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

  1. Path: sparky!uunet!olivea!decwrl!sdd.hp.com!zaphod.mps.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 1 of 2
  5. Message-ID: <9209010916.AA11953@ucbvax.Berkeley.EDU>
  6. Date: 31 Aug 92 21:49:40 GMT
  7. Sender: usenet@ucbvax.BERKELEY.EDU
  8. Organization: The Internet
  9. Lines: 580
  10.  
  11. $! ................... Cut between dotted lines and save. ...................
  12. $!...........................................................................
  13. $! VAX/VMS archive file created by VMS_SHARE V06.10 7-FEB-1989.
  14. $!
  15. $! VMS_SHARE was written by James Gray (Gray:OSBUSouth@Xerox.COM) from
  16. $! VMS_SHAR by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au).
  17. $!
  18. $! To unpack, simply save, concatinate all parts into one file and
  19. $! execute (@) that file.
  20. $!
  21. $! This archive was created by user MOELLER
  22. $! on 11-JUN-1992 09:51:13.65.
  23. $!
  24. $! ATTENTION: To keep each article below 40 blocks (20480 bytes), this
  25. $!            program has been transmitted in 2 parts.  You should
  26. $!            concatenate ALL parts to ONE file and execute (@) that file.
  27. $!
  28. $! It contains the following 1 file:
  29. $!        REMPRTSMB.C
  30. $!
  31. $!============================================================================
  32. $ SET SYMBOL/SCOPE=( NOLOCAL, NOGLOBAL )
  33. $ VERSION = F$GETSYI( "VERSION" )
  34. $ IF VERSION .GES "V4.4" THEN GOTO VERSION_OK
  35. $ WRITE SYS$OUTPUT "You are running VMS ''VERSION'; ", -
  36.     "VMS_SHARE V06.10 7-FEB-1989 requires VMS V4.4 or higher."
  37. $ EXIT 44 ! SS$_ABORT
  38. $VERSION_OK:
  39. $ GOTO START
  40. $!
  41. $UNPACK_FILE:
  42. $ WRITE SYS$OUTPUT "Creating ''FILE_IS'"
  43. $ DEFINE/USER_MODE SYS$OUTPUT NL:
  44. $ EDIT/TPU/COMMAND=SYS$INPUT/NODISPLAY/OUTPUT='FILE_IS'/NOSECTION -
  45.     VMS_SHARE_DUMMY.DUMMY
  46. b_part := CREATE_BUFFER( "{Part}", GET_INFO( COMMAND_LINE, "file_name" ) )
  47. ; s_file_spec := GET_INFO( COMMAND_LINE, "output_file" ); SET( OUTPUT_FILE
  48. , b_part, s_file_spec ); b_errors := CREATE_BUFFER( "{Errors}" ); i_errors
  49. := 0; pat_beg_1 := ANCHOR & "-+-+-+ Beginning"; pat_beg_2 := LINE_BEGIN
  50. & "+-+-+-+ Beginning"; pat_end := ANCHOR & "+-+-+-+-+ End"; POSITION
  51. ( BEGINNING_OF( b_part ) ); LOOP EXITIF SEARCH( SPAN( ' ' )@r_trail
  52. & LINE_END, FORWARD) = 0; POSITION( r_trail ); ERASE( r_trail ); ENDLOOP
  53. ; POSITION( BEGINNING_OF( b_part ) ); i_append_line := 0; LOOP EXITIF MARK
  54. ( NONE ) = END_OF( b_part ); s_x := ERASE_CHARACTER( 1 )
  55. ; IF s_x = '+' THEN r_skip := SEARCH( pat_beg_1, FORWARD, EXACT ); IF r_skip
  56. <> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ERASE_LINE; ENDIF
  57. ; ENDIF; IF s_x = '-' THEN r_skip := SEARCH( pat_end, FORWARD, EXACT )
  58. ; IF r_skip <> 0 THEN s_x := ''; MOVE_HORIZONTAL( -CURRENT_OFFSET ); m_skip
  59. := MARK( NONE ); r_skip := SEARCH( pat_beg_2, FORWARD, EXACT ); IF r_skip
  60. <> 0 THEN POSITION( END_OF( r_skip ) ); MOVE_HORIZONTAL( -CURRENT_OFFSET )
  61. ; MOVE_VERTICAL( 1 ); MOVE_HORIZONTAL( -1 ); ELSE POSITION( END_OF( b_part )
  62. ); ENDIF; ERASE( CREATE_RANGE( m_skip, MARK( NONE ), NONE ) ); ENDIF; ENDIF
  63. ; IF s_x = 'V' THEN s_x := ''; IF i_append_line <> 0 THEN APPEND_LINE
  64. ; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF; i_append_line := 1
  65. ; MOVE_VERTICAL( 1 ); ENDIF; IF s_x = 'X' THEN s_x := ''; IF i_append_line
  66. <> 0 THEN APPEND_LINE; MOVE_HORIZONTAL( -CURRENT_OFFSET ); ENDIF
  67. ; i_append_line := 0; MOVE_VERTICAL( 1 ); ENDIF; IF s_x <> '' THEN i_errors
  68. := i_errors + 1; s_text := CURRENT_LINE; POSITION( b_errors ); COPY_TEXT
  69. ( "The following line could not be unpacked properly:" ); SPLIT_LINE
  70. ; COPY_TEXT( s_x ); COPY_TEXT( s_text ); POSITION( b_part ); MOVE_VERTICAL
  71. ( 1 ); ENDIF; ENDLOOP; POSITION( BEGINNING_OF( b_part ) ); LOOP r_x := SEARCH
  72. ( "`", FORWARD, EXACT ); EXITIF r_x = 0; POSITION( r_x ); ERASE_CHARACTER( 1
  73. ); COPY_TEXT( ASCII( INT( ERASE_CHARACTER( 3 ) ) ) ); ENDLOOP
  74. ; IF i_errors = 0 THEN SET( NO_WRITE, b_errors, ON ); ELSE POSITION
  75. ( BEGINNING_OF( b_errors ) ); COPY_TEXT( FAO
  76. ( "The following !UL errors were detected while unpacking !AS", i_errors
  77. , s_file_spec ) ); SPLIT_LINE; SET( OUTPUT_FILE, b_errors, "SYS$COMMAND" )
  78. ; ENDIF; EXIT;
  79. $ DELETE VMS_SHARE_DUMMY.DUMMY;*
  80. $ CHECKSUM 'FILE_IS
  81. $ WRITE SYS$OUTPUT " CHECKSUM ", -
  82.   F$ELEMENT( CHECKSUM_IS .EQ. CHECKSUM$CHECKSUM, ",", "failed!!,passed." )
  83. $ RETURN
  84. $!
  85. $START:
  86. $ FILE_IS = "REMPRTSMB.C"
  87. $ CHECKSUM_IS = 137336104
  88. $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY
  89. X/*****`009multithreaded output-redirection symbiont`009*****/
  90. X
  91. X#define ASY_FAB`009`009/* <<< allegedly requires VMS V5 <<< */
  92. X#ifdef ASY_FAB
  93. X#define Version "V1.1a"
  94. X#else
  95. X#define Version "V1.1s"
  96. X#endif
  97. X
  98. X/*****
  99. X`009w.j.m. jul 1988, after XXXSMB V0.3
  100. X
  101. XV0.95 21-jul-1988 wjm: set SPL & DLT bits on open, not on close (for DAP)
  102. XV0.96 27-jul-1988 wjm: fix handling of immediate $PUT error
  103. XV0.97 11-sep-1989 wjm: set procname to REMPRTSMB_n
  104. XV0.98 07-jun-1990 wjm: fix incompatible change of <prvdef.h> by supplying own
  105. X`009`009`009"prvdef.h"; add /RSX and /JOBNAME options;
  106. X`009`009`009some fixes; use ITRMLEN() now;
  107. X`009`009`009for simplicity, use same SPL/DLT setting on`032
  108. X`009`009`009open AND close (not tested on RSX anyway);
  109. XV0.99 ................. (VMS V5) #ifdef ASY_FAB, finally implement FAB$M_ASY
  110. XV1.0  16-jul-1991 wjm: fix "#ifndef ASY_FAB" compilation by removing
  111. X`009`009`009a superfluous statement;
  112. X`009`009`009if "logname" ends in a quotation mark, consider
  113. X`009`009`009it a complete network task (or foreign file) spec:
  114. X`009`009`009don't look for options, don't append "filename.type".
  115. XV1.1  11-jun-1992 wjm: workarea created by VMS V5.5 SMBSRVSHR is no longer
  116. X`009`009`009quadword-aligned, round up pointer prior to use.
  117. X********
  118. X
  119. Xintended use:
  120. X`009$ ini/queue  ...  /proc=REMPRTSMB`009-`009! this image
  121. X`009`009/separate=(flag,trailer)`009-
  122. X`009`009/on=logname
  123. X
  124. Xwhere 'logname' translates to either
  125. X(a) something ending in a quotation mark - it will be considered a complete
  126. X`009file spec (e.g. network foreign file spec, or network task spec).
  127. Xor
  128. X(b) something like "node::dev:[dir]/opt"
  129. X(one of "node::" or "dev:" must be present, "[dir]" and "/opt" are optional).
  130. Xwithout "/opt", the output files will be named "node::dev:[dir]VAX.PRT".
  131. Xpossible options ('/opt') are:
  132. X`009/USERNAME  ...`009use VMS username instead of "VAX" for default filespec.
  133. X`009/JOBNAME   ...`009if JOB_NAME has legal "fff.vvv" format, use it for
  134. X`009`009`009output filespec (neither "fff" nor "vvv" may be void);
  135. X`009`009`009if it is just "fff", output filespec => "fff.PRT".
  136. X`009/RSX `009   ...`009require RSX-compatible JOB_NAME, or otherwise
  137. X`009`009`009force output filespec into RSX-compatible format.
  138. X`009/SPOOL`009  ...`009creates output file with "print/delete" option
  139. X
  140. X*****/
  141. X
  142. X/*****`009internals:
  143. X`009assume that only 1 input routine is active (1 scb-pointer only).
  144. X`009assume that output routine may be called without wait for
  145. X`009`009completion, with a different scb-pointer for each buffer.
  146. X*****/
  147. X
  148. X#module REMPRTSMB Version
  149. X
  150. X/*****/
  151. X
  152. X#include stddef
  153. X#include ctype
  154. X#include string
  155. X#include descrip
  156. Xtypedef struct dsc$descriptor DESCR;
  157. X
  158. X/*****/
  159. X
  160. X#include lnmdef
  161. X
  162. X#define LIB$K_VM_FIXED 4`009/* actually defined in $LIBVMDEF */
  163. X
  164. X#include fab
  165. X#include rab
  166. X
  167. X#include "smbdef.h"
  168. X#include "psmdef.h"
  169. X#include "prvdef.h"`009`009/* NOT the one from VAXC 3.x */
  170. X
  171. Xglobalvalue PSM$_EOF, PSM$_FUNNOTSUP, PSM$_PENDING;
  172. Xglobalvalue RMS$_EOF, SS$_NORMAL, SS$_IVLOGNAM;
  173. X
  174. Xextern int itrmlen(DESCR *);
  175. X
  176. Xextern unsigned psm$replace(const int *, unsigned (*)());
  177. Xextern unsigned psm$print(const int *, const int *, const int *);
  178. Xextern unsigned psm$report(char **, ...);
  179. Xextern unsigned psm$read_item_dx(char **, const int *, DESCR *);
  180. X
  181. Xextern unsigned lib$analyze_sdesc(const DESCR *, unsigned short *, char **);
  182. Xextern void lib$stop(unsigned, ...);
  183. Xextern unsigned lib$insv(const int *, const int *, const int *, void *);
  184. Xextern unsigned lib$insqti(void *, double *q, ...);
  185. Xextern unsigned lib$insqhi(void *, double *q, ...);
  186. Xextern unsigned lib$remqhi(double *q, void **, ...);
  187. Vextern unsigned lib$create_vm_zone(unsigned *, const unsigned *, const int *)
  188. X;
  189. Xextern unsigned lib$get_vm(const int *, void **, ...);
  190. Xextern unsigned lib$free_vm(const int *, void **, ...);
  191. X
  192. Xextern unsigned sys$trnlnm(const unsigned *, const DESCR *, const DESCR *,
  193. X`009`009`009`009const unsigned char *, const void *);
  194. Xextern unsigned sys$setprv(unsigned, const void *, unsigned, void *);
  195. Xextern unsigned sys$setprn(const DESCR *);
  196. Xextern unsigned sys$bintim(const DESCR *, void *);
  197. Xextern unsigned sys$setimr(unsigned, const void *, void (*)(), unsigned);
  198. Xextern unsigned sys$cantim(unsigned, unsigned);
  199. Xextern unsigned sys$dclast(void (*)(), unsigned, unsigned);
  200. Xextern unsigned sys$create(struct FAB *, ...);
  201. Xextern unsigned sys$connect(struct RAB *, ...);
  202. Xextern unsigned sys$put(struct RAB *, ...);
  203. Xextern unsigned sys$disconnect(struct RAB *, ...);
  204. Xextern unsigned sys$close(struct FAB *, ...);
  205. X
  206. X/*****/
  207. X
  208. X#define BLOCK_SIZE 512`009`009/* max. output record size */
  209. X
  210. Xtypedef enum linkstate `123
  211. X`009init,`009/* == 0 !!!`009`009*/
  212. X`009open1,`009/* initial $open to be done */
  213. X`009open1t,`009/* timer pending, $open to be retried`009*/
  214. X#ifdef ASY_FAB
  215. X`009open2,`009/* $connect pending`009*/
  216. X#endif
  217. X`009open3,`009/* $connect pending`009*/
  218. X`009opened,
  219. X`009putting,/* $put pending`009`009*/
  220. X`009close1,`009/* $disconnect to be done`009*/
  221. X`009close2,`009/* $disconnect pending`009*/
  222. X#ifdef ASY_FAB
  223. X`009close3,`009/* $close pending`009*/
  224. X#endif
  225. X`009aborting,
  226. X`009closed
  227. X`125 LINKSTATE;
  228. X
  229. Xtypedef struct outputqelt `123
  230. X`009double oqlink;`009`009/* offset=0, q-aligned !!!`009*/
  231. X`009char *scbp;
  232. X`009char *op;
  233. X`009int olen;
  234. X`125 OUTPUTQELT;
  235. X#define OLEN_CLOSE (-1)`009`009/* special <olen> value`009*/
  236. X#define OLEN_ABORT (-2)`009`009/* special <olen> value`009*/
  237. X
  238. Xtypedef struct workarea `123
  239. X`009double wk_oqhead;`009/* q-aligned quadword !!!`009*/
  240. X`009OUTPUTQELT *wk_curqp;
  241. X`009LINKSTATE wk_state;
  242. X`009char *wk_scbp;`009`009/* pointer for psm$report */
  243. X        struct FAB wk_fab;
  244. X        struct RAB wk_rab;
  245. X`009char wk_file[256];`009/* output filespec */
  246. X
  247. X`009unsigned wk_spool:1;`009/* flag: open with SPL & DLT`009*/
  248. X`125 WORKAREA;
  249. X
  250. V#define Q_ALIGN(p) (((unsigned) p + 7) & `1267)`009/* round up to multiple of
  251. X 8 */
  252. X
  253. X/*****/
  254. X
  255. Xstatic void rms_ast(struct RAB *);`009`009/* forward */
  256. X
  257. Xstatic unsigned oq_vm_zone = 0;
  258. Xstatic OUTPUTQELT *oq_alloc(void);`009`009/* forward */
  259. X
  260. X#define oq_free(p) `123unsigned stat;\
  261. X`009if(((stat=lib$free_vm(&sizeof(OUTPUTQELT),&p,&oq_vm_zone))&1)==0)\
  262. X`009`009lib$stop(stat`1240x10000000);`125
  263. X
  264. X#ifdef OPTRACE
  265. X#define OPMSG(s) opermsg(s)
  266. X#else
  267. X#define OPMSG(s)
  268. X#endif
  269. X
  270. X
  271. X/*****`009"main" program - must come first (not declared to VAXC) *****/
  272. X
  273. Xunsigned remprtsmb_main()
  274. X`123
  275. X`009static unsigned`009`009`009/* forward */
  276. X`009`009remprt_job_flag(),
  277. X`009`009remprt_job_trailer(),
  278. X`009`009remprt_output(),
  279. X`009`009remprt_input_nop();
  280. X`009static struct replacetab `123
  281. X`009`009int type;
  282. X`009`009unsigned (*routine)();
  283. X`009`009`125 replace_tab[] = `123
  284. X`009`009`009`009/* always */
  285. X`009/* o.k.`009`009PSM$K_JOB_SETUP`009`009`009`009*/
  286. X`009`009`009`009/* always */
  287. X`009/* o.k.`009`009PSM$K_FORM_SETUP`009`009`009*/
  288. X`009`009`009`009/* JOBCTL separate, 1st file */
  289. X`009/* >>>>`009*/`009`123PSM$K_JOB_FLAG, remprt_job_flag`125,
  290. X`009`009`009`009/* JOBCTL separate, 1st file */
  291. X`009`009`009`123PSM$K_JOB_BURST, remprt_input_nop`125,
  292. X`009`009`009`009/* always */
  293. X`009/* o.k.`009`009PSM$K_FILE_SETUP`009`009`009*/
  294. X`009`009`009`009/* JOBCTL default */
  295. X`009/* o.k.`009`009PSM$K_FILE_FLAG`009`009`009`009*/
  296. X`009`009`009`009/* JOBCTL default */
  297. X`009/* o.k.`009`009PSM$K_FILE_BURST`009`009`009*/
  298. X`009`009`009`009/* always */
  299. X`009/* o.k.`009`009PSM$K_FILE_SETUP_2`009`009`009*/
  300. X`009`009`009`009/* always 1 of the following ... */
  301. X`009/* o.k. */`009/* FILE_ERRORS, FILE_INFORMATION, MAIN_INPUT */
  302. X`009`009`009`009/* JOBCTL default */
  303. X`009/* o.k.`009`009PSM$K_FILE_TRAILER`009`009`009*/
  304. X`009`009`009`009/* JOBCTL separate, last file */
  305. X`009`009`009`123PSM$K_JOB_RESET, remprt_input_nop`125,
  306. X`009`009`009`009/* JOBCTL separate, last file */
  307. X`009/* >>>> */`009`123PSM$K_JOB_TRAILER, remprt_job_trailer`125,
  308. X`009`009`009`009/* always (trailing FF) */
  309. X`009/* o.k.`009`009PSM$K_JOB_COMPLETION`009`009`009*/
  310. X
  311. X`009`009/* "nested" routines */
  312. X`009`009`009`009/* JOBCTL default, or user spec'd */
  313. X`009/* o.k.`009`009PSM$K_PAGE_HEADER`009`009`009*/
  314. X`009`009`009`009/* JOBCTL default */
  315. X`009/* o.k.`009`009PSM$K_PAGE_SETUP`009`009`009*/
  316. X`009`009`009`009/* coroutines */
  317. X`009/* o.k. */`009/* MAIN_FORMAT, LIBRARY_INPUT */
  318. X`009`009`009`009/* output routine */
  319. X`009/* >>>> */`009`123PSM$K_OUTPUT, remprt_output`125,
  320. X
  321. X`009`009/* that's all for VMS 4.x */
  322. X`009`009`009`123NULL, NULL`125`125;
  323. X
  324. X`009unsigned status;
  325. X`009unsigned privs[2] = `1230, 0`125;
  326. X`009struct replacetab *i;
  327. X
  328. X`009/* set privileges - have only SETPRV */
  329. X`009lib$insv(&1,&PRV$V_TMPMBX,&1,&privs);
  330. X`009lib$insv(&1,&PRV$V_NETMBX,&1,&privs);
  331. X`009lib$insv(&1,&PRV$V_READALL,&1,&privs);
  332. X`009status = sys$setprv(1,&privs,0,NULL);
  333. X`009if((status & 1) == 0) return status `124 0x10000000;
  334. X
  335. X`009/* replace routines listed in above table */
  336. X`009for(i = replace_tab; i->type != NULL; i++) `123
  337. X`009`009status = psm$replace(&(i->type),i->routine);
  338. X`009`009if((status & 1) == 0) return status `124 0x10000000;
  339. X`009`125
  340. X
  341. X`009/* set process name */
  342. X`009`123`009char prn[] = "REMPRTSMB_0";`009/* to be modified */
  343. X`009`009$DESCRIPTOR(prn_dsc,prn);
  344. X
  345. X`009`009do `123
  346. X`009`009`009prn[sizeof(prn)-2]++;
  347. X`009`009`125 while((sys$setprn(&prn_dsc) & 1) == 0 &&
  348. X`009`009`009prn[sizeof(prn)-2] < '9');
  349. X`009`125
  350. X
  351. X`009/* start - 8 threads maximum */
  352. X`009status = psm$print(&8, &BLOCK_SIZE, &(7 + sizeof(WORKAREA)));
  353. X`009return status `124 0x10000000;
  354. X`125
  355. X
  356. X/*****`009symbiont output routine`009`009*****/
  357. X
  358. Xstatic unsigned remprt_output(
  359. X`009char **ctxp,`032
  360. X`009void *pwap,
  361. X`009int *funcp,
  362. X`009DESCR *dscp,
  363. X`009unsigned *argp)
  364. X`123
  365. X`009WORKAREA *wap = (WORKAREA *) Q_ALIGN(pwap);
  366. X`009unsigned status;
  367. X`009unsigned short buflen;
  368. X`009char *bufp;
  369. X`009static void init_wk(WORKAREA *);`009/* forward */
  370. X`009static unsigned put_out(char *, WORKAREA *, char *, unsigned short);
  371. X`009static void abort_job(WORKAREA *);`009/* forward */
  372. X
  373. X
  374. X`009if(wap->wk_state == init) `123
  375. X`009`009init_wk(wap);`009`009/* 1st time init`009*/
  376. X`009`125
  377. X
  378. X`009switch(*funcp) `123
  379. X`009  case PSM$K_OPEN:
  380. X`009`009*argp = (1 << SMBMSG$V_SERVER) `124
  381. X`009`009`009(1 << SMBMSG$V_LOWERCASE);
  382. X
  383. X`009`009return SS$_NORMAL;`009/* no real action yet`009*/
  384. X`009`009break;
  385. X
  386. X`009  case PSM$K_WRITE:
  387. X`009  case PSM$K_WRITE_NOFORMAT:
  388. X`009`009switch(wap->wk_state) `123
  389. X`009`009  case putting:
  390. X`009`009  case opened:
  391. X`009`009`009status = lib$analyze_sdesc(dscp,&buflen,&bufp);
  392. X`009`009`009if((status & 1) == 0) lib$stop(status `124 0x10000000);
  393. X`009`009`009return put_out(ctxp,wap,bufp,buflen); /* asynch. */
  394. X`009`009`009break;
  395. X`009`009`125
  396. X`009`009return SS$_NORMAL;`009/* (fake) */
  397. X`009`009break;
  398. X
  399. X`009  case PSM$K_CLOSE:
  400. X`009`009abort_job(wap);
  401. X`009`009return SS$_NORMAL;
  402. X`009`009break;
  403. X
  404. X`009  default:
  405. X`009`009return PSM$_FUNNOTSUP;
  406. X`009`009break;
  407. X`009`125
  408. X`125
  409. X
  410. X/*****`009no-op input routine (replaces undesired PSM routines) *****/
  411. X
  412. Xstatic unsigned remprt_input_nop(
  413. X`009char **ctxp,
  414. X`009void *pwap,
  415. X`009int *funcp,
  416. X`009DESCR *dscp,
  417. X`009unsigned *argp)
  418. X`123
  419. X`009switch(*funcp) `123
  420. X`009  case PSM$K_OPEN:
  421. X`009`009*argp = PSM$K_CC_INTERNAL;
  422. X`009`009/* drop thru */
  423. X`009  case PSM$K_CLOSE:
  424. X`009`009return SS$_NORMAL;
  425. X`009`009break;
  426. X
  427. X`009  case PSM$K_READ:
  428. X`009`009return PSM$_EOF;
  429. X`009`009break;
  430. X
  431. X`009  default:
  432. X`009`009return PSM$_FUNNOTSUP;
  433. X`009`009break;
  434. X`009`125
  435. X`125
  436. X
  437. X/*****`009job flag page: open output`009*****/
  438. X
  439. Xstatic unsigned remprt_job_flag(
  440. X`009char **ctxp,
  441. X`009void *pwap,
  442. X`009int *funcp,
  443. X`009DESCR *dscp,
  444. X`009unsigned *argp)
  445. X`123
  446. X`009WORKAREA *wap = (WORKAREA *) Q_ALIGN(pwap);
  447. X`009static unsigned init_job(char **, WORKAREA *);`009/* forward */
  448. X`009static void abort_job(WORKAREA *);`009`009/* forward */
  449. X
  450. X
  451. X`009switch(*funcp) `123
  452. X`009  case PSM$K_OPEN:
  453. X`009`009*argp = PSM$K_CC_INTERNAL;
  454. X
  455. X`009`009return init_job(ctxp,wap);`009`009/* continues via AST */
  456. X`009`009break;
  457. X
  458. X`009  case PSM$K_READ:
  459. X`009`009return RMS$_EOF;
  460. X`009`009break;
  461. X
  462. X`009  case PSM$K_CLOSE:
  463. X`009`009return SS$_NORMAL;
  464. X`009`009break;
  465. X
  466. X`009  case PSM$K_CANCEL:
  467. X`009  case PSM$K_STOP_TASK:
  468. X`009  case PSM$K_RESET_STREAM:
  469. X`009`009abort_job(wap);`009`009/* ggf. cancel open loop */
  470. X`009  default:
  471. X`009`009return PSM$_FUNNOTSUP;
  472. X`009`009break;
  473. X`009`125
  474. X`125
  475. X
  476. X/*****`009job trailer page: close output file`009*****/
  477. X
  478. Xstatic unsigned remprt_job_trailer(
  479. X`009char **ctxp,
  480. X`009void *pwap,
  481. X`009int *funcp,
  482. X`009DESCR *dscp,
  483. X`009unsigned *argp)
  484. X`123
  485. X`009WORKAREA *wap = (WORKAREA *) Q_ALIGN(pwap);
  486. X`009static unsigned close_job(char **, WORKAREA *);`009/* forward */
  487. X`009static void abort_job(WORKAREA *);`009`009/* forward */
  488. X
  489. X
  490. X`009switch(*funcp) `123
  491. X`009  case PSM$K_OPEN:
  492. X`009`009*argp = PSM$K_CC_INTERNAL;
  493. X
  494. X`009`009switch(wap->wk_state) `123
  495. X`009`009  case putting:
  496. X`009`009  case opened:
  497. X`009`009`009return close_job(ctxp,wap);`009/* continue via AST`009*/
  498. X`009`009`009break;
  499. X`009`009`125
  500. X`009`009return SS$_NORMAL;
  501. X`009`009break;
  502. X
  503. X`009  case PSM$K_READ:
  504. X`009`009return RMS$_EOF;
  505. X`009`009break;
  506. X
  507. X`009  case PSM$K_CLOSE:
  508. X`009`009return SS$_NORMAL;
  509. X`009`009break;
  510. X
  511. X`009  case PSM$K_STOP_TASK:`009`009`009/* asynch. abort`009*/
  512. X`009`009switch(wap->wk_state) `123
  513. X`009`009  case putting:
  514. X`009`009  case opened:
  515. X`009`009`009abort_job(wap);
  516. X`009`009`009break;
  517. X`009`009`125
  518. X`009  default:
  519. X`009`009return PSM$_FUNNOTSUP;
  520. X`009`009break;
  521. X`009`125
  522. X`125
  523. X
  524. X/*****`009job startup (triggered by job_flag)`009*****/
  525. X
  526. Xstatic unsigned init_job(
  527. X`009char **ctxp,
  528. X`009WORKAREA *wap)
  529. X`123
  530. X`009unsigned status;
  531. X`009int l;
  532. X`009char /*logical*/ opt_username,opt_spool,opt_jobname,opt_rsx;
  533. X`009char *lp, *lp1, *lp2, *optp;
  534. X`009static unsigned short lnml;
  535. X`009static char devlnm[32], line[256];
  536. X`009static DESCR devlnmdsc = `1230-0,0,0,devlnm`125;
  537. X`009static const $DESCRIPTOR(linedsc,line);
  538. X`009static const $DESCRIPTOR(lnmtabdsc,"LNM$FILE_DEV");
  539. X`009static struct `123
  540. X`009`009unsigned short len;
  541. X`009`009unsigned short code;
  542. X`009`009void *addr;
  543. X`009`009void *retlen;
  544. X`009`125 itmlst[2] = `123
  545. X`009`009`123sizeof(line)-1, LNM$_STRING, line, &lnml`125,
  546. X`009`009`1230, 0, NULL, NULL`125
  547. X`009`125;
  548. X
  549. X
  550. X`009/*****`009link state must be =closed !!!`009****/
  551. X
  552. X`009if(wap->wk_state != closed) `123
  553. X`009`009lib$stop(0x10000004,1,wap->wk_state);`009/* crash ...`009*/
  554. X`009`125
  555. X
  556. X`009/***** "device name" and options *****/
  557. X
  558. X`009opt_username = 0;
  559. X`009opt_jobname = 0;
  560. X`009opt_rsx = 0;
  561. X`009opt_spool = 0;
  562. X
  563. X`009devlnmdsc.dsc$w_length = sizeof(devlnm)-1;
  564. X`009devlnm[0] = '\0';
  565. X`009psm$read_item_dx(ctxp,&SMBMSG$K_DEVICE_NAME,&devlnmdsc);
  566. X`009devlnm[itrmlen(&devlnmdsc)] = '\0';
  567. X
  568. X`009l = strlen(devlnm);
  569. X`009if(l > 0 && devlnm[l-1] == ':') `123
  570. X`009`009devlnm[--l] = '\0';`009/* ggf. remove trailing ':' */
  571. X`009`125
  572. X
  573. X`009devlnmdsc.dsc$w_length = l;
  574. X`009status = sys$trnlnm(NULL, &lnmtabdsc, &devlnmdsc, NULL, &itmlst);
  575. X`009if((status & 1) == 0) return status;
  576. X
  577. X`009l = lnml;
  578. X`009line[l] = '\0';
  579. X
  580. X`009if(l > 0 && line[l-1] == '"') `123`009`009/* quoted output spec ... */
  581. X`009`009strcpy(wap->wk_file,line);`009/* copy unchanged */
  582. X`009`009goto file_name_ok;
  583. X`009`125
  584. X
  585. X`009for(lp=line; *lp != '\0'; lp++)
  586. X`009`009*lp = toupper(*lp);`009/* upcase device & options */
  587. X
  588. X`009optp = strchr(line,'/');
  589. X`009if(optp == NULL) optp = line + strlen(line);
  590. -+-+-+-+-+ End of part 1 +-+-+-+-+-
  591.