123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281 |
- /*+-------------------------------------------------------------------------
- pcmdfile.c - ecu file-related procedure commands
- wht@wht.net
- Defined functions:
- _file_not_open(filenum)
- _param_to_stat(param, pstat_rtnd)
- get_filenum(param, filenum)
- ifunc_fatime(param, pvalue)
- ifunc_fmode(param, pvalue)
- ifunc_fmtime(param, pvalue)
- ifunc_fsize(param, pvalue)
- ifunc_ftell(param, pvalue)
- ifunc_ischr(param, pvalue)
- ifunc_isdir(param, pvalue)
- ifunc_isreg(param, pvalue)
- pcmd_fchmod(param)
- pcmd_fclose(param)
- pcmd_fdel(param)
- pcmd_fgetc(param)
- pcmd_fgets(param)
- pcmd_fopen(param)
- pcmd_fputc(param)
- pcmd_fputs(param)
- pcmd_fread(param)
- pcmd_fflush(param)
- pcmd_fwrite(param)
- pcmd_mkdir(param)
- pcmd_pclose(param)
- pcmd_popen(param)
- proc_file_reset()
- str_to_filemode(modestr, filemode)
- --------------------------------------------------------------------------*/
- /*+:EDITS:*/
- /*:04-26-2000-11:16-wht@bob-RELEASE 4.42 */
- /*:03-31-1998-17:38-wht@kepler-add fdopen_socket */
- /*:01-25-1997-13:31-wht@yuriatin-add fflush */
- /*:01-24-1997-02:38-wht@yuriatin-SOURCE RELEASE 4.00 */
- /*:09-11-1996-20:00-wht@yuriatin-3.48-major telnet,curses,structural overhaul */
- /*:11-23-1995-11:20-wht@kepler-source control 3.37 for tsx-11 */
- /*:11-14-1995-10:23-wht@kepler-3.37.80-source control point: SOCKETS */
- /*:05-04-1994-04:39-wht@n4hgf-ECU release 3.30 */
- /*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 */
- /*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA */
- /*:07-03-1992-12:48-wht@n4hgf-why not let fchmod set any bits? */
- /*:07-25-1991-12:59-wht@n4hgf-ECU release 3.10 */
- /*:06-27-1991-13:45-wht@n4hgf-$i0 wasn't always plugged on failures */
- /*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
- #include "ecu.h"
- #include "ecukey.h"
- #include "ecuerror.h"
- #include "esd.h"
- #include "var.h"
- #include "procedure.h"
- #if !defined(S_IRUSR)
- #define S_IRUSR 00400 /* read permission: owner */
- #define S_IWUSR 00200 /* write permission: owner */
- #define S_IXUSR 00100 /* execute permission: owner */
- #define S_IRWXG 00070 /* read, write, execute: group */
- #define S_IRGRP 00040 /* read permission: group */
- #define S_IWGRP 00020 /* write permission: group */
- #define S_IXGRP 00010 /* execute permission: group */
- #define S_IRWXO 00007 /* read, write, execute: other */
- #define S_IROTH 00004 /* read permission: other */
- #define S_IWOTH 00002 /* write permission: other */
- #define S_IXOTH 00001 /* execute permission: other */
- #endif
- extern PCB *pcb_stack[];
- #define FILE_MAX 10
- typedef struct pfile_struct
- {
- FILE *f; /* file pointer */
- ESD *n; /* file name */
- int is_socket; /* true if file is fdopen_socket stuff */
- int in_use;
- } PFILE;
- PFILE pfile[FILE_MAX];
- char fwrite_error_fmt[] = "file %d write error (not open for write?)\n";
- /*+-------------------------------------------------------------------------
- close_ecu_file(filenum)
- --------------------------------------------------------------------------*/
- void
- close_ecu_file(filenum)
- UINT filenum;
- {
- if (filenum > FILE_MAX)
- return;
- if (pfile[filenum].f)
- {
- if(pfile[filenum].is_socket)
- close(fileno(pfile[filenum].f));
- fclose(pfile[filenum].f);
- esdfree(pfile[filenum].n);
- memset((char *)&pfile[filenum],0,sizeof(pfile[0]));
- }
- } /* end of close_ecu_file */
- /*+-------------------------------------------------------------------------
- proc_file_reset()
- --------------------------------------------------------------------------*/
- void
- proc_file_reset()
- {
- int itmp;
- for (itmp = 0; itmp < FILE_MAX; itmp++)
- {
- close_ecu_file(itmp);
- }
- } /* end of proc_file_reset */
- /*+-------------------------------------------------------------------------
- _file_not_open(filenum)
- --------------------------------------------------------------------------*/
- int
- _file_not_open(filenum)
- int filenum;
- {
- pprintf("file %d not open\n", filenum);
- return (eFATAL_ALREADY);
- } /* end of _file_not_open */
- /*+-------------------------------------------------------------------------
- get_filenum(param,filenum)
- --------------------------------------------------------------------------*/
- int
- get_filenum(param, filenum)
- ESD *param;
- int *filenum;
- {
- int erc;
- UINT32 lvarnum;
- int old_index;
- skip_cmd_break(param);
- old_index = param->old_index;
- if (erc = gint(param, &lvarnum))
- return (erc);
- if (lvarnum > FILE_MAX)
- return (eBadFileNumber);
- *filenum = (int)lvarnum;
- param->old_index = old_index;
- return (0);
- } /* end of get_filenum */
- /*+-------------------------------------------------------------------------
- str_to_filemode(modestr,filemode) - "rwxrwxrwx" to mode integer
- --------------------------------------------------------------------------*/
- str_to_filemode(modestr, filemode)
- char *modestr;
- long *filemode;
- {
- int i;
- int mode = 0;
- int erc = 0;
- if (strlen(modestr) != 9)
- {
- pprintf("bad length: '%s'\n", modestr);
- return (eFATAL_ALREADY);
- }
- for (i = 0; i < 9; i++)
- {
- switch (modestr[i])
- {
- case 'r':
- if (i == 0)
- mode |= S_IRUSR;
- else if (i == 3)
- mode |= S_IRGRP;
- else if (i == 6)
- mode |= S_IROTH;
- else
- erc = eSyntaxError;
- break;
- case 'w':
- if (i == 1)
- mode |= S_IWUSR;
- else if (i == 4)
- mode |= S_IWGRP;
- else if (i == 7)
- mode |= S_IWOTH;
- else
- erc = eSyntaxError;
- break;
- case 'x':
- if (i == 2)
- mode |= S_IXUSR;
- else if (i == 5)
- mode |= S_IXGRP;
- else if (i == 8)
- mode |= S_IXOTH;
- else
- erc = eSyntaxError;
- break;
- case 's':
- if (i == 2)
- {
- mode |= S_ISUID;
- mode |= S_IXUSR;
- }
- else if (i == 5)
- {
- mode |= S_ISGID;
- mode |= S_IXGRP;
- }
- else if (i == 7)
- {
- mode |= S_ISGID;
- mode |= S_IXGRP;
- }
- else
- erc = eSyntaxError;
- break;
- case 't':
- #if defined(FULL_FEATURE_CHMODE)
- if (i == 8)
- {
- mode |= S_ISVTX;
- mode |= S_IXOTH;
- }
- else
- erc = eSyntaxError;
- #else
- pputs("set sticky bit not allowed\n");
- erc = eFATAL_ALREADY;
- #endif /* defined(FULL_FEATURE_CHMODE) */
- break;
- case 'l':
- if (i == 5)
- {
- mode |= S_ISGID;
- mode &= ~S_IXGRP;
- }
- else
- erc = eSyntaxError;
- break;
- case '-':
- break;
- default:
- erc = eSyntaxError;
- } /* end switch */
- if (erc)
- break;
- } /* end for */
- if (erc)
- {
- if (erc != eFATAL_ALREADY)
- pputs("invalid mode specifier\n");
- pputs(modestr);
- while (i--)
- pputc(' ');
- pputs("^\n");
- }
- else
- *filemode = (long)mode;
- return (erc);
- } /* end of str_to_filemode */
- /*+-------------------------------------------------------------------------
- pcmd_fgetc(param)
- fgetc <filenum-int> [$][i<varspec> | $s<varspec>]
- int variable receives 0 if EOF
- str var receives null str on eof
- --------------------------------------------------------------------------*/
- int
- pcmd_fgetc(param)
- ESD *param;
- {
- int erc;
- int filenum;
- int vartype;
- int inchar;
- ESD *svptr;
- long *ivptr;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- skip_cmd_char(param, '$');
- if ((param->index >= param->cb) ||
- (((vartype = to_lower(*(param->pb + param->index))) != 'i') &&
- (vartype != 's')))
- return (eIllegalVarType);
- param->index++;
- switch (vartype)
- {
- case 'i':
- erc = get_ivptr(param, &ivptr, 1);
- break;
- default:
- erc = get_svptr(param, &svptr, 1);
- break;
- }
- if (erc)
- return (erc);
- if ((inchar = fgetc(pfile[filenum].f)) == EOF)
- {
- if (proc_trace)
- pputs("fgetc EOF\n");
- if (vartype == 'i')
- *ivptr = -1;
- else
- esdzero(svptr);
- }
- else if (vartype == 'i')
- *ivptr = inchar;
- else
- {
- *svptr->pb = inchar;
- svptr->cb = 1;
- }
- if (proc_trace)
- {
- pputs("fgetc set ");
- pputs((vartype == 'i') ? "int" : "str");
- pprintf(" var = %lu (0x%02x)\n", inchar, inchar);
- }
- return (0);
- } /* end of pcmd_fgetc */
- /*+-------------------------------------------------------------------------
- pcmd_fread(param)
- --------------------------------------------------------------------------*/
- /*ARGSUSED*/
- int
- pcmd_fread(param)
- ESD *param;
- {
- param = 0; /* unusued */
- return (eNotImplemented);
- } /* end of pcmd_fread */
- /*+-------------------------------------------------------------------------
- pcmd_fgets(param)
- fgetc <filenum-int> [$][s]<varspec>
- --------------------------------------------------------------------------*/
- int
- pcmd_fgets(param)
- ESD *param;
- {
- int erc;
- int filenum;
- char ctmp;
- ESD *svptr;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- skip_cmd_char(param, '$');
- if (erc = get_cmd_char(param, &ctmp))
- return (erc);
- if (to_lower(ctmp) != 's')
- return (eIllegalVarType);
- if (erc = get_svptr(param, &svptr, 1))
- return (erc);
- *svptr->pb = 0;
- svptr->cb = 0;
- if (!(iv[0] = !fgets(svptr->pb, svptr->maxcb + 1, pfile[filenum].f)))
- {
- svptr->cb = strlen(svptr->pb);
- if (*(svptr->pb + svptr->cb - 1) == NL)
- {
- svptr->cb--;
- esd_null_terminate(svptr);
- }
- }
- if (proc_trace)
- pprintf("fgets set str var = '%s'\n", svptr->pb);
- return (0);
- } /* end of pcmd_fgets */
- /*+-------------------------------------------------------------------------
- pcmd_fclose(param)
- fclose <filenum-int>
- --------------------------------------------------------------------------*/
- int
- pcmd_fclose(param)
- ESD *param;
- {
- int erc;
- int filenum;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- close_ecu_file(filenum);
- return (0);
- } /* end of pcmd_fclose */
- /*+-------------------------------------------------------------------------
- pcmd_fputc(param)
- fputc <file-num> <int>
- fputc <file-num> <str>
- --------------------------------------------------------------------------*/
- int
- pcmd_fputc(param)
- ESD *param;
- {
- int erc;
- int filenum;
- ESD *buf = (ESD *) 0;
- char outchar = 0;
- long outlong;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- if (!gint(param, &outlong))
- outchar = (char)outlong;
- else
- {
- if (!(buf = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (erc = gstr(param, buf, 1))
- goto FUNC_RETURN;
- if (!buf->cb)
- {
- pputs("cannot fputc: zero length string\n");
- erc = eFATAL_ALREADY;
- goto FUNC_RETURN;
- }
- outchar = *buf->pb;
- }
- if (fputc(outchar, pfile[filenum].f) < 0)
- {
- pprintf(fwrite_error_fmt, filenum);
- erc = eFATAL_ALREADY;
- }
- FUNC_RETURN:
- if (buf)
- esdfree(buf);
- return (erc);
- } /* end of pcmd_fputc */
- /*+-------------------------------------------------------------------------
- pcmd_fopen(param)
- fopen [-<fopen_switches>] <filenum-int> <filename-str>
- sets $i0 with result
- --------------------------------------------------------------------------*/
- int
- pcmd_fopen(param)
- ESD *param;
- {
- int erc;
- int filenum;
- ESD *fname = (ESD *) 0;
- char switches[8];
- if (!proc_level)
- return (eNotExecutingProc);
- if (get_switches(param, switches, sizeof(switches)))
- {
- strcpy(switches, "-r");
- if (proc_trace)
- {
- pputs("Warning: fopen defaulting to read\n");
- show_error_position(pcb_stack[proc_level - 1]);
- }
- }
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (pfile[filenum].f)
- {
- pprintf("file %d already open\n", filenum);
- return (eFATAL_ALREADY);
- }
- /*
- * get temp for param (all exits after here must go through
- * FUNC_RETURN)
- */
- if (!(fname = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (erc = gstr(param, fname, 1))
- goto FUNC_RETURN;
- iv[0] = 0;
- if (!(pfile[filenum].f = fopen(fname->pb, switches + 1)))
- {
- iv[0] = (long)errno;
- if (proc_trace)
- {
- pprintf("'%s'", fname->pb);
- pperror(" ");
- }
- }
- else if (proc_trace)
- pprintf("opened '%s' as ECU file %d\n", fname->pb, filenum);
- if (!erc)
- {
- pfile[filenum].n = fname;
- pfile[filenum].is_socket = 0;
- }
- FUNC_RETURN:
- if (erc)
- esdfree(fname);
- return (erc);
- } /* end of pcmd_fopen */
- /*+-------------------------------------------------------------------------
- pcmd_fputs(param)
- fputs [-n] <filenum-int> <str>
- -n do not output newline after <str>
- <filenum-int> file number for operation
- <str> string to write to file
- --------------------------------------------------------------------------*/
- int
- pcmd_fputs(param)
- ESD *param;
- {
- int erc;
- int filenum;
- ESD *buf = (ESD *) 0;
- char switches[8];
- if (!proc_level)
- return (eNotExecutingProc);
- get_switches(param, switches, sizeof(switches));
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- if (!(buf = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (erc = gstr(param, buf, 1))
- goto FUNC_RETURN;
- if (!fputs(buf->pb, pfile[filenum].f) && strlen(buf->pb))
- {
- pprintf(fwrite_error_fmt, filenum);
- erc = eFATAL_ALREADY;
- goto FUNC_RETURN;
- }
- if (!strchr(switches, 'n'))
- fputc(NL, pfile[filenum].f);
- FUNC_RETURN:
- esdfree(buf);
- return (erc);
- } /* end of pcmd_fputs */
- /*+-------------------------------------------------------------------------
- pcmd_fwrite(param)
- fwrite <filenum-int> <str>
- --------------------------------------------------------------------------*/
- /*ARGSUSED*/
- int
- pcmd_fwrite(param)
- ESD *param;
- {
- param = 0; /* unusued */
- return (eNotImplemented);
- #ifdef USE_FWRITE
- int erc;
- int filenum;
- ESD *buf = (ESD *) 0;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- if (!(buf = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (erc = gstr(param, buf, 1))
- goto FUNC_RETURN;
- if (!fputs(buf->pb, pfile[filenum].f) && strlen(buf->pb))
- {
- pprintf(fwrite_error_fmt, filenum);
- erc = eFATAL_ALREADY;
- }
- FUNC_RETURN:
- esdfree(buf);
- return (erc);
- #endif
- } /* end of pcmd_fwrite */
- /*+-------------------------------------------------------------------------
- pcmd_fchmod(param)
- fchmod <mode-str> | <mode-int> <filenum-int> | <filename-str>
- $i0 = 0 if successful, else errno
- --------------------------------------------------------------------------*/
- int
- pcmd_fchmod(param)
- ESD *param;
- {
- int erc;
- int filenum;
- ESD *fname = (ESD *) 0;
- ESD *mode = (ESD *) 0;
- long new_mode;
- char *path = "??";;
- if (!(fname = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (!(mode = esdalloc(ESD_NOMSZ)))
- {
- esdfree(fname);
- return (eNoMemory);
- }
- if (erc = skip_cmd_break(param))
- goto FUNC_RETURN;
- else if (!gstr(param, mode, 0))
- {
- if (erc = str_to_filemode(mode->pb, &new_mode))
- goto FUNC_RETURN;
- }
- else if (erc = gint(param, &new_mode))
- {
- erc = eBadParameter;
- goto FUNC_RETURN;
- }
- if (erc = skip_cmd_break(param))
- goto FUNC_RETURN;
- else if (!gstr(param, fname, 1))
- {
- path = fname->pb;
- if (iv[0] = (long)(chmod(path, (unsigned short)new_mode)))
- {
- iv[0] = (long)errno;
- if (proc_trace)
- pperror(path);
- }
- }
- else if (!get_filenum(param, &filenum))
- {
- if (!pfile[filenum].f)
- {
- erc = (_file_not_open(filenum));
- iv[0] = EBADF;
- }
- else if (iv[0] = (long)chmod(pfile[filenum].n->pb,
- (unsigned short)new_mode))
- {
- iv[0] = (long)errno;
- if (proc_trace)
- {
- sprintf(fname->pb, "file %d", filenum);
- pperror(fname->pb);
- }
- }
- if (!iv[0])
- path = pfile[filenum].n->pb;
- }
- else
- erc = eBadParameter;
- if (proc_trace && !erc && !iv[0])
- pprintf("'%s' mode set to %o\n", path, (int)new_mode);
- FUNC_RETURN:
- esdfree(mode);
- esdfree(fname);
- return (erc);
- } /* end of pcmd_fchmod */
- /*+-------------------------------------------------------------------------
- pcmd_fdel(param)
- fdel <filename-str>
- $i0 = 0 if successful, else errno
- --------------------------------------------------------------------------*/
- int
- pcmd_fdel(param)
- ESD *param;
- {
- int erc;
- ESD *fname = (ESD *) 0;
- if (!(fname = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (erc = gstr(param, fname, 1))
- goto FUNC_RETURN;
- if (iv[0] = (long)unlink(fname->pb))
- iv[0] = (long)errno;
- if (proc_trace)
- {
- if (iv[0])
- pperror(fname->pb);
- else
- pprintf("'%s' deleted\n", fname->pb);
- }
- FUNC_RETURN:
- esdfree(fname);
- return (erc);
- } /* end of pcmd_fdel */
- /*+-------------------------------------------------------------------------
- pcmd_fseek(param)
- fseek <filenum-int> <filepos-int>
- sets $i0 with result
- --------------------------------------------------------------------------*/
- int
- pcmd_fseek(param)
- ESD *param;
- {
- int erc;
- int filenum;
- long seekpos;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- if (erc = gint(param, &seekpos))
- return (erc);
- iv[0] = 0;
- if (fseek(pfile[filenum].f, seekpos, 0) < 0)
- {
- iv[0] = (long)errno;
- if (proc_trace)
- {
- pprintf("file %d ", filenum);
- pperror("seek error");
- }
- }
- else if (proc_trace)
- pprintf("file %d set to position %ld\n", filenum, seekpos);
- return (erc);
- } /* end of pcmd_fseek */
- /*+-------------------------------------------------------------------------
- pcmd_fflush(param)
- fflush <filenum-int>
- sets $i0 with result
- --------------------------------------------------------------------------*/
- int
- pcmd_fflush(param)
- ESD *param;
- {
- int erc;
- int filenum;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- iv[0] = 0;
- if (fflush(pfile[filenum].f) < 0)
- {
- iv[0] = (long)errno;
- if (proc_trace)
- {
- pprintf("file %d ", filenum);
- pperror("flush error");
- }
- }
- else if (proc_trace)
- pprintf("file %d flushed\n", filenum);
- return (erc);
- } /* end of pcmd_fflush */
- /*+-------------------------------------------------------------------------
- pcmd_mkdir(param)
- mkdir <filename-str>
- $i0 = 0 if successful, else errno
- --------------------------------------------------------------------------*/
- int
- pcmd_mkdir(param)
- ESD *param;
- {
- int erc;
- ESD *fname = (ESD *) 0;
- if (!(fname = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (erc = gstr(param, fname, 1))
- goto FUNC_RETURN;
- if (iv[0] = (long)mkdir(fname->pb, 0755))
- iv[0] = (long)errno;
- if (proc_trace)
- {
- if (iv[0])
- pperror(fname->pb);
- else
- pprintf("'%s' deleted\n", fname->pb);
- }
- FUNC_RETURN:
- esdfree(fname);
- return (erc);
- } /* end of pcmd_mkdir */
- /*+-------------------------------------------------------------------------
- pcmd_pclose(param)
- pclose <filenum-int>
- --------------------------------------------------------------------------*/
- int
- pcmd_pclose(param)
- ESD *param;
- {
- int erc;
- int filenum;
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (pfile[filenum].f)
- {
- pclose(pfile[filenum].f);
- pfile[filenum].f = (FILE *) 0;
- esdfree(pfile[filenum].n);
- }
- return (0);
- } /* end of pcmd_pclose */
- /*+-------------------------------------------------------------------------
- pcmd_popen(param)
- popen [-<popen_switches>] <filenum-int> <filename-str>
- sets $i0 with result
- --------------------------------------------------------------------------*/
- int
- pcmd_popen(param)
- ESD *param;
- {
- int erc;
- int filenum;
- ESD *fname = 0;
- char switches[8];
- #if !defined(M_UNIX)
- FILE *popen();
- #endif
- if (!proc_level)
- return (eNotExecutingProc);
- if (get_switches(param, switches, sizeof(switches)))
- {
- strcpy(switches, "-r");
- if (proc_trace)
- {
- pputs("Warning: popen defaulting to read\n");
- show_error_position(pcb_stack[proc_level - 1]);
- }
- }
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (pfile[filenum].f)
- {
- pprintf("file %d already open\n", filenum);
- return (eFATAL_ALREADY);
- }
- if (!(fname = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (erc = gstr(param, fname, 1))
- goto FUNC_RETURN;
- iv[0] = 0;
- if (pfile[filenum].f = popen(fname->pb, switches + 1))
- {
- iv[0] = (long)errno;
- if (proc_trace)
- {
- pprintf("'%s'", fname->pb);
- pperror(" ");
- }
- }
- else if (proc_trace)
- pprintf("opened '%s' as ECU file %d\n", fname->pb, filenum);
- if (!erc)
- pfile[filenum].n = fname;
- FUNC_RETURN:
- if (erc && fname)
- esdfree(fname);
- return (erc);
- } /* end of pcmd_popen */
- /*+-------------------------------------------------------------------------
- ifunc_ftell(param,pvalue)
- %ftell(<filenum-int>)
- --------------------------------------------------------------------------*/
- int
- ifunc_ftell(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- int filenum;
- long ftell();
- if (!proc_level)
- return (eNotExecutingProc);
- if (erc = skip_paren(param, 1))
- return (erc);
- if (erc = get_filenum(param, &filenum))
- return (erc);
- if (!pfile[filenum].f)
- return (_file_not_open(filenum));
- if (erc = skip_paren(param, 0))
- return (erc);
- *pvalue = ftell(pfile[filenum].f);
- return (0);
- } /* end of ifunc_ftell */
- /*+-------------------------------------------------------------------------
- _param_to_stat(param,pstat_rtnd)
- --------------------------------------------------------------------------*/
- int
- _param_to_stat(param, pstat_rtnd)
- ESD *param;
- struct stat **pstat_rtnd;
- {
- int erc;
- int filenum;
- static struct stat fst;
- struct stat *pstat = &fst;
- ESD *fname;
- errno = 0;
- if (erc = skip_paren(param, 1))
- return (erc);
- if (!(fname = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- if (!gstr(param, fname, 1))
- {
- if (stat(fname->pb, pstat))
- pstat = (struct stat *)0;
- }
- else if (param->index = param->old_index, !get_filenum(param, &filenum))
- {
- if (!pfile[filenum].f)
- {
- esdfree(fname);
- return (_file_not_open(filenum));
- }
- if (stat(pfile[filenum].n->pb, pstat))
- pstat = (struct stat *)0;
- }
- else
- erc = eBadParameter;
- esdfree(fname);
- if (erc)
- return (erc);
- if (erc = skip_paren(param, 0))
- return (erc);
- *pstat_rtnd = pstat;
- if (proc_trace && !pstat)
- pperror("stat");
- return (0);
- } /* end of _param_to_stat */
- /*+-------------------------------------------------------------------------
- ifunc_fsize(param,pvalue)
- %fsize(<filenum-int>)
- %fsize('filename')
- --------------------------------------------------------------------------*/
- int
- ifunc_fsize(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- struct stat *pstat;
- if (erc = _param_to_stat(param, &pstat))
- return (erc);
- if (!pstat)
- *pvalue = -1;
- else
- *pvalue = pstat->st_size;
- return (0);
- } /* end of ifunc_fsize */
- /*+-------------------------------------------------------------------------
- ifunc_fatime(param,pvalue)
- %fatime(<filenum-int>)
- %fatime('filename')
- --------------------------------------------------------------------------*/
- int
- ifunc_fatime(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- struct stat *pstat;
- if (erc = _param_to_stat(param, &pstat))
- return (erc);
- if (!pstat)
- *pvalue = -1;
- else
- *pvalue = pstat->st_atime;
- return (0);
- } /* end of ifunc_fatime */
- /*+-------------------------------------------------------------------------
- ifunc_fmtime(param,pvalue)
- %fmtime(<filenum-int>)
- %fmtime('filename')
- --------------------------------------------------------------------------*/
- int
- ifunc_fmtime(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- struct stat *pstat;
- if (erc = _param_to_stat(param, &pstat))
- return (erc);
- if (!pstat)
- *pvalue = -1;
- else
- *pvalue = pstat->st_mtime;
- return (0);
- } /* end of ifunc_fmtime */
- /*+-------------------------------------------------------------------------
- ifunc_fmode(param,pvalue)
- %fmode(<filenum-int>)
- %fmode('filename')
- --------------------------------------------------------------------------*/
- int
- ifunc_fmode(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- struct stat *pstat;
- if (erc = _param_to_stat(param, &pstat))
- return (erc);
- if (!pstat)
- *pvalue = -1;
- else
- *pvalue = (long)pstat->st_mode;
- return (0);
- } /* end of ifunc_fmode */
- /*+-------------------------------------------------------------------------
- ifunc_isreg(param,pvalue)
- %isreg(<filenum-int>)
- %isreg('filename')
- --------------------------------------------------------------------------*/
- int
- ifunc_isreg(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- if (erc = ifunc_fmode(param, pvalue))
- return (erc);
- if (*pvalue != -1)
- *pvalue = ((*pvalue & S_IFMT) == S_IFREG);
- return (0);
- } /* end of ifunc_isreg */
- /*+-------------------------------------------------------------------------
- ifunc_isdir(param,pvalue)
- %isdir(<filenum-int>)
- %isdir('filename')
- --------------------------------------------------------------------------*/
- int
- ifunc_isdir(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- if (erc = ifunc_fmode(param, pvalue))
- return (erc);
- if (*pvalue != -1)
- *pvalue = ((*pvalue & S_IFMT) == S_IFDIR);
- return (0);
- } /* end of ifunc_isdir */
- /*+-------------------------------------------------------------------------
- ifunc_ischr(param,pvalue)
- %ischr(<filenum-int>)
- %ischr('filename')
- --------------------------------------------------------------------------*/
- int
- ifunc_ischr(param, pvalue)
- ESD *param;
- long *pvalue;
- {
- int erc;
- if (erc = ifunc_fmode(param, pvalue))
- return (erc);
- if (*pvalue != -1)
- *pvalue = ((*pvalue & S_IFMT) == S_IFCHR);
- return (0);
- } /* end of ifunc_ischr */
- /*+-------------------------------------------------------------------------
- get_free_filenum()
- --------------------------------------------------------------------------*/
- static int
- get_free_filenum()
- {
- int fnum;
- for(fnum = FILE_MAX; fnum >= 0; fnum--)
- {
- if(!pfile[fnum].f)
- return(fnum);
- }
- return(-1);
- } /* end of get_free_filenum */
- /*+-------------------------------------------------------------------------
- socket_fdopen(fd,pecufnum) - open an ECU file descriptor for a socket
- --------------------------------------------------------------------------*/
- int
- socket_fdopen(fd,pecufnum)
- int fd;
- int *pecufnum;
- {
- int filenum;
- ESD *fname = (ESD *) 0;
- if (!proc_level)
- return (eNotExecutingProc);
- if((filenum = get_free_filenum()) < 0)
- return (eNoFreeFile);
- if (pfile[filenum].f)
- {
- pprintf("file %d already open\n", filenum);
- return (eFATAL_ALREADY);
- }
- if (!(fname = esdalloc(ESD_NOMSZ)))
- return (eNoMemory);
- sprintf(fname->pb,"socket_%03d",fd); fname->cb = strlen(fname->pb);
- fname->cb = strlen(fname->pb);
- pfile[filenum].f = fdopen(fd,"r+");
- setbuf(pfile[filenum].f,0);
- if (proc_trace)
- pprintf("fdopened '%s' as ECU file %d\n", fname->pb, filenum);
- pfile[filenum].n = fname;
- pfile[filenum].is_socket = 1;
- *pecufnum = filenum;
- return (0);
- } /* end of socket_fdopen */
- /*+-------------------------------------------------------------------------
- ecufileno(filenum)
- --------------------------------------------------------------------------*/
- int
- ecufileno(filenum)
- UINT filenum;
- {
- FILE *fp;
- if (filenum > FILE_MAX)
- return (-1);
- if(!(fp = pfile[filenum].f))
- return (-1);
- return(fileno(fp));
- } /* end of ecufileno */
- /* vi: set tabstop=4 shiftwidth=4: */
- /* end of pcmdfile.c */
|