From decwrl!ucbvax!ucsd!swrinde!cs.utexas.edu!uunet!allbery Wed May 16 09:18:29 PDT 1990 Article 1545 of comp.sources.misc: Path: decwrl!ucbvax!ucsd!swrinde!cs.utexas.edu!uunet!allbery From: wht%n4hgf@gatech.edu (Warren Tucker) Newsgroups: comp.sources.misc Subject: v12i065: ECU 2.80 part 12/29 Message-ID: <88368@uunet.UU.NET> Date: 12 May 90 01:59:59 GMT Sender: allbery@uunet.UU.NET Lines: 2271 Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Posting-number: Volume 12, Issue 65 Submitted-by: wht%n4hgf@gatech.edu (Warren Tucker) Archive-name: ecu2.80/part12 ---- Cut Here and unpack ---- #!/bin/sh # This is part 12 of ecu280 if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= pcmd.c ============== echo "x - extracting pcmd.c (Text)" sed 's/^X//' << 'SHAR_EOF' > pcmd.c && X/* CHK=0xC504 */ X/*+------------------------------------------------------------------------- X pcmd.c - ecu procedure commands X wht%n4hgf@gatech.edu X X Defined functions: X cmd_baud(param) X cmd_cd(param) X cmd_clrx(param) X cmd_dial(param) X cmd_duplex(param) X cmd_echo(param) X cmd_exit(param) X cmd_flush(param) X cmd_hangup(param) X cmd_hexdump(param) X cmd_lbreak(param) X cmd_lgets(param) X cmd_logevent(param) X cmd_lookfor(param) X cmd_nap(param) X cmd_parity(param) X cmd_prompt(param) X cmd_ptrace(param) X cmd_send(param) X cmd_set(param) X cmd_system(param) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */ X/*:04-19-1990-03:08-wht@n4hgf-GCC run found unused vars -- rm them */ X/*:04-08-1990-19:15-wht@n4hgf-use new auto_create option on get_?vptr */ 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-25-1990-12:33-wht@n4hgf-allow whole spec for int vars in cmd_getf */ X/*:03-24-1990-19:01-wht@n4hgf-use auto_create switch on find_mkv routines */ X/*:03-12-1990-04:42-wht@n4hgf-add cmd_rname */ X/*:03-11-1990-13:09-wht@n4hgf-hangup command now returns 0 if no line */ X/*:02-25-1990-02:59-wht-add -m switch to nap command */ X/*:11-20-1989-16:05-wht-add cmd_getf and unimplemented cmd_putf */ X/*:11-04-1989-06:21-wht-use make_char_graphic when tracing svar assignment */ X/*:10-14-1989-21:10-wht-allow user to change ecu color choices */ X/*:07-27-1989-15:33-wht-was not freeing delimiter esd in cmd_lgets */ 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 "ecuerror.h" X#include "ecuhangup.h" X#include "ecukey.h" X#include "esd.h" X#include "var.h" X#include "proc.h" X Xchar *strchr(); X Xextern int proctrace; Xextern int rcvr_pid; Xextern ulong colors_current; X X/*+------------------------------------------------------------------------- X cmd_baud(param) X--------------------------------------------------------------------------*/ Xint Xcmd_baud(param) XESD *param; X{ Xlong new_baud; Xint erc; X X if(shm->Liofd < 0) X return(eNoLineAttached); X X if(erc = gint(param,&new_baud)) X return(erc); X if(!valid_baud_rate((uint)new_baud)) X { X pprintf("invalid baud rate: %lu\n",new_baud); X return(eFATAL_ALREADY); X } X shm->Lbaud = (uint)new_baud; X lset_baud_rate(1); X if(proctrace) X { X pprintf("baud rate set to %u\n",shm->Lbaud); X } X return(0); X X} /* end of cmd_baud */ X X/*+------------------------------------------------------------------------- X cmd_cd(param) X--------------------------------------------------------------------------*/ Xint Xcmd_cd(param) XESD *param; X{ Xint erc; XESD *tesd = make_esd(256); Xextern char curr_dir[]; /* current working directory */ X X if(!tesd) X return(eNoMemory); X if(erc = gstr(param,tesd)) X goto RETURN; X if(expand_dirname(tesd->pb,tesd->maxcb)) X { X param->index = param->old_index; X erc = eFATAL_ALREADY; X goto RETURN; X } X if(chdir(tesd->pb) < 0) /* now change to the new directory */ X { X pperror(tesd->pb); /* print error if we get one */ X pputs("\n"); X erc = eFATAL_ALREADY; X goto RETURN; X } X get_curr_dir(curr_dir,256); X XRETURN: X free_esd(tesd); X return(erc); X} /* end of cmd_cd */ X X/*+------------------------------------------------------------------------- X cmd_clrx(param) X--------------------------------------------------------------------------*/ Xint Xcmd_clrx(param) XESD *param; X{ X if(shm->Liofd < 0) X return(eNoLineAttached); X X lclear_xmtr_xoff(); X if(proctrace) X pputs("transmitter XOFF cleared\n"); X return(0); X} /* end of cmd_clrx */ X X/*+------------------------------------------------------------------------- X cmd_dial(param) X X hayes_dial does the following: X sets I0 to 0==connect, X 1==failed to connect, X 2==interrupted, X 3==modem error X sets S0 to modem result code X--------------------------------------------------------------------------*/ Xint Xcmd_dial(param) XESD *param; X{ Xint erc; XESD *tesd = (ESD *)0; X X if(shm->Lmodem_off_hook) X { X pputs("Already off hook\n"); X return(eFATAL_ALREADY); X } X if(!(tesd = make_esd(64))) X return(eNoMemory); X if(erc = gstr(param,tesd)) X { X free_esd(tesd); X return(erc); X } X strcpy(shm->Llogical,tesd->pb); X lclear_xmtr_xoff(); X if(lookup_logical_telno()) X (void)hayes_dial(); X else X { X pprintf("No such entry: %s\n",tesd->pb); X erc = eFATAL_ALREADY; X } X X if(!erc && (shm->Liofd < 0)) X erc = eNoLineAttached; X X free_esd(tesd); X X return(erc); X} /* end of cmd_dial */ X X/*+------------------------------------------------------------------------- X cmd_duplex(param) Xduplex [f | h] Xduplex ['f' | 'h'] Xduplex 0 == half, non-0 == full X--------------------------------------------------------------------------*/ Xint Xcmd_duplex(param) XESD *param; X{ Xint erc; Xint new_duplex; XESD *tesd; X X if(erc = skip_cmd_break(param)) X return(erc); X if(!(tesd = make_esd(64))) X return(eNoMemory); X erc = gstr(param,tesd); X new_duplex = to_upper((erc) ? param->pb[param->index] : *tesd->pb); X free_esd(tesd); X X switch(new_duplex) X { X case 'f': X shm->Lfull_duplex = 1; X break; X case 'h': X shm->Lfull_duplex = 0; X break; X default: X erc = eBadParameter; X } X if(proctrace && !erc) X pprintf("duplex set to %s\n",(shm->Lfull_duplex) ? "full" : "half"); X return(erc); X X} /* end of cmd_duplex */ X X/*+------------------------------------------------------------------------- X cmd_echo(param) Xecho [-n] X--------------------------------------------------------------------------*/ Xint Xcmd_echo(param) XESD *param; X{ Xint erc; XESD *tesd; Xchar switches[8]; X X if((tesd = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X get_switches(param,switches,sizeof(switches)); X X if(erc = gstr(param,tesd)) X { X free_esd(tesd); X return(erc); X } X pputs(tesd->pb); X if(!strchr(switches,'n')) /* if no -n */ X pputs("\n"); X free_esd(tesd); X return(0); X X} /* end of cmd_echo */ X X/*+------------------------------------------------------------------------- X cmd_exit(param) X--------------------------------------------------------------------------*/ Xint Xcmd_exit(param) XESD *param; X{ Xlong int1; Xulong colors_at_entry = colors_current; X X if(!gint(param,&int1) && int1) X { X setcolor(colors_error); X pprintf("[procedure exiting ecu: user code %ld]\n",int1); X setcolor(colors_at_entry); X hangup(HANGUP_INIT_PROC_ERROR+(int)(int1 & 0x1F)); X } X setcolor(colors_notify); X pputs("[procedure exiting ecu: normal exit]\n"); X setcolor(colors_at_entry); X hangup(0); X} /* end of cmd_exit */ X X/*+------------------------------------------------------------------------- X cmd_lgets(param) X Xlgets [-er] [] X Xread string into string variable number Xwaiting 1/10th secs for first char, Xwaiting 1/10th secs for subsequent chars, Xoptionally terminating read upon detection of X-e echos to screen X-r completely raw, else strip CRs & NLs from either end of string X$i0 receives the length of the read X receives the string X--------------------------------------------------------------------------*/ Xint Xcmd_lgets(param) XESD *param; X{ Xint erc; Xlong int2; Xlong int3; XESD *tesd1 = (ESD *)0; XESD *svptr; XLRWT lr; Xchar switches[8]; XESD *make_esd(); Xchar ctmp; X X if(shm->Liofd < 0) X return(eNoLineAttached); X X get_switches(param,switches,sizeof(switches)); X X skip_cmd_char(param,'$'); X if(erc = get_cmd_char(param,&ctmp)) X return(erc); X if(to_lower(ctmp) != 's') X return(eIllegalVarType); X if(erc = get_svptr(param,&svptr,1)) X return(erc); X X if(erc = gint(param,&int2)) X return(erc); X X if(erc = gint(param,&int3)) X return(erc); X X if((tesd1 = make_esd(64)) == (ESD *)0) X return(eNoMemory); X if(gstr(param,tesd1)) /* optional delimiter */ X { X free_esd(tesd1); X tesd1 = (ESD *)0; X } X X zero_esd(svptr); X X lr.to1 = int2 * 100L; X lr.to2 = int3 * 100L; X /* allow interrupts + raw read per -r */ X lr.raw_flag = (strchr(switches,'r')) ? 0x81 : 0x80; X lr.buffer = svptr->pb; X lr.bufsize = svptr->maxcb; X lr.delim = (tesd1) ? tesd1->pb : (char *)0; X lr.echo = (strchr(switches,'e') != (char *)0); X (void)lgets_timeout(&lr); X if(tesd1) X free_esd(tesd1); X X svptr->cb = lr.count; X null_terminate_esd(svptr); X iv[0] = (long)lr.count; X if(proctrace) X pprintf("lgets read %d chars\n",lr.count); X return(0); X X} /* end of cmd_lgets */ X X/*+------------------------------------------------------------------------- X cmd_flush(param) X--------------------------------------------------------------------------*/ Xint Xcmd_flush(param) XESD *param; X{ X if(shm->Liofd < 0) X return(eNoLineAttached); X X lflush(2); X if(proctrace) X pputs("line flushed\n"); X return(0); X} /* end of cmd_flush */ X X/*+------------------------------------------------------------------------- X cmd_hangup(param) X--------------------------------------------------------------------------*/ Xint Xcmd_hangup(param) XESD *param; X{ X if(shm->Liofd < 0) X { X if(proctrace) X pputs("no line attached ... hangup ignored\n"); X hayes_modem_on_hook(); X return(0); X } X X if(proctrace) X pputs("hanging up ... "); X hayes_ATH(); X if(proctrace) X pputs("line on hook\n"); X return(0); X} /* end of cmd_hangup */ X X/*+------------------------------------------------------------------------- X cmd_hexdump(param) X Xhexdump [-s] Xhexdump -t[s] X buf to dump X title (if -t) X-s short (terse) dump X--------------------------------------------------------------------------*/ Xint Xcmd_hexdump(param) XESD *param; X{ Xint erc; XESD *title = (ESD *)0; XESD *buf; Xchar switches[8]; Xextern FILE *plog_fp; X X if((buf = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X get_switches(param,switches,sizeof(switches)); X X if(strchr(switches,'t')) /* if -t */ X { X if((title = make_esd(256)) == (ESD *)0) X { X erc = eNoMemory; X goto RETURN; X } X if(erc = gstr(param,title)) X goto RETURN; X } X X if(erc = gstr(param,buf)) X goto RETURN; X X hex_dump(buf->pb,buf->cb,(title) ? title->pb : "", X (strchr(switches,'s')) ? 1 : 0); X X if(plog_fp) X hex_dump_fp(plog_fp,buf->pb,buf->cb,(title) ? title->pb : "", X (strchr(switches,'s')) ? 1 : 0); X XRETURN: X free_esd(buf); X if(title) X free_esd(title); X return(erc); X X} /* end of cmd_hexdump */ X X/*+------------------------------------------------------------------------- X cmd_lbreak(param) X--------------------------------------------------------------------------*/ Xint Xcmd_lbreak(param) XESD *param; X{ X if(shm->Liofd < 0) X return(eNoLineAttached); X X lbreak(); X return(0); X} /* end of cmd_lbreak */ X X/*+------------------------------------------------------------------------- X cmd_logevent(param) X Xlogevent 'cmd' X--------------------------------------------------------------------------*/ Xint Xcmd_logevent(param) XESD *param; X{ Xint erc; XESD *eventstr; Xextern int last_child_wait_status; Xchar switches[8]; X X if((eventstr = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X get_switches(param,switches,sizeof(switches)); X X/* a hack */ X strcpy(eventstr->pb,"PROC "); X eventstr->pb += 5; X eventstr->maxcb -= 5; X X if(erc = gstr(param,eventstr)) X { X eventstr->pb -= 5; /* be nice */ X eventstr->maxcb += 5; /* or surely this will haunt us one day */ X free_esd(eventstr); X return(erc); X } X X/* rehack */ X eventstr->pb -= 5; X eventstr->maxcb += 5; X eventstr->cb += 5; X X ecu_log_event(eventstr->pb); X free_esd(eventstr); X return(0); X X} /* end of eventstr_logevent */ X X/*+------------------------------------------------------------------------- X cmd_lookfor(param) X Xlookfor [-e] [quiet | ] [] X X-e echo to screen while looking Xquiet means look for quiet X means look for string X number 1/10ths secs (default 5.0 second) for timeout X Xin case of lookfor , $i0 plugged 1 if found, else 0 X--------------------------------------------------------------------------*/ Xint Xcmd_lookfor(param) XESD *param; X{ Xint erc; Xchar switches[8]; Xchar *cptr = (char *)0; XESD *tesd = (ESD *)0; Xulong decisecs = 50; /* default wait is 5 seconds */ Xint echo_flag; Xchar quiet[8]; Xlong start_secs; Xlong time(); X X if(shm->Liofd < 0) X return(eNoLineAttached); X X get_switches(param,switches,sizeof(switches)); X echo_flag = (strchr(switches,'e') != (char *)0); X X if(!get_alpha_zstr(param,quiet,sizeof(quiet))) X { X if(strcmp(quiet,"quiet")) X return(eSyntaxError); X } X else X { X if((tesd = make_esd(64)) == (ESD *)0) X return(eNoMemory); X if(erc = gstr(param,tesd)) X goto RETURN; X if(!tesd->cb) X { X pputs("lookfor null string\n"); X erc = eFATAL_ALREADY; X goto RETURN; X } X cptr = tesd->pb; X } X X if(erc = gint(param,&decisecs)) X { X /* if something there non-integer */ X if(!end_of_cmd(param)) X { X erc = eSyntaxError; X goto RETURN; X } X } X erc = 0; X X if(proctrace) X time(&start_secs); X X if(cptr) X { X iv[0] = (long)llookfor(cptr,decisecs * 100L,echo_flag); X if(proctrace) X pprintf("llookfor set $i00 = %ld\n",iv[0]); X } X else X lquiet(decisecs * 100L,echo_flag); X X if(proctrace) X pprintf("waited %ld secs\n",time((long *)0) - start_secs); X XRETURN: X if(tesd) X free_esd(tesd); X return(erc); X X} /* end of cmd_lookfor */ X X/*+------------------------------------------------------------------------- X cmd_nap(param) Xnap [-m] X number 1/10ths secs, except if -m, nap milliseconds X--------------------------------------------------------------------------*/ Xint Xcmd_nap(param) XESD *param; X{ Xint erc; Xchar switches[8]; Xulong interval; X X get_switches(param,switches,sizeof(switches)); X X if(erc = gint(param,&interval)) X return(erc); X if(interval) X { X if(strchr(switches,'m')) X nap(interval); X else X nap(interval * 100L); X } X return(0); X} /* end of cmd_nap */ X X/*+------------------------------------------------------------------------- X cmd_parity(param) Xparity [e | o | n] Xparity ['e' | 'o' | 'n'] X--------------------------------------------------------------------------*/ Xint Xcmd_parity(param) XESD *param; X{ Xint erc; Xint new_parity = 0; XESD *tesd; X X if(shm->Liofd < 0) X return(eNoLineAttached); X X if(erc = skip_cmd_break(param)) X return(erc); X if(!(tesd = make_esd(64))) X return(eNoMemory); X erc = gstr(param,tesd); X new_parity = to_lower((erc) ? param->pb[param->index] : *tesd->pb); X if(!erc && !tesd->cb) X new_parity = 0; X free_esd(tesd); X X switch(new_parity) X { X case 'n': X new_parity = 0; X case 'e': X case 'o': X shm->Lparity = new_parity; X lset_parity(1); X break; X default: X erc = eBadParameter; X } X if(proctrace && !erc) X pprintf("parity set to %s\n", X (shm->Lparity) ? ((shm->Lparity == 'e') ? "even" : "odd") X : "none"); X return(erc); X X} /* end of cmd_parity */ X X/*+------------------------------------------------------------------------- X cmd_prompt(param) X--------------------------------------------------------------------------*/ Xint Xcmd_prompt(param) XESD *param; X{ Xextern ESD *icmd_prompt; X X return(gstr(param,icmd_prompt)); X} /* end of cmd_prompt */ X X/*+------------------------------------------------------------------------- X cmd_ptrace(param) X--------------------------------------------------------------------------*/ Xint Xcmd_ptrace(param) XESD *param; X{ Xchar s8[8]; Xregister itmp; X X if(get_alpha_zstr(param,s8,sizeof(s8))) X return(eSyntaxError); X itmp = strlen(s8); X while(itmp--) X s8[itmp] = to_lower(s8[itmp]); X if(!strcmp(s8,"on")) X proctrace = 1; X else if(!strcmp(s8,"off")) X proctrace = 0; X else X return(eSyntaxError); X return(0); X} /* end of cmd_ptrace */ X X/*+------------------------------------------------------------------------- X cmd_rname(param) - set remote name X--------------------------------------------------------------------------*/ Xint Xcmd_rname(param) XESD *param; X{ Xint erc; XESD *rname; X X if(shm->Liofd < 0) X return(eNoLineAttached); X if(!shm->Lmodem_off_hook) X { X pputs("Not connected\n"); X return(eFATAL_ALREADY); X } X X if((rname = make_esd(sizeof(shm->Lrname) - 1)) == (ESD *)0) X return(eNoMemory); X X if(!(erc = gstr(param,rname))) X { X strcpy(shm->Lrname,rname->pb); X if(proctrace) X pprintf("rname set to '%s'\n",rname->pb); X } X free_esd(rname); X return(erc); X X} /* end of cmd_rname */ X X/*+------------------------------------------------------------------------- X cmd_send(param) Xsend [-n] X-n do not send trailing CR X--------------------------------------------------------------------------*/ Xint Xcmd_send(param) XESD *param; X{ Xint erc; XESD *buf; Xchar switches[8]; X X if(shm->Liofd < 0) X return(eNoLineAttached); X X if((buf = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X get_switches(param,switches,sizeof(switches)); X X if(erc = gstr(param,buf)) X { X free_esd(buf); X return(erc); X } X X lputs(buf->pb); X X if(!strchr(switches,'n')) X lputc(CR); X X free_esd(buf); X return(erc); X} /* end of cmd_send */ X X/*+------------------------------------------------------------------------- X cmd_set(param) X--------------------------------------------------------------------------*/ Xint Xcmd_set(param) XESD *param; X{ Xint erc; Xint itmp; Xulong varnum; Xuint varmax; Xchar vartype; Xchar varstr[16]; Xint show_status; Xlong *ivptr; XESD *svptr; Xchar *cptr; Xchar *make_char_graphic(); X X if(erc = skip_cmd_break(param)) X return(erc); X X do { X /* $ is optional */ X if((erc = skip_cmd_char(param,'$')) && (erc != eSyntaxError)) X return(erc); X /* get variable type */ X if(get_cmd_char(param,&vartype)) X return(eSyntaxError); X /* validate variable type */ X vartype = to_lower(vartype); X switch(vartype) X { X case 'i': X varmax = IVQUAN; X break; X case 's': X varmax = SVQUAN; X break; X default: X return(eIllegalVarType); X } X X if(!get_numeric_value(param,&varnum)) X goto TEST_VARNUM; X else if(*(param->pb + param->index) == '[') X { X if(erc = get_subscript(param,&varnum)) X return(erc); XTEST_VARNUM: X if((int)varnum >= varmax) X return(eIllegalVarNumber); X switch(vartype) X { X case 'i': X ivptr = &iv[(int)varnum]; X break; X default: X svptr = sv[(int)varnum]; X } X } X else if(get_alphanum_zstr(param,varstr,sizeof(varstr))) X return(eInvalidVarName); X else X { X varnum = 0x1000L; X switch(vartype) X { X case 'i': X erc = find_mkvi(varstr,&ivptr,1); X break; X default: X erc = find_mkvs(varstr,&svptr,1); X } X if(erc) X return(erc); X } X X show_status = 1; X if(!skip_cmd_char(param,'=')) /* assignment */ X { X switch(vartype) X { X case 'i': X if(erc = gint(param,ivptr)) X return(erc); X break; X default: X if(erc = gstr(param,svptr)) X return(erc); X break; X } X if(!proctrace) X show_status = 0; X } X if(show_status) X { X switch(vartype) X { X case 'i': X if(varnum != 0x1000L) X pprintf("$i%02ld = %7ld (0x%08lx,0%lo)\n",varnum, X *ivptr,*ivptr,*ivptr); X else X pprintf("$i%s = %ld (0x%08lx,0%lo)\n",varstr, X *ivptr,*ivptr,*ivptr); X break; X default: X if(varnum != 0x1000L) X pprintf("$s%02ld = '",varnum); X else X pprintf("$s%s = '",varstr); X itmp = svptr->cb; X cptr = svptr->pb; X while(itmp--) X pputs(make_char_graphic(*cptr++,0)); X pputs("'\n"); X break; X } X } X } while(!skip_comma(param)); X X if(!end_of_cmd(param)) X return(eSyntaxError); X X return(0); X} /* end of cmd_set */ X X/*+------------------------------------------------------------------------- X cmd_system(param) X Xsystem [-l] 'cmd' X-l makes comm line stdin/stdout X-s keeps all fds the same X Xreturns $i0 set to exit status of program or 0x100 if interrupted X--------------------------------------------------------------------------*/ Xint Xcmd_system(param) XESD *param; X{ Xint erc; XESD *cmd; Xextern int last_child_wait_status; Xchar switches[8]; X X if((cmd = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X get_switches(param,switches,sizeof(switches)); X X/* a hack */ X *cmd->pb++ = (strchr(switches,'s')) ? '>' : X ((strchr(switches,'l')) ? '$' : '!'); X X cmd->maxcb--; X X if(erc = gstr(param,cmd)) X { X cmd->pb--; /* be nice */ X cmd->maxcb++; /* or surely this will haunt us one day */ X free_esd(cmd); X return(erc); X } X X/* rehack */ X cmd->pb--; X cmd->cb++; X cmd->maxcb++; X X if(proctrace) X { X pputs(cmd->pb + 1); X pputs("\n"); X } X X last_child_wait_status = 0xFF00; X shell(cmd->pb); X iv[0] = (last_child_wait_status & 0xFF) X ? 0x100L : (long)last_child_wait_status >> 8; X if(proctrace) X pprintf("$i0 = %ld, (%s)\n",iv[0], X (iv[0] == 0x100L) ? "interrupted" : "program exit status"); X X free_esd(cmd); X return(0); X} /* end of cmd_system */ X X/*+------------------------------------------------------------------------- X get_big_endian_16(ptr) X--------------------------------------------------------------------------*/ Xushort Xget_big_endian_16(ptr) Xregister uchar *ptr; X{ Xregister ushort uint16 = ((ushort)ptr[0] << 8) | ptr[1]; X X return(uint16); X X} /* end of get_big_endian_16 */ X X/*+------------------------------------------------------------------------- X get_big_endian_32(ptr) X--------------------------------------------------------------------------*/ Xulong Xget_big_endian_32(ptr) Xregister uchar *ptr; X{ Xregister ulong uint32 = ((ulong)*ptr++) << 24; X uint32 |= ((ulong)*ptr++) << 16; X uint32 |= ((ulong)*ptr++) << 8; X uint32 |= (ulong)*ptr++; X return(uint32); X X} /* end of get_big_endian_32 */ X X/*+------------------------------------------------------------------------- X cmd_getf(param) - get friend memory X Xgetf -x Xwhere: -x == X -b byte X -w word (little-endian) X -W word (big-endian) X -l 32-bits (little-endian) X -L 32-bits (big-endian) X--------------------------------------------------------------------------*/ Xint Xcmd_getf(param) XESD *param; X{ Xint erc; Xchar switches[8]; Xlong *piv; Xlong offset; Xint size; Xint big_endian; X X if(erc = get_switches(param,switches,sizeof(switches))) X return(erc); X if((strlen(switches) != 2) || !strchr("bwWlL",switches[1])) X { X pputs("invalid switch\n"); X return(eFATAL_ALREADY); X } X size = to_lower(switches[1]); X big_endian = isupper(switches[1]); X X/* X if(!get_svptr(param,&psv)) X return(eNotImplemented); X else X*/ X if(!strncmp(param->pb + param->index,"$i",2)) X param->index += 2; X if(erc = get_ivptr(param,&piv,1)) X return(erc); X X if(erc = gint(param,&offset)) X return(erc); X X if(proctrace) X pprintf("getf %s offset=0x%lx",switches,offset); X X switch(size) X { X case 'b': X if(offset > ((long)sizeof(shm->friend_space) - 1)) X goto OFFSET_TOO_LARGE; X *piv = *(((uchar *)shm->friend_space) + (int)offset) & 0xFF; X break; X case 'w': X if(offset > ((long)sizeof(shm->friend_space) - 2)) X goto OFFSET_TOO_LARGE; X if(big_endian) X *piv = get_big_endian_16((uchar *)shm->friend_space + X (int)offset); X else X *piv = *(((ushort *)shm->friend_space) + (int)offset) & 0xFFFF; X break; X case 'l': X if(offset > ((long)sizeof(shm->friend_space) - 4)) X goto OFFSET_TOO_LARGE; X if(big_endian) X { X *piv = get_big_endian_32((uchar *)shm->friend_space + X (int)offset); X } X else X *piv = *((long *)((char *)shm->friend_space + (int)offset)); X break; X } X X if(proctrace) X pprintf(" value=%ld (%08lx)\n",*piv,*piv); X return(0); X XOFFSET_TOO_LARGE: X if(proctrace) X pputs("\n"); X pprintf("offset 0x%02lx too large for -%c (0x%02x bytes available)\n", X offset,switches[1],sizeof(shm->friend_space)); X return(eFATAL_ALREADY); X X} /* end of cmd_getf */ X X/*+------------------------------------------------------------------------- X cmd_putf(param) X--------------------------------------------------------------------------*/ Xcmd_putf(param) XESD *param; X{ X return(eNotImplemented); X} /* end of cmd_putf */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of pcmd.c */ SHAR_EOF $TOUCH -am 0507233390 pcmd.c && chmod 0644 pcmd.c || echo "restore of pcmd.c failed" set `wc -c pcmd.c`;Wc_c=$1 if test "$Wc_c" != "23451"; then echo original size 23451, current size $Wc_c fi # ============= pcmdfile.c ============== echo "x - extracting pcmdfile.c (Text)" sed 's/^X//' << 'SHAR_EOF' > pcmdfile.c && X/* CHK=0x69F1 */ X/*+------------------------------------------------------------------------- X pcmdfile.c - ecu file-related procedure commands X wht%n4hgf@gatech.edu X X Defined functions: X _file_not_open(filenum) X _gfilenum(param,filenum) X _param_to_stat(param,pstat_rtnd) X cmd_fchmod(param) X cmd_fclose(param) X cmd_fdel(param) X cmd_fgetc(param) X cmd_fgets(param) X cmd_fopen(param) X cmd_fputc(param) X cmd_fputs(param) X cmd_fread(param) X cmd_fseek(param) X cmd_fwrite(param) X cmd_mkdir(param) X cmd_pclose(param) X cmd_popen(param) X ifunc_fatime(param,pvalue) X ifunc_fmode(param,pvalue) X ifunc_fmtime(param,pvalue) X ifunc_fsize(param,pvalue) X ifunc_ftell(param,pvalue) X ifunc_ischr(param,pvalue) X ifunc_isdir(param,pvalue) X ifunc_isreg(param,pvalue) X proc_file_reset() X str_to_filemode(modestr,filemode) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */ X/*:04-19-1990-03:08-wht@n4hgf-GCC run found unused vars -- rm them */ X/*:04-10-1990-17:20-wht@n4hgf-fix cmd_fgets to return int var 0 */ X/*:04-08-1990-19:15-wht@n4hgf-use new auto_create option on get_?vptr */ X/*:03-25-1990-14:11-wht@n4hgf------ x2.70 ------- */ X/*:03-18-1990-15:29-wht@n4hgf-add popen and pclose commands */ 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 "ecuerror.h" X#include "esd.h" X#include "var.h" X#include "proc.h" X X#if !defined(S_IRUSR) X#define S_IRUSR 00400 /* read permission: owner */ X#define S_IWUSR 00200 /* write permission: owner */ X#define S_IXUSR 00100 /* execute permission: owner */ X#define S_IRWXG 00070 /* read, write, execute: group */ X#define S_IRGRP 00040 /* read permission: group */ X#define S_IWGRP 00020 /* write permission: group */ X#define S_IXGRP 00010 /* execute permission: group */ X#define S_IRWXO 00007 /* read, write, execute: other */ X#define S_IROTH 00004 /* read permission: other */ X#define S_IWOTH 00002 /* write permission: other */ X#define S_IXOTH 00001 /* execute permission: other */ X#endif X Xextern int proctrace; Xextern int rcvr_pid; Xextern int errno; Xextern proc_level; Xextern PCB *pcb_stack[]; X X#define FILE_MAX 5 X Xtypedef struct pfile_struct X{ X FILE *f; /* file pointer */ X ESD *n; /* file name */ X} PFILE; X XPFILE pfile[FILE_MAX]; X Xchar fwrite_error_fmt[] = "file %d write error (not open for write?)\n"; X X/*+------------------------------------------------------------------------- X proc_file_reset() X--------------------------------------------------------------------------*/ Xvoid Xproc_file_reset() X{ Xregister itmp; X X for(itmp = 0; itmp < FILE_MAX; itmp++) X { X if(pfile[itmp].f) X { X fclose(pfile[itmp].f); X pfile[itmp].f = NULL; X free_esd(pfile[itmp].n); X } X } X} /* end of proc_file_reset */ X X/*+------------------------------------------------------------------------- X _file_not_open(filenum) X--------------------------------------------------------------------------*/ Xint X_file_not_open(filenum) Xint filenum; X{ X pprintf("file %d not open\n",filenum); X return(eFATAL_ALREADY); X} /* end of _file_not_open */ X X/*+------------------------------------------------------------------------- X _gfilenum(param,filenum) X--------------------------------------------------------------------------*/ Xint X_gfilenum(param,filenum) XESD *param; Xint *filenum; X{ Xint erc; Xulong lvarnum; Xint old_index; X X skip_cmd_break(param); X old_index = param->old_index; X if(erc = gint(param,&lvarnum)) X return(erc); X if(lvarnum > FILE_MAX) X return(eBadFileNumber); X *filenum = (int)lvarnum; X param->old_index = old_index; X return(0); X} /* end of _gfilenum */ X X/*+------------------------------------------------------------------------- X str_to_filemode(modestr,filemode) - "rwxrwxrwx" to mode integer X--------------------------------------------------------------------------*/ Xstr_to_filemode(modestr,filemode) Xchar *modestr; Xlong *filemode; X{ Xregister i; Xregister mode = 0; Xint erc = 0; X X if(strlen(modestr) != 9) X { X pprintf("bad length: '%s'\n",modestr); X return(eFATAL_ALREADY); X } X X for(i=0; i < 9; i++) X { X switch(modestr[i]) X { X X case 'r': X if(i == 0) X mode |= S_IRUSR; X else if(i == 3) X mode |= S_IRGRP; X else if(i == 6) X mode |= S_IROTH; X else X erc = eSyntaxError; X break; X X X case 'w': X if(i == 1) X mode |= S_IWUSR; X else if(i == 4) X mode |= S_IWGRP; X else if(i == 7) X mode |= S_IWOTH; X else X erc = eSyntaxError; X break; X X X case 'x': X if(i == 2) X mode |= S_IXUSR; X else if(i == 5) X mode |= S_IXGRP; X else if(i == 8) X mode |= S_IXOTH; X else X erc = eSyntaxError; X break; X X X case 's': X#if defined(FULL_FEATURE_CHMODE) X if(i == 2) X { X mode |= S_ISUID; X mode |= S_IXUSR; X } X else if(i == 5) X { X mode |= S_ISGID; X mode |= S_IXGRP; X } X else X erc = eSyntaxError; X#else X pputs("setuid/setgid not allowed\n"); X erc = eFATAL_ALREADY; X#endif /* defined(FULL_FEATURE_CHMODE) */ X break; X X X case 't': X#if defined(FULL_FEATURE_CHMODE) X if(i == 8) X { X mode |= S_ISVTX; X mode |= S_IXOTH; X } X else X erc = eSyntaxError; X#else X pputs("set sticky bit not allowed\n"); X erc = eFATAL_ALREADY; X#endif /* defined(FULL_FEATURE_CHMODE) */ X break; X case 'l': X if(i == 5) X { X mode |= S_ISGID; X mode &= ~S_IXGRP; X } X else X erc = eSyntaxError; X break; X case '-': X break; X default: X erc = eSyntaxError; X } /* end switch */ X X if(erc) X break; X X } /* end for */ X X if(erc) X { X if(erc != eFATAL_ALREADY) X pputs("invalid mode specifier\n"); X pputs(modestr); X while(i--) X pputc(' '); X pputs("^\n"); X X } X else X *filemode = (long)mode; X X return(erc); X X} /* end of str_to_filemode */ X X/*+------------------------------------------------------------------------- X cmd_fgetc(param) X Xfgetc [$][i | $s] Xint variable receives 0 if EOF Xstr var receives null str on eof X--------------------------------------------------------------------------*/ Xint Xcmd_fgetc(param) XESD *param; X{ Xint erc; Xint filenum; Xint vartype; Xint inchar; XESD *svptr; Xlong *ivptr; X X if(!proc_level) X return(eNotExecutingProc); X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(!pfile[filenum].f) X return(_file_not_open(filenum)); X X skip_cmd_char(param,'$'); X if((param->index >= param->cb) || X ( ((vartype = to_lower(*(param->pb + param->index))) != 'i') && X (vartype != 's'))) X return(eIllegalVarType); X param->index++; X switch(vartype) X { X case 'i': X erc = get_ivptr(param,&ivptr,1); X break; X default: X erc = get_svptr(param,&svptr,1); X break; X } X if(erc) X return(erc); X X if((inchar = fgetc(pfile[filenum].f)) == EOF) X { X if(proctrace) X pputs("fgetc EOF\n"); X if(vartype == 'i') X *ivptr = -1; X else X zero_esd(svptr); X } X else if(vartype == 'i') X *ivptr = inchar; X else X { X *svptr->pb = inchar; X svptr->cb = 1; X } X X if(proctrace) X { X pputs("fgetc set "); X pputs((vartype == 'i') ? "int" : "str"); X pprintf(" var = %lu (0x%02x)\n",inchar,inchar); X } X return(0); X X} /* end of cmd_fgetc */ X X/*+------------------------------------------------------------------------- X cmd_fread(param) X--------------------------------------------------------------------------*/ Xint Xcmd_fread(param) XESD *param; X{ X return(eNotImplemented); X} /* end of cmd_fread */ X X/*+------------------------------------------------------------------------- X cmd_fgets(param) Xfgetc [$][s] X--------------------------------------------------------------------------*/ Xint Xcmd_fgets(param) XESD *param; X{ Xint erc; Xint filenum; Xchar ctmp; XESD *svptr; X X if(!proc_level) X return(eNotExecutingProc); X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(!pfile[filenum].f) X return(_file_not_open(filenum)); X X skip_cmd_char(param,'$'); X if(erc = get_cmd_char(param,&ctmp)) X return(erc); X if(to_lower(ctmp) != 's') X return(eIllegalVarType); X if(erc = get_svptr(param,&svptr,1)) X return(erc); X *svptr->pb = 0; X svptr->cb = 0; X if(!(iv[0] = !fgets(svptr->pb,svptr->maxcb + 1,pfile[filenum].f))) X { X svptr->cb = strlen(svptr->pb); X if(*(svptr->pb + svptr->cb - 1) == NL) X { X svptr->cb--; X null_terminate_esd(svptr); X } X } X if(proctrace) X pprintf("fgets set str var = '%s'\n",svptr->pb); X return(0); X X} /* end of cmd_fgets */ X X/*+------------------------------------------------------------------------- X cmd_fclose(param) Xfclose X--------------------------------------------------------------------------*/ Xint Xcmd_fclose(param) XESD *param; X{ Xint erc; Xint filenum; X X if(!proc_level) X return(eNotExecutingProc); X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(pfile[filenum].f) X { X fclose(pfile[filenum].f); X pfile[filenum].f = NULL; X free_esd(pfile[filenum].n); X } X X return(0); X X} /* end of cmd_fclose */ X X/*+------------------------------------------------------------------------- X cmd_fputc(param) Xfputc Xfputc X--------------------------------------------------------------------------*/ Xint Xcmd_fputc(param) XESD *param; X{ Xint erc; Xint filenum; XESD *buf = (ESD *)0; Xchar outchar = 0; Xlong outlong; X X if(!proc_level) X return(eNotExecutingProc); X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(!pfile[filenum].f) X return(_file_not_open(filenum)); X X if(!gint(param,&outlong)) X outchar = (char)outlong; X else X { X if((buf = make_esd(64)) == (ESD *)0) X return(eNoMemory); X if(erc = gstr(param,buf)) X goto RETURN; X if(!buf->cb) X { X pputs("cannot fputc: zero length string\n"); X erc = eFATAL_ALREADY; X goto RETURN; X } X outchar = *buf->pb; X } X X if(fputc(outchar,pfile[filenum].f) < 0) X { X pprintf(fwrite_error_fmt,filenum); X erc = eFATAL_ALREADY; X } X XRETURN: X if(buf) X free_esd(buf); X return(erc); X} /* end of cmd_fputc */ X X/*+------------------------------------------------------------------------- X cmd_fopen(param) X Xfopen [-] Xsets $i0 with result X--------------------------------------------------------------------------*/ Xint Xcmd_fopen(param) XESD *param; X{ Xint erc; Xint filenum; XESD *filename = (ESD *)0; Xchar switches[8]; X X if(!proc_level) X return(eNotExecutingProc); X X if(get_switches(param,switches,sizeof(switches))) X { X strcpy(switches,"-r"); X if(proctrace) X { X pputs("Warning: fopen defaulting to read\n"); X show_error_position(pcb_stack[proc_level - 1]); X } X } X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(pfile[filenum].f) X { X pprintf("file %d already open\n",filenum); X return(eFATAL_ALREADY); X } X X if((filename = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if(erc = gstr(param,filename)) X goto RETURN; X X iv[0] = 0; X if((pfile[filenum].f = fopen(filename->pb,switches + 1)) == NULL) X { X if(proctrace) X { X pprintf("'%s'",filename->pb); X pperror(" "); X iv[0] = (long)errno; X } X } X else if(proctrace) X pprintf("opened '%s' as file %d\n",filename->pb,filenum); X X if(!erc) X pfile[filenum].n = filename; X XRETURN: X if(erc) X free_esd(filename); X return(erc); X} /* end of cmd_fopen */ X X/*+------------------------------------------------------------------------- X cmd_fputs(param) Xfputs [-n] X-n do not output newline after X file number for operation X string to write to file X--------------------------------------------------------------------------*/ Xint Xcmd_fputs(param) XESD *param; X{ Xint erc; Xint filenum; XESD *buf = (ESD *)0; Xchar switches[8]; X X if(!proc_level) X return(eNotExecutingProc); X X get_switches(param,switches,sizeof(switches)); X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(!pfile[filenum].f) X return(_file_not_open(filenum)); X X if((buf = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if(erc = gstr(param,buf)) X goto RETURN; X X if(!fputs(buf->pb,pfile[filenum].f) && strlen(buf->pb)) X { X pprintf(fwrite_error_fmt,filenum); X erc = eFATAL_ALREADY; X goto RETURN; X } X X if(!strchr(switches,'n')) X fputc(NL,pfile[filenum].f); X XRETURN: X free_esd(buf); X return(erc); X} /* end of cmd_fputs */ X X/*+------------------------------------------------------------------------- X cmd_fwrite(param) Xfwrite X--------------------------------------------------------------------------*/ Xint Xcmd_fwrite(param) XESD *param; X{ X return(eNotImplemented); X#ifdef USE_FWRITE Xint erc; Xint filenum; XESD *buf = (ESD *)0; X X if(!proc_level) X return(eNotExecutingProc); X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(!pfile[filenum].f) X return(_file_not_open(filenum)); X X if((buf = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if(erc = gstr(param,buf)) X goto RETURN; X X if(!fputs(buf->pb,pfile[filenum].f) && strlen(buf->pb)) X { X pprintf(fwrite_error_fmt,filenum); X erc = eFATAL_ALREADY; X } X XRETURN: X free_esd(buf); X return(erc); X#endif X} /* end of cmd_fwrite */ X X/*+------------------------------------------------------------------------- X cmd_fchmod(param) X Xfchmod | | X$i0 = 0 if successful, else errno X--------------------------------------------------------------------------*/ Xint Xcmd_fchmod(param) XESD *param; X{ Xint erc; Xint filenum; XESD *fname = (ESD *)0; XESD *mode = (ESD *)0; Xlong new_mode; Xchar *cptr; X X if((fname = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if((mode = make_esd(64)) == (ESD *)0) X { X free_esd(fname); X return(eNoMemory); X } X X if(erc = skip_cmd_break(param)) X goto RETURN; X else if(!gstr(param,mode)) X { X if(erc = str_to_filemode(mode->pb,&new_mode)) X goto RETURN; X } X else if(erc = gint(param,&new_mode)) X { X erc = eBadParameter; X goto RETURN; X } X X if(erc = skip_cmd_break(param)) X goto RETURN; X else if(!gstr(param,fname)) X { X cptr = fname->pb; X if(iv[0] = (long)chmod(cptr,(int)new_mode &= 0777)) X { X iv[0] = (long)errno; X if(proctrace) X pperror(cptr); X } X } X else if(!_gfilenum(param,&filenum)) X { X if(!pfile[filenum].f) X { X erc = (_file_not_open(filenum)); X iv[0] = EBADF; X } X else if(iv[0] = (long)chmod(pfile[filenum].n->pb,(int)new_mode & 0777)) X { X iv[0] = (long)errno; X if(proctrace) X { X sprintf(fname->pb,"file %d",filenum); X pperror(fname->pb); X } X } X if(!iv[0]) X cptr = pfile[filenum].n->pb; X } X else X erc = eBadParameter; X X if(proctrace && !erc && !iv[0]) X pprintf("'%s' mode set to %o\n",cptr,0100000 | (int)new_mode); X XRETURN: X free_esd(mode); X free_esd(fname); X X return(erc); X X} /* end of cmd_fchmod */ X X/*+------------------------------------------------------------------------- X cmd_fdel(param) X Xfdel X$i0 = 0 if successful, else errno X--------------------------------------------------------------------------*/ Xint Xcmd_fdel(param) XESD *param; X{ Xint erc; XESD *fname = (ESD *)0; X X if((fname = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if(erc = gstr(param,fname)) X goto RETURN; X X if(iv[0] = (long)unlink(fname->pb)) X iv[0] = (long)errno; X X if(proctrace) X { X if(iv[0]) X pperror(fname->pb); X else X pprintf("'%s' deleted\n",fname->pb); X } X XRETURN: X free_esd(fname); X return(erc); X} /* end of cmd_fdel */ X X/*+------------------------------------------------------------------------- X cmd_fseek(param) Xfseek Xsets $i0 with result X--------------------------------------------------------------------------*/ Xint Xcmd_fseek(param) XESD *param; X{ Xint erc; Xint filenum; Xlong seekpos; X X if(!proc_level) X return(eNotExecutingProc); X if(erc = _gfilenum(param,&filenum)) X return(erc); X if(!pfile[filenum].f) X return(_file_not_open(filenum)); X if(erc = gint(param,&seekpos)) X return(erc); X X iv[0] = 0; X if(fseek(pfile[filenum].f,seekpos,0) < 0) X { X if(proctrace) X { X pprintf("file %d ",filenum); X pperror("seekerror"); X } X iv[0] = (int)errno; X } X else if(proctrace) X pprintf("file %d set to position %ld\n",filenum,seekpos); X X return(erc); X X} /* end of cmd_fseek */ X X/*+------------------------------------------------------------------------- X cmd_mkdir(param) X Xmkdir X$i0 = 0 if successful, else errno X--------------------------------------------------------------------------*/ Xint Xcmd_mkdir(param) XESD *param; X{ Xint erc; XESD *fname = (ESD *)0; X X if((fname = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if(erc = gstr(param,fname)) X goto RETURN; X X if(iv[0] = (long)mkdir(fname->pb,0755)) X iv[0] = (long)errno; X X if(proctrace) X { X if(iv[0]) X pperror(fname->pb); X else X pprintf("'%s' deleted\n",fname->pb); X } X XRETURN: X free_esd(fname); X return(erc); X} /* end of cmd_mkdir */ X X/*+------------------------------------------------------------------------- X cmd_pclose(param) Xpclose X--------------------------------------------------------------------------*/ Xint Xcmd_pclose(param) XESD *param; X{ Xint erc; Xint filenum; X X if(!proc_level) X return(eNotExecutingProc); X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(pfile[filenum].f) X { X pclose(pfile[filenum].f); X pfile[filenum].f = NULL; X free_esd(pfile[filenum].n); X } X X return(0); X X} /* end of cmd_pclose */ X X/*+------------------------------------------------------------------------- X cmd_popen(param) X Xpopen [-] Xsets $i0 with result X--------------------------------------------------------------------------*/ Xint Xcmd_popen(param) XESD *param; X{ Xint erc; Xint filenum; XESD *filename = (ESD *)0; Xchar switches[8]; X#if !defined(M_UNIX) XFILE *popen(); X#endif X X if(!proc_level) X return(eNotExecutingProc); X X if(get_switches(param,switches,sizeof(switches))) X { X strcpy(switches,"-r"); X if(proctrace) X { X pputs("Warning: popen defaulting to read\n"); X show_error_position(pcb_stack[proc_level - 1]); X } X } X X if(erc = _gfilenum(param,&filenum)) X return(erc); X X if(pfile[filenum].f) X { X pprintf("file %d already open\n",filenum); X return(eFATAL_ALREADY); X } X X if((filename = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if(erc = gstr(param,filename)) X goto RETURN; X X iv[0] = 0; X if((pfile[filenum].f = popen(filename->pb,switches + 1)) == NULL) X { X if(proctrace) X { X pprintf("'%s'",filename->pb); X pperror(" "); X iv[0] = (long)errno; X } X } X else if(proctrace) X pprintf("opened '%s' as file %d\n",filename->pb,filenum); X X if(!erc) X pfile[filenum].n = filename; X XRETURN: X if(erc) X free_esd(filename); X return(erc); X} /* end of cmd_popen */ X X/*+------------------------------------------------------------------------- X ifunc_ftell(param,pvalue) X%ftell() X--------------------------------------------------------------------------*/ Xint Xifunc_ftell(param,pvalue) XESD *param; Xlong *pvalue; X{ Xint erc; Xint filenum; Xlong ftell(); X X if(!proc_level) X return(eNotExecutingProc); X if(erc = skip_paren(param,1)) X return(erc); X if(erc = _gfilenum(param,&filenum)) X return(erc); X if(!pfile[filenum].f) X return(_file_not_open(filenum)); X if(erc = skip_paren(param,0)) X return(erc); X X *pvalue = ftell(pfile[filenum].f); X return(0); X} /* end of ifunc_ftell */ X X/*+------------------------------------------------------------------------- X _param_to_stat(param,pstat_rtnd) X--------------------------------------------------------------------------*/ Xint X_param_to_stat(param,pstat_rtnd) XESD *param; Xstruct stat **pstat_rtnd; X{ Xint erc; Xint filenum; Xstatic struct stat fst; Xstruct stat *pstat = &fst; XESD *fname; X X errno = 0; X X if(erc = skip_paren(param,1)) X return(erc); X X if((fname = make_esd(256)) == (ESD *)0) X return(eNoMemory); X X if(!gstr(param,fname)) X { X if(stat(fname->pb,pstat)) X pstat = (struct stat *)0; X } X else if(param->index = param->old_index,!_gfilenum(param,&filenum)) X { X if(!pfile[filenum].f) X { X free_esd(fname); X return(_file_not_open(filenum)); X } X if(stat(pfile[filenum].n->pb,pstat)) X pstat = (struct stat *)0; X } X else X erc = eBadParameter; X X free_esd(fname); X X if(erc) X return(erc); X X if(erc = skip_paren(param,0)) X return(erc); X X *pstat_rtnd = pstat; X if(proctrace && !pstat) X pperror("stat"); X return(0); X X} /* end of _param_to_stat */ X X/*+------------------------------------------------------------------------- X ifunc_fsize(param,pvalue) X%fsize() X%fsize('filename') X--------------------------------------------------------------------------*/ Xint Xifunc_fsize(param,pvalue) XESD *param; Xlong *pvalue; X{ Xregister erc; Xstruct stat *pstat; X X if(erc = _param_to_stat(param,&pstat)) X return(erc); X if(!pstat) X *pvalue = -1; X else X *pvalue = pstat->st_size; X return(0); X} /* end of ifunc_fsize */ X X/*+------------------------------------------------------------------------- X ifunc_fatime(param,pvalue) X%fatime() X%fatime('filename') X--------------------------------------------------------------------------*/ Xint Xifunc_fatime(param,pvalue) XESD *param; Xlong *pvalue; X{ Xregister erc; Xstruct stat *pstat; X X if(erc = _param_to_stat(param,&pstat)) X return(erc); X if(!pstat) X *pvalue = -1; X else X *pvalue = pstat->st_atime; X return(0); X} /* end of ifunc_fatime */ X X/*+------------------------------------------------------------------------- X ifunc_fmtime(param,pvalue) X%fmtime() X%fmtime('filename') X--------------------------------------------------------------------------*/ Xint Xifunc_fmtime(param,pvalue) XESD *param; Xlong *pvalue; X{ Xregister erc; Xstruct stat *pstat; X X if(erc = _param_to_stat(param,&pstat)) X return(erc); X if(!pstat) X *pvalue = -1; X else X *pvalue = pstat->st_mtime; X return(0); X} /* end of ifunc_fmtime */ X X/*+------------------------------------------------------------------------- X ifunc_fmode(param,pvalue) X%fmode() X%fmode('filename') X--------------------------------------------------------------------------*/ Xint Xifunc_fmode(param,pvalue) XESD *param; Xlong *pvalue; X{ Xregister erc; Xstruct stat *pstat; X X if(erc = _param_to_stat(param,&pstat)) X return(erc); X if(!pstat) X *pvalue = -1; X else X *pvalue = (long)pstat->st_mode; X return(0); X} /* end of ifunc_fmode */ X X/*+------------------------------------------------------------------------- X ifunc_isreg(param,pvalue) X%isreg() X%isreg('filename') X--------------------------------------------------------------------------*/ Xint Xifunc_isreg(param,pvalue) XESD *param; Xlong *pvalue; X{ Xregister erc; X X if(erc = ifunc_fmode(param,pvalue)) X return(erc); X if(*pvalue != -1) X *pvalue = ((*pvalue & S_IFMT) == S_IFREG); X return(0); X} /* end of ifunc_isreg */ X X/*+------------------------------------------------------------------------- X ifunc_isdir(param,pvalue) X%isdir() X%isdir('filename') X--------------------------------------------------------------------------*/ Xint Xifunc_isdir(param,pvalue) XESD *param; Xlong *pvalue; X{ Xregister erc; X X if(erc = ifunc_fmode(param,pvalue)) X return(erc); X if(*pvalue != -1) X *pvalue = ((*pvalue & S_IFMT) == S_IFDIR); X return(0); X} /* end of ifunc_isdir */ X X/*+------------------------------------------------------------------------- X ifunc_ischr(param,pvalue) X%ischr() X%ischr('filename') X--------------------------------------------------------------------------*/ Xint Xifunc_ischr(param,pvalue) XESD *param; Xlong *pvalue; X{ Xregister erc; X X if(erc = ifunc_fmode(param,pvalue)) X return(erc); X if(*pvalue != -1) X *pvalue = ((*pvalue & S_IFMT) == S_IFCHR); X return(0); X} /* end of ifunc_ischr */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of pcmdfile.c */ SHAR_EOF $TOUCH -am 0507233390 pcmdfile.c && chmod 0644 pcmdfile.c || echo "restore of pcmdfile.c failed" set `wc -c pcmdfile.c`;Wc_c=$1 if test "$Wc_c" != "23230"; then echo original size 23230, current size $Wc_c fi echo "End of part 12, continue with part 13" exit 0