ecu - SCO XENIX V/{2,3}86 Extended CU part 02/47
Warren Tucker
wht at tridom.uucp
Mon Oct 9 07:41:31 AEST 1989
---- Cut Here and unpack ----
#!/bin/sh
# this is part 2 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file ecu.c continued
#
CurArch=2
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
exit 1; fi
( read Scheck
if test "$Scheck" != $CurArch
then echo "Please unpack part $Scheck next!"
exit 1;
else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file ecu.c"
sed 's/^X//' << 'SHAR_EOF' >> ecu.c
X else
X {
X choose_line(Lbaud);
X if(!Lline[0])
X {
X fprintf(se,"no line available at %u baud\r\n",Lbaud);
X hangup(HANGUP_LINE_OPEN_ERROR);
X }
X }
X }
X
X cptr = (char *)0;
X if(initial_procedure[0])
X {
X init_proc_argv[0] = initial_procedure;
X init_proc_argc = 1;
X for(iargv = 1; iargv < argc; iargv++)
X {
X if(*argv[iargv] != '-')
X {
X if(init_proc_argc == MAX_PARGV)
X {
X ff(se,"too many arguments to initial procedure\r\n");
X hangup(1);
X }
X init_proc_argv[init_proc_argc++] = argv[iargv];
X }
X }
X
X/* wierd bug fixed by this ... I know not why */
X windows_start();
X windows_end2();
X fflush(so);
X
X ttymode(2);
X if(do_proc(init_proc_argc,init_proc_argv))
X {
X if(quit_on_init_proc_fail)
X hangup(HANGUP_INIT_PROC_ERROR);
X }
X proc_file_reset();
X colors_save = current_colors;
X setcolor(0x07000800L); /* gray */
X fputs("[procedure finished]",se);
X setcolor(colors_save);
X ff(se,"\r\n");
X if(Liofd < 0)
X {
X ff(se,"\r\n");
X ff(se,"\r\n");
X stand_out();
X ff(se, " [no line attached by initial procedure] ");
X stand_end();
X ff(se,"\r\n");
X if(quit_on_init_proc_fail)
X hangup(HANGUP_INIT_PROC_ERROR);
X stand_out();
X ff(se, " [press ESC to exit or SPACE for setup menu ] ");
X stand_end();
X itmp = ttygetc(0);
X ff(se,"\r\n");
X if(itmp == ESC)
X hangup(1);
X ttymode(1);
X setup_screen((char *)0);
X }
X else
X {
X
X ttymode(1);
X start_rcvr_process(0);
X }
X }
X else /* no initial procedure */
X {
X cptr = (char *)0;
X for(iargv = 1; iargv < argc; iargv++)
X {
X if((*argv[iargv] != '-') || (strcmp(argv[iargv],"-") == 0))
X {
X cptr = argv[iargv];
X break;
X }
X }
X ttymode(1);
X setup_screen(cptr);
X }
X
X hangup(xmtr()); /* enter xmtr operation */
X /*NOTREACHED*/
X} /* end of main */
X
X/* end of ecu.c */
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
echo "File ecu.c is complete"
chmod 0644 ecu.c || echo "restore of ecu.c fails"
echo "x - extracting ecuLCK.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuLCK.c &&
X/* CHK=0xC002 */
X/*+-----------------------------------------------------------------------
X ecuLCK.c -- lock file management
X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X Defined functions:
X check_utmp()
X create_lock_file(lock_file_name)
X lock_tty()
X make_lock_name(ttyname,lock_file_name)
X other_lock_name(first_lock_name)
X unlock_tty()
X
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-30-1989-01:06-wht-ecuungetty interface SEEMS to be working now */
X/*:06-29-1989-00:42-wht-add ungetty handler */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "utmpstatus.h"
X
Xextern int errno;
Xextern char ungetty_ttyname[];
X
X/*+-------------------------------------------------------------------------
X check_utmp()
Xreturn 0 if line available, else LOPEN code
X--------------------------------------------------------------------------*/
Xint
Xcheck_utmp()
X{
Xregister ufd;
Xregister status = 0;
X
X switch(utmp_status(Lline))
X {
X case US_DIALOUT: /* enabled for login, currently dialout */
X status = LOPEN_DIALOUT_IN_USE;
X break;
X case US_LOGGEDIN: /* enabled for login, in use */
X status = LOPEN_ENABLED_IN_USE;
X break;
X case US_NOTFOUND: /* not in utmp, or getty dead */
X break;
X case US_LOGIN: /* enabled for login, idle */
X status = ungetty_get_line();
X break;
X }
X return(status);
X
X} /* end of check_utmp */
X
X/*+-------------------------------------------------------------------------
X make_lock_name(ttyname,lock_file_name)
X--------------------------------------------------------------------------*/
Xmake_lock_name(ttyname,lock_file_name)
Xchar *ttyname;
Xchar *lock_file_name;
X{
X
X if((ulindex(ttyname,"/dev/tty")) != 0)
X return(LOPEN_INVALID);
X
X strcpy(lock_file_name,"/usr/spool/uucp/LCK..");
X strcat(lock_file_name,ttyname + 5);
X return(0);
X
X} /* end of make_lock_name */
X
X/*+-----------------------------------------------------------------------
X line_locked(ttyname)
X
X Returns 1 if locked else 0
X------------------------------------------------------------------------*/
Xint
Xline_locked(ttyname)
Xchar *ttyname;
X{
Xint fd_lockf;
Xint status = 0;
Xint pid;
Xchar pidstr[20];
Xchar lock_file_name[64];
X
X make_lock_name(ttyname,lock_file_name);
X
X if((fd_lockf = open(lock_file_name,O_RDONLY,0)) >= 0)
X {
X if((read(fd_lockf,pidstr,11) == 11) &&
X (sscanf(pidstr,"%10d",&pid) == 1))
X {
X status = 1;
X if(kill(pid,0)) /* is owner pid already dead? */
X {
X if(errno == ESRCH) /* this error sez so */
X status = 0;
X }
X /* owner pid still active with lock */
X }
X }
X close(fd_lockf);
X return(status);
X} /* end of line_locked */
X
X/*+-----------------------------------------------------------------------
X create_lock_file()
X
X Returns 0 if lock file created,else error codes:
X LOPEN_ if error
X else pid of process currently busy on device
X------------------------------------------------------------------------*/
Xint
Xcreate_lock_file(lock_file_name)
Xchar *lock_file_name;
X{
Xregister itmp;
Xregister fd_lockf;
Xint pid;
Xchar pidstr[20];
Xint old_umask;
Xint erc = 0;
X
X old_umask = umask(0);
X
X if((fd_lockf = open(lock_file_name,O_CREAT | O_EXCL | O_RDWR,0666)) < 0)
X { /* file already exists */
X if((fd_lockf = open(lock_file_name,O_RDWR,0666)) < 0)
X {
X erc = LOPEN_LCKERR;
X goto RESTORE_UMASK;
X }
X else if(((itmp = read(fd_lockf,pidstr,11)) == 11) &&
X (sscanf(pidstr,"%10d",&pid) == 1))
X {
X if(kill(pid,0)) /* is owner pid already dead? */
X {
X if(errno == ESRCH) /* this error sez so */
X {
X pid = getpid(); /* so we will use it */
X lseek(fd_lockf,0L,0);
X sprintf(pidstr,"%10d\n",pid);
X write(fd_lockf,pidstr,11);
X close(fd_lockf);
X erc = 0;
X goto RESTORE_UMASK;
X }
X }
X /* owner pid still active with lock */
X close(fd_lockf);
X erc = pid; /* port is busy */
X goto RESTORE_UMASK;
X }
X else
X {
X close(fd_lockf);
X erc = LOPEN_UNKPID;
X goto RESTORE_UMASK;
X }
X }
X pid = getpid();
X sprintf(pidstr,"%10d\n",pid);
X write(fd_lockf,pidstr,11);
X
X#if defined(M_XENIX)
X close(fd_lockf);
X chmod(lock_file_name,0666);
X#else
X fchmod(fd_lockf,0666);
X close(fd_lockf);
X#endif
X
XRESTORE_UMASK:
X (void)umask(old_umask);
X return(erc);
X
X} /* end of create_lock_file */
X
X/*+-------------------------------------------------------------------------
X other_lock_name(first_lock_name)
X--------------------------------------------------------------------------*/
Xchar *
Xother_lock_name(first_lock_name)
Xchar *first_lock_name;
X{
Xregister itmp;
Xstatic char other_lock_name[64];
X
X strcpy(other_lock_name,first_lock_name);
X itmp = strlen(other_lock_name) - 1;
X if(islower(other_lock_name[itmp]))
X other_lock_name[itmp] = toupper(other_lock_name[itmp]);
X else if(isupper(other_lock_name[itmp]))
X other_lock_name[itmp] = tolower(other_lock_name[itmp]);
X
X return(other_lock_name);
X
X} /* end of other_lock_name */
X
X/*+-------------------------------------------------------------------------
X lock_tty()
X--------------------------------------------------------------------------*/
Xlock_tty()
X{
Xregister itmp;
X
X if(itmp = make_lock_name(Lline,LLCKname))
X return(itmp);
X
X if(itmp = check_utmp())
X return(itmp);
X
X if(!ungetty_ttyname[0])
X {
X if(itmp = create_lock_file(LLCKname))
X {
X ungetty_return_line();
X return(itmp);
X }
X }
X
X if(itmp = create_lock_file(other_lock_name(LLCKname)))
X {
X if(ungetty_ttyname[0])
X ungetty_return_line();
X else
X unlink(other_lock_name(LLCKname));
X unlink(LLCKname);
X LLCKname[0] = 0;
X return(itmp);
X }
X
X return(0);
X
X} /* end of lock_tty */
X
X/*+-----------------------------------------------------------------------
X void unlock_tty()
X------------------------------------------------------------------------*/
Xvoid
Xunlock_tty()
X{
X
X ungetty_return_line();
X
X if(LLCKname[0] == 0)
X return;
X
X unlink(LLCKname);
X unlink(other_lock_name(LLCKname));
X
X LLCKname[0] = 0;
X
X} /* end of unlock_tty */
X
X/* end of ecuLCK.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecuLCK.c || echo "restore of ecuLCK.c fails"
echo "x - extracting ecuchdir.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuchdir.c &&
X/* CHK=0x2265 */
X/*+-------------------------------------------------------------------------
X ecuchdir.c
X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X Defined functions:
X cd_array_delete(arg,narg)
X cd_array_delete_usage()
X cd_array_init()
X cd_array_read(arg,narg)
X cd_array_save(arg,narg)
X change_directory(cdarg,arg_present_flag)
X expand_dirname(dirname)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "ecukey.h"
X#include <pwd.h>
X
X#define CD_QUAN 44
X#define CD_PATHLEN 130
Xchar *cd_array[CD_QUAN];
Xuint cd_in_use = 0;
X
Xextern char curr_dir[]; /* current working directory */
Xextern int errno;
X
X/*+-------------------------------------------------------------------------
X cd_array_read(arg,narg)
X--------------------------------------------------------------------------*/
Xvoid
Xcd_array_read(arg,narg)
Xchar **arg;
Xint narg;
X{
Xchar dirpath[CD_PATHLEN];
XFILE *fpcd;
XFILE *fopen();
Xregister char *cptr;
Xregister itmp;
Xchar *skip_ld_break();
X
X get_home_dir(dirpath);
X strcat(dirpath,"/.ecu/dir");
X if((fpcd = fopen(dirpath,"r")) == (FILE *)0)
X return; /* none found */
X
X for(cd_in_use = 0; cd_in_use < CD_QUAN; cd_in_use++)
X {
X if(fgets(dirpath,sizeof(dirpath),fpcd) == (char *)0)
X break;
X dirpath[strlen(dirpath) - 1] = 0;
X cptr = skip_ld_break(dirpath);
X if(strlen(cptr) == 0)
X {
X --cd_in_use;
X continue;
X }
X strcpy(cd_array[cd_in_use],cptr);
X }
X fclose(fpcd);
X} /* end of cd_array_read */
X
X/*+-------------------------------------------------------------------------
X cd_array_save(arg,narg)
X--------------------------------------------------------------------------*/
Xvoid cd_array_save(arg,narg)
Xchar **arg;
Xint narg;
X{
Xregister icd;
Xchar savepath[256];
XFILE *fpcd;
XFILE *fopen();
X
X get_home_dir(savepath);
X strcat(savepath,"/.ecu/dir");
X
X if(cd_in_use == 0)
X {
X ff(se,"No directory list to save in %s\r\n",savepath);
X return;
X }
X if((fpcd = fopen(savepath,"w")) == (FILE *)0)
X {
X ff(se,"%s could not be opened\r\n",savepath);
X return;
X }
X
X for(icd = 0; icd < cd_in_use; icd++)
X fprintf(fpcd,"%s\n",cd_array[icd]);
X fclose(fpcd);
X ff(se,"%d entries saved in %s\r\n",cd_in_use,savepath);
X
X} /* end of cd_array_save */
X
X/*+-------------------------------------------------------------------------
X cd_array_delete_usage()
X--------------------------------------------------------------------------*/
Xvoid
Xcd_array_delete_usage()
X{
X ff(se,"usage del[ete] <1st> [<last>]\r\n");
X} /* end of cd_array_delete_usage */
X
X/*+-------------------------------------------------------------------------
X cd_array_delete(arg,narg)
X--------------------------------------------------------------------------*/
Xcd_array_delete(arg,narg)
Xchar **arg;
Xint narg;
X{
Xuint first; /* 1st to delete */
Xuint last; /* last to delete */
X
X if((narg < 2) || (narg > 3))
X {
X cd_array_delete_usage();
X return(-1);
X }
X
X first = atoi(arg[1]) - 1;
X if(narg == 2)
X last = first;
X else
X last = atoi(arg[2]) - 1;
X
X if((first > (cd_in_use - 1)) || (last > (cd_in_use - 1)) || (last < first))
X {
X cd_array_delete_usage();
X return(-1);
X }
X
X if(last == (cd_in_use - 1))
X {
X cd_in_use = first;
X }
X else
X {
X int count_less = last - first + 1;
X last++;
X while(last != cd_in_use)
X strcpy(cd_array[first++],cd_array[last++]);
X cd_in_use -= count_less;
X }
X return(0);
X} /* end of cd_array_delete */
X
X/*+-------------------------------------------------------------------------
X cd_array_init()
X--------------------------------------------------------------------------*/
Xcd_array_init()
X{
Xregister itmp;
Xchar *malloc();
X
X/*allocate change_ irectory stack */
X for(itmp = 0; itmp < CD_QUAN; itmp++)
X {
X if((cd_array[itmp] = malloc(CD_PATHLEN + 1)) == (char *)0)
X {
X ff(se,"Not enough memory for cd stack\r\n");
X exit(1);
X }
X *cd_array[itmp] = 0;
X }
X (void)cd_array_read(cd_array,0);
X} /* end of cd_array_init */
X
X/*+-------------------------------------------------------------------------
X expand_dirname(dirname) - convert dirnames with shell chars
X--------------------------------------------------------------------------*/
Xexpand_dirname(dirname,maxlen)
Xchar *dirname;
Xint maxlen;
X{
Xregister itmp;
Xregister char *cptr;
Xchar s256[256];
Xchar *expcmd;
X
X if(!find_shell_chars(dirname))
X return(0);
X
X sprintf(s256,"`ls -d %s`",dirname);
X if(expand_cmd_with_wildlist(s256,&expcmd))
X {
X ff(se,"No files match\r\n");
X return;
X }
X strncpy(dirname,expcmd,maxlen);
X dirname[maxlen - 1] = 0;
X free(expcmd);
X if(strchr(dirname,' '))
X {
X fputs("Too many files:\r\n",se);
X fputs(dirname,se);
X fputs("\r\n",se);
X return(-1);
X }
X return(0);
X
X} /* end of expand_dirname */
X
X/*+-------------------------------------------------------------------------
X change_directory(dirname,arg_present_flag)
X
X Change directory to 'dirname' if arg_present_flag is true,
X else if flag 0, ask for new directory name and change to it
X This procedure maintains the global variable 'curr_dir' that
X reflects the ecu transmitter and receiver process current
X working directory.
X--------------------------------------------------------------------------*/
Xchange_directory(cdarg,arg_present_flag)
Xchar *cdarg;
Xint arg_present_flag;
X{
Xregister icd;
Xregister itmp;
Xchar s130[130];
X#define ARG_MAX 5
Xchar *arg[ARG_MAX];
Xint narg;
Xint longest;
X
X if(cd_in_use == 0)
X cd_array_read(arg,0);
X
X fputs(" ",se);
X
X if(arg_present_flag) /* if there is an argument ... */
X {
X if(isdigit(*cdarg)) /* ... and first char is digit */
X {
X icd = atoi(cdarg) - 1;
X if(icd >= cd_in_use)
X goto DISPLAY_CD_ARRAY;
X strncpy(s130,cd_array[icd],sizeof(s130) - 1);
X }
X else
X strncpy(s130,cdarg,sizeof(s130) - 1); /* literal dir spec */
X
X s130[sizeof(s130) - 1] = 0;
X }
X else /* no arg to cd command */
X {
XDISPLAY_CD_ARRAY:
X fputs("\r\n",se);
X longest = 0;
X for(icd = 0; icd < CD_QUAN/2; icd++)
X {
X if(icd >= cd_in_use)
X break;
X if(longest < (itmp = strlen(cd_array[icd])))
X longest = itmp;
X }
X longest += 4;
X if(longest < 36)
X longest += 4;
X for(icd = 0; icd < CD_QUAN/2; icd++)
X {
X if(icd >= cd_in_use)
X break;
X sprintf(s130,"%2d %s ",icd + 1,cd_array[icd]);
X fputs(s130,se);
X if(icd + CD_QUAN/2 >= cd_in_use)
X fputs("\r\n",se);
X else
X {
X itmp = longest - strlen(s130);
X while(itmp-- > 0)
X fputc(' ',se);
X sprintf(s130,"%2d %s\r\n",
X icd + 1 + CD_QUAN/2,cd_array[icd + CD_QUAN/2]);
X fputs(s130,se);
X
X }
X }
X fputs("current dir: ",se);
X stand_out();
X ff(se," %s ",curr_dir);
X stand_end();
X eeol();
X fputs("\r\n",se);
X
XGET_NEW_DIR:
X fputs("New dir, <#>, %save, %read, %del, %xmitcd, <enter>: ",se);
X ttygets(s130,sizeof(s130),1);
X if( (s130[0] == ESC) || (strlen(s130) == 0) )
X {
X ff(se,"no directory change\r\n");
X return(0);
X }
X else if(s130[0] == '%')
X {
X build_str_array(s130,arg,ARG_MAX,&narg);
X
X if(minunique("save",&s130[1],1))
X {
X cd_array_save(arg,narg);
X goto GET_NEW_DIR;
X }
X else if(minunique("read",&s130[1],1))
X {
X cd_array_read(arg,narg);
X goto DISPLAY_CD_ARRAY;
X }
X else if(minunique("delete",&s130[1],1))
X {
X if(cd_array_delete(arg,narg))
X goto GET_NEW_DIR;
X else
X goto DISPLAY_CD_ARRAY;
X }
X else if(minunique("xmitcd",&s130[1],1))
X {
X lputs("cd ");
X lputs(curr_dir);
X lputc('\r');
X return(0);
X }
X else
X {
X ff(se,"Invalid cd subcommand\r\n");
X goto GET_NEW_DIR;
X }
X }
X else if(icd = atoi(s130))
X {
X icd--;
X if(icd >= cd_in_use)
X goto GET_NEW_DIR;
X strncpy(s130,cd_array[icd],sizeof(s130) - 1);
X s130[sizeof(s130) - 1] = 0;
X }
X }
X if(expand_dirname(s130,sizeof(s130)))
X return(-1);
X if(chdir(s130) < 0) /* now change to the new directory */
X {
X perror(s130); /* print error if we get one */
X ff(se,"\r\n");
X return(-1);
X }
X get_curr_dir(curr_dir,256);
X
X fputs("\r\nconfirmed: ",se);
X stand_out();
X ff(se," %s ",curr_dir);
X stand_end();
X fputs("\r\n",se);
X fflush(se);
X
X for(icd = 0; icd < cd_in_use; icd++)
X {
X if(strcmp(curr_dir,cd_array[icd]) == 0)
X return(0);
X }
X if(cd_in_use == CD_QUAN)
X {
X for(icd = 1; icd < CD_QUAN; icd++)
X {
X strcpy(cd_array[icd - 1],cd_array[icd]);
X }
X strcpy(cd_array[CD_QUAN - 1],curr_dir);
X }
X else
X strcpy(cd_array[cd_in_use++],curr_dir);
X
X return(0);
X
X} /* end of change_directory */
X/* end of ecuchdir.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecuchdir.c || echo "restore of ecuchdir.c fails"
echo "x - extracting ecudump.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecudump.c &&
X/* CHK=0x89CA */
X/*+-----------------------------------------------------------------------
X ecudump.c -- very generic hex/graphics dump development aid
X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X Defined functions:
X hex_dump(str,len,title,terse_flag)
X hex_dump_fp(fp,str,len,title,terse_flag)
X hex_dump16(int16)
X hex_dump32(int32)
X hex_dump4(int4)
X hex_dump8(int8)
X
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-27-1989-15:49-wht-fix too many hyphens on odd-length titles */
X/*:07-11-1989-16:52-wht-no carriage returns output if dumpfp != stderr */
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X
Xstatic FILE *dumpfp;
X
X#define dump_putc(ch) fputc((ch),dumpfp)
X#define dump_puts(str) fputs(str,dumpfp)
X
X/*+-----------------------------------------------------------------------
X hex_dump#... subservient routines
X------------------------------------------------------------------------*/
Xvoid hex_dump4(int4)
Xuchar int4;
X{
X int4 &= 15;
X dump_putc((int4 >= 10) ? (int4 + 'A' - 10) : (int4 + '0'));
X}
X
Xvoid hex_dump8(int8)
Xuchar int8;
X{
X hex_dump4(int8 >> 4);
X hex_dump4(int8);
X}
X
Xvoid hex_dump16(int16)
Xushort int16;
X{
X hex_dump8(int16 >> 8);
X hex_dump8(int16);
X}
X
Xvoid hex_dump32(int32)
Xulong int32;
X{
X hex_dump16(int32 >> 16);
X hex_dump16(int32);
X}
X
X
X/*+-----------------------------------------------------------------
X hex_dump_fp(fp,str,len,title,terse_flag)
X
X if 'title' not NULL, title is printed... 'terse_flag'
X controls whether or not the title is "conspicuous" with
X hyphens before and after it making title line >70 chars long
X------------------------------------------------------------------*/
Xvoid
Xhex_dump_fp(fp,str,len,title,terse_flag)
XFILE *fp;
Xchar *str;
Xint len;
Xchar *title;
Xint terse_flag;
X{
Xint istr;
Xregister ipos;
Xregister itmp;
X
X dumpfp = fp;
X
X if(title && (istr = strlen(title)))
X {
X if(!terse_flag)
X {
X ipos = (73 - istr) / 2;
X itmp = ipos;
X while(itmp--)
X dump_putc('-');
X dump_putc(' ');
X if(istr & 1)
X ipos--;
X }
X dump_puts(title);
X if(!terse_flag)
X {
X dump_putc(' ');
X while(ipos--)
X dump_putc('-');
X }
X if(dumpfp == se)
X dump_puts("\r\n");
X else
X dump_puts("\n");
X
X }
X
X istr = 0;
X while(istr < len)
X {
X hex_dump16(istr);
X dump_putc(' ');
X for(itmp = 0; itmp < 16; ++itmp)
X {
X ipos = istr + itmp;
X if(ipos >= len)
X {
X if(!terse_flag)
X dump_puts(" ");
X continue;
X }
X dump_putc(' ');
X hex_dump8(str[ipos]);
X }
X dump_puts(" | ");
X for(itmp = 0; itmp < 16; ++itmp)
X {
X ipos = istr + itmp;
X if( (ipos) >= len)
X {
X if(!terse_flag)
X dump_putc(' ');
X }
X else
X {
X dump_putc((str[ipos] >= ' ' && str[ipos] < 0x7f)
X ? str[ipos] : '.' );
X }
X }
X if(dumpfp == se)
X dump_puts(" |\r\n");
X else
X dump_puts(" |\n");
X istr += 16;
X } /* end of while(istr < len) */
X
X} /* end of hex_dump_fp */
X
X/*+-------------------------------------------------------------------------
X hex_dump(str,len,title,terse_flag)
X--------------------------------------------------------------------------*/
Xvoid
Xhex_dump(str,len,title,terse_flag)
Xchar *str;
Xint len;
Xchar *title;
Xint terse_flag;
X{
X hex_dump_fp(se,str,len,title,terse_flag);
X} /* end of hex_dump_fp */
X/* end of ecudump.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecudump.c || echo "restore of ecudump.c fails"
echo "x - extracting ecufinsert.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecufinsert.c &&
X/* CHK=0x291F */
X#define USE_XON_XOFF
X/*+-------------------------------------------------------------------------
X ecufinsert.c -- insert file onto comm line
X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X Defined functions:
X file_insert_to_line(fname,arg_present_flag)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-27-1989-20:32-wht-allow wildcard spec or squiggle dir ref */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "ecukey.h"
X
Xextern int interrupt;
Xextern char kbdintr; /* current input INTR */
X
X/*+-------------------------------------------------------------------------
X expand_filename(fname) - convert fnames with shell chars
X--------------------------------------------------------------------------*/
Xexpand_filename(fname,maxlen)
Xchar *fname;
Xint maxlen;
X{
Xregister itmp;
Xregister char *cptr;
Xchar s256[256];
Xchar *expcmd;
X
X if(!find_shell_chars(fname))
X return(0);
X
X sprintf(s256,"`ls %s`",fname);
X if(expand_cmd_with_wildlist(s256,&expcmd))
X {
X ff(se,"\r\nNo files match\r\n");
X return;
X }
X strncpy(fname,expcmd,maxlen);
X fname[maxlen - 1] = 0;
X if(strchr(expcmd,' '))
X {
X fputs("\r\nToo many files:\r\n",se);
X fputs(expcmd,se);
X fputs("\r\n",se);
X free(expcmd);
X return(-1);
X }
X free(expcmd);
X return(0);
X
X} /* end of expand_filename */
X
X/*+-------------------------------------------------------------------------
X file_insert_to_line(narg,arg)
X--------------------------------------------------------------------------*/
Xfile_insert_to_line(narg,arg)
Xint narg;
Xchar **arg;
X{
Xchar insert_fname[128];
Xchar file_string[512];
Xchar response[8];
Xint single_flag;
Xint old_ttymode = get_ttymode();
XFILE *fopen();
XFILE *fp;
Xlong total_chars = 0L;
Xlong total_lines = 0L;
X#ifdef USE_XON_XOFF
Xint ixon;
Xint ixoff;
X#endif
X
X if(narg > 1)
X strncpy(insert_fname,arg[1],sizeof(insert_fname));
X else
X {
X ff(se,"\r\n--> File to insert on comm line: ");
X ttygets(insert_fname,sizeof(insert_fname),1);
X if( (insert_fname[0] == ESC) || (strlen(insert_fname) == 0) )
X {
X ff(se,"--> no transmission\r\n");
X return(0);
X }
X }
X if(expand_filename(insert_fname,sizeof(insert_fname)))
X return(-1);
X if((fp = fopen(insert_fname,"r")) == (FILE *)0)
X {
X ff(se,"--> ");
X perror(insert_fname); /* print error if we get one */
X ff(se,"\r\n");
X return(-1);
X }
X
X if(narg > 1)
X ff(se,"\r\n");
X
X if(narg > 2)
X response[0] = *arg[2];
X else
X {
X ff(se,"--> (S)ingle line at a time or (F)ull speed transmission: ");
X ttygets(response,sizeof(response),1);
X }
X single_flag = (to_lower(response[0]) == 's') ? 1 : 0;
X if((single_flag == 0) && (to_lower(response[0]) != 'f'))
X {
X ff(se,"--> file insertion abandoned\r\n");
X fclose(fp);
X return(0);
X }
X
X if(single_flag)
X ff(se,"--> press [space] to continue or 's' for stop\r\n");
X else
X {
X ttymode(2);
X ff(se,"--> press %s to abort\r\n",make_char_graphic(kbdintr,0));
X }
X
X#ifdef USE_XON_XOFF
X lget_xon_xoff(&ixon,&ixoff); /* get current line xon/xoff status */
X lxon_xoff(IXON | IXOFF); /* set it for us */
X#endif
X
X while( fgets(file_string,sizeof(file_string),fp) != NULL)
X {
X file_string[strlen(file_string) - 1] = 0;
X total_chars += strlen(file_string);
X total_lines++;
X if(strlen(file_string) == 0) /* some destinations do not */
X lputc(' '); /* like completely blank lines */
X else
X lputs(file_string);
X lputc('\r');
X if(interrupt)
X {
X interrupt = 0;
X ff(se,"--> Interrupted\r\n");
X break;
X }
X if(single_flag)
X {
X response[0] = ttygetc(0);
X if(to_lower(response[0]) == 's')
X break;
X }
X else
X nap(60L);
X }
X
X ttymode(old_ttymode); /* restore old console mode */
X#ifdef USE_XON_XOFF
X lxon_xoff(ixon | ixoff); /* restore old line xon/xoff status */
X#endif
X fclose(fp);
X
X ff(se,"\r\n--> sent %ld lines, %ld characters\r\n",
X total_lines,total_chars);
X return(0);
X
X} /* end of file_insert_to_line */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecufinsert.c || echo "restore of ecufinsert.c fails"
echo "x - extracting ecufkey.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecufkey.c &&
X/* CHK=0xFCA6 */
X/*+-----------------------------------------------------------------
X ecufkey.c -- XENIX function key definition
X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X Defined functions:
X keyset_display()
X keyset_idnum(keystr)
X keyset_idstr(keyid)
X keyset_init()
X keyset_read(keyset_name)
X xf_to_keyid(xf)
X
X------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#if defined(M_XENIX) /* the entire module is bound by this cond. compile */
X#include "ecu.h"
X#include "ecukey.h"
X#include "ecufkey.h"
X#include "ecuxkey.h"
X#include "ecufork.h"
X
Xextern char kbdintr; /* current input INTR */
Xextern char curr_dir[]; /* current working key defns */
X
XKDE keyset_table[KDE_COUNT];
Xchar keyset_name[32] = "";
X
XXF_KDE_NAME xf_kde_name[] =
X{
X { XFcurup, KDE_CUU, "CUU" },
X { XFcurdn, KDE_CUD, "CUD" },
X { XFcurrt, KDE_CUR, "CUR" },
X { XFcurlf, KDE_CUL, "CUL" },
X { XFcur5, KDE_CU5, "CU5" },
X { XFend, KDE_END, "END" },
X { XFpgdn, KDE_PGDN, "PGDN" },
X { XFhome, KDE_HOME, "HOME" },
X { XFpgup, KDE_PGUP, "PGUP" },
X { XFins, KDE_INS, "INS" },
X { XF1, KDE_F1, "F1" },
X { XF2, KDE_F2, "F2" },
X { XF3, KDE_F3, "F3" },
X { XF4, KDE_F4, "F4" },
X { XF5, KDE_F5, "F5" },
X { XF6, KDE_F6, "F6" },
X { XF7, KDE_F7, "F7" },
X { XF8, KDE_F8, "F8" },
X { XF9, KDE_F9, "F9" },
X { XF10, KDE_F10, "F10" },
X { XF11, KDE_F11, "F11" },
X { XF12, KDE_F12, "F12" },
X { XFbktab, KDE_BKTAB, "BKTAB" },
X { 0,0,"" }
X};
X
X/*+-------------------------------------------------------------------------
X keyset_init()
X--------------------------------------------------------------------------*/
Xvoid
Xkeyset_init()
X{
Xregister itmp;
Xregister KDE *tkde;
Xchar *make_char_graphic();
X
X for(itmp = 0; itmp < KDE_COUNT; itmp++)
X {
X tkde = &keyset_table[itmp];
X tkde->logical[0] = 0;
X tkde->outcount = 0;
X tkde->keyid = (uchar)itmp;
X }
X
X keyset_name[0] = 0;
X
X tkde = &keyset_table[KDE_END];
X strcpy(tkde->logical,
X (kbdintr == 0x7F) ? "DEL" : make_char_graphic(kbdintr,0));
X tkde->outstr[0] = kbdintr;
X tkde->outcount = 1;
X
X tkde = &keyset_table[KDE_HOME];
X strcpy(tkde->logical,"ecu cmd");
X tkde->outcount = KACT_COMMAND;
X
X tkde = &keyset_table[KDE_INS];
X strcpy(tkde->logical,"local shell");
X tkde->outcount = KACT_LOCAL_SHELL;
X
X tkde = &keyset_table[KDE_CU5];
X strcpy(tkde->logical,"Screen dump");
X tkde->outstr[0] = 0x7F;
X tkde->outcount = 1;
X
X} /* end of keyset_init */
X
X/*+-------------------------------------------------------------------------
X keyset_idnum(keystr)
X--------------------------------------------------------------------------*/
Xkeyset_idnum(keystr)
Xchar *keystr;
X{
Xstruct XF_KDE_NAME *xkn = xf_kde_name;
X while(xkn->xf != 0)
X {
X if(strcmp(xkn->name,keystr) == 0)
X return((int)xkn->kde);
X xkn++;
X }
X return(-1);
X} /* end of keyset_idnum */
X
X/*+-------------------------------------------------------------------------
X keyset_idstr(keyid)
X--------------------------------------------------------------------------*/
Xchar *
Xkeyset_idstr(keyid)
Xint keyid;
X{
Xstruct XF_KDE_NAME *xkn = xf_kde_name;
X while(xkn->xf != 0)
X {
X if((int)xkn->kde == keyid)
X return(xkn->name);
X xkn++;
X }
X return((char *)0);
X} /* end of keyset_idstr */
X
X/*+-------------------------------------------------------------------------
X xf_to_keyid(xf)
X--------------------------------------------------------------------------*/
SHAR_EOF
echo "End of part 2"
echo "File ecufkey.c is continued in part 3"
echo "3" > s2_seq_.tmp
exit 0
--
-------------------------------------------------------------------
Warren Tucker, Tridom Corporation ...!gatech!emory!tridom!wht
Ker-au'-lo-phon. An 8-foot partial flue-stop, having metal pipes
surmounted by adjustable rings, and with a hole bored near the top
of each pipe, producing a soft and "reedy" tone.
More information about the Alt.sources
mailing list