From decwrl!ucbvax!tut.cis.ohio-state.edu!cs.utexas.edu!uunet!allbery Wed May 16 09:18:10 PDT 1990 Article 1541 of comp.sources.misc: Path: decwrl!ucbvax!tut.cis.ohio-state.edu!cs.utexas.edu!uunet!allbery From: wht%n4hgf@gatech.edu (Warren Tucker) Newsgroups: comp.sources.misc Subject: v12i061: ECU 2.80 part 08/29 Message-ID: <88363@uunet.UU.NET> Date: 12 May 90 01:58:10 GMT Sender: allbery@uunet.UU.NET Lines: 2005 Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Posting-number: Volume 12, Issue 61 Submitted-by: wht%n4hgf@gatech.edu (Warren Tucker) Archive-name: ecu2.80/part08 ---- Cut Here and unpack ---- #!/bin/sh # This is part 08 of ecu280 if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= ecuutil.c ============== echo "x - extracting ecuutil.c (Text)" sed 's/^X//' << 'SHAR_EOF' > ecuutil.c && X/* CHK=0xC7DA */ X/*+----------------------------------------------------------------------- X ecuutil.c -- utility routines for extended calling unit X wht%n4hgf@gatech.edu X X Defined functions: X arg_token(parsestr,termchars) X ascii_name_to_hex(str3char) X ascii_to_hex(ascii) X build_arg_array(cmd,arg,arg_max_quan,narg_rtn) X build_str_array(str,arg,str_max_quan,nstr_rtn) X disp_line_termio(fd,text) X disp_termio(ttt,text) X errno_text(errno) X find_shell_chars(command) X get_curr_dir(cdir,cdir_max) X get_home_dir(home_dir) X hex_to_ascii_name(char_val) X make_char_graphic(ch,incl_3char) X make_dirs(pathname) X make_ecu_subdir() X mem_cpy(dest,src,len); X mkdir(dpath,dmode) X mode_map(mode,mode_str) X pad_zstr_to_len(zstr,len) X perror_errmsg(str) X print_cwd(curdir,buf_size) X skip_ld_break(zstr) X str_token(parsestr,termchars) X yes_or_no(strarg) X X------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */ X/*:05-02-1990-13:25-wht@n4hgf-added double quote to shell metachar list */ X/*:04-19-1990-14:56-wht@n4hgf-my GCC is uses XENIX libs/turn on mkdir for it */ X/*:04-19-1990-03:07-wht@n4hgf-GCC run found unused vars -- rm them */ X/*:04-16-1990-00:52-wht@n4hgf-add mem_cpy */ X/*:04-02-1990-02:17-wht@n4hgf-Dialers support appears to work */ X/*:03-27-1990-15:18-wht@n4hgf-overhaul for/wait/SIGCLD handling */ X/*:03-25-1990-14:11-wht@n4hgf------ x2.70 ------- */ X/*:02-28-1990-17:21-wht@n4hgf-chmod new ecu dir to 700 */ X/*:12-21-1989-17:01-wht-add CTSFLOW/RTSFLOW to disp_termio */ X/*:12-09-1989-22:54-wht-found bug in arg_token when using it elsewhere */ X/*:11-23-1989-03:11-wht-conditional compile for M_XENIX or M_UNIX */ X/*:11-23-1989-02:47-wht-UNIX has a mkdir system call */ X/*:11-19-1989-16:10-wht-add errno_text */ X/*:11-02-1989-06:59-wht-use getpwuid for home dir */ X/*:10-07-1989-21:11-wht-fix arg_token+fix doc on add_token & str_token */ X/*:07-29-1989-14:39-wht-add CS5,6,7, 8 to disp_termio */ X/*:07-03-1989-22:57-wht------ x2.00 ----- */ X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */ X X#include "ecu.h" X#include "ecuhangup.h" X#include "ecufork.h" X#include X Xchar *getenv(); X Xextern int errno; Xextern int rcvr_pid; /* ==0 if rcvr process, else pid of rcvr */ Xextern char curr_dir[]; X Xchar *ascii_ctlstr = X"NULSOHSTXETXEOTENQACKBELBS HT NL VT FF CR SO SI DLEDC1DC2DC3DC4NAKSYNETBCANEM SUBESCFS GS RS US "; X X/*+------------------------------------------------------------------------- X mem_cpy(dest,src,len) - memcpy() with non-destructive overlapping copy X--------------------------------------------------------------------------*/ Xvoid Xmem_cpy(dest,src,len) Xregister char *dest; Xregister char *src; Xregister len; X{ X if(dest > src) X { X dest += len; X src += len; X while(len--) X *--dest = *--src; X } X else X { X while(len--) X *dest++ = *src++; X } X} /* end of mem_cpy */ X X/*+------------------------------------------------------------------------- X errno_text(errno) X--------------------------------------------------------------------------*/ Xchar * Xerrno_text(errno) Xint errno; X{ Xstatic char errant[16]; X X switch(errno) X { X case 0: return("0"); X case EPERM: return("EPERM"); X case ENOENT: return("ENOENT"); X case ESRCH: return("ESRCH"); X case EINTR: return("EINTR"); X case EIO: return("EIO"); X case ENXIO: return("ENXIO"); X case E2BIG: return("E2BIG"); X case ENOEXEC: return("ENOEXEC"); X case EBADF: return("EBADF"); X case ECHILD: return("ECHILD"); X case EAGAIN: return("EAGAIN"); X case ENOMEM: return("ENOMEM"); X case EACCES: return("EACCES"); X case EFAULT: return("EFAULT"); X case ENOTBLK: return("ENOTBLK"); X case EBUSY: return("EBUSY"); X case EEXIST: return("EEXIST"); X case EXDEV: return("EXDEV"); X case ENODEV: return("ENODEV"); X case ENOTDIR: return("ENOTDIR"); X case EISDIR: return("EISDIR"); X case EINVAL: return("EINVAL"); X case ENFILE: return("ENFILE"); X case EMFILE: return("EMFILE"); X case ENOTTY: return("ENOTTY"); X case ETXTBSY: return("ETXTBSY"); X case EFBIG: return("EFBIG"); X case ENOSPC: return("ENOSPC"); X case ESPIPE: return("ESPIPE"); X case EROFS: return("EROFS"); X case EMLINK: return("EMLINK"); X case EPIPE: return("EPIPE"); X case EDOM: return("EDOM"); X case ERANGE: return("ERANGE"); X default: X sprintf(errant,"E%04u",errno); X return(errant); X } X X} /* end of errno_text */ X X/*+------------------------------------------------------------------------- X skip_ld_break(zstr) - skip leading spaces and tabs X--------------------------------------------------------------------------*/ Xchar * Xskip_ld_break(zstr) Xregister char *zstr; X{ X while(isspace(*zstr)) X zstr++; X return(zstr); X} /* end of skip_ld_break */ X X/*+----------------------------------------------------------------------- X pad_zstr_to_len(zstr,len) X X pads with spaces to specified length, unless already longer than X len in which case the string is truncated to 'len' characters. X------------------------------------------------------------------------*/ Xvoid Xpad_zstr_to_len(zstr,len) Xchar *zstr; Xint len; X{ Xregister izstr; X X izstr = strlen(zstr); X if(izstr >= len) X zstr[len] = 0; X else X { X while(izstr < len) X zstr[izstr++] = 0x20; X zstr[izstr] = 0; X } X} /* end of pad_zstr_to_len */ X X/*+----------------------------------------------------------------------- X arg_token(parsestr,termchars) X XGet next token from string parsestr ((char *)0 on 2nd, 3rd, etc. Xcalls), where tokens are nonempty strings separated by runs of chars Xfrom termchars. Writes nulls into parsestr to end tokens. Xtermchars need not remain constant from call to call. X XTreats multiple occurrences of a termchar as one delimiter (does not Xallow null fields). X------------------------------------------------------------------------*/ Xchar *arg_token_static = (char *)0; Xchar *arg_token(parsestr,termchars) Xchar *parsestr; Xchar *termchars; X{ Xregister int first = 1; Xregister char *termptr; Xregister char *parseptr; Xchar *token; X X if(parsestr == (char *)0 && arg_token_static == (char *)0) X return((char *)0); X X if(parsestr) X parseptr = parsestr; X else X parseptr = arg_token_static; X X while(*parseptr) X { X if(!strchr(termchars,*parseptr)) X break; X parseptr++; X } X X if(!*parseptr) X { X arg_token_static = (char *)0; X return((char *)0); X } X X token = parseptr; X if(*token == '\'') X { X token++; X parseptr++; X while(*parseptr) X { X if(*parseptr == '\'') X { X arg_token_static = parseptr + 1; X *parseptr = 0; X return(token); X } X parseptr++; X } X arg_token_static = (char *)0; X return(token); X } X while(*parseptr) X { X if(strchr(termchars,*parseptr)) X { X *parseptr = 0; X arg_token_static = parseptr + 1; X while(*arg_token_static) X { X if(!strchr(termchars,*arg_token_static)) X break; X arg_token_static++; X } X return(token); X } X parseptr++; X } X arg_token_static = (char *)0; X return(token); X} /* end of arg_token */ X X/*+------------------------------------------------------------------------- X build_arg_array(cmd,arg,arg_max_quan,&narg) X--------------------------------------------------------------------------*/ Xvoid Xbuild_arg_array(cmd,arg,arg_max_quan,narg_rtn) Xchar *cmd; Xchar **arg; Xint arg_max_quan; Xint *narg_rtn; X{ Xregister itmp; Xregister narg; X X for(itmp = 0; itmp < arg_max_quan; itmp++) X arg[itmp] = (char *)0; X arg[0] = arg_token(cmd," \t\r\n"); X X for(narg = 1; narg < arg_max_quan; ++narg) X { X if((arg[narg] = arg_token((char *)0," \t\r\n")) == (char *)0) X break; X } X X *narg_rtn = narg; X X} /* end of build_arg_array */ X X/*+----------------------------------------------------------------------- X str_token(parsestr,termchars) X XGet next token from string parsestr ((char *)0 on 2nd, 3rd, etc. Xcalls), where tokens are nonempty strings separated by runs of chars Xfrom termchars. Writes nulls into parsestr to end tokens. Xtermchars need not remain constant from call to call. X XTreats each occurrence of a termchar as delimiter (allows null Xfields). X------------------------------------------------------------------------*/ Xstatic char *str_token_static = (char *)0; Xchar *str_token(parsestr,termchars) Xchar *parsestr; Xchar *termchars; X{ Xregister char *termptr; Xregister char *parseptr; Xchar *token; X X if(parsestr == (char *)0 && str_token_static == (char *)0) X return((char *)0); X X if(parsestr) X parseptr = parsestr; X else X parseptr = str_token_static; X X while(*parseptr) X { X for(termptr = termchars; *termptr != 0; termptr++) X { X if(*parseptr == *termptr) X goto FOUND_TERM; X } X if(!*termptr) X break; X parseptr++; X } X X if(!*parseptr) X { X str_token_static = (char *)0; X return((char *)0); X } X XFOUND_TERM: X token = parseptr; X while(*parseptr) X { X for(termptr = termchars; *termptr;) X { X if(*parseptr == *termptr++) X { X str_token_static = parseptr + 1; X *parseptr = 0; X return(token); X } X } X parseptr++; X } X str_token_static = (char *)0; X return(token); X} /* end of str_token */ X X/*+------------------------------------------------------------------------- X build_str_array(str,arg,str_max_quan,&narg) X--------------------------------------------------------------------------*/ Xvoid Xbuild_str_array(str,arg,str_max_quan,nstr_rtn) Xchar *str; Xchar **arg; Xint str_max_quan; Xint *nstr_rtn; X{ Xregister itmp; Xregister narg; X X X for(itmp = 0; itmp < str_max_quan; itmp++) X arg[itmp] = (char *)0; X arg[0] = str_token(str," \t\r\n"); X X for(narg = 1; narg < str_max_quan; ++narg) X { X if((arg[narg] = str_token((char *)0," \t\r\n")) == (char *)0) X break; X } X X *nstr_rtn = narg; X X} /* end of build_str_array */ X X/*+----------------------------------------------------------------------- X make_char_graphic(character,incl_3char) - Make all chars "printable" X X returns pointer to a static string containing printable version X of a character. If control char, printed as "^A", etc. X if incl_3char set true, then space + ASCII assignment (e.g. "NUL") is X appended to the string for non-printable graphics X------------------------------------------------------------------------*/ Xchar *make_char_graphic(ch,incl_3char) Xregister char ch; Xint incl_3char; X{ Xstatic char gg[16]; X X ch &= 0x7F; X if((ch >= 0x20) && (ch < 0x7F)) X { X gg[0] = ch; gg[1] = 0; X } X else X { X gg[0] = '^'; X if(ch == 0x7F) X { X gg[1] = '?'; X if(incl_3char) X strcpy(&gg[2]," DEL"); X } X else X { X gg[1] = ch + 0x40; X if(incl_3char) X { X gg[2] = 0x20; X strncpy(&gg[3],ascii_ctlstr + (ch * 3),3); X gg[7] = 0; X } X else X gg[2] = 0; X } X } X return(gg); X} /* end of make_char_graphic */ X X/*+----------------------------------------------------------------------- X disp_termio(ttt) X display termio 'ttt' on stderr X------------------------------------------------------------------------*/ Xvoid disp_termio(ttt,text) Xstruct termio *ttt; Xchar *text; X{ Xregister flag; Xregister i_cc; Xregister char *cptr; Xint dbits; Xchar parity; X X pprintf("---------> %s\n",text); X X flag = ttt->c_iflag; X pprintf("iflag: %07o IGNBRK:%d BRKINT:%d IGNPAR:%d PARMRK:%d INPCK:%d ISTRIP:%d\n", X flag, X (flag & IGNBRK) ? 1 : 0, X (flag & BRKINT) ? 1 : 0, X (flag & IGNPAR) ? 1 : 0, X (flag & PARMRK) ? 1 : 0, X (flag & INPCK ) ? 1 : 0, X (flag & ISTRIP) ? 1 : 0); X pprintf( X" INLCR:%d IGNCR:%d ICRNL:%d IUCLC:%d IXON:%d IXANY:%d IXOFF:%d\n", X (flag & INLCR ) ? 1 : 0, X (flag & IGNCR ) ? 1 : 0, X (flag & ICRNL ) ? 1 : 0, X (flag & IUCLC ) ? 1 : 0, X (flag & IXON ) ? 1 : 0, X (flag & IXANY ) ? 1 : 0, X (flag & IXOFF ) ? 1 : 0); X X flag = ttt->c_oflag; X pprintf("oflag: %07o OPOST:%d OLCUC:%d ONLCR:%d OCRNL:%d ONOCR:%d ONLRET:%d OFDEL:%d\n", X flag, X (flag & OPOST ) ? 1 : 0, X (flag & OLCUC ) ? 1 : 0, X (flag & ONLCR ) ? 1 : 0, X (flag & OCRNL ) ? 1 : 0, X (flag & ONOCR ) ? 1 : 0, X (flag & ONLRET) ? 1 : 0, X (flag & OFDEL ) ? 1 : 0); X X flag = ttt->c_cflag; X pprintf("cflag: %07o ",ttt->c_cflag); X switch(flag & CBAUD) X { X case B0: cptr = "HUP"; break; X case B50: cptr = "50"; break; X case B75: cptr = "75"; break; X case B110: cptr = "110"; break; X case B134: cptr = "134.5"; break; X case B150: cptr = "150"; break; X case B200: cptr = "200"; break; X case B300: cptr = "300"; break; X case B600: cptr = "600"; break; X case B1200: cptr = "1200"; break; X case B1800: cptr = "1800"; break; X case B2400: cptr = "2400"; break; X case B4800: cptr = "4800"; break; X case B9600: cptr = "9600"; break; X#if defined(B19200) X case B19200:cptr = "19200"; break; X#endif X#if defined(B38400) X case B38400:cptr = "38400"; break; X#endif X default: X switch(flag & CBAUD) X { X case EXTA: cptr = "EXTA"; break; X case EXTB: cptr = "EXTB"; break; X default: cptr = "????"; break; X } X } X dbits = 5 + ((flag & CSIZE) >> 4); X parity = (flag & PARENB) ? ((flag & PARODD) ? 'O' : 'E') : 'N'; X pprintf("%s-%d-%c-%d ",cptr,dbits,parity,(flag & CSTOPB) ? 2 : 1); X switch(flag & CS8) X { X case CS8: pputs("CS8 "); break; X case CS7: pputs("CS7 "); break; X case CS6: pputs("CS6 "); break; X case CS5: pputs("CS5 "); break; X } X pprintf("CREAD:%d HUPCL:%d CLOCAL:%d", X (flag & CREAD ) ? 1 : 0, X (flag & HUPCL ) ? 1 : 0, X (flag & CLOCAL) ? 1 : 0); X#ifdef RTSFLOW X pprintf(" RTSFLOW:%d CTSFLOW:%d", X (flag & RTSFLOW ) ? 1 : 0, X (flag & CTSFLOW ) ? 1 : 0); X#endif X pprintf("\n"); X X flag = ttt->c_lflag; X pprintf("lflag: %07o ISIG:%d ICANON:%d XCASE:%d ECHO:%d ECHOE:%d\n", X flag, X (flag & ISIG ) ? 1 : 0, X (flag & ICANON) ? 1 : 0, X (flag & XCASE ) ? 1 : 0, X (flag & ECHO ) ? 1 : 0, X (flag & ECHOE ) ? 1 : 0); X pprintf(" ECHOK:%d ECHONL:%d NOFLSH:%d", X (flag & ECHOK ) ? 1 : 0, X (flag & ECHONL) ? 1 : 0, X (flag & NOFLSH) ? 1 : 0); X X#if defined(XCLUDE) X pprintf(" XCLUDE:%d",(flag & XCLUDE) ? 1 : 0); X#endif X pputs("\n"); X X pprintf("ctl chars: "); X for(i_cc = 0; i_cc < NCC; i_cc++) X pprintf("%02x ",ttt->c_cc[i_cc]); X pprintf(" (hex)\n"); X pprintf(" INTR QUIT ERAS KILL EOF EOL EOL2 SWTCH VMIN-EOF VTIME-EOL\n"); X X} /* end of disp_termio */ X X/*+----------------------------------------------------------------------- X disp_line_termio(fd) X XGet current termio structure for file descriptor fd Xand display on stderr X------------------------------------------------------------------------*/ Xvoid disp_line_termio(fd,text) Xint fd; /* file descriptor */ Xchar *text; X{ Xstruct termio fd_termio; Xchar text2[128]; X X ioctl(fd,TCGETA,&fd_termio); X sprintf(text2,"fd: %d %s",fd,text); X disp_termio(&fd_termio,text2); X X} /* end of disp_line_termio */ X X/*+----------------------------------------------------------------------- X print_cwd(curdir) print and return current working directory X------------------------------------------------------------------------*/ Xvoid print_cwd(curdir,buf_size) Xchar *curdir; Xint buf_size; X{ X ff(se,"%s\r\n",curr_dir); X strncpy(curdir,curr_dir,buf_size); X} /* end of print_cwd */ X X/*+----------------------------------------------------------------------- X dummy_call() bypass optimizer (call from another module for noop) X------------------------------------------------------------------------*/ Xvoid dummy_call() { ; } X X/*+----------------------------------------------------------------------- X ascii_name_to_hex(str3char) X X return value of ascii ctl char name (e.g., "NUL") 0 - 0x1F X returns -1 if input not valid X------------------------------------------------------------------------*/ Xascii_name_to_hex(str3char) Xchar *str3char; X{ Xregister char *cptr = ascii_ctlstr; Xregister intval; X X for(intval = 0; intval < 0x20; intval++) X { X if( (to_lower(*str3char) == to_lower(*cptr)) && X (to_lower(*(str3char + 1)) == to_lower(*(cptr + 1))) && X ((to_lower(*(str3char + 2)) == to_lower(*(cptr + 2))) || X (*(cptr + 2) == ' '))) X return(intval); X cptr += 3; X } X X return(-1); X X} /* end of ascii_name_to_hex */ X X/*+------------------------------------------------------------------------- X ascii_to_hex(ascii) X--------------------------------------------------------------------------*/ Xascii_to_hex(ascii) Xchar *ascii; X{ Xint hexval; X if(strlen(ascii) == 1) X return(*ascii); X else if(!strncmp(ascii,"0x",2)) X { X sscanf(ascii + 2,"%x",&hexval); X return(hexval & 0xFF); X } X else if(*ascii == '^') X return(*(ascii + 1) & 0x1F); X else X return(ascii_name_to_hex(ascii)); X} /* end of ascii_to_hex */ X X/*+------------------------------------------------------------------------- X hex_to_ascii_name(char_val) X X Returns pointer to static string containing three character ASCII X name for control character followed by a null. X--------------------------------------------------------------------------*/ Xchar * Xhex_to_ascii_name(char_val) Xchar char_val; X{ Xstatic char ascii_name[4]; X X if(char_val == 0x7F) X strcpy(ascii_name,"DEL"); X else X { X strncpy(ascii_name,ascii_ctlstr + (char_val * 3),3); X ascii_name[3] = 0; X } X X return(ascii_name); X X} /* end of hex_to_ascii_name */ X X/*+------------------------------------------------------------------------- X get_curr_dir(cdir,cdir_max) - get current directory into 'cdir' X--------------------------------------------------------------------------*/ Xget_curr_dir(cdir,cdir_max) Xchar *cdir; Xint cdir_max; X{ X#if defined(pyr) Xchar *getwd(); X return((getwd(cdir) == (char *)0) ? -1 : 0); X#endif X X#if defined(M_XENIX) || defined(M_UNIX) XFILE *popen(); XFILE *pipefp = popen("/bin/pwd","r"); X if(!pipefp) X return(-1); X fgets(cdir,cdir_max,pipefp); X cdir[strlen(cdir) - 1] = 0; X fclose(pipefp); X return(0); X#endif X X} /* end of get_curr_dir */ X X/*+----------------------------------------------------------------------- X get_home_dir(home_dir): leave plenty of room for result! X------------------------------------------------------------------------*/ Xget_home_dir(home_dir) Xchar *home_dir; X{ Xstatic char home_directory[256] = ""; Xstruct passwd *pwent; Xstruct passwd *getpwuid(); X X if(home_directory[0]) X { X strcpy(home_dir,home_directory); X return(0); X } X X if(!(pwent = getpwuid(getuid()))) X { X pperror("cannot get pwent for you!!"); X hangup(HANGUP_PWENT_ERROR); X } X strcpy(home_directory,pwent->pw_dir); X strcpy(home_dir,pwent->pw_dir); X endpwent(); X return(0); X X} /* end of get_home_dir */ X X/*+------------------------------------------------------------------------- X mkdir(dpath,dmode) X Directory-creating routines from Public Domain TAR by John Gilmore X Make a directory. Compatible with the mkdir() system call on 4.2BSD. X--------------------------------------------------------------------------*/ X#if !defined(M_UNIX) || defined(__GNUC__) X#define TERM_SIGNAL(status) ((status) & 0x7F) X#define TERM_COREDUMP(status) (((status) & 0x80) != 0) X#define TERM_VALUE(status) ((status) >> 8) Xmkdir(dpath,dmode) Xchar *dpath; Xint dmode; X{ X int cpid,status; X struct stat statbuf; X int (*original_sighdlr)(); X X if(stat(dpath,&statbuf) == 0) X { X errno = EEXIST; /* Stat worked,so it already exists */ X return(-1); X } X X /* If stat fails for a reason other than non-existence,return error */ X if(errno != ENOENT) X return(-1); X X original_sighdlr = signal(SIGCLD,SIG_DFL); X switch(cpid = fork()) X { X X case -1: /* Error in fork() */ X return(-1); /* Errno is set already */ X X case 0: /* Child process */ X /* X * Cheap hack to set mode of new directory. Since this X * child process is going away anyway,we zap its umask. X * FIXME,this won't suffice to set SUID,SGID,etc. on this X * directory. Does anybody care? X */ X status = umask(0); /* Get current umask */ X status = umask(status | (0777 & ~dmode)); /* Set for mkdir */ X execl("/bin/mkdir","mkdir",dpath,(char *)0); X _exit(-1); /* Can't exec /bin/mkdir */ X X default: /* Parent process */ X while((cpid != wait(&status)) && (cpid != -1)) X ; /* Wait for kid to finish */ X } X X signal(SIGCLD,original_sighdlr); X X if(TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) X { X errno = EIO; /* We don't know why,but */ X return(-1); /* /bin/mkdir failed */ X } X X return(0); X} /* end of mkdir */ X#endif X X/*+------------------------------------------------------------------------- X make_dirs(pathname) X X Directory-creating routines from Public Domain TAR by John Gilmore X After a file/link/symlink/dir creation has failed, see if it's because X some required directory was not present, and if so, create all X required dirs. X X returns 0 if no directory made, else # levels required to get target X--------------------------------------------------------------------------*/ Xint Xmake_dirs(pathname) Xregister char *pathname; X{ X register char *p; /* Points into path */ X int madeone = 0; /* Did we do anything yet? */ X int save_errno = errno; /* Remember caller's errno */ X X if(errno != ENOENT) X return(0); /* Not our problem */ X X for(p = strchr(pathname,'/'); p != NULL; p = strchr(p+1,'/')) X { X /* Avoid mkdir of empty string,if leading or double '/' */ X if(p == pathname || p[-1] == '/') X continue; X /* Avoid mkdir where last part of path is '.' */ X if(p[-1] == '.' && (p == pathname+1 || p[-2] == '/')) X continue; X *p = 0; /* Truncate the path there */ X if( !mkdir(pathname,0777)) X { /* Try to create it as a dir */ X madeone++; /* Remember if we made one */ X *p = '/'; X continue; X } X *p = '/'; X if(errno == EEXIST) /* Directory already exists */ X continue; X /* X * Some other error in the mkdir. We return to the caller. X */ X break; X } X errno = save_errno; /* Restore caller's errno */ X return(madeone); /* Tell them to retry if we made one */ X} /* end of make_dirs */ X X/*+------------------------------------------------------------------------- X make_ecu_subdir() Xmust be called early in execution before wierd tty states set, etc. X--------------------------------------------------------------------------*/ Xvoid Xmake_ecu_subdir() X{ Xint itmp; Xstruct stat fst; Xchar s256[256]; X X get_home_dir(s256); X strcat(s256,"/.ecu"); X if((!(itmp = stat(s256,&fst))) && ((fst.st_mode & S_IFMT) != S_IFDIR)) X { X ff(se,"~/.ecu is not a directory. Rename the file and try again.\n\n"); X exit(1); X } X if(itmp) /* if stat failed, try to make the directory */ X { X strcat(s256,"/."); X if(make_dirs(s256)) X { X if(stat(s256,&fst)) X { X ff(se,"cannot make ~/.ecu subdirectory.\n"); X perror(s256); X exit(1); X } X } X } X chmod(s256,0700); X} /* end of make_ecu_subdir */ X X/*+------------------------------------------------------------------------- X yes_or_no(strarg) X Returns 1 if first char is 'Y' or 'y' X or if strarg is numeric returns the numeric value X or if strarg is alpha == "on" returns 1 X Returns 0 otherwise X--------------------------------------------------------------------------*/ Xyes_or_no(strarg) Xchar *strarg; X{ X if((strcmp(strarg,"on") == 0) || (to_lower(*strarg) == 'y')) X return(1); X else X return(atoi(strarg)); X} /* end of yes_or_no */ X X/*+------------------------------------------------------------------------- X find_shell_chars(command) X--------------------------------------------------------------------------*/ Xfind_shell_chars(command) Xchar *command; X{ Xregister schar; Xregister cchar; Xregister char *scptr; Xstatic char shell_chars[] = "\"~;*?'`{}[]$"; X X while(cchar = *command++) X { X scptr = shell_chars; X while(schar = *scptr++) X if(schar == cchar) X return(1); X } X return(0); X} /* end of find_shell_chars */ X X/*+------------------------------------------------------------------------- X perror_errmsg(str) X--------------------------------------------------------------------------*/ Xvoid Xperror_errmsg(str) Xchar *str; X{ Xextern char errmsg[]; Xextern char *sys_errlist[]; Xextern int sys_nerr; Xextern int errno; X X if(errno > sys_nerr) X sprintf(errmsg,"%s: error %d",str,errno); X else X sprintf(errmsg,"%s: %s",str,sys_errlist[errno]); X} /* end of perror_errmsg */ X X/*+----------------------------------------------------------------------- X mode_map(mode,mode_str) build drwxrwxrwx string X------------------------------------------------------------------------*/ Xchar * Xmode_map(mode,mode_str) Xunsigned short mode; Xchar *mode_str; X{ Xregister unsigned ftype = mode & S_IFMT; Xregister char *rtn; Xstatic char result[12]; X X rtn = (mode_str == (char *)0) ? result : mode_str; X X /* drwxrwxrwx */ X /* 0123456789 */ X strcpy(rtn,"----------"); X X switch(ftype) X { X case S_IFIFO: *rtn = 'p'; break; /* FIFO (named pipe) */ X case S_IFDIR: *rtn = 'd'; break; /* directory */ X case S_IFCHR: *rtn = 'c'; break; /* character special */ X case S_IFBLK: *rtn = 'b'; break; /* block special */ X case S_IFREG: *rtn = '-'; break; /* regular */ X X#if defined(pyr) | defined(BSD4) X case S_IFLNK: *rtn = 'l'; break; /* symbolic link */ X case S_IFSOCK: *rtn = 's'; break; /* socket */ X#endif X X#if defined (M_XENIX) || defined(M_UNIX) X case S_IFNAM: /* name space entry */ X if(mode & S_INSEM) /* semaphore */ X { X *rtn = 's'; X break; X } X if(mode & S_INSHD) /* shared memory */ X { X *rtn = 'm'; X break; X } X#endif X X default: *rtn = '?'; break; /* ??? */ X } X X if(mode & 000400) *(rtn + 1) = 'r'; X if(mode & 000200) *(rtn + 2) = 'w'; X if(mode & 000100) *(rtn + 3) = 'x'; X if(mode & 004000) *(rtn + 3) = 's'; X if(mode & 000040) *(rtn + 4) = 'r'; X if(mode & 000020) *(rtn + 5) = 'w'; X if(mode & 000010) *(rtn + 6) = 'x'; X if(mode & 002000) *(rtn + 6) = 's'; X if(mode & 000004) *(rtn + 7) = 'r'; X if(mode & 000002) *(rtn + 8) = 'w'; X if(mode & 000001) *(rtn + 9) = 'x'; X if(mode & 001000) *(rtn + 9) = 't'; X X return(rtn); X X} /* end of mode_map */ X X/* end of ecuutil.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0507233390 ecuutil.c && chmod 0644 ecuutil.c || echo "restore of ecuutil.c failed" set `wc -c ecuutil.c`;Wc_c=$1 if test "$Wc_c" != "25389"; then echo original size 25389, current size $Wc_c fi # ============= ecuwinutil.c ============== echo "x - extracting ecuwinutil.c (Text)" sed 's/^X//' << 'SHAR_EOF' > ecuwinutil.c && X/* CHK=0x920C */ X/*+------------------------------------------------------------------------- X ecuwinutil.c - curses window utilities X wht%n4hgf@gatech.edu X X Defined functions: X clear_area(win,y,x,len) X clear_area_char(win,y,x,len,fillchar) X winbox(win) X window_create(title,title_x,tly,tlx,lines,cols) X window_setup(win,title,title_x) X windows_end(last_win) X windows_end_signal() X windows_start() X winget_single(win,nondelim_list,delim_list) X wingets(win,y,x,buf,bufsize,delim,edit) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */ X/*:04-19-1990-03:07-wht@n4hgf-GCC run found unused vars -- rm them */ X/*:04-16-1990-00:05-wht@n4hgf-smarter wingets */ X/*:03-27-1990-15:18-wht@n4hgf-overhaul for/wait/SIGCLD handling */ X/*:03-25-1990-14:11-wht@n4hgf------ x2.70 ------- */ X/*:11-24-1989-14:41-wht-UNIX tcap-curses blinks with high bits set on addch */ X/*:11-19-1989-17:17-wht-change windows_end_signal() to not goto bottom left */ X/*:07-03-1989-22:57-wht------ x2.00 ----- */ X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */ X X#include X#include "ecukey.h" X#include "ecuxkey.h" X#include "ecuhangup.h" X#include "pc_scr.h" X X#if !defined(ushort) X#define ushort unsigned short X#endif X#if !defined(uchar) X#define uchar unsigned char X#endif X#if !defined(uint) X#define uint unsigned int X#endif X#if !defined(ulong) X#define ulong unsigned long X#endif X Xint windows_active = 0; Xint ttymode_before_window_start; X X/*+------------------------------------------------------------------------- X clear_area_char(win,y,x,len,fillchar) X--------------------------------------------------------------------------*/ Xvoid Xclear_area_char(win,y,x,len,fillchar) XWINDOW *win; Xint y; Xint x; Xint len; Xchar fillchar; X{ X wmove(win,y,x); X while(len-- > 0) X waddch(win,fillchar & 0xFF); X wmove(win,y,x); X X} /* end of clear_area_char */ X X/*+------------------------------------------------------------------------- X clear_area(win,y,x,len) X--------------------------------------------------------------------------*/ Xvoid Xclear_area(win,y,x,len) XWINDOW *win; Xint y; Xint x; Xint len; X{ X clear_area_char(win,y,x,len,' '); X} /* end of clear_area_char */ X X/*+------------------------------------------------------------------------- X windows_start() X--------------------------------------------------------------------------*/ Xvoid Xwindows_start() X{ X X ttymode_before_window_start = get_ttymode(); X ttymode(0); X if(!initscr()) X { X fprintf(stderr,"curses init failure ... check term type\r\n"); X hangup(HANGUP_USAGE); X } X savetty(); raw(); noecho(); nonl(); clear(); X windows_active = 1; X X} /* end of windows_start */ X X/*+------------------------------------------------------------------------- X windows_end(last_win) X--------------------------------------------------------------------------*/ Xvoid Xwindows_end(last_win) XWINDOW *last_win; X{ X if(last_win) X wrefresh(last_win); X/* X resetty(); X*/ X endwin(); X curmove(LINES - 1,0); X ttymode(ttymode_before_window_start); X windows_active = 0; X} /* end of windows_end */ X X/*+------------------------------------------------------------------------- X windows_end2() X--------------------------------------------------------------------------*/ Xvoid Xwindows_end2() X{ X endwin(); X ttymode(ttymode_before_window_start); X windows_active = 0; X} /* end of windows_end2 */ X X/*+------------------------------------------------------------------------- X windows_end_signal() -- called by hangup() X--------------------------------------------------------------------------*/ Xvoid Xwindows_end_signal() X{ X windows_end2(); X} /* end of windows_end_signal */ X X/*+------------------------------------------------------------------------- X winbox(win) X--------------------------------------------------------------------------*/ Xvoid Xwinbox(win) XWINDOW *win; X{ X X box(win,sVR,sHR); X wmove(win,0,0); waddch(win,(unsigned)sTL); X wmove(win,win->_maxy - 1,0); waddch(win,(unsigned)sBL); X wmove(win,win->_maxy - 1,win->_maxx - 1); waddch(win,(unsigned)sBR); X wmove(win,0,win->_maxx - 1); waddch(win,(unsigned)sTR); X X} /* end of winbox */ X X/*+------------------------------------------------------------------------- X window_setup(win) X--------------------------------------------------------------------------*/ Xvoid Xwindow_setup(win,title,title_x) XWINDOW *win; Xchar *title; X{ Xregister stand = (title_x < 0); X X if(stand) X title_x = -title_x; X X scrollok(win,0); /* do not scroll */ X winbox(win); X wmove(win,0,title_x); X if(stand) X wstandout(win); X waddch(win,'['); X wprintw(win," %s ",title); X waddch(win,']'); X if(stand) X wstandend(win); X} /* end of window_setup */ X X/*+------------------------------------------------------------------------- X window_create(title,title_x,tly,tlx,lines,cols) Xif title_x negative, make title "stand" out X--------------------------------------------------------------------------*/ XWINDOW * Xwindow_create(title,title_x,tly,tlx,lines,cols) Xchar *title; X{ Xregister WINDOW *nwin = newwin(lines,cols,tly,tlx); X X if(nwin) X window_setup(nwin,title,title_x); X return(nwin); X} /* end of window_create */ X X/*+------------------------------------------------------------------------- X wingets X numchars = wingets(win,y,x,buf,bufsize,&delim,edit) X XThis procedure reads a string from win and returns the number Xof characters read. -1 is returned if an abort is signaled by the Xkeyboard user. X--------------------------------------------------------------------------*/ Xint Xwingets(win,y,x,buf,bufsize,delim,edit) XWINDOW *win; Xint y; Xregister x; Xregister char *buf; Xint bufsize; /* includes room for null..field is 1 less */ Xregister uchar *delim; Xint edit; X{ Xregister count = 0; Xregister pos = 0; Xint insert_mode = 0; X X X bufsize--; X clear_area_char(win,y,x,bufsize,'_'); X if(edit) X { X waddstr(win,buf); X count = pos = strlen(buf); X } X else X *buf = 0; X wmove(win,y,x + pos); X X while(1) X { X wrefresh(win); X *delim = ttygetc(1); X if((*delim < 0x20) || (*delim >= 0x7F)) X { X switch(*delim) X { X case CR: X *delim = NL; X case NL: X wrefresh(win); X return(count); X X case BS: X if(count) X { X if(count == pos) X { X *(buf + --count) = 0; X wmove(win,y,x + count); X waddch(win,'_'); X wmove(win,y,x + count); X pos--; X } X else X { X if(!pos) X continue; X mem_cpy(buf + pos - 1,buf + pos,count - pos); X *(buf + --count) = 0; X wmove(win,y,x + --pos); X waddstr(win,buf + pos); X waddch(win,'_'); X wmove(win,y,x + pos); X } X } X continue; X X case XFcurlf: X if(pos) X wmove(win,y,x + --pos); X continue; X X case XFcurrt: X if(pos < count) X wmove(win,y,x + ++pos); X continue; X X case XFins: X insert_mode = !insert_mode; X continue; X X case ESC: X return(-1); X X case CTL_U: X clear_area_char(win,y,x,bufsize,'_'); X count = 0; X pos = 0; X continue; X X default: X wrefresh(win); X return(-1); X } /* end of switch(*delim) */ X /*NOTREACHED*/ X } /* end of if read delimiter */ X X if(count == bufsize) X continue; X X if(insert_mode && (pos != count)) X { X waddch(win,*delim); X waddstr(win,buf + pos); X mem_cpy(buf + pos + 1,buf + pos,count - pos); X *(buf + pos++) = *delim; X *(buf + ++count) = 0; X wmove(win,y,x + pos); X } X else X { X waddch(win,*delim); X *(buf + pos) = *delim; X if(pos == count) X *(buf + ++count) = 0; X pos++; X } X } /* end of while can get character */ X X} /* end of wingets */ X X/*+------------------------------------------------------------------------- X winget_single(win,nondelim_list,delim_list) X XThis procedure assumes cursor is positioned, repeats reading a non-echoing Xcharacter from the keyboard until it matches a character in nondelim_list Xor delim_list. delim_list is expected to contain printable characters Xand no upper-case characters. X XIf no match occurs, the bell is rung and the keyboard is read again. X XIf the input character matches a character in delim_list, the index (0-n) Xof the character in delim_list is returned. If a match occurs, an Xupper-case version of the matching character is placed in the window. X XIf the input character matches a character in nondelim_list, the character Xis returned or'ed with 0x1000 X X--------------------------------------------------------------------------*/ Xint Xwinget_single(win,nondelim_list,delim_list) XWINDOW *win; Xregister char *nondelim_list; Xregister char *delim_list; X{ Xregister itmp; Xregister nlen = strlen(nondelim_list); Xregister dlen = strlen(delim_list); Xregister ichar; X X wrefresh(win); X X while(1) X { X ichar = to_lower(ttygetc(1)); X for(itmp = 0; itmp < nlen; itmp++) X { X if(ichar == nondelim_list[itmp]) X { X waddch(win,to_upper(ichar)); X wrefresh(win); X return(itmp); X } X } X for(itmp = 0; itmp < dlen; itmp++) X { X if(ichar == delim_list[itmp]) X return(ichar | 0x1000); X } X ring_bell(); X } X X} /* end of winget_single */ X X/* end of ecuwinutil.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0507233390 ecuwinutil.c && chmod 0644 ecuwinutil.c || echo "restore of ecuwinutil.c failed" set `wc -c ecuwinutil.c`;Wc_c=$1 if test "$Wc_c" != "9038"; then echo original size 9038, current size $Wc_c fi # ============= ecuxenix.c ============== echo "x - extracting ecuxenix.c (Text)" sed 's/^X//' << 'SHAR_EOF' > ecuxenix.c && X/* CHK=0xA3B1 */ X/*+----------------------------------------------------------------- X ecuxenix.c -- very machine/OS dependent functions X wht%n4hgf@gatech.edu X X Defined functions: X morse_bell(xbell_type,count) X rename(from,to) X send_bell_fd(fd,count,nap_msec) X send_get_response(token,narg,arg) X set_bell_fd(fd,pitch,duration) X set_default_escape_prompt() X show_escape_prompt() X signal_name_text(sig) X xbell(type,count) X xbell_fd(fd,type,count) X bell_alarm(xbell_type) X bell_notify(xbell_type) X kbd_escape(xkey) X X This module is a grab bag for historical reasons. Needs reorg. X------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */ X/*:04-19-1990-14:56-wht@n4hgf-my GCC is uses XENIX libs/turn on rename for it */ X/*:04-19-1990-03:07-wht@n4hgf-GCC run found unused vars -- rm them */ X/*:04-17-1990-14:22-wht@n4hgf-add icmd_history_manager call */ X/*:03-27-1990-15:18-wht@n4hgf-overhaul for/wait/SIGCLD handling */ X/*:03-25-1990-14:11-wht@n4hgf------ x2.70 ------- */ X/*:03-23-1990-14:22-wht@n4hgf-add KACT_REDISPLAY processing */ X/*:02-15-1990-16:02-wht-another use for signal name text - slight change */ X/*:12-02-1989-17:11-wht-add UNIX-specific signal names to signal_name_text */ X/*:11-23-1989-02:48-wht-UNIX has a rename system call */ X/*:11-04-1989-03:23-wht-alt-a through alt-z automatic procedure execution */ X/*:10-15-1989-02:52-wht-move MORSE definition to Makefile */ X/*:10-14-1989-21:10-wht-allow user to change ecu color choices */ X/*:07-03-1989-22:57-wht------ x2.00 ----- */ X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */ X X#include "ecu.h" X#include "ecukey.h" X#include "ecufkey.h" X#include "ecuxkey.h" X#include "ecufork.h" X#include "esd.h" X X#if defined(MORSE) X/* the space between # and include defeats make depend from seeing this */ X# include X#endif X Xchar *get_ttyname(); X Xextern char curr_dir[]; /* current working key defns */ Xextern KDE keyset_table[]; Xextern char keyset_name[]; Xextern int want_bell_notify; /* want bell notify */ Xextern int rcvr_pid; Xextern int interrupt; X XESD *icmd_prompt; /* interactive command prompt */ Xint icmd_prompt_len; X X/*+------------------------------------------------------------------------- X show_escape_prompt() Xreturns number of character positions written to screen X--------------------------------------------------------------------------*/ Xshow_escape_prompt() X{ Xchar prompt_last; X X prompt_last = 'd'; /* dummy */ X if(icmd_prompt->cb) X prompt_last = *(icmd_prompt->pb + icmd_prompt->cb - 1); X X icmd_prompt_len = 0; X shmx_make_rcvr_sleep(1); X if(!(colors_current & 0xFFFF0000L) || !(colors_current & 0xFFFFL)) X setcolor(colors_normal); X stand_out(); X if(icmd_prompt->cb) X { X ff(se," %s",icmd_prompt->pb); X icmd_prompt_len += icmd_prompt->cb + 1; X } X if(isalnum(prompt_last)) X { X fputs(" %",se); X icmd_prompt_len += 2; X } X stand_end(); X fputc(' ',se); X icmd_prompt_len++; X fflush(so); X return(icmd_prompt_len); X X} /* end of show_escape_prompt */ X X/*+------------------------------------------------------------------------- X set_default_escape_prompt() X--------------------------------------------------------------------------*/ Xvoid Xset_default_escape_prompt() X{ Xregister char *cptr; Xchar *getenv(); X X if((cptr = getenv("ECUPROMPT")) != (char *)0) X { X strncpy(icmd_prompt->pb,cptr,icmd_prompt->maxcb); X *(icmd_prompt->pb + icmd_prompt->maxcb - 1) = 0; X icmd_prompt->cb = strlen(icmd_prompt->pb); X null_terminate_esd(icmd_prompt); X } X X} /* end of set_default_escape_prompt */ X X/*+------------------------------------------------------------------------- X kbd_escape() -- xmtr got extended key -- process it Xreturns(1) X--------------------------------------------------------------------------*/ Xkbd_escape(xkey) Xuchar xkey; X{ Xregister itmp; Xregister backspace_count; Xregister KDE *tkde; Xuchar icmd_buf[128]; X X if((xkey >= XF_ALTA) && (xkey <= XF_ALTZ)) X { X char alt_key_proc_name[8]; X char *arg = alt_key_proc_name; X int narg = 1; X int rcvr_alive = (rcvr_pid > 0); X sprintf(alt_key_proc_name,"alt_%c",xkey - XF_ALTA + 'a'); X if(rcvr_alive) X kill_rcvr_process(SIGUSR1); X ttymode(2); X ttyflush(0); X if(do_proc(narg,&arg)) X ring_bell(); X proc_file_reset(); X ttymode(1); X if(rcvr_alive) X start_rcvr_process(0); X return(1); X } X X switch(xkey) X { X case XFhome: /* home key pressed ? */ X backspace_count = show_escape_prompt(); XGET_ICMD: X ttygets(icmd_buf,sizeof(icmd_buf),2); X switch(icmd_buf[0]) X { X case XFhome: X case XFend: X case XFpgup: X case XFpgdn: X case XFcurup: X case XFcurdn: X if(icmd_history_manager(icmd_buf[0],icmd_buf,sizeof(icmd_buf))) X goto GET_ICMD; X } X if(!icmd_buf[0] || (icmd_buf[0] == ESC)) X { X while(backspace_count--) X ff(se,"\b \b"); X break; X } X if(icmd(icmd_buf)) X hangup(HANGUP_OK); X break; X X default: X if((itmp = xf_to_keyid(xkey)) < 0) X { X ring_bell(); X break; X } X tkde = &keyset_table[itmp]; X if((itmp = tkde->outcount) > 0) X { X register char *cptr = tkde->outstr; X while(itmp--) X lputc(*cptr++); X } X else if(tkde->outcount < 0) X { X switch(tkde->outcount) X { X case KACT_LOCAL_SHELL: X fputs("\r\n",se); X stand_out(); X ff(se," local shell in %s ",curr_dir); X stand_end(); X ff(se,"\r\n"); X shell("!"); X break; X case KACT_REDISPLAY: X redisplay_rcvr_screen(); X } X } X else X ring_bell(); X break; X } X return(1); X} /* end of kbd_escape */ X X/*+------------------------------------------------------------------------- X set_bell_fd(fd,pitch,duration) XExample: 1B 5B 3D 34 30 30 30 3B 31 42 | .[=4000;1B X--------------------------------------------------------------------------*/ Xvoid Xset_bell_fd(fd,pitch,duration) Xint fd; Xint pitch; Xint duration; X{ Xchar bell_cmd[32]; X sprintf(bell_cmd,"\033[=%d;%dB",pitch,duration); X write(fd,bell_cmd,strlen(bell_cmd)); X} /* end of set_bell_fd */ X X/*+------------------------------------------------------------------------- X send_bell_fd(fd,count,nap_msec) X--------------------------------------------------------------------------*/ Xvoid Xsend_bell_fd(fd,count,nap_msec) Xregister fd; Xregister count; Xregister nap_msec; X{ Xstatic char bellch = 0x07; X X if(count) X while(count--) X { X write(fd,&bellch,1); X nap((long)nap_msec); X } X} /* end of send_bell_fd */ X X/*+------------------------------------------------------------------------- X xbell_fd(fd,type,count) X--------------------------------------------------------------------------*/ Xvoid Xxbell_fd(fd,type,count) Xregister fd; Xregister type; Xregister count; X{ Xregister itmp; X X if(count) X while(count--) X { X switch(type) X { X case XBELL_DONE: /* octaves */ X set_bell_fd(fd,1000,1); X send_bell_fd(fd,1,100); X set_bell_fd(fd,2000,1); X send_bell_fd(fd,1,100); X set_bell_fd(fd,4000,1); X send_bell_fd(fd,1,100); X break; X case XBELL_ATTENTION: /* morse .-.-.- ATTENTION */ X for(itmp = 0; itmp < 3; itmp++) X { X set_bell_fd(fd,2000,1); X send_bell_fd(fd,1,140); X set_bell_fd(fd,2000,3); X send_bell_fd(fd,1,340); X } X break; X case XBELL_C: /* morse -.-. C */ X for(itmp = 0; itmp < 2; itmp++) X { X set_bell_fd(fd,2000,3); X send_bell_fd(fd,1,320); X set_bell_fd(fd,2000,1); X send_bell_fd(fd,1,120); X } X break; X case XBELL_3T: /* 3 morse T's */ X set_bell_fd(fd,2000,3); X send_bell_fd(fd,3,460); X break; X default: X set_bell_fd(fd,2000,4); X send_bell_fd(fd,1,100); X break; X } X } X X set_bell_fd(fd,4000,1); X X} /* end of xbell_fd */ X X/*+------------------------------------------------------------------------- X morse_bell(xbell_type,count) X--------------------------------------------------------------------------*/ X#if defined(MORSE) Xmorse_bell(xbell_type,count) Xint xbell_type; Xint count; X{ Xregister morse_fd; Xint morse_frequency = 600; Xchar morse_char; Xstatic int morse_ticks = 0; Xextern int errno; X X if(!morse_ticks) X { X char *hzstr; X char *getenv(); X int hz; X if(!(hzstr = getenv("HZ"))) X hz = 50; X else X hz = atoi(hzstr); X morse_ticks = hz / 25; X } X X if((morse_fd = open("/dev/morse",O_WRONLY,0)) < 0) X return(-1); X X ioctl(morse_fd,MORSE_SET_SPEED,&morse_ticks); X ioctl(morse_fd,MORSE_SET_FREQUENCY,&morse_frequency); X switch(xbell_type) X { X case XBELL_DONE: X morse_char = 'd'; X/* X morse_frequency = 400; X ioctl(morse_fd,MORSE_SET_FREQUENCY,&morse_frequency); X*/ X break; X case XBELL_ATTENTION: X morse_char = '.'; X break; X case XBELL_C: X morse_char = 'c'; X break; X case XBELL_3T: X morse_char = 'o'; X break; X default: X morse_char = BT; X break; X } X while(count--) X write(morse_fd,&morse_char,1); X close(morse_fd); X return(0); X} /* end of morse_bell */ X#endif X X/*+------------------------------------------------------------------------- X xbell(type,count) X--------------------------------------------------------------------------*/ Xvoid Xxbell(type,count) Xint type; Xint count; X{ X#if defined(MORSE) X if(morse_bell(type,count)) X#endif X xbell_fd(1,type,count); X} /* end of xbell */ X X/*+------------------------------------------------------------------------- X bell_alarm(xbell_type) X Under XENIX 2.2.1, ring bell on multiscreens; X if morse driver included, use it X--------------------------------------------------------------------------*/ Xint Xbell_alarm(xbell_type) Xint xbell_type; X{ Xregister notify_fd; Xregister fork_pid; Xstatic long notify_time = 0L; Xchar *ttname; Xchar devname[64]; Xint devnum; Xint ttnum; Xlong time(long *); X X/* if ECU from modem port or console in single-user mode, dont do it */ X/* 0123456789 */ X/* /dev/tty10 */ X/* /dev/tty1a */ X ttname = get_ttyname(); X if(!isdigit(ttname[strlen(ttname) - 1])) X return(0); X ttnum = atoi(ttname + 8); X X/* if happened less than 15 secs ago, forget it */ X if((time((long *)0) - notify_time) < 15L) X return(0); X X notify_time = time((long *)0); X X#if defined(MORSE) X if(morse_bell(xbell_type,1)) X { X#endif X if((fork_pid = fork()) != 0) X { X#if defined(FORK_DEBUG) X sprintf(devname,"DEBUG bell notify pid %d",fork_pid); X ecu_log_event(devname); /* bell notify */ X#endif X return(fork_pid > 0); X } X X for(devnum = 1; devnum < 13; devnum++) X { X if(devnum == ttnum) /* don't bell notify ecu's tty */ X continue; X sprintf(devname,"/dev/tty%02d",devnum); X if((notify_fd = open(devname,O_WRONLY,0)) >= 0) X { X xbell_fd(notify_fd,xbell_type,1); X close(notify_fd); X } X } X X _exit(0); /* end of child tine (of the fork, naturally) */ X#if defined(MORSE) X } X#endif X} /* end of bell_alarm */ X X/*+------------------------------------------------------------------------- X bell_notify(xbell_type) X--------------------------------------------------------------------------*/ Xvoid Xbell_notify(xbell_type) Xint xbell_type; X{ X X if(want_bell_notify) X bell_alarm(xbell_type); X X} /* end of bell_notify */ X X/*+------------------------------------------------------------------------- X signal_name_text(sig) X--------------------------------------------------------------------------*/ Xchar * Xsignal_name_text(sig) Xint sig; X{ Xregister char *cptr; Xstatic char sigunknown[20]; X X sig &= 0x7F; X switch(sig) X { X case SIGHUP: cptr = "SIGHUP"; break; X case SIGINT: cptr = "SIGINT"; break; X case SIGQUIT: cptr = "SIGQUIT"; break; X case SIGILL: cptr = "SIGILL"; break; X case SIGTRAP: cptr = "SIGTRAP"; break; X case SIGIOT: cptr = "SIGIOT"; break; X case SIGEMT: cptr = "SIGEMT"; break; X case SIGFPE: cptr = "SIGFPE"; break; X case SIGKILL: cptr = "SIGKILL"; break; X case SIGBUS: cptr = "SIGBUS"; break; X case SIGSEGV: cptr = "SIGSEGV"; break; X case SIGSYS: cptr = "SIGSYS"; break; X case SIGPIPE: cptr = "SIGPIPE"; break; X case SIGALRM: cptr = "SIGALRM"; break; X case SIGTERM: cptr = "SIGTERM"; break; X case SIGUSR1: cptr = "SIGUSR1"; break; X case SIGUSR2: cptr = "SIGUSR2"; break; X case SIGCLD: cptr = "SIGCLD"; break; X case SIGPWR: cptr = "SIGPWR"; break; X#if defined(M_UNIX) X case SIGSTOP: cptr = "SIGSTOP"; break; X case SIGTSTP: cptr = "SIGTSTP"; break; X case SIGCONT: cptr = "SIGCONT"; break; X case SIGTTIN: cptr = "SIGTTIN"; break; X case SIGTTOU: cptr = "SIGTTOU"; break; X#endif X default: X sprintf(sigunknown,"SIGNAL %u",sig); X return(sigunknown); X } X return(cptr); X X} /* end of signal_name_text */ X X/*+------------------------------------------------------------------------- X rename(from,to) X--------------------------------------------------------------------------*/ X#if !defined(M_UNIX) || defined(__GNUC__) Xrename(from,to) Xchar *from; Xchar *to; X{ Xstruct stat ss; Xextern int errno; X X if(stat(to,&ss) == 0) /* if to exists, flunk */ X { X errno = EEXIST; /* fake "file exists" error */ X return(-1); X } X if(link(from,to)) /* if cannot link, flunk */ X return(-1); X if(unlink(from)) /* if cannot unlink, flunk */ X return(-1); X return(0); X} /* end of rename */ X#endif X X/*+------------------------------------------------------------------------- X send_get_response(token,narg,arg) X--------------------------------------------------------------------------*/ Xvoid Xsend_get_response(token,narg,arg) Xint token; Xint narg; Xchar **arg; X{ Xregister itmp; Xregister char *cptr; Xint iarg; Xint mode = atoi(arg[1]); XLRWT lr; Xchar buf[1024]; XFILE *fplog; Xchar *fname = "ecu.sgr.log"; Xint rcvr_alive = (rcvr_pid > 0); X X if(narg < 3) X { X fputs(" usage: sgr mode cmd\r\n",se); X return; X } X if((fplog = fopen(fname,"a")) == NULL) X { X fputs("\r\n",se); X perror(fname); X fputs("\r\n",se); X return; X } X X mode &= 0x0F; X if(rcvr_alive) X kill_rcvr_process(SIGUSR1); X X lr.to1 = 10 * 1000L; X lr.to2 = 2 * 1000L; X lr.raw_flag = 0x80 + mode; /* allow interrupts */ X lr.buffer = buf; X lr.bufsize = sizeof(buf); X lr.delim = (char *)0; X lr.echo = 0; X interrupt = 0; X X fputs("\r\n",se); X X fprintf(fplog,"\nMode: %d ",mode); X fputs("Stimulus: ",fplog); X for(iarg = 2; iarg < narg; iarg++) X { X fputs(arg[iarg],fplog); X lputs_paced(20,arg[iarg]); X if(iarg != (narg - 1)) X { X fputc(' ',fplog); X lputc_paced(20,' '); X } X } X fputs("\nResponse: \n",fplog); X lputc_paced(20,'\r'); X X lgets_timeout(&lr); X itmp = lr.count; X cptr = strchr(buf,'\n') + 1; X itmp -= (int)(cptr - buf); X hex_dump_fp(fplog,cptr,itmp,(char *)0,1); X X itmp = lr.count; X cptr = buf; X while(itmp--) X { X if(*cptr == '\n') X fputc('\r',se); X fputc(*cptr++,se); X } X X fclose(fplog); X if(rcvr_alive) X start_rcvr_process(0); X} /* end of send_get_response */ X X/* end of ecuxenix.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 0509094990 ecuxenix.c && chmod 0644 ecuxenix.c || echo "restore of ecuxenix.c failed" set `wc -c ecuxenix.c`;Wc_c=$1 if test "$Wc_c" != "14488"; then echo original size 14488, current size $Wc_c fi echo "End of part 8, continue with part 9" exit 0