pcmdfile.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281
  1. /*+-------------------------------------------------------------------------
  2. pcmdfile.c - ecu file-related procedure commands
  3. wht@wht.net
  4. Defined functions:
  5. _file_not_open(filenum)
  6. _param_to_stat(param, pstat_rtnd)
  7. get_filenum(param, filenum)
  8. ifunc_fatime(param, pvalue)
  9. ifunc_fmode(param, pvalue)
  10. ifunc_fmtime(param, pvalue)
  11. ifunc_fsize(param, pvalue)
  12. ifunc_ftell(param, pvalue)
  13. ifunc_ischr(param, pvalue)
  14. ifunc_isdir(param, pvalue)
  15. ifunc_isreg(param, pvalue)
  16. pcmd_fchmod(param)
  17. pcmd_fclose(param)
  18. pcmd_fdel(param)
  19. pcmd_fgetc(param)
  20. pcmd_fgets(param)
  21. pcmd_fopen(param)
  22. pcmd_fputc(param)
  23. pcmd_fputs(param)
  24. pcmd_fread(param)
  25. pcmd_fflush(param)
  26. pcmd_fwrite(param)
  27. pcmd_mkdir(param)
  28. pcmd_pclose(param)
  29. pcmd_popen(param)
  30. proc_file_reset()
  31. str_to_filemode(modestr, filemode)
  32. --------------------------------------------------------------------------*/
  33. /*+:EDITS:*/
  34. /*:04-26-2000-11:16-wht@bob-RELEASE 4.42 */
  35. /*:03-31-1998-17:38-wht@kepler-add fdopen_socket */
  36. /*:01-25-1997-13:31-wht@yuriatin-add fflush */
  37. /*:01-24-1997-02:38-wht@yuriatin-SOURCE RELEASE 4.00 */
  38. /*:09-11-1996-20:00-wht@yuriatin-3.48-major telnet,curses,structural overhaul */
  39. /*:11-23-1995-11:20-wht@kepler-source control 3.37 for tsx-11 */
  40. /*:11-14-1995-10:23-wht@kepler-3.37.80-source control point: SOCKETS */
  41. /*:05-04-1994-04:39-wht@n4hgf-ECU release 3.30 */
  42. /*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 */
  43. /*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA */
  44. /*:07-03-1992-12:48-wht@n4hgf-why not let fchmod set any bits? */
  45. /*:07-25-1991-12:59-wht@n4hgf-ECU release 3.10 */
  46. /*:06-27-1991-13:45-wht@n4hgf-$i0 wasn't always plugged on failures */
  47. /*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  48. #include "ecu.h"
  49. #include "ecukey.h"
  50. #include "ecuerror.h"
  51. #include "esd.h"
  52. #include "var.h"
  53. #include "procedure.h"
  54. #if !defined(S_IRUSR)
  55. #define S_IRUSR 00400 /* read permission: owner */
  56. #define S_IWUSR 00200 /* write permission: owner */
  57. #define S_IXUSR 00100 /* execute permission: owner */
  58. #define S_IRWXG 00070 /* read, write, execute: group */
  59. #define S_IRGRP 00040 /* read permission: group */
  60. #define S_IWGRP 00020 /* write permission: group */
  61. #define S_IXGRP 00010 /* execute permission: group */
  62. #define S_IRWXO 00007 /* read, write, execute: other */
  63. #define S_IROTH 00004 /* read permission: other */
  64. #define S_IWOTH 00002 /* write permission: other */
  65. #define S_IXOTH 00001 /* execute permission: other */
  66. #endif
  67. extern PCB *pcb_stack[];
  68. #define FILE_MAX 10
  69. typedef struct pfile_struct
  70. {
  71. FILE *f; /* file pointer */
  72. ESD *n; /* file name */
  73. int is_socket; /* true if file is fdopen_socket stuff */
  74. int in_use;
  75. } PFILE;
  76. PFILE pfile[FILE_MAX];
  77. char fwrite_error_fmt[] = "file %d write error (not open for write?)\n";
  78. /*+-------------------------------------------------------------------------
  79. close_ecu_file(filenum)
  80. --------------------------------------------------------------------------*/
  81. void
  82. close_ecu_file(filenum)
  83. UINT filenum;
  84. {
  85. if (filenum > FILE_MAX)
  86. return;
  87. if (pfile[filenum].f)
  88. {
  89. if(pfile[filenum].is_socket)
  90. close(fileno(pfile[filenum].f));
  91. fclose(pfile[filenum].f);
  92. esdfree(pfile[filenum].n);
  93. memset((char *)&pfile[filenum],0,sizeof(pfile[0]));
  94. }
  95. } /* end of close_ecu_file */
  96. /*+-------------------------------------------------------------------------
  97. proc_file_reset()
  98. --------------------------------------------------------------------------*/
  99. void
  100. proc_file_reset()
  101. {
  102. int itmp;
  103. for (itmp = 0; itmp < FILE_MAX; itmp++)
  104. {
  105. close_ecu_file(itmp);
  106. }
  107. } /* end of proc_file_reset */
  108. /*+-------------------------------------------------------------------------
  109. _file_not_open(filenum)
  110. --------------------------------------------------------------------------*/
  111. int
  112. _file_not_open(filenum)
  113. int filenum;
  114. {
  115. pprintf("file %d not open\n", filenum);
  116. return (eFATAL_ALREADY);
  117. } /* end of _file_not_open */
  118. /*+-------------------------------------------------------------------------
  119. get_filenum(param,filenum)
  120. --------------------------------------------------------------------------*/
  121. int
  122. get_filenum(param, filenum)
  123. ESD *param;
  124. int *filenum;
  125. {
  126. int erc;
  127. UINT32 lvarnum;
  128. int old_index;
  129. skip_cmd_break(param);
  130. old_index = param->old_index;
  131. if (erc = gint(param, &lvarnum))
  132. return (erc);
  133. if (lvarnum > FILE_MAX)
  134. return (eBadFileNumber);
  135. *filenum = (int)lvarnum;
  136. param->old_index = old_index;
  137. return (0);
  138. } /* end of get_filenum */
  139. /*+-------------------------------------------------------------------------
  140. str_to_filemode(modestr,filemode) - "rwxrwxrwx" to mode integer
  141. --------------------------------------------------------------------------*/
  142. str_to_filemode(modestr, filemode)
  143. char *modestr;
  144. long *filemode;
  145. {
  146. int i;
  147. int mode = 0;
  148. int erc = 0;
  149. if (strlen(modestr) != 9)
  150. {
  151. pprintf("bad length: '%s'\n", modestr);
  152. return (eFATAL_ALREADY);
  153. }
  154. for (i = 0; i < 9; i++)
  155. {
  156. switch (modestr[i])
  157. {
  158. case 'r':
  159. if (i == 0)
  160. mode |= S_IRUSR;
  161. else if (i == 3)
  162. mode |= S_IRGRP;
  163. else if (i == 6)
  164. mode |= S_IROTH;
  165. else
  166. erc = eSyntaxError;
  167. break;
  168. case 'w':
  169. if (i == 1)
  170. mode |= S_IWUSR;
  171. else if (i == 4)
  172. mode |= S_IWGRP;
  173. else if (i == 7)
  174. mode |= S_IWOTH;
  175. else
  176. erc = eSyntaxError;
  177. break;
  178. case 'x':
  179. if (i == 2)
  180. mode |= S_IXUSR;
  181. else if (i == 5)
  182. mode |= S_IXGRP;
  183. else if (i == 8)
  184. mode |= S_IXOTH;
  185. else
  186. erc = eSyntaxError;
  187. break;
  188. case 's':
  189. if (i == 2)
  190. {
  191. mode |= S_ISUID;
  192. mode |= S_IXUSR;
  193. }
  194. else if (i == 5)
  195. {
  196. mode |= S_ISGID;
  197. mode |= S_IXGRP;
  198. }
  199. else if (i == 7)
  200. {
  201. mode |= S_ISGID;
  202. mode |= S_IXGRP;
  203. }
  204. else
  205. erc = eSyntaxError;
  206. break;
  207. case 't':
  208. #if defined(FULL_FEATURE_CHMODE)
  209. if (i == 8)
  210. {
  211. mode |= S_ISVTX;
  212. mode |= S_IXOTH;
  213. }
  214. else
  215. erc = eSyntaxError;
  216. #else
  217. pputs("set sticky bit not allowed\n");
  218. erc = eFATAL_ALREADY;
  219. #endif /* defined(FULL_FEATURE_CHMODE) */
  220. break;
  221. case 'l':
  222. if (i == 5)
  223. {
  224. mode |= S_ISGID;
  225. mode &= ~S_IXGRP;
  226. }
  227. else
  228. erc = eSyntaxError;
  229. break;
  230. case '-':
  231. break;
  232. default:
  233. erc = eSyntaxError;
  234. } /* end switch */
  235. if (erc)
  236. break;
  237. } /* end for */
  238. if (erc)
  239. {
  240. if (erc != eFATAL_ALREADY)
  241. pputs("invalid mode specifier\n");
  242. pputs(modestr);
  243. while (i--)
  244. pputc(' ');
  245. pputs("^\n");
  246. }
  247. else
  248. *filemode = (long)mode;
  249. return (erc);
  250. } /* end of str_to_filemode */
  251. /*+-------------------------------------------------------------------------
  252. pcmd_fgetc(param)
  253. fgetc <filenum-int> [$][i<varspec> | $s<varspec>]
  254. int variable receives 0 if EOF
  255. str var receives null str on eof
  256. --------------------------------------------------------------------------*/
  257. int
  258. pcmd_fgetc(param)
  259. ESD *param;
  260. {
  261. int erc;
  262. int filenum;
  263. int vartype;
  264. int inchar;
  265. ESD *svptr;
  266. long *ivptr;
  267. if (!proc_level)
  268. return (eNotExecutingProc);
  269. if (erc = get_filenum(param, &filenum))
  270. return (erc);
  271. if (!pfile[filenum].f)
  272. return (_file_not_open(filenum));
  273. skip_cmd_char(param, '$');
  274. if ((param->index >= param->cb) ||
  275. (((vartype = to_lower(*(param->pb + param->index))) != 'i') &&
  276. (vartype != 's')))
  277. return (eIllegalVarType);
  278. param->index++;
  279. switch (vartype)
  280. {
  281. case 'i':
  282. erc = get_ivptr(param, &ivptr, 1);
  283. break;
  284. default:
  285. erc = get_svptr(param, &svptr, 1);
  286. break;
  287. }
  288. if (erc)
  289. return (erc);
  290. if ((inchar = fgetc(pfile[filenum].f)) == EOF)
  291. {
  292. if (proc_trace)
  293. pputs("fgetc EOF\n");
  294. if (vartype == 'i')
  295. *ivptr = -1;
  296. else
  297. esdzero(svptr);
  298. }
  299. else if (vartype == 'i')
  300. *ivptr = inchar;
  301. else
  302. {
  303. *svptr->pb = inchar;
  304. svptr->cb = 1;
  305. }
  306. if (proc_trace)
  307. {
  308. pputs("fgetc set ");
  309. pputs((vartype == 'i') ? "int" : "str");
  310. pprintf(" var = %lu (0x%02x)\n", inchar, inchar);
  311. }
  312. return (0);
  313. } /* end of pcmd_fgetc */
  314. /*+-------------------------------------------------------------------------
  315. pcmd_fread(param)
  316. --------------------------------------------------------------------------*/
  317. /*ARGSUSED*/
  318. int
  319. pcmd_fread(param)
  320. ESD *param;
  321. {
  322. param = 0; /* unusued */
  323. return (eNotImplemented);
  324. } /* end of pcmd_fread */
  325. /*+-------------------------------------------------------------------------
  326. pcmd_fgets(param)
  327. fgetc <filenum-int> [$][s]<varspec>
  328. --------------------------------------------------------------------------*/
  329. int
  330. pcmd_fgets(param)
  331. ESD *param;
  332. {
  333. int erc;
  334. int filenum;
  335. char ctmp;
  336. ESD *svptr;
  337. if (!proc_level)
  338. return (eNotExecutingProc);
  339. if (erc = get_filenum(param, &filenum))
  340. return (erc);
  341. if (!pfile[filenum].f)
  342. return (_file_not_open(filenum));
  343. skip_cmd_char(param, '$');
  344. if (erc = get_cmd_char(param, &ctmp))
  345. return (erc);
  346. if (to_lower(ctmp) != 's')
  347. return (eIllegalVarType);
  348. if (erc = get_svptr(param, &svptr, 1))
  349. return (erc);
  350. *svptr->pb = 0;
  351. svptr->cb = 0;
  352. if (!(iv[0] = !fgets(svptr->pb, svptr->maxcb + 1, pfile[filenum].f)))
  353. {
  354. svptr->cb = strlen(svptr->pb);
  355. if (*(svptr->pb + svptr->cb - 1) == NL)
  356. {
  357. svptr->cb--;
  358. esd_null_terminate(svptr);
  359. }
  360. }
  361. if (proc_trace)
  362. pprintf("fgets set str var = '%s'\n", svptr->pb);
  363. return (0);
  364. } /* end of pcmd_fgets */
  365. /*+-------------------------------------------------------------------------
  366. pcmd_fclose(param)
  367. fclose <filenum-int>
  368. --------------------------------------------------------------------------*/
  369. int
  370. pcmd_fclose(param)
  371. ESD *param;
  372. {
  373. int erc;
  374. int filenum;
  375. if (!proc_level)
  376. return (eNotExecutingProc);
  377. if (erc = get_filenum(param, &filenum))
  378. return (erc);
  379. close_ecu_file(filenum);
  380. return (0);
  381. } /* end of pcmd_fclose */
  382. /*+-------------------------------------------------------------------------
  383. pcmd_fputc(param)
  384. fputc <file-num> <int>
  385. fputc <file-num> <str>
  386. --------------------------------------------------------------------------*/
  387. int
  388. pcmd_fputc(param)
  389. ESD *param;
  390. {
  391. int erc;
  392. int filenum;
  393. ESD *buf = (ESD *) 0;
  394. char outchar = 0;
  395. long outlong;
  396. if (!proc_level)
  397. return (eNotExecutingProc);
  398. if (erc = get_filenum(param, &filenum))
  399. return (erc);
  400. if (!pfile[filenum].f)
  401. return (_file_not_open(filenum));
  402. if (!gint(param, &outlong))
  403. outchar = (char)outlong;
  404. else
  405. {
  406. if (!(buf = esdalloc(ESD_NOMSZ)))
  407. return (eNoMemory);
  408. if (erc = gstr(param, buf, 1))
  409. goto FUNC_RETURN;
  410. if (!buf->cb)
  411. {
  412. pputs("cannot fputc: zero length string\n");
  413. erc = eFATAL_ALREADY;
  414. goto FUNC_RETURN;
  415. }
  416. outchar = *buf->pb;
  417. }
  418. if (fputc(outchar, pfile[filenum].f) < 0)
  419. {
  420. pprintf(fwrite_error_fmt, filenum);
  421. erc = eFATAL_ALREADY;
  422. }
  423. FUNC_RETURN:
  424. if (buf)
  425. esdfree(buf);
  426. return (erc);
  427. } /* end of pcmd_fputc */
  428. /*+-------------------------------------------------------------------------
  429. pcmd_fopen(param)
  430. fopen [-<fopen_switches>] <filenum-int> <filename-str>
  431. sets $i0 with result
  432. --------------------------------------------------------------------------*/
  433. int
  434. pcmd_fopen(param)
  435. ESD *param;
  436. {
  437. int erc;
  438. int filenum;
  439. ESD *fname = (ESD *) 0;
  440. char switches[8];
  441. if (!proc_level)
  442. return (eNotExecutingProc);
  443. if (get_switches(param, switches, sizeof(switches)))
  444. {
  445. strcpy(switches, "-r");
  446. if (proc_trace)
  447. {
  448. pputs("Warning: fopen defaulting to read\n");
  449. show_error_position(pcb_stack[proc_level - 1]);
  450. }
  451. }
  452. if (erc = get_filenum(param, &filenum))
  453. return (erc);
  454. if (pfile[filenum].f)
  455. {
  456. pprintf("file %d already open\n", filenum);
  457. return (eFATAL_ALREADY);
  458. }
  459. /*
  460. * get temp for param (all exits after here must go through
  461. * FUNC_RETURN)
  462. */
  463. if (!(fname = esdalloc(ESD_NOMSZ)))
  464. return (eNoMemory);
  465. if (erc = gstr(param, fname, 1))
  466. goto FUNC_RETURN;
  467. iv[0] = 0;
  468. if (!(pfile[filenum].f = fopen(fname->pb, switches + 1)))
  469. {
  470. iv[0] = (long)errno;
  471. if (proc_trace)
  472. {
  473. pprintf("'%s'", fname->pb);
  474. pperror(" ");
  475. }
  476. }
  477. else if (proc_trace)
  478. pprintf("opened '%s' as ECU file %d\n", fname->pb, filenum);
  479. if (!erc)
  480. {
  481. pfile[filenum].n = fname;
  482. pfile[filenum].is_socket = 0;
  483. }
  484. FUNC_RETURN:
  485. if (erc)
  486. esdfree(fname);
  487. return (erc);
  488. } /* end of pcmd_fopen */
  489. /*+-------------------------------------------------------------------------
  490. pcmd_fputs(param)
  491. fputs [-n] <filenum-int> <str>
  492. -n do not output newline after <str>
  493. <filenum-int> file number for operation
  494. <str> string to write to file
  495. --------------------------------------------------------------------------*/
  496. int
  497. pcmd_fputs(param)
  498. ESD *param;
  499. {
  500. int erc;
  501. int filenum;
  502. ESD *buf = (ESD *) 0;
  503. char switches[8];
  504. if (!proc_level)
  505. return (eNotExecutingProc);
  506. get_switches(param, switches, sizeof(switches));
  507. if (erc = get_filenum(param, &filenum))
  508. return (erc);
  509. if (!pfile[filenum].f)
  510. return (_file_not_open(filenum));
  511. if (!(buf = esdalloc(ESD_NOMSZ)))
  512. return (eNoMemory);
  513. if (erc = gstr(param, buf, 1))
  514. goto FUNC_RETURN;
  515. if (!fputs(buf->pb, pfile[filenum].f) && strlen(buf->pb))
  516. {
  517. pprintf(fwrite_error_fmt, filenum);
  518. erc = eFATAL_ALREADY;
  519. goto FUNC_RETURN;
  520. }
  521. if (!strchr(switches, 'n'))
  522. fputc(NL, pfile[filenum].f);
  523. FUNC_RETURN:
  524. esdfree(buf);
  525. return (erc);
  526. } /* end of pcmd_fputs */
  527. /*+-------------------------------------------------------------------------
  528. pcmd_fwrite(param)
  529. fwrite <filenum-int> <str>
  530. --------------------------------------------------------------------------*/
  531. /*ARGSUSED*/
  532. int
  533. pcmd_fwrite(param)
  534. ESD *param;
  535. {
  536. param = 0; /* unusued */
  537. return (eNotImplemented);
  538. #ifdef USE_FWRITE
  539. int erc;
  540. int filenum;
  541. ESD *buf = (ESD *) 0;
  542. if (!proc_level)
  543. return (eNotExecutingProc);
  544. if (erc = get_filenum(param, &filenum))
  545. return (erc);
  546. if (!pfile[filenum].f)
  547. return (_file_not_open(filenum));
  548. if (!(buf = esdalloc(ESD_NOMSZ)))
  549. return (eNoMemory);
  550. if (erc = gstr(param, buf, 1))
  551. goto FUNC_RETURN;
  552. if (!fputs(buf->pb, pfile[filenum].f) && strlen(buf->pb))
  553. {
  554. pprintf(fwrite_error_fmt, filenum);
  555. erc = eFATAL_ALREADY;
  556. }
  557. FUNC_RETURN:
  558. esdfree(buf);
  559. return (erc);
  560. #endif
  561. } /* end of pcmd_fwrite */
  562. /*+-------------------------------------------------------------------------
  563. pcmd_fchmod(param)
  564. fchmod <mode-str> | <mode-int> <filenum-int> | <filename-str>
  565. $i0 = 0 if successful, else errno
  566. --------------------------------------------------------------------------*/
  567. int
  568. pcmd_fchmod(param)
  569. ESD *param;
  570. {
  571. int erc;
  572. int filenum;
  573. ESD *fname = (ESD *) 0;
  574. ESD *mode = (ESD *) 0;
  575. long new_mode;
  576. char *path = "??";;
  577. if (!(fname = esdalloc(ESD_NOMSZ)))
  578. return (eNoMemory);
  579. if (!(mode = esdalloc(ESD_NOMSZ)))
  580. {
  581. esdfree(fname);
  582. return (eNoMemory);
  583. }
  584. if (erc = skip_cmd_break(param))
  585. goto FUNC_RETURN;
  586. else if (!gstr(param, mode, 0))
  587. {
  588. if (erc = str_to_filemode(mode->pb, &new_mode))
  589. goto FUNC_RETURN;
  590. }
  591. else if (erc = gint(param, &new_mode))
  592. {
  593. erc = eBadParameter;
  594. goto FUNC_RETURN;
  595. }
  596. if (erc = skip_cmd_break(param))
  597. goto FUNC_RETURN;
  598. else if (!gstr(param, fname, 1))
  599. {
  600. path = fname->pb;
  601. if (iv[0] = (long)(chmod(path, (unsigned short)new_mode)))
  602. {
  603. iv[0] = (long)errno;
  604. if (proc_trace)
  605. pperror(path);
  606. }
  607. }
  608. else if (!get_filenum(param, &filenum))
  609. {
  610. if (!pfile[filenum].f)
  611. {
  612. erc = (_file_not_open(filenum));
  613. iv[0] = EBADF;
  614. }
  615. else if (iv[0] = (long)chmod(pfile[filenum].n->pb,
  616. (unsigned short)new_mode))
  617. {
  618. iv[0] = (long)errno;
  619. if (proc_trace)
  620. {
  621. sprintf(fname->pb, "file %d", filenum);
  622. pperror(fname->pb);
  623. }
  624. }
  625. if (!iv[0])
  626. path = pfile[filenum].n->pb;
  627. }
  628. else
  629. erc = eBadParameter;
  630. if (proc_trace && !erc && !iv[0])
  631. pprintf("'%s' mode set to %o\n", path, (int)new_mode);
  632. FUNC_RETURN:
  633. esdfree(mode);
  634. esdfree(fname);
  635. return (erc);
  636. } /* end of pcmd_fchmod */
  637. /*+-------------------------------------------------------------------------
  638. pcmd_fdel(param)
  639. fdel <filename-str>
  640. $i0 = 0 if successful, else errno
  641. --------------------------------------------------------------------------*/
  642. int
  643. pcmd_fdel(param)
  644. ESD *param;
  645. {
  646. int erc;
  647. ESD *fname = (ESD *) 0;
  648. if (!(fname = esdalloc(ESD_NOMSZ)))
  649. return (eNoMemory);
  650. if (erc = gstr(param, fname, 1))
  651. goto FUNC_RETURN;
  652. if (iv[0] = (long)unlink(fname->pb))
  653. iv[0] = (long)errno;
  654. if (proc_trace)
  655. {
  656. if (iv[0])
  657. pperror(fname->pb);
  658. else
  659. pprintf("'%s' deleted\n", fname->pb);
  660. }
  661. FUNC_RETURN:
  662. esdfree(fname);
  663. return (erc);
  664. } /* end of pcmd_fdel */
  665. /*+-------------------------------------------------------------------------
  666. pcmd_fseek(param)
  667. fseek <filenum-int> <filepos-int>
  668. sets $i0 with result
  669. --------------------------------------------------------------------------*/
  670. int
  671. pcmd_fseek(param)
  672. ESD *param;
  673. {
  674. int erc;
  675. int filenum;
  676. long seekpos;
  677. if (!proc_level)
  678. return (eNotExecutingProc);
  679. if (erc = get_filenum(param, &filenum))
  680. return (erc);
  681. if (!pfile[filenum].f)
  682. return (_file_not_open(filenum));
  683. if (erc = gint(param, &seekpos))
  684. return (erc);
  685. iv[0] = 0;
  686. if (fseek(pfile[filenum].f, seekpos, 0) < 0)
  687. {
  688. iv[0] = (long)errno;
  689. if (proc_trace)
  690. {
  691. pprintf("file %d ", filenum);
  692. pperror("seek error");
  693. }
  694. }
  695. else if (proc_trace)
  696. pprintf("file %d set to position %ld\n", filenum, seekpos);
  697. return (erc);
  698. } /* end of pcmd_fseek */
  699. /*+-------------------------------------------------------------------------
  700. pcmd_fflush(param)
  701. fflush <filenum-int>
  702. sets $i0 with result
  703. --------------------------------------------------------------------------*/
  704. int
  705. pcmd_fflush(param)
  706. ESD *param;
  707. {
  708. int erc;
  709. int filenum;
  710. if (!proc_level)
  711. return (eNotExecutingProc);
  712. if (erc = get_filenum(param, &filenum))
  713. return (erc);
  714. if (!pfile[filenum].f)
  715. return (_file_not_open(filenum));
  716. iv[0] = 0;
  717. if (fflush(pfile[filenum].f) < 0)
  718. {
  719. iv[0] = (long)errno;
  720. if (proc_trace)
  721. {
  722. pprintf("file %d ", filenum);
  723. pperror("flush error");
  724. }
  725. }
  726. else if (proc_trace)
  727. pprintf("file %d flushed\n", filenum);
  728. return (erc);
  729. } /* end of pcmd_fflush */
  730. /*+-------------------------------------------------------------------------
  731. pcmd_mkdir(param)
  732. mkdir <filename-str>
  733. $i0 = 0 if successful, else errno
  734. --------------------------------------------------------------------------*/
  735. int
  736. pcmd_mkdir(param)
  737. ESD *param;
  738. {
  739. int erc;
  740. ESD *fname = (ESD *) 0;
  741. if (!(fname = esdalloc(ESD_NOMSZ)))
  742. return (eNoMemory);
  743. if (erc = gstr(param, fname, 1))
  744. goto FUNC_RETURN;
  745. if (iv[0] = (long)mkdir(fname->pb, 0755))
  746. iv[0] = (long)errno;
  747. if (proc_trace)
  748. {
  749. if (iv[0])
  750. pperror(fname->pb);
  751. else
  752. pprintf("'%s' deleted\n", fname->pb);
  753. }
  754. FUNC_RETURN:
  755. esdfree(fname);
  756. return (erc);
  757. } /* end of pcmd_mkdir */
  758. /*+-------------------------------------------------------------------------
  759. pcmd_pclose(param)
  760. pclose <filenum-int>
  761. --------------------------------------------------------------------------*/
  762. int
  763. pcmd_pclose(param)
  764. ESD *param;
  765. {
  766. int erc;
  767. int filenum;
  768. if (!proc_level)
  769. return (eNotExecutingProc);
  770. if (erc = get_filenum(param, &filenum))
  771. return (erc);
  772. if (pfile[filenum].f)
  773. {
  774. pclose(pfile[filenum].f);
  775. pfile[filenum].f = (FILE *) 0;
  776. esdfree(pfile[filenum].n);
  777. }
  778. return (0);
  779. } /* end of pcmd_pclose */
  780. /*+-------------------------------------------------------------------------
  781. pcmd_popen(param)
  782. popen [-<popen_switches>] <filenum-int> <filename-str>
  783. sets $i0 with result
  784. --------------------------------------------------------------------------*/
  785. int
  786. pcmd_popen(param)
  787. ESD *param;
  788. {
  789. int erc;
  790. int filenum;
  791. ESD *fname = 0;
  792. char switches[8];
  793. #if !defined(M_UNIX)
  794. FILE *popen();
  795. #endif
  796. if (!proc_level)
  797. return (eNotExecutingProc);
  798. if (get_switches(param, switches, sizeof(switches)))
  799. {
  800. strcpy(switches, "-r");
  801. if (proc_trace)
  802. {
  803. pputs("Warning: popen defaulting to read\n");
  804. show_error_position(pcb_stack[proc_level - 1]);
  805. }
  806. }
  807. if (erc = get_filenum(param, &filenum))
  808. return (erc);
  809. if (pfile[filenum].f)
  810. {
  811. pprintf("file %d already open\n", filenum);
  812. return (eFATAL_ALREADY);
  813. }
  814. if (!(fname = esdalloc(ESD_NOMSZ)))
  815. return (eNoMemory);
  816. if (erc = gstr(param, fname, 1))
  817. goto FUNC_RETURN;
  818. iv[0] = 0;
  819. if (pfile[filenum].f = popen(fname->pb, switches + 1))
  820. {
  821. iv[0] = (long)errno;
  822. if (proc_trace)
  823. {
  824. pprintf("'%s'", fname->pb);
  825. pperror(" ");
  826. }
  827. }
  828. else if (proc_trace)
  829. pprintf("opened '%s' as ECU file %d\n", fname->pb, filenum);
  830. if (!erc)
  831. pfile[filenum].n = fname;
  832. FUNC_RETURN:
  833. if (erc && fname)
  834. esdfree(fname);
  835. return (erc);
  836. } /* end of pcmd_popen */
  837. /*+-------------------------------------------------------------------------
  838. ifunc_ftell(param,pvalue)
  839. %ftell(<filenum-int>)
  840. --------------------------------------------------------------------------*/
  841. int
  842. ifunc_ftell(param, pvalue)
  843. ESD *param;
  844. long *pvalue;
  845. {
  846. int erc;
  847. int filenum;
  848. long ftell();
  849. if (!proc_level)
  850. return (eNotExecutingProc);
  851. if (erc = skip_paren(param, 1))
  852. return (erc);
  853. if (erc = get_filenum(param, &filenum))
  854. return (erc);
  855. if (!pfile[filenum].f)
  856. return (_file_not_open(filenum));
  857. if (erc = skip_paren(param, 0))
  858. return (erc);
  859. *pvalue = ftell(pfile[filenum].f);
  860. return (0);
  861. } /* end of ifunc_ftell */
  862. /*+-------------------------------------------------------------------------
  863. _param_to_stat(param,pstat_rtnd)
  864. --------------------------------------------------------------------------*/
  865. int
  866. _param_to_stat(param, pstat_rtnd)
  867. ESD *param;
  868. struct stat **pstat_rtnd;
  869. {
  870. int erc;
  871. int filenum;
  872. static struct stat fst;
  873. struct stat *pstat = &fst;
  874. ESD *fname;
  875. errno = 0;
  876. if (erc = skip_paren(param, 1))
  877. return (erc);
  878. if (!(fname = esdalloc(ESD_NOMSZ)))
  879. return (eNoMemory);
  880. if (!gstr(param, fname, 1))
  881. {
  882. if (stat(fname->pb, pstat))
  883. pstat = (struct stat *)0;
  884. }
  885. else if (param->index = param->old_index, !get_filenum(param, &filenum))
  886. {
  887. if (!pfile[filenum].f)
  888. {
  889. esdfree(fname);
  890. return (_file_not_open(filenum));
  891. }
  892. if (stat(pfile[filenum].n->pb, pstat))
  893. pstat = (struct stat *)0;
  894. }
  895. else
  896. erc = eBadParameter;
  897. esdfree(fname);
  898. if (erc)
  899. return (erc);
  900. if (erc = skip_paren(param, 0))
  901. return (erc);
  902. *pstat_rtnd = pstat;
  903. if (proc_trace && !pstat)
  904. pperror("stat");
  905. return (0);
  906. } /* end of _param_to_stat */
  907. /*+-------------------------------------------------------------------------
  908. ifunc_fsize(param,pvalue)
  909. %fsize(<filenum-int>)
  910. %fsize('filename')
  911. --------------------------------------------------------------------------*/
  912. int
  913. ifunc_fsize(param, pvalue)
  914. ESD *param;
  915. long *pvalue;
  916. {
  917. int erc;
  918. struct stat *pstat;
  919. if (erc = _param_to_stat(param, &pstat))
  920. return (erc);
  921. if (!pstat)
  922. *pvalue = -1;
  923. else
  924. *pvalue = pstat->st_size;
  925. return (0);
  926. } /* end of ifunc_fsize */
  927. /*+-------------------------------------------------------------------------
  928. ifunc_fatime(param,pvalue)
  929. %fatime(<filenum-int>)
  930. %fatime('filename')
  931. --------------------------------------------------------------------------*/
  932. int
  933. ifunc_fatime(param, pvalue)
  934. ESD *param;
  935. long *pvalue;
  936. {
  937. int erc;
  938. struct stat *pstat;
  939. if (erc = _param_to_stat(param, &pstat))
  940. return (erc);
  941. if (!pstat)
  942. *pvalue = -1;
  943. else
  944. *pvalue = pstat->st_atime;
  945. return (0);
  946. } /* end of ifunc_fatime */
  947. /*+-------------------------------------------------------------------------
  948. ifunc_fmtime(param,pvalue)
  949. %fmtime(<filenum-int>)
  950. %fmtime('filename')
  951. --------------------------------------------------------------------------*/
  952. int
  953. ifunc_fmtime(param, pvalue)
  954. ESD *param;
  955. long *pvalue;
  956. {
  957. int erc;
  958. struct stat *pstat;
  959. if (erc = _param_to_stat(param, &pstat))
  960. return (erc);
  961. if (!pstat)
  962. *pvalue = -1;
  963. else
  964. *pvalue = pstat->st_mtime;
  965. return (0);
  966. } /* end of ifunc_fmtime */
  967. /*+-------------------------------------------------------------------------
  968. ifunc_fmode(param,pvalue)
  969. %fmode(<filenum-int>)
  970. %fmode('filename')
  971. --------------------------------------------------------------------------*/
  972. int
  973. ifunc_fmode(param, pvalue)
  974. ESD *param;
  975. long *pvalue;
  976. {
  977. int erc;
  978. struct stat *pstat;
  979. if (erc = _param_to_stat(param, &pstat))
  980. return (erc);
  981. if (!pstat)
  982. *pvalue = -1;
  983. else
  984. *pvalue = (long)pstat->st_mode;
  985. return (0);
  986. } /* end of ifunc_fmode */
  987. /*+-------------------------------------------------------------------------
  988. ifunc_isreg(param,pvalue)
  989. %isreg(<filenum-int>)
  990. %isreg('filename')
  991. --------------------------------------------------------------------------*/
  992. int
  993. ifunc_isreg(param, pvalue)
  994. ESD *param;
  995. long *pvalue;
  996. {
  997. int erc;
  998. if (erc = ifunc_fmode(param, pvalue))
  999. return (erc);
  1000. if (*pvalue != -1)
  1001. *pvalue = ((*pvalue & S_IFMT) == S_IFREG);
  1002. return (0);
  1003. } /* end of ifunc_isreg */
  1004. /*+-------------------------------------------------------------------------
  1005. ifunc_isdir(param,pvalue)
  1006. %isdir(<filenum-int>)
  1007. %isdir('filename')
  1008. --------------------------------------------------------------------------*/
  1009. int
  1010. ifunc_isdir(param, pvalue)
  1011. ESD *param;
  1012. long *pvalue;
  1013. {
  1014. int erc;
  1015. if (erc = ifunc_fmode(param, pvalue))
  1016. return (erc);
  1017. if (*pvalue != -1)
  1018. *pvalue = ((*pvalue & S_IFMT) == S_IFDIR);
  1019. return (0);
  1020. } /* end of ifunc_isdir */
  1021. /*+-------------------------------------------------------------------------
  1022. ifunc_ischr(param,pvalue)
  1023. %ischr(<filenum-int>)
  1024. %ischr('filename')
  1025. --------------------------------------------------------------------------*/
  1026. int
  1027. ifunc_ischr(param, pvalue)
  1028. ESD *param;
  1029. long *pvalue;
  1030. {
  1031. int erc;
  1032. if (erc = ifunc_fmode(param, pvalue))
  1033. return (erc);
  1034. if (*pvalue != -1)
  1035. *pvalue = ((*pvalue & S_IFMT) == S_IFCHR);
  1036. return (0);
  1037. } /* end of ifunc_ischr */
  1038. /*+-------------------------------------------------------------------------
  1039. get_free_filenum()
  1040. --------------------------------------------------------------------------*/
  1041. static int
  1042. get_free_filenum()
  1043. {
  1044. int fnum;
  1045. for(fnum = FILE_MAX; fnum >= 0; fnum--)
  1046. {
  1047. if(!pfile[fnum].f)
  1048. return(fnum);
  1049. }
  1050. return(-1);
  1051. } /* end of get_free_filenum */
  1052. /*+-------------------------------------------------------------------------
  1053. socket_fdopen(fd,pecufnum) - open an ECU file descriptor for a socket
  1054. --------------------------------------------------------------------------*/
  1055. int
  1056. socket_fdopen(fd,pecufnum)
  1057. int fd;
  1058. int *pecufnum;
  1059. {
  1060. int filenum;
  1061. ESD *fname = (ESD *) 0;
  1062. if (!proc_level)
  1063. return (eNotExecutingProc);
  1064. if((filenum = get_free_filenum()) < 0)
  1065. return (eNoFreeFile);
  1066. if (pfile[filenum].f)
  1067. {
  1068. pprintf("file %d already open\n", filenum);
  1069. return (eFATAL_ALREADY);
  1070. }
  1071. if (!(fname = esdalloc(ESD_NOMSZ)))
  1072. return (eNoMemory);
  1073. sprintf(fname->pb,"socket_%03d",fd); fname->cb = strlen(fname->pb);
  1074. fname->cb = strlen(fname->pb);
  1075. pfile[filenum].f = fdopen(fd,"r+");
  1076. setbuf(pfile[filenum].f,0);
  1077. if (proc_trace)
  1078. pprintf("fdopened '%s' as ECU file %d\n", fname->pb, filenum);
  1079. pfile[filenum].n = fname;
  1080. pfile[filenum].is_socket = 1;
  1081. *pecufnum = filenum;
  1082. return (0);
  1083. } /* end of socket_fdopen */
  1084. /*+-------------------------------------------------------------------------
  1085. ecufileno(filenum)
  1086. --------------------------------------------------------------------------*/
  1087. int
  1088. ecufileno(filenum)
  1089. UINT filenum;
  1090. {
  1091. FILE *fp;
  1092. if (filenum > FILE_MAX)
  1093. return (-1);
  1094. if(!(fp = pfile[filenum].f))
  1095. return (-1);
  1096. return(fileno(fp));
  1097. } /* end of ecufileno */
  1098. /* vi: set tabstop=4 shiftwidth=4: */
  1099. /* end of pcmdfile.c */