home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / os / vms / 14419 < prev    next >
Encoding:
Internet Message Format  |  1992-09-01  |  14.3 KB

  1. Path: sparky!uunet!cis.ohio-state.edu!pacific.mps.ohio-state.edu!linac!att!ucbvax!gwdgv1.dnet.gwdg.de!moeller
  2. From: moeller@gwdgv1.dnet.gwdg.de ("GWDGV1::MOELLER")
  3. Newsgroups: comp.os.vms
  4. Subject: REMPRTSMB 1.1 (VMS V5.5 fix) part 2 of 2
  5. Message-ID: <9209010955.AA12188@ucbvax.Berkeley.EDU>
  6. Date: 31 Aug 92 21:49:52 GMT
  7. Sender: usenet@ucbvax.BERKELEY.EDU
  8. Organization: The Internet
  9. Lines: 526
  10.  
  11. +-+-+-+ Beginning of part 2 +-+-+-+
  12. X`009for(lp1 = optp; *lp1 != '\0'; lp1 = lp2) `123
  13. X`009`009lp2 = strchr(lp1+1,'/');`009/* locate next '/' ... */
  14. X`009`009if(lp2 == NULL) lp2 = lp1 + strlen(lp1);  /* ... or '\0' */
  15. X
  16. X#define opt_(o) ((lp2-lp1) == sizeof(o)-1 && strncmp(lp1,o,sizeof(o)-1) == 0)
  17. X
  18. X`009`009if(opt_("/USERNAME")) `123
  19. X`009`009`009opt_username = 1;
  20. X`009`009`125 else if(opt_("/JOBNAME")) `123
  21. X`009`009`009opt_jobname = 1;
  22. X`009`009`125 else if(opt_("/RSX")) `123
  23. X`009`009`009opt_rsx = 1;
  24. X`009`009`125 else if(opt_("/SPOOL")) `123
  25. X`009`009`009opt_spool = 1;
  26. X`009`009`125
  27. X`009`125
  28. X`009*optp = '\0';`009`009`009/* remove options now`009*/
  29. X
  30. X`009if(strlen(line) > (sizeof wap->wk_file)-39-1-39-1) `123
  31. X`009`009return SS$_IVLOGNAM;`009/* make sure it's not too long */
  32. X`009`125
  33. X`009strcpy(wap->wk_file,line);`009/* copy "node::dev:[dir]"`009*/
  34. X
  35. X`009/*****`009filename`009*****/
  36. X
  37. X`009if(opt_jobname) `123`009`009/* have a try at JOB_NAME */
  38. X`009`009int l1,l2;
  39. X`009`009char c;
  40. X
  41. X`009`009line[0] = '\0';
  42. X`009`009psm$read_item_dx(ctxp,&SMBMSG$K_JOB_NAME,&linedsc);
  43. X`009`009line[itrmlen(&linedsc)] = '\0';
  44. X
  45. X`009`009l1 = 0; l2 = -1;
  46. X`009`009for(lp = line; *lp; lp++) `123
  47. X`009`009`009if(*lp == '.') `123
  48. X`009`009`009`009if(l2 >= 0) goto job_name_failed;
  49. X`009`009`009`009l2 = 0;
  50. X`009`009`009`125 else if((*lp >= 'A' && *lp <= 'Z') `124`124
  51. X`009`009`009`009  (*lp >= 'a' && *lp <= 'z') `124`124
  52. X`009`009`009`009  (*lp >= '0' && *lp <= '9') `124`124
  53. X`009`009`009`009  (!opt_rsx && (*lp == '_' `124`124
  54. X`009`009`009`009`009`009*lp == '-' `124`124
  55. X`009`009`009`009`009`009*lp == '$'))) `123
  56. X`009`009`009`009if(l2 < 0) l1++; else l2++;
  57. X`009`009`009`125 else goto job_name_failed;
  58. X`009`009`125
  59. X`009`009if(!opt_rsx) `123
  60. X`009`009`009if(l1 == 0 `124`124 l1 > 39 `124`124
  61. X`009`009`009   l2 == 0 `124`124 l2 > 39) goto job_name_failed;
  62. X`009`009`125 else `123
  63. X`009`009`009if(l1 == 0 `124`124 l1 > 9 `124`124
  64. X`009`009`009   l2 == 0 `124`124 l2 > 3) goto job_name_failed;
  65. X`009`009`125
  66. X
  67. X`009`009if(l2 < 0) strcat(line,".PRT");
  68. X`009`009strcat(wap->wk_file,line);
  69. X`009`009goto file_name_ok;
  70. X`009`125
  71. Xjob_name_failed:
  72. X
  73. X`009if(opt_username) `123`009`009`009/* "username.PRT" */
  74. X`009`009line[0] = '\0';
  75. X`009`009psm$read_item_dx(ctxp,&SMBMSG$K_USER_NAME,&linedsc);
  76. X`009`009line[itrmlen(&linedsc)] = '\0';
  77. X
  78. X`009`009if(opt_rsx) `123
  79. X`009`009`009if(strlen(line) > 9) line[9] = '\0';
  80. X`009`009`009for(lp = line; *lp; lp++) `123
  81. X`009`009`009`009if(!((*lp >= 'A' && *lp <= 'Z') `124`124
  82. X`009`009`009`009     (*lp >= 'a' && *lp <= 'z') `124`124
  83. X`009`009`009`009     (*lp >= '0' && *lp <= '9'))) `123
  84. X`009`009`009`009`009*lp = '0';
  85. X`009`009`009`009`125
  86. X`009`009`009`125
  87. X`009`009`125
  88. X
  89. X`009`009strcat(line,".PRT");
  90. X`009`009strcat(wap->wk_file,line);
  91. X`009`125 else `123`009`009`009`009/* "VAX.PRT" */
  92. X`009`009strcat(wap->wk_file,"VAX.PRT");
  93. X`009`125
  94. Xfile_name_ok:
  95. X
  96. X`009wap->wk_fab.fab$b_fns = strlen(wap->wk_file);
  97. X
  98. X`009/*****`009spooling option`009*****/
  99. X
  100. X`009wap->wk_spool = opt_spool;
  101. X
  102. X`009/*****`009ready to go`009*****/
  103. X
  104. X`009wap->wk_scbp = *ctxp;
  105. X`009wap->wk_state = open1;
  106. X`009status = sys$dclast(rms_ast,&wap->wk_rab,0);
  107. X`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  108. X
  109. X`009return PSM$_PENDING;
  110. X`125
  111. X
  112. X/*****`009queue output`009*****/
  113. X
  114. Xstatic unsigned put_out(
  115. X`009char **ctxp,
  116. X`009WORKAREA *wap,
  117. X`009char *bufp,
  118. X`009unsigned short buflen)
  119. X`123
  120. X`009unsigned status;
  121. X`009OUTPUTQELT *qp;
  122. X
  123. X
  124. X`009qp = oq_alloc();
  125. X`009qp->scbp = *ctxp;
  126. X`009qp->op = bufp;
  127. X`009qp->olen = buflen;
  128. X`009status = lib$insqti(qp,&wap->wk_oqhead);
  129. X`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  130. X
  131. X`009/* assume state=putting or =opened */
  132. X
  133. X`009if(wap->wk_state == opened) `123
  134. X`009`009wap->wk_state = putting;
  135. X`009`009status = sys$dclast(rms_ast,&wap->wk_rab,0);
  136. X`009`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  137. X`009`125
  138. X
  139. X`009return PSM$_PENDING;
  140. X`125
  141. X
  142. X/*****`009abort job (asynch, no psm$report)`009*****/
  143. X
  144. Xstatic void abort_job(`009
  145. X`009WORKAREA *wap)
  146. X`123
  147. X`009unsigned status;
  148. X`009OUTPUTQELT *qp;
  149. X`009static void rms_abort(WORKAREA *);`009`009/* forward */
  150. X`009static void rms_open_cancel(WORKAREA *);`009/* forward */
  151. X
  152. X
  153. X`009switch(wap->wk_state) `123
  154. X`009  case putting:
  155. X`009`009qp = oq_alloc();
  156. X`009`009qp->scbp = NULL;
  157. X`009`009qp->olen = OLEN_ABORT;
  158. X`009`009status = lib$insqhi(qp,&wap->wk_oqhead);`009/* at HEAD */
  159. X`009`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  160. X`009`009break;
  161. X
  162. X`009  case opened:
  163. X`009`009rms_abort(wap);
  164. X`009`009break;
  165. X
  166. X`009  default:
  167. X`009`009rms_open_cancel(wap);
  168. X`009`009break;
  169. X`009`125
  170. X`125
  171. X
  172. X/*****`009 end of job`009*****/
  173. X
  174. Xstatic unsigned close_job(
  175. X`009char **ctxp,
  176. X`009WORKAREA *wap)
  177. X`123
  178. X`009unsigned status;
  179. X`009OUTPUTQELT *qp;
  180. X
  181. X
  182. X`009switch(wap->wk_state) `123
  183. X`009  case putting:
  184. X`009`009qp = oq_alloc();
  185. X`009`009qp->scbp = *ctxp;
  186. X`009`009qp->olen = OLEN_CLOSE;
  187. X`009`009status = lib$insqti(qp,&wap->wk_oqhead);
  188. X`009`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  189. X`009`009break;
  190. X
  191. X`009  case opened:
  192. X`009`009wap->wk_state = close1;
  193. X`009`009wap->wk_scbp = *ctxp;
  194. X`009`009status = sys$dclast(rms_ast,&wap->wk_rab,0);
  195. X`009`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  196. X`009`009break;
  197. X`009`125
  198. X`009return PSM$_PENDING;
  199. X`125
  200. X
  201. X/*****`009initialize workarea (1st time only)`009*****/
  202. X
  203. Xstatic void init_wk(
  204. X`009WORKAREA *wap)
  205. X`123
  206. X`009wap->wk_fab = cc$rms_fab;
  207. X`009wap->wk_rab = cc$rms_rab;
  208. X
  209. X`009wap->wk_fab.fab$l_ctx = wap;
  210. X        wap->wk_fab.fab$b_fac = FAB$M_PUT;
  211. X#ifndef ASY_FAB
  212. X`009wap->wk_fab.fab$l_fop = FAB$M_SQO `124 FAB$M_TEF;
  213. X#else
  214. X`009wap->wk_fab.fab$l_fop = FAB$M_ASY `124 FAB$M_SQO `124 FAB$M_TEF;
  215. X#endif
  216. X`009wap->wk_fab.fab$b_rfm = FAB$C_VAR;
  217. X`009wap->wk_fab.fab$b_rat = 0;`009/* "none" */
  218. X`009wap->wk_fab.fab$w_mrs = BLOCK_SIZE;
  219. X`009wap->wk_fab.fab$l_fna = &wap->wk_file;
  220. X`009/* b_fns to be filled in later, l_fop possibly modified */
  221. X
  222. X`009wap->wk_rab.rab$l_ctx = wap;
  223. X`009wap->wk_rab.rab$l_fab = &wap->wk_fab;
  224. X`009wap->wk_rab.rab$b_rac = RAB$C_SEQ;
  225. X`009wap->wk_rab.rab$l_rop = RAB$M_ASY `124 RAB$M_WBH;
  226. X`009/* l_rbf, w_rsz to be filled in later */
  227. X
  228. X`009wap->wk_state = closed;
  229. X`125
  230. X
  231. X/*****`009cleanup OUTPUTQELTs in WORKAREA`009*****/
  232. X
  233. Xstatic void oq_cleanup(
  234. X`009WORKAREA *wap)
  235. X`123
  236. X`009unsigned status;
  237. X`009OUTPUTQELT *qp;
  238. X
  239. X
  240. X`009/* the current qelt's scbp is NOT acknowledged !!! */
  241. X
  242. X`009if(wap->wk_curqp != NULL) `123`009
  243. X`009`009oq_free(wap->wk_curqp);
  244. X`009`009wap->wk_curqp = NULL;
  245. X`009`125
  246. X
  247. X`009while((lib$remqhi(&wap->wk_oqhead, &qp) & 1) != 0) `123
  248. X`009`009if(qp->scbp != NULL) `123
  249. X`009`009`009psm$report(&qp->scbp,&0);`009/* fake completion */
  250. X`009`009`125
  251. X`009`009oq_free(qp);
  252. X`009`125
  253. X`125
  254. X
  255. X/** emergency (synch) close`009**/
  256. X
  257. Xstatic void rms_abort(
  258. X`009WORKAREA *wap)
  259. X`123
  260. X`009unsigned fop,rop;
  261. X
  262. X
  263. X`009if(wap->wk_fab.fab$w_ifi != 0) `123
  264. X`009`009rop = wap->wk_rab.rab$l_rop;
  265. X`009`009wap->wk_rab.rab$l_rop &= `126RAB$M_ASY;`009/* synch. $disconnect */
  266. X`009`009fop = wap->wk_fab.fab$l_fop;
  267. X`009`009wap->wk_fab.fab$l_fop `124= FAB$M_DLT;`009/* get rid of file */
  268. X`009`009wap->wk_fab.fab$l_fop &= `126FAB$M_SPL;`009/* don't spool */
  269. X#ifdef ASY_FAB
  270. X`009`009wap->wk_fab.fab$l_fop &= `126FAB$M_ASY;`009/* synch. $close */
  271. X#endif
  272. X`009`009sys$close(&wap->wk_fab);`009`009/* ignore status */
  273. X`009`009wap->wk_rab.rab$l_rop = rop;
  274. X`009`009wap->wk_fab.fab$l_fop = fop;
  275. X`009`125
  276. X`009wap->wk_state=closed;
  277. X`125
  278. X
  279. X/**`009AST for RMS actions, arg=pointer to RAB *or* FAB`009**/
  280. X
  281. Xstatic void rms_ast(
  282. X`009struct RAB *frabp)`009/* bzw. struct FAB */
  283. X`123
  284. X`009unsigned status;
  285. X`009WORKAREA *wap;
  286. X
  287. X
  288. V`009wap = frabp->rab$l_ctx;`009/* same as fab$l_ctx - see old comments in .H
  289. X */
  290. X
  291. X/** make sure "frabp" is used ONLY in the preceding line **/
  292. X
  293. Xagain:
  294. X`009switch(wap->wk_state) `123
  295. X
  296. X`009/***********/
  297. X`009  case closed:`009`009/* no-op */
  298. X`009`009break;
  299. X
  300. X`009/***********/
  301. X`009  case open1:
  302. X`009  case open1t:
  303. X
  304. X`009`009if(wap->wk_spool) `123
  305. X`009`009`009wap->wk_fab.fab$l_fop `124= FAB$M_SPL `124 FAB$M_DLT;
  306. X`009`009`125 else `123
  307. X`009`009`009wap->wk_fab.fab$l_fop &= `126(FAB$M_SPL `124 FAB$M_DLT);
  308. X`009`009`125
  309. X#ifndef ASY_FAB
  310. X`009`009status=sys$create(&wap->wk_fab);`009/* synchronous`009*/
  311. X#else
  312. X`009`009/* asynch. $create */
  313. X
  314. X`009`009wap->wk_state = open2;
  315. X
  316. X`009`009status = sys$create(&wap->wk_fab,rms_ast,rms_ast);
  317. X`009`009/* AST should take care of 'status', else bad luck ... */
  318. X
  319. X`009`009break;
  320. X
  321. X`009/***********/
  322. X`009  case open2:
  323. X`009`009status = wap->wk_fab.fab$l_sts;
  324. X#endif
  325. X`009`009if((status & 1) == 0) goto set_open_timer;
  326. X
  327. X`009`009/* asynch $connect`009*/
  328. X
  329. X`009`009wap->wk_state = open3;
  330. X`009`009status = sys$connect(&wap->wk_rab,rms_ast,rms_ast);
  331. X`009`009if((status & 1) == 0) `123
  332. X`009`009`009rms_abort(wap);
  333. X`009`009`009psm$report(&wap->wk_scbp,&status);
  334. X`009`009`009return;
  335. X`009`009`125
  336. X`009`009break;
  337. X
  338. X`009/***********/
  339. X`009  case open3:
  340. X`009`009status = wap->wk_rab.rab$l_sts;
  341. X`009`009if((status & 1) == 0) `123
  342. X`009`009`009rms_abort(wap);
  343. X`009`009`009psm$report(&wap->wk_scbp,&status);
  344. X`009`009`009return;
  345. X`009`009`125
  346. X
  347. X`009`009wap->wk_state = opened;
  348. X`009`009psm$report(&wap->wk_scbp);
  349. X`009`009break;
  350. X
  351. X`009/***********/
  352. X`009  case putting:
  353. X`009`009if(wap->wk_curqp != NULL) `123`009/* $put completion`009*/
  354. X`009`009`009psm$report(&(wap->wk_curqp->scbp),
  355. X`009`009`009`009`009&wap->wk_rab.rab$l_sts);
  356. X`009`009`009oq_free(wap->wk_curqp);
  357. X`009`009`125
  358. X
  359. X`009`009status = lib$remqhi(&wap->wk_oqhead, &wap->wk_curqp);
  360. X`009`009if((status & 1) == 0) `123
  361. X`009`009`009wap->wk_curqp = NULL;
  362. X`009`009`009wap->wk_state = opened;
  363. X`009`009`009return;
  364. X`009`009`125
  365. X
  366. X`009`009switch(wap->wk_curqp->olen) `123
  367. X`009`009  case OLEN_CLOSE:
  368. X`009`009`009wap->wk_scbp = wap->wk_curqp->scbp;
  369. X`009`009`009oq_cleanup(wap);
  370. X`009`009`009wap->wk_state = close1;
  371. X`009`009`009goto again;`009`009/* now do "close1" action */
  372. X
  373. X`009`009  case OLEN_ABORT:
  374. X`009`009`009wap->wk_scbp = wap->wk_curqp->scbp;
  375. X`009`009`009oq_cleanup(wap);
  376. X`009`009`009wap->wk_state = aborting;
  377. X`009`009`009goto again;`009`009/* now do "aborting" action */
  378. X`009`009`125
  379. X
  380. X`009`009wap->wk_rab.rab$l_rbf = wap->wk_curqp->op;
  381. X`009`009wap->wk_rab.rab$w_rsz = wap->wk_curqp->olen;
  382. X`009`009status = sys$put(&wap->wk_rab,rms_ast,rms_ast);
  383. X`009`009if((status & 1) == 0) `123
  384. X`009`009`009psm$report(&(wap->wk_curqp->scbp),&status);
  385. X`009`009`009rms_abort(wap);`009`009/* state -> closed */
  386. X`009`009`009oq_cleanup(wap);`009/* cleanup */
  387. X`009`009`125
  388. X`009`009break;
  389. X
  390. X`009/***********/
  391. X`009  case close1:
  392. X`009`009wap->wk_state = close2;
  393. X`009`009status = sys$disconnect(&wap->wk_rab,rms_ast,rms_ast);
  394. X`009`009if((status & 1) == 0) `123
  395. X`009`009`009rms_abort(wap);
  396. X`009`009`009psm$report(&wap->wk_scbp,&status);
  397. X`009`009`009return;
  398. X`009`009`125
  399. X`009`009break;
  400. X
  401. X`009/***********/
  402. X`009  case close2:
  403. X`009`009status = wap->wk_rab.rab$l_sts;
  404. X`009`009if((status & 1) == 0) `123
  405. X`009`009`009rms_abort(wap);
  406. X`009`009`009psm$report(&wap->wk_scbp,&status);
  407. X`009`009`009return;
  408. X`009`009`125
  409. X
  410. X#ifndef ASY_FAB
  411. X`009`009status = sys$close(&wap->wk_fab);`009/* synch.`009*/
  412. X`009`009wap->wk_state = closed;
  413. X#else
  414. X`009`009wap->wk_state = close3;
  415. X`009`009status = sys$close(&wap->wk_fab,rms_ast,rms_ast);
  416. X`009`009if((status & 1) == 0) `123
  417. X`009`009`009rms_abort(wap);
  418. X`009`009`009psm$report(&wap->wk_scbp,&status);
  419. X`009`009`009return;
  420. X`009`009`125
  421. X`009`009break;
  422. X
  423. X`009/***********/
  424. X`009  case close3:
  425. X`009`009status = wap->wk_fab.fab$l_sts;
  426. X`009`009wap->wk_state = closed;`009`009`009/* it got to be ... */
  427. X#endif
  428. X`009`009psm$report(&wap->wk_scbp,&status);
  429. X`009`009break;
  430. X
  431. X`009/***********/
  432. X`009  case aborting:
  433. X`009`009rms_abort(wap);
  434. X`009`009if(wap->wk_scbp != NULL) `123`009`009/* only if desired */
  435. X`009`009`009psm$report(&wap->wk_scbp,&0);
  436. X`009`009`125
  437. X`009`009break;
  438. X
  439. X`009/***********/
  440. X`009  default:
  441. X`009`009lib$stop(0x10000004,1,wap->wk_state);
  442. X`009`009break;
  443. X`009`125
  444. X
  445. X`009return;
  446. X
  447. Xset_open_timer:`009`009/* set timer & later retry $create */
  448. X`009`123
  449. X`009`009unsigned bintim[2];
  450. X`009`009$DESCRIPTOR(timdsc,"0 0:2:0");
  451. X
  452. X`009`009sys$bintim(&timdsc,&bintim);
  453. X
  454. X`009`009wap->wk_state = open1t;
  455. X`009`009status = sys$setimr(0,&bintim,rms_ast,&wap->wk_rab);
  456. X`009`009if((status & 1) == 0) `123
  457. X`009`009`009lib$stop(status `124 0x10000000);
  458. X`009`009`125
  459. X`009`125
  460. X`125
  461. X
  462. X/**`009AST-subroutine: cancel open loop`009**/
  463. X
  464. Xstatic void rms_open_cancel(
  465. X`009WORKAREA *wap)
  466. X`123
  467. X`009switch(wap->wk_state) `123
  468. X
  469. X`009  case open1t:
  470. X`009`009sys$cantim(&wap->wk_rab,0);`009/* try to cancel timer`009*/
  471. X`009  case open1:
  472. X`009`009wap->wk_state = closed;`009`009/* no more open pending`009*/
  473. X`009`009psm$report(&wap->wk_scbp,&0);`009`009/* open failed`009*/
  474. X`009`009break;
  475. X
  476. X#ifdef ASY_FAB
  477. X`009  case open2:
  478. X#endif
  479. X`009  case open3:
  480. X`009`009wap->wk_state = aborting;`009/* no more open pending`009*/
  481. X`009`009/* AST will call psm$report */
  482. X`009`009break;
  483. X`009`125
  484. X`125
  485. X
  486. X/*****`009 allocate output q-element `009*****/
  487. X
  488. Xstatic OUTPUTQELT *oq_alloc(void)
  489. X`123
  490. X`009unsigned status;
  491. X`009OUTPUTQELT *qp;
  492. X
  493. X
  494. X`009if(oq_vm_zone == NULL) `123
  495. X`009`009status = lib$create_vm_zone(&oq_vm_zone,
  496. X`009`009`009`009&LIB$K_VM_FIXED,&sizeof(OUTPUTQELT));
  497. X`009`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  498. X`009`125
  499. X
  500. X`009status = lib$get_vm(&sizeof(OUTPUTQELT),&qp,&oq_vm_zone);
  501. X`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  502. X
  503. X`009return qp;
  504. X`125
  505. X
  506. X/*****/
  507. X
  508. X#ifdef OPTRACE
  509. X
  510. Xstatic unsigned opermsg(char *text)
  511. X`123
  512. X#include opcdef
  513. X`009extern unsigned sys$sndopr(const DESCR *, unsigned);
  514. X
  515. X`009int l;
  516. X`009struct `123
  517. X`009`009unsigned func;
  518. X`009`009unsigned rqstid;
  519. X`009`009char buf[120];
  520. X`009`125 opcbuf;
  521. X`009DESCR bufdsc = `1230-0, DSC$K_DTYPE_T, DSC$K_CLASS_S, opcbuf`125;
  522. X
  523. X
  524. X`009opcbuf.func = OPC$_RQ_RQST `124 (OPC$M_NM_CENTRL<<8);
  525. X`009opcbuf.rqstid = 0;
  526. X`009l = strlen(text);
  527. X`009if(l > 120) l = 120;
  528. X`009memcpy(opcbuf.buf,text,l);
  529. X`009bufdsc.dsc$w_length = l + offsetof(struct opcbuf,buf);
  530. X`009return sys$sndopr(&bufdsc,0);
  531. X`125
  532. X#endif
  533. $ GOSUB UNPACK_FILE
  534. $ EXIT
  535. -+-+-+-+-+ End of part 2 +-+-+-+-+-
  536.  
  537.