ftp.nice.ch/pub/next/unix/shell/guestshell.1.1.N.bs.tar.gz#/misc.c

This is misc.c in view mode; [Download] [Up]

/* miscellaneous */

#include	<curses.h>
#include	<stdarg.h>
#include	<stdlib.h>
#include	<stdio.h>
#include	<string.h>
#include	<time.h>
#include        <sys/signal.h>

#include	"global.h"
#include	"prototypes.h"

#define	TIMESTRLEN	30
#define	TERMCAPMAXLL	50
#define	MAXLINELEN	1024


/* local prototypes */

static void donothing(void);
static void hangup(void);
static void listemus(void);

void erasescreen()
{
	clear();
	refresh();
}

void donothing()
{
	return;
}

void hangup()
{
	log("got hangup-signal, terminating...");
	endwin();
	exit(EXIT_SUCCESS);
}

void initsig()
{
	if(signal(SIGHUP, (void (*)())&hangup)==BADSIG)
		log("couldn't catch SIGHUP.");

	if(signal(SIGINT, (void (*)())&donothing)==BADSIG)
		log("couldn't catch SIGINT.");
}

void log(char *fmt, ...)
{
	va_list args;
	FILE *logh;
	time_t t;  
	char timestr[TIMESTRLEN];

	va_start(args,fmt);
	if((logh=fopen(LOGFILE,"a"))==0L)
	{
		printf("\n\nlogfile inaccessible. Couldn't log message:\n");
		vprintf(fmt,args);
		printf("\n\n");
	}
	else
	{
		t=time(0L);
		strcpy(timestr, ctime(&t));
		timestr[24]='\0';
	        fprintf(logh,"%s ",timestr);
		vfprintf(logh,fmt,args);
		fprintf(logh,"\n");
		fclose(logh);

		if(chmod(LOGFILE,664)!=0)
		  perror("chmod");
		
		/* chown guest LOGFILE would be nice here, but we
		   are not setuid root. */
		
	}
	va_end(args);
}

bool	testemu(char *emulation)
{
	FILE *tch;
	char tcbuf[TERMCAPMAXLL], *emuocc, *colocc;
	bool emufound=FALSE;

	if(*emulation=='\0')
	{
	  	printf("\nYou _must_ specify an emulation !\n");
		return FALSE;
	}

	if((tch=fopen(TERMCAP,"r"))==0L)
	{
		log("couldn't open termcap. ( filename '%s' )",TERMCAP);
		strcpy(emulation,"vt100");
		printf("\nsomething is wrong with my termcap-file.\n" 
		       "Trying to set $TERM to vt100 !\n");
		return TRUE;
	}

	while(((fgets(tcbuf,sizeof(tcbuf),tch))!=0L)&&(!emufound))
		if((emuocc=strstr(tcbuf,emulation)) &&
				(*tcbuf!='#') &&
				((colocc=strchr(tcbuf,':'))==0 ? 
					TRUE : (emuocc<colocc))) 
			emufound=TRUE;

	fclose(tch);

	if(!emufound)
	  log("Emulation not found: %s.",emulation);

	return emufound;
}

#define TERMCAPFS '|'
#define PRINTFIELD 2

void listemus()
{
  char shcmd[SHCMDLEN];

  printf("\n\n");

  sprintf(shcmd,"%s 'BEGIN { FS=\"%c\"; i=0 }"
                   "(NF>2) {"
                              "if(index($%i,\":\")!=0) {"
                                "$%i=substr($%i,1,index($%i,\":\")-1)"
                              "};"
                              "i+=(length($%i)+1);"
                              "if(i>68) { printf(\"\\n\"); i=0 };"
                              "printf(\"%%s \",$%i)"
                          "}' < /etc/termcap",
                 AWKBIN, TERMCAPFS, PRINTFIELD, PRINTFIELD, PRINTFIELD,
	         PRINTFIELD, PRINTFIELD, PRINTFIELD);

  if(system(shcmd))
    log("error running awk. ( %s )", AWKBIN); 

  printf("\n\n");
}

void setemu(bool curseson)
{
	char emulation[MAXEMULEN],shcmd[SHCMDLEN];

	do
	{
	  do
	    {
		printf("\nplease enter emulation ( such as vt100 )\n"
                       "or 'l' for a list ( VERY LONG ! ) >");
		if(curseson)
		  refresh();
		gets(emulation);

		if(strcasecmp(emulation,"l")==0)
		  listemus();

	      }while(strcasecmp(emulation,"l")==0);

	}while(!testemu(emulation));
	if(curseson)
	  refresh();

	setenv("TERM",emulation,TRUE);
	unsetenv("TERMCAP"); 

#ifdef STTY
	if(system(STTY))
	  perror("system");
#endif

	sprintf(shcmd,"%s -r >/dev/null",TSETBIN);
	if(system(shcmd))
	  perror("system");

}

/* switch terminal to raw mode then read a single character and reset
   terminal to old state. */
char readchar()
{
        char c;
        struct sgttyb bufold, bufnew;

	gtty(0,&bufold);
	bufnew=bufold;
	bufnew.sg_flags|=RAW;
	stty(0,&bufnew);
  
	read(0,&c,1);

	stty(0,&bufold);
	return(c);
}

int showfile(char *filebody)
{
	char c, textfile[FILENAME_MAX], line[MAXLINELEN];
	FILE *th;
	int linecnt=0;

	erasescreen();
	sprintf(textfile,"%s%s",TEXTPATH,filebody);

	if((th=fopen(textfile,"r"))==0L)
	{
		log("couldn't access file '%s'", textfile);
		return FALSE;
	}

	do {
		while( !feof(th) && (linecnt<LINES-1))
			if(fgets(line,sizeof(line),th)!=0) 
			{
				printf("%s",line);
				linecnt+=((strlen(line)/COLS)+1);
			}

		/* FIXME: invert bar */
		printf(" >> CR to scroll one screen,"
		       " q to quit << "); 	

		refresh();
		while(((c=getchar())!='q') && (c!=10))
			;
	
		linecnt=0;
		printf("\r");
		refresh();
	} while((!feof(th)) && (c!='q'));

	fclose(th);
	return TRUE;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.