home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume25 / QBATCH / patch01b < prev    next >
Text File  |  1991-11-12  |  54KB  |  1,639 lines

  1. Newsgroups: comp.sources.misc
  2. From: alan@tharr.uucp (Alan Saunders)
  3. Subject:  v25i059:  QBATCH - a queued batch processing system for UNIX, Patch01b/2
  4. Message-ID: <1991Nov13.040858.19900@sparky.imd.sterling.com>
  5. X-Md4-Signature: c3b6669d124d7adabb1d472a87649dee
  6. Date: Wed, 13 Nov 1991 04:08:58 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: alan@tharr.uucp (Alan Saunders)
  10. Posting-number: Volume 25, Issue 59
  11. Archive-name: QBATCH/patch01b
  12. Environment: UNIX
  13. Patch-To: QBATCH: Volume 25, Issue 20-25
  14.  
  15. #! /bin/sh
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # Contents:  ./patches/qbatch.p1
  21. # Wrapped by kent@sparky on Tue Nov 12 21:47:45 1991
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. echo If this archive is complete, you will see the following message:
  24. echo '          "shar: End of archive 2 (of 2)."'
  25. if test -f './patches/qbatch.p1' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'./patches/qbatch.p1'\"
  27. else
  28.   echo shar: Extracting \"'./patches/qbatch.p1'\" \(50591 characters\)
  29.   sed "s/^X//" >'./patches/qbatch.p1' <<'END_OF_FILE'
  30. XPrereq: 0
  31. Xdiff -cr ./src/patchlevel.h ../new/src/patchlevel.h
  32. X*** ./src/patchlevel.h    Fri Nov  8 08:53:15 1991
  33. X--- ../new/src/patchlevel.h    Fri Nov  8 09:59:39 1991
  34. X***************
  35. X*** 1 ****
  36. X! #define PATCHLEVEL 0
  37. X--- 1 ----
  38. X! #define PATCHLEVEL 1
  39. Xdiff -cr ./INSTALL ../new/INSTALL
  40. X*** ./INSTALL    Fri Nov  8 08:53:29 1991
  41. X--- ../new/INSTALL    Tue Nov 12 14:22:20 1991
  42. X***************
  43. X*** 31,38 ****
  44. X  world searchable, but should only be root writeable.  SPOOLPATH is
  45. X  where the batch files are created, again, the world should be able to
  46. X  look at the contents of these files (jcl and monitors), but only root
  47. X! should be able to create and delete them.
  48. X  
  49. X  Now, if you are not your systems administrator, you are at his (or her)
  50. X  mercy.  Certain of the QBATCH programs need to be able to set user and
  51. X  group id's so they must be owned by root, and setuid. The Makefile
  52. X--- 31,43 ----
  53. X  world searchable, but should only be root writeable.  SPOOLPATH is
  54. X  where the batch files are created, again, the world should be able to
  55. X  look at the contents of these files (jcl and monitors), but only root
  56. X! should be able to create and delete them.  Also define MAILPATH and 
  57. X! SUBJECT to suit your system.
  58. X  
  59. X+ If you require queue profile logging to be available, ensure that
  60. X+ LOGGING is defined in qbatch.h, and check that the data being logged
  61. X+ suits your system administrator (in logging.c).
  62. X+ 
  63. X  Now, if you are not your systems administrator, you are at his (or her)
  64. X  mercy.  Certain of the QBATCH programs need to be able to set user and
  65. X  group id's so they must be owned by root, and setuid. The Makefile
  66. X***************
  67. X*** 94,100 ****
  68. X  it.  If it becomes a problem, you'll have to periodically tidy up
  69. X  manually.
  70. X  
  71. X! Enjoy ... Alan Saunders August 30 1991
  72. X  
  73. X  If you do come across any problems, with security or anything else
  74. X  relating to QBATCH, please contact me, as I hope you will if you design
  75. X--- 99,105 ----
  76. X  it.  If it becomes a problem, you'll have to periodically tidy up
  77. X  manually.
  78. X  
  79. X! Enjoy ... Alan Saunders November 12 1991
  80. X  
  81. X  If you do come across any problems, with security or anything else
  82. X  relating to QBATCH, please contact me, as I hope you will if you design
  83. Xdiff -cr ./MANIFEST ../new/MANIFEST
  84. X*** ./MANIFEST    Fri Nov  8 08:53:04 1991
  85. X--- ../new/MANIFEST    Tue Nov 12 14:24:10 1991
  86. X***************
  87. X*** 17,22 ****
  88. X--- 17,23 ----
  89. X   doc/chap.07                3    
  90. X   doc/chap.08                3    
  91. X   doc/chap.09                3    
  92. X+  doc/quickstart            0   Notes to get you started using QBATCH
  93. X   doc/glossary               2    Limited glossary of terms used
  94. X   magic                      1    
  95. X   man                        1    
  96. X***************
  97. X*** 55,60 ****
  98. X--- 56,62 ----
  99. X   src/jn.c                   2    
  100. X   src/jr.c                   1    
  101. X   src/js.c                   5    
  102. X+  src/logging.c              0
  103. X   src/patchlevel.h           1    
  104. X   src/qagen                  1    
  105. X   src/qbatch.h               2    
  106. Xdiff -cr ./NEWS ../new/NEWS
  107. X*** ./NEWS    Fri Nov  8 08:53:34 1991
  108. X--- ../new/NEWS    Tue Nov 12 16:25:30 1991
  109. X***************
  110. X*** 156,158 ****
  111. X--- 156,214 ----
  112. X  and my knowledge of [La]TeX is even less.... Any volunteers?
  113. X  
  114. X  ..ADS
  115. X+ 
  116. X+ 7 November 1991
  117. X+ 
  118. X+ PHEW! I only posted last Friday!
  119. X+ 
  120. X+ Bug fixes as follows:
  121. X+ 
  122. X+ Makefile:-
  123. X+ added a missing qt in install target.
  124. X+ added definition of BINDIR to CFLAGS
  125. X+ 
  126. X+ config.c:-
  127. X+ Missing semicolon at end
  128. X+ spurious entry of setuser() should have been qb_setuser();
  129. X+ #ifdef'd SIGCONT and SIGHALT in toggle_halt_action()
  130. X+ (apparently some systems don't define these signals)
  131. X+ 
  132. X+ qp.c:-
  133. X+ Changed hardwired directory (how did that get in??) for jobdone script
  134. X+ .. now points to BINDIR.
  135. X+ changed monitor checking code so that if a monitor is specified, and does not
  136. X+ already exist, it is created owned by the submittor not root.
  137. X+  
  138. X+ Thanks to Ian Lea of Siemens (Germany) for these. (iian@estevax.uucp)
  139. X+ 
  140. X+ Added functionality for command string on js command line
  141. X+ New option to js (-c "string"). With this option js does not look for a file of
  142. X+ jcl to subbmit, nor for jcl on stdin but instead creates a jcl file containing
  143. X+ a single shell command line (== string).
  144. X+ 
  145. X+ Thanks to Ian Lea of Siemens (Germany) for this suggestion. (iian@estevax.uucp)
  146. X+ 
  147. X+ Added functionality for mailed monitors.
  148. X+ If the default monitor for a queue is MAIL (upper case), or a specified monitor ('-m MAIL'
  149. X+ to js, or MONITOR=MAIL in the environment), then the monitor will be written to a scratch
  150. X+ file, and mailed to the submitting user when the job is complete.
  151. X+ 
  152. X+ Thanks to Peter Da Silva for this suggestion. (peter@ficc.ferranti.com)
  153. X+ 
  154. X+ Added functionality for profile time logging.
  155. X+ now #define LOGGING in qbatch.h to enable the logging function, and switch
  156. X+ logging on and off qith the new qc -l option.
  157. X+ logging.c is an implementor configurable c function to write the required
  158. X+ logging data to SPOOLPATH/<queuename>.log. It will be called if the logging
  159. X+ flag (qh_log) is set in the queue header.  This flag is toggled with qc -l.
  160. X+ 
  161. X+ Added -L option to qf and qt to check whether logging is switched on.
  162. X+ 
  163. X+ This gets around the problem of monitoring queue activity when monitors
  164. X+ are not always in the same file. (private and mailed monitors).
  165. X+ 
  166. X+ 12 November 1991
  167. X+ 
  168. X+ Posted qbatch.p1 to comp.sources.misc
  169. X+ 
  170. X+ .. ADS
  171. XCommon subdirectories: ./doc and ../new/doc
  172. XCommon subdirectories: ./man and ../new/man
  173. XCommon subdirectories: ./src and ../new/src
  174. Xdiff -cr ./doc/chap.01 ../new/doc/chap.01
  175. X*** ./doc/chap.01    Fri Nov  8 08:53:21 1991
  176. X--- ../new/doc/chap.01    Tue Nov 12 13:00:55 1991
  177. X***************
  178. X*** 56,62 ****
  179. X      for users to remember to redirect stdout and stderr when running batch
  180. X      jobs, this is done automatically by QBATCH.  Both stdout and stderr are
  181. X      combined into a 'monitor' for the job, which for any given queue and user
  182. X!     will always be written to the same place.
  183. X  
  184. X      D. QBATCH queues can be started and stopped (by the super user) at ANY
  185. X      time, even from within a QBATCH job, or from cron.  This allows the
  186. X--- 56,62 ----
  187. X      for users to remember to redirect stdout and stderr when running batch
  188. X      jobs, this is done automatically by QBATCH.  Both stdout and stderr are
  189. X      combined into a 'monitor' for the job, which for any given queue and user
  190. X!     will always be written to an identifiable place.
  191. X  
  192. X      D. QBATCH queues can be started and stopped (by the super user) at ANY
  193. X      time, even from within a QBATCH job, or from cron.  This allows the
  194. Xdiff -cr ./doc/chap.02 ../new/doc/chap.02
  195. X*** ./doc/chap.02    Fri Nov  8 08:53:29 1991
  196. X--- ../new/doc/chap.02    Tue Nov 12 13:05:01 1991
  197. X***************
  198. X*** 48,53 ****
  199. X--- 48,56 ----
  200. X          SIGCONT to the job, to resume it's processing.  If it is unchanged,
  201. X          no action will be taken.
  202. X  
  203. X+     log.    If set, the profile timings of the job are written to a logfile
  204. X+         so that they can be accumulated and analysed.
  205. X+ 
  206. X      stop.   If set, when the current job (if any) terminates or is killed, qp
  207. X          itself will terminate.  If no job is running qp will terminate
  208. X          immediately.
  209. X***************
  210. X*** 58,63 ****
  211. X--- 61,67 ----
  212. X  
  213. X      Programs which alter the settings of these flags are:
  214. X  
  215. X+     qc      (queue create/change) Toggles the log flag.
  216. X      qs        (queue stop)     Sets the stop, and optionally the kill and or 
  217. X                  repeat flags.
  218. X      jk        (job kill (remove))    May set the kill flag.
  219. Xdiff -cr ./doc/chap.03 ../new/doc/chap.03
  220. X*** ./doc/chap.03    Fri Nov  8 08:53:21 1991
  221. X--- ../new/doc/chap.03    Tue Nov 12 13:06:30 1991
  222. X***************
  223. X*** 29,34 ****
  224. X--- 29,36 ----
  225. X      Enabled. The enabled flag will be set allowing users to submit jobs
  226. X           immediately.
  227. X  
  228. X+     Logging  will be disabled.
  229. X+ 
  230. X      Stopped. There will be no process engine running.
  231. X  
  232. X      Spooling. The default SPOOLPATH (defined during implementation) will 
  233. Xdiff -cr ./doc/chap.04 ../new/doc/chap.04
  234. X*** ./doc/chap.04    Fri Nov  8 08:53:38 1991
  235. X--- ../new/doc/chap.04    Tue Nov 12 13:15:17 1991
  236. X***************
  237. X*** 55,63 ****
  238. X      they may use /dev/console instead. (this seems to be the case in SunOS
  239. X      on SPARCstations.)
  240. X  
  241. X!     js will accept the job either as a named file, or from stdin.  This
  242. X!     allows regularly run jobs to be set up as 'jcl' files, and submitted
  243. X!     as:
  244. X      js <queuename> <jclfile>
  245. X      Alternatively, stdin can be used, either directly:
  246. X      js <queuename>
  247. X--- 55,63 ----
  248. X      they may use /dev/console instead. (this seems to be the case in SunOS
  249. X      on SPARCstations.)
  250. X  
  251. X!     js will accept the job as a named file, from stdin, or as a single
  252. X!     command specified with the -c option.  This allows regularly run jobs to be
  253. X!     set up as 'jcl' files, and submitted as:
  254. X      js <queuename> <jclfile>
  255. X      Alternatively, stdin can be used, either directly:
  256. X      js <queuename>
  257. X***************
  258. X*** 70,75 ****
  259. X--- 70,80 ----
  260. X      [..]
  261. X      EOjob
  262. X  
  263. X+     For a single command, the job may be submitted as:
  264. X+     js -c <command> <queuename>
  265. X+     e.g.
  266. X+     js -c make work
  267. X+ 
  268. X      If submitted as a file, the 'jcl' may be created in a script, using
  269. X      prompts, and shell parameters etc to set it up.
  270. X  
  271. X***************
  272. X*** 78,83 ****
  273. X--- 83,96 ----
  274. X  
  275. X      Main options:
  276. X  
  277. X+     -c <command>    This allows the submitting user to submit single
  278. X+             commands to a batch queue instead of creating a jcl
  279. X+             file. <command> can be any valid command in the syntax
  280. X+             of the operating shell, but must be self-contained.
  281. X+             (i.e. including any necessary switches and parameters.
  282. X+             If <command> contains spaces it should be enclosed in
  283. X+             quotes.
  284. X+ 
  285. X      -n <name>    This provides a meaningful name for the job.  It's only
  286. X              use is to give some meaning to the ql output (see
  287. X              later).
  288. X***************
  289. X*** 206,211 ****
  290. X--- 219,228 ----
  291. X  
  292. X      -l  Provides a one line status report similar to qt -l but with the
  293. X          columns headed.
  294. X+ 
  295. X+     -L  Returns the absolute pathspec of the queue's logfile if logging is
  296. X+         turned on.  If logging is disabled, returns a message to that
  297. X+         effect to stderr, and fails.
  298. X  
  299. X      -j  jcl. returns the full absolute pathspec of the jcl file created by
  300. X          js for this job.
  301. Xdiff -cr ./doc/chap.05 ../new/doc/chap.05
  302. X*** ./doc/chap.05    Fri Nov  8 08:53:34 1991
  303. X--- ../new/doc/chap.05    Tue Nov 12 13:39:07 1991
  304. X***************
  305. X*** 41,46 ****
  306. X--- 41,47 ----
  307. X  
  308. X      The monitor therefore not only serves to record the output of a job, but
  309. X      also to give some indication of it's performance, and resource usage.
  310. X+     (see also 5a LOGGING).
  311. X  
  312. X      Normally, queue default monitors will be publicly readable, to allow users
  313. X      to check on the progress of their jobs.  This obviously may be changed by
  314. X***************
  315. X*** 87,92 ****
  316. X--- 88,99 ----
  317. X      list will overrule a source earlier (a monitor sourced by specifying -m to
  318. X      js will always be used even if a MONITOR environment variable is set.)
  319. X  
  320. X+     If a default monitor of "MAIL" is specified to qc for either a new or
  321. X+     existing queue (and no other monitor is specified), or a monitor of "MAIL"
  322. X+     is specified to js, either through the -m option or the environment, then
  323. X+     the monitor for the job will be written to a scratch file, and mailed to
  324. X+     the submitting user on completion.
  325. X+ 
  326. X      If a default monitor of "NONE" is specified to qc for either a new or
  327. X      existing queue:
  328. X   
  329. X***************
  330. X*** 110,116 ****
  331. X      
  332. X      2. Any profile information stored in the monitors will be split up 
  333. X         across several directories, thus making accounting and tuning more
  334. X!        difficult.
  335. X   
  336. X      3. using 'more `qf -m <queuename>`' may give startling results when
  337. X         used for troubleshooting.  (The result will depend on the setting
  338. X--- 117,123 ----
  339. X      
  340. X      2. Any profile information stored in the monitors will be split up 
  341. X         across several directories, thus making accounting and tuning more
  342. X!        difficult. (see 5a LOGGING).
  343. X   
  344. X      3. using 'more `qf -m <queuename>`' may give startling results when
  345. X         used for troubleshooting.  (The result will depend on the setting
  346. X***************
  347. X*** 139,141 ****
  348. X--- 146,181 ----
  349. X      The 'live' monitor can then be truncated (cat /dev/null><monitorspec>).
  350. X      This approach at least keeps the problem manageable.
  351. X  
  352. X+ 5a LOGGING.
  353. X+     
  354. X+     For the added convenience of the system administrator where monitors are
  355. X+     not generally queue default (either private or mailed monitors), the
  356. X+     LOGGING option is available.  LOGGING must be #defined in the Makefile
  357. X+     before compilation to make it available, and the log flag in the queue
  358. X+     header must be set (qc -l <queuename>) to enable it.
  359. X+ 
  360. X+     If logging is available, and enabled for a queue, then the profile timings
  361. X+     will be written to the queue logfile for each job processed.  The logfile
  362. X+     for a queue is SPOOLPATH/<queuename>.log.  The data written to this file is
  363. X+     implementor defined, but as released consists of a single line entry for
  364. X+     each job processed.  The entry is designed more for program readability
  365. X+     than human, since I feel that when this information is needed, it will also
  366. X+     need to be analysed.
  367. X+ 
  368. X+     As released, the data logged is:
  369. X+ 
  370. X+     start time of job (time_t format)
  371. X+     end time of job (time_t format)
  372. X+     user name 
  373. X+     uid 
  374. X+     gid 
  375. X+     job queued time 
  376. X+     job process time (real)
  377. X+     job cpu time (user)
  378. X+     job cpu time (system)
  379. X+ 
  380. X+     (process times are in seconds/100  subject to the accuracy of the system
  381. X+     clock.)   
  382. X+ 
  383. X+     fields in the record are packed (no spaces) with a colon (':') as a
  384. X+     field delimiter.
  385. Xdiff -cr ./doc/chap.07 ../new/doc/chap.07
  386. X*** ./doc/chap.07    Fri Nov  8 08:53:30 1991
  387. X--- ../new/doc/chap.07    Tue Nov 12 13:40:49 1991
  388. X***************
  389. X*** 35,43 ****
  390. X         easier to resolve under these conditions, and complaints will be fewer.
  391. X  
  392. X      c. By monitoring the profile timings of jobs through each queue. The times
  393. X!        taken  are reported in the monitor for each job processed.  They are
  394. X!        also accumulated in the queue header.  A summary of timings may be
  395. X!        displayed at any time with:
  396. X         qf -s <queuename>
  397. X         A typical display would be:
  398. X  
  399. X--- 35,43 ----
  400. X         easier to resolve under these conditions, and complaints will be fewer.
  401. X  
  402. X      c. By monitoring the profile timings of jobs through each queue. The times
  403. X!        taken  are reported in the monitor for each job processed, and may be
  404. X!        separately logged.  They are also accumulated in the queue header.
  405. X!        A summary of timings may be displayed at any time with:
  406. X         qf -s <queuename>
  407. X         A typical display would be:
  408. X  
  409. Xdiff -cr ./doc/chap.09 ../new/doc/chap.09
  410. X*** ./doc/chap.09    Fri Nov  8 08:53:31 1991
  411. X--- ../new/doc/chap.09    Tue Nov 12 13:41:24 1991
  412. X***************
  413. X*** 6,11 ****
  414. X--- 6,13 ----
  415. X      Copyright (c) Vita Services Ltd. 1990 and
  416. X      Copyright (c) Vita Fibres Ltd. 1991
  417. X  
  418. X+ 9. SECURITY
  419. X+ 
  420. X      Because of the nature of QBATCH, some of the programs have to run setuid
  421. X      as root.  THIS IS A POTENTIAL SECURITY HOLE!! Unless you ensure that only
  422. X      root can copy or write to them. Setuid programs are dangerous unless
  423. Xdiff -cr ./doc/glossary ../new/doc/glossary
  424. X*** ./doc/glossary    Fri Nov  8 08:53:22 1991
  425. X--- ../new/doc/glossary    Tue Nov 12 13:42:54 1991
  426. X***************
  427. X*** 50,55 ****
  428. X--- 50,59 ----
  429. X  js            Job submit, Program to submit jobs to a queue for
  430. X              queued processing.
  431. X  
  432. X+ logfile            The file to which profile timing information is written
  433. X+             when LOGGING is available, and logging is enabled for a
  434. X+             queue.  It will normally be SPOOLPATH/<queuename>.log
  435. X+ 
  436. X  MANDIR            The directory path specified in the Makefile, where
  437. X              the manual pages will be installed.
  438. X  
  439. Xdiff -cr ./man/js.l ../new/man/js.l
  440. X*** ./man/js.l    Fri Nov  8 08:53:22 1991
  441. X--- ../new/man/js.l    Tue Nov 12 12:57:28 1991
  442. X***************
  443. X*** 16,21 ****
  444. X--- 16,24 ----
  445. X  .B \-dl
  446. X  ]
  447. X  [
  448. X+ .BI \-c " command string"
  449. X+ ]
  450. X+ [
  451. X  .BI \-m " monitor"
  452. X  ]
  453. X  [
  454. X***************
  455. X*** 46,54 ****
  456. X  containing the pathspec of it is placed in the temporary file (-l
  457. X  option), or it's contents are copied into the temporary file. If the
  458. X  jcl file is not provided, stdin is copied into the temporary file up to
  459. X! an eof. (this allows for piped jcl). An entry is added to the end of
  460. X! the queue file, and if the queue is being processed, a signal is sent
  461. X! to the pid of the process engine for the queue.
  462. X  .SH OPTIONS
  463. X  .TP 12
  464. X  .B  \-d
  465. X--- 49,58 ----
  466. X  containing the pathspec of it is placed in the temporary file (-l
  467. X  option), or it's contents are copied into the temporary file. If the
  468. X  jcl file is not provided, stdin is copied into the temporary file up to
  469. X! an eof. (this allows for piped jcl). A command string provided with the -c option
  470. X! creates the jcl with a single command line, instead of expecting commands from a file or stdin.
  471. X! An entry is added to the end of the queue file, and if the queue is being processed, a signal
  472. X! is sent to the pid of the process engine for the queue.
  473. X  .SH OPTIONS
  474. X  .TP 12
  475. X  .B  \-d
  476. X***************
  477. X*** 66,71 ****
  478. X--- 70,82 ----
  479. X  (and possible script commands and directives in the case of fixed context queues), jcl
  480. X  linked in this way must be totally self-contained.  The environment is NOT copied in the case
  481. X  of a linked job, and this option is not permitted for fixed context queues.
  482. X+ .TP
  483. X+ .BI \-c " command string"
  484. X+ Specify a single line of jcl to be placed in the job file instead of expecting multiple lines
  485. X+ either in a submitted file, or on standard input.
  486. X+ .br
  487. X+ command string should be a self contained command, including all necessary switches and
  488. X+ parameters. If it contains spaces, it should be enclosed in quotes.
  489. X  .TP
  490. X  .BI  \-m " monitor"
  491. X  Specify a non-default monitor for this job. If this
  492. Xdiff -cr ./man/qc.l ../new/man/qc.l
  493. X*** ./man/qc.l    Fri Nov  8 08:53:35 1991
  494. X--- ../new/man/qc.l    Tue Nov 12 10:09:03 1991
  495. X***************
  496. X*** 16,21 ****
  497. X--- 16,24 ----
  498. X  .B \- f
  499. X  ]
  500. X  [
  501. X+ .BI \-l
  502. X+ ]
  503. X+ [
  504. X  .BI \-m " monitor"
  505. X  ]
  506. X  [
  507. X***************
  508. X*** 128,133 ****
  509. X--- 131,146 ----
  510. X  If the queue already exists, the -f option will toggle the state of the
  511. X  fixed context flag.
  512. X  .TP
  513. X+ .B \-l
  514. X+ Toggle the logging status of this queue.
  515. X+ If the queue does not exist (is being created in this operation)
  516. X+ Then the -l flag will cause the logging flag to be set (default is not set).
  517. X+ If the queue already exists, the -l option will toggle the state of the 
  518. X+ logging flag.
  519. X+ .sp
  520. X+ If the logging flag is set, the profile timings for jobs processed in this
  521. X+ queue will be written to SPOOLPATH/<queuename>.log.
  522. X+ .TP
  523. X  .BI \-m " monitor"
  524. X  Specify a default monitor for this queue.
  525. X  monitor may be a directory, or a file. If monitor is a directory,
  526. X***************
  527. X*** 138,147 ****
  528. X  and -m is not specified then a monitor xxxx.mon in the 
  529. X  spooling directory will be used.
  530. X  .sp
  531. X! A special case is if the monitor specified is "NONE" (in upper case).
  532. X! In this case the user submitting a job to the queue MUST provide a 
  533. X  monitor specification, either by using the -m option of js, or through
  534. X  an environment variable MONITOR.
  535. X  .TP
  536. X  .BI \-p " priority"
  537. X  Specify a priority or 'nice value' at which jobs processed
  538. X--- 151,166 ----
  539. X  and -m is not specified then a monitor xxxx.mon in the 
  540. X  spooling directory will be used.
  541. X  .sp
  542. X! Special cases:
  543. X! .br
  544. X! a. If the monitor specified is "NONE" (in upper case).
  545. X! then the user submitting a job to the queue MUST provide a 
  546. X  monitor specification, either by using the -m option of js, or through
  547. X  an environment variable MONITOR.
  548. X+ .sp
  549. X+ b. If the monitor specified is "MAIL" (in upper case), then unless an alternate
  550. X+ monitor is specified through js or the environment, then the monitor will be
  551. X+ mailed to the submitting user.
  552. X  .TP
  553. X  .BI \-p " priority"
  554. X  Specify a priority or 'nice value' at which jobs processed
  555. Xdiff -cr ./man/qf.l ../new/man/qf.l
  556. X*** ./man/qf.l    Fri Nov  8 08:53:23 1991
  557. X--- ../new/man/qf.l    Tue Nov 12 10:15:19 1991
  558. X***************
  559. X*** 15,20 ****
  560. X--- 15,22 ----
  561. X  \-[
  562. X  .B a
  563. X  ]|[
  564. X+ .B L
  565. X+ ]|[
  566. X  .B l
  567. X  ]|[
  568. X  .B n
  569. X***************
  570. X*** 72,77 ****
  571. X--- 74,85 ----
  572. X  .B  \-j
  573. X  JCL. Reports the full pathspec of the JCL file of the
  574. X  first entry in the queue. (Normally the running job.)
  575. X+ .TP
  576. X+ .B  \-L
  577. X+ Logging. Reports the full pathspec of the Logging file for the
  578. X+ queue if logging is switched on.  (SPOOLPATH/<queuename>.log)
  579. X+ .br
  580. X+ If logging is switched off, a message to that effect is sent to stderr.
  581. X  .TP
  582. X  .B \-l
  583. X  Line. Produces a brief status report on the queue header.  The report is headed with the
  584. Xdiff -cr ./man/qt.l ../new/man/qt.l
  585. X*** ./man/qt.l    Fri Nov  8 08:53:23 1991
  586. X--- ../new/man/qt.l    Tue Nov 12 10:17:39 1991
  587. X***************
  588. X*** 21,26 ****
  589. X--- 21,28 ----
  590. X  ]|[
  591. X  .B k
  592. X  ]|[
  593. X+ .B L
  594. X+ ]|[
  595. X  .B l
  596. X  ]|[
  597. X  .B r
  598. X***************
  599. X*** 66,72 ****
  600. X  Kill flag. 
  601. X  .B qt
  602. X  will fail if the kill flag is not set.
  603. X! (last job was not killed) It will not fail if the last job was killed.
  604. X  .TP
  605. X  .B \-l
  606. X  Line. Produces a brief single line status report on the queue header if the user may submit jobs
  607. X--- 68,79 ----
  608. X  Kill flag. 
  609. X  .B qt
  610. X  will fail if the kill flag is not set.
  611. X! .TP
  612. X! .B  \-L
  613. X! Logging flag. 
  614. X! .B qt
  615. X! will fail if the Logging flag is not set.
  616. X! (Job profile times are not being logged) It will not fail if jobs are being logged.
  617. X  .TP
  618. X  .B \-l
  619. X  Line. Produces a brief single line status report on the queue header if the user may submit jobs
  620. Xdiff -cr ./man/queue.l ../new/man/queue.l
  621. X*** ./man/queue.l    Fri Nov  8 08:53:24 1991
  622. X--- ../new/man/queue.l    Tue Nov 12 10:23:07 1991
  623. X***************
  624. X*** 92,98 ****
  625. X  .B qh_defmon
  626. X  default monitor for queue 
  627. X  .br
  628. X! (default is <qh_spool>/<qname>.mon)
  629. X  .sp 2
  630. X  .TP 0
  631. X  .nf
  632. X--- 92,105 ----
  633. X  .B qh_defmon
  634. X  default monitor for queue 
  635. X  .br
  636. X! (default is <qh_spool>/<qname>.mon) Normally a pathspec to either a file
  637. X! or a directory into which monitors will be written.
  638. X! .br
  639. X! May also be:
  640. X! .br
  641. X! NONE to force the user to provide a monitor specification, or
  642. X! .br
  643. X! MAIL to mail monitors to the user by default.
  644. X  .sp 2
  645. X  .TP 0
  646. X  .nf
  647. X***************
  648. X*** 104,110 ****
  649. X  #define    qh_enabled   8              /* accept entries flag      */
  650. X  #define    qh_halt     16              /* suspend processing flag  */
  651. X  #define    qh_fixed    32              /* fixed context processing */
  652. X! #define    qh_flagmax  32              /* should be highest above  */
  653. X  #define    qh_action qh_kill + qh_halt /* immediate action flags   */
  654. X  .sp 2
  655. X  .fi
  656. X--- 111,118 ----
  657. X  #define    qh_enabled   8              /* accept entries flag      */
  658. X  #define    qh_halt     16              /* suspend processing flag  */
  659. X  #define    qh_fixed    32              /* fixed context processing */
  660. X! #define    qh_log      64              /* profile logging switch   */
  661. X! #define    qh_flagmax  64              /* should be highest above  */
  662. X  #define    qh_action qh_kill + qh_halt /* immediate action flags   */
  663. X  .sp 2
  664. X  .fi
  665. Xdiff -cr ./src/Makefile ../new/src/Makefile
  666. X*** ./src/Makefile    Fri Nov  8 08:53:32 1991
  667. X--- ../new/src/Makefile    Tue Nov 12 16:15:55 1991
  668. X***************
  669. X*** 8,15 ****
  670. X  # clean:    Remove core files, object files and programs from src.
  671. X  #        WARNING do NOT make clean before make install!
  672. X  # shar:        Repackage QBATCH as a shar kit.
  673. X- CFLAG=-g
  674. X- LDFLAG=-Bstatic
  675. X  
  676. X  # the directory into which to move the binaries
  677. X  BINDIR=/usr/local/bin
  678. X--- 8,13 ----
  679. X***************
  680. X*** 20,25 ****
  681. X--- 18,35 ----
  682. X  # the bourne shell path
  683. X  SHELL=/bin/sh
  684. X  
  685. X+ # the path to the mail program.
  686. X+ 
  687. X+ MAILPATH="/usr/ucb/Mail"
  688. X+ 
  689. X+ # The subject switch for the mail program.  This should be 
  690. X+ # the switch syntax which when followed by a string will cause
  691. X+ # the string to be used as the subject line by the mail program
  692. X+ # defined above. If SUBJECT is not defined or is null, the string will
  693. X+ # not be placed in the command line.
  694. X+ 
  695. X+ SUBJECT="-s"
  696. X+ 
  697. X  # configuration of working paths
  698. X  # N.B. Include the quotes and the trailing '/' in the defined string
  699. X  # both should be absolute paths (i.e leading '/'
  700. X***************
  701. X*** 30,38 ****
  702. X  # where QBATCH creates it's job files and default monitors
  703. X  SPOOLPATH="/var/spool/batch/"
  704. X  
  705. X! QPATHS=-DQUEUEPATH=\"$(QUEUEPATH)\" -DSPOOLPATH=\"$(SPOOLPATH)\"
  706. X! PROGS=jj jk jm jn jr js qa qc qd qe qf qg qh ql qp qs qt qw rc.QBATCH jobdone
  707. X  
  708. X  all:    $(PROGS)
  709. X      @echo "\n\007programs and scripts ... make complete\n"
  710. X  
  711. X--- 40,52 ----
  712. X  # where QBATCH creates it's job files and default monitors
  713. X  SPOOLPATH="/var/spool/batch/"
  714. X  
  715. X! CFLAG=-g 
  716. X! LDFLAG=-Bstatic
  717. X! QPATHS=-DQUEUEPATH=\"$(QUEUEPATH)\" -DSPOOLPATH=\"$(SPOOLPATH)\" \
  718. X! -DBINDIR=\"$(BINDIR)\" -DMAILPATH=\"$(MAILPATH)\" -DSUBJECT=\"$(SUBJECT)\"
  719. X  
  720. X+ PROGS=jj jk jm jn jr js qa qc qd qe qf qg qh ql qp qs qt qw rc.QBATCH jobdone qa
  721. X+ 
  722. X  all:    $(PROGS)
  723. X      @echo "\n\007programs and scripts ... make complete\n"
  724. X  
  725. X***************
  726. X*** 92,99 ****
  727. X      cc $(CFLAG) $(LDFLAG) $(QPATHS) $@.c -o $@
  728. X      chmod 0711 $@
  729. X  
  730. X! qp:    qp.c qbatch.h  config.o time.o
  731. X!     cc $(CFLAG) $(LDFLAG) $(QPATHS) $@.c config.o time.o  -o $@
  732. X      chmod 0700 $@
  733. X  
  734. X  qs:    qs.c qbatch.h  config.o
  735. X--- 106,114 ----
  736. X      cc $(CFLAG) $(LDFLAG) $(QPATHS) $@.c -o $@
  737. X      chmod 0711 $@
  738. X  
  739. X! qp:    qp.c qbatch.h  config.o time.o logging.o
  740. X!     cc $(CFLAG) $(LDFLAG) $(QPATHS) $@.c config.o time.o \
  741. X!     logging.o  -o $@
  742. X      chmod 0700 $@
  743. X  
  744. X  qs:    qs.c qbatch.h  config.o
  745. X***************
  746. X*** 119,127 ****
  747. X  config.o:    config.c config.h qbatch.h
  748. X          cc $(CFLAG) $(QPATHS) -c config.c
  749. X  
  750. X! time.o:        config.h 
  751. X          cc $(CFLAG) $(QPATHS) -c time.c
  752. X  
  753. X  qbatch.h:    what.h Makefile
  754. X          touch qbatch.h
  755. X  
  756. X--- 134,145 ----
  757. X  config.o:    config.c config.h qbatch.h
  758. X          cc $(CFLAG) $(QPATHS) -c config.c
  759. X  
  760. X! time.o:        time.c config.h 
  761. X          cc $(CFLAG) $(QPATHS) -c time.c
  762. X  
  763. X+ logging.o:    logging.c config.h 
  764. X+         cc $(CFLAG) $(QPATHS) -c logging.c
  765. X+ 
  766. X  qbatch.h:    what.h Makefile
  767. X          touch qbatch.h
  768. X  
  769. X***************
  770. X*** 132,138 ****
  771. X          $(BINDIR)/jr $(BINDIR)/js $(BINDIR)/qa $(BINDIR)/qc \
  772. X          $(BINDIR)/qd $(BINDIR)/qe $(BINDIR)/qf $(BINDIR)/qg \
  773. X          $(BINDIR)/qh $(BINDIR)/ql $(BINDIR)/qp $(BINDIR)/qs \
  774. X!         $(BINDIR)/qw $(BINDIR)/rc.QBATCH $(BINDIR)/jobdone
  775. X          @echo "\n\007Installation of programs and scripts complete\n"
  776. X  
  777. X  make_doc:
  778. X--- 150,157 ----
  779. X          $(BINDIR)/jr $(BINDIR)/js $(BINDIR)/qa $(BINDIR)/qc \
  780. X          $(BINDIR)/qd $(BINDIR)/qe $(BINDIR)/qf $(BINDIR)/qg \
  781. X          $(BINDIR)/qh $(BINDIR)/ql $(BINDIR)/qp $(BINDIR)/qs \
  782. X!         $(BINDIR)/qt $(BINDIR)/qw \
  783. X!         $(BINDIR)/rc.QBATCH $(BINDIR)/jobdone
  784. X          @echo "\n\007Installation of programs and scripts complete\n"
  785. X  
  786. X  make_doc:
  787. X***************
  788. X*** 197,202 ****
  789. X--- 216,224 ----
  790. X          cp $? $(BINDIR)
  791. X  
  792. X  $(BINDIR)/qs:    qs
  793. X+         cp $? $(BINDIR)
  794. X+ 
  795. X+ $(BINDIR)/qt:    qt
  796. X          cp $? $(BINDIR)
  797. X  
  798. X  $(BINDIR)/qw:    qw
  799. Xdiff -cr ./src/config.c ../new/src/config.c
  800. X*** ./src/config.c    Fri Nov  8 08:53:36 1991
  801. X--- ../new/src/config.c    Fri Nov  8 12:08:36 1991
  802. X***************
  803. X*** 56,62 ****
  804. X--- 56,64 ----
  805. X  void toggle_halt_status(newaction)
  806. X  int newaction;
  807. X  {
  808. X+ #ifdef SIGCONT && SIGSTOP
  809. X      kill (childid, (((newaction &qh_halt) == 0) ? SIGCONT : SIGSTOP));
  810. X+ #endif
  811. X  }
  812. X  #endif /* NO_PGP */
  813. X  
  814. X***************
  815. X*** 72,78 ****
  816. X--- 74,82 ----
  817. X  void toggle_halt_status(newaction)
  818. X  int newaction;
  819. X  {
  820. X+ #ifdef SIGCONT && SIGSTOP
  821. X      killpg (childid, (((newaction &qh_halt) == 0) ? SIGCONT : SIGSTOP));
  822. X+ #endif
  823. X  }
  824. X  #endif /* SUNOSPGP */
  825. X  
  826. X***************
  827. X*** 88,94 ****
  828. X--- 92,100 ----
  829. X  void toggle_halt_status(newaction)
  830. X  int newaction;
  831. X  {
  832. X+ #ifdef SIGCONT && SIGSTOP
  833. X      kill ((childid * -1), (((newaction &qh_halt) == 0) ? SIGCONT : SIGSTOP));
  834. X+ #endif
  835. X  }
  836. X  #endif /* XPG3PGP */
  837. X  
  838. X***************
  839. X*** 286,292 ****
  840. X          if (had_usersig)
  841. X          {
  842. X  #ifdef RE_INSTALL
  843. X!         setuser();
  844. X  #endif
  845. X          }
  846. X          if (waitid != childid) continue;
  847. X--- 292,298 ----
  848. X          if (had_usersig)
  849. X          {
  850. X  #ifdef RE_INSTALL
  851. X!         qb_setuser();
  852. X  #endif
  853. X          }
  854. X          if (waitid != childid) continue;
  855. X***************
  856. X*** 312,317 ****
  857. X      pause();
  858. X  #endif
  859. X  #ifdef RE_INSTALL
  860. X!     qb_setuser()    /* re-install interrupt handler */
  861. X  #endif /* RE_INSTALL */
  862. X  }
  863. X--- 318,323 ----
  864. X      pause();
  865. X  #endif
  866. X  #ifdef RE_INSTALL
  867. X!     qb_setuser();   /* re-install interrupt handler */
  868. X  #endif /* RE_INSTALL */
  869. X  }
  870. Xdiff -cr ./src/config.h ../new/src/config.h
  871. X*** ./src/config.h    Fri Nov  8 08:53:36 1991
  872. X--- ../new/src/config.h    Fri Nov  8 12:18:30 1991
  873. X***************
  874. X*** 132,141 ****
  875. X  /*define QCLOCK_TICK gethz();*/
  876. X  
  877. X  /* Some systems don't define pid_t, if not typedef it here */
  878. X! /*typedef int pid_t*/
  879. X  /* and some don't define these */
  880. X! /*typedef short uid_t*/
  881. X! /*typedef short gid_t*/
  882. X  
  883. X  /* if needed , define these */
  884. X  
  885. X--- 132,141 ----
  886. X  /*define QCLOCK_TICK gethz();*/
  887. X  
  888. X  /* Some systems don't define pid_t, if not typedef it here */
  889. X! /*typedef int pid_t;*/
  890. X  /* and some don't define these */
  891. X! /*typedef short uid_t;*/
  892. X! /*typedef short gid_t;*/
  893. X  
  894. X  /* if needed , define these */
  895. X  
  896. Xdiff -cr ./src/js.c ../new/src/js.c
  897. X*** ./src/js.c    Fri Nov  8 08:53:39 1991
  898. X--- ../new/src/js.c    Tue Nov 12 12:44:17 1991
  899. X***************
  900. X*** 15,21 ****
  901. X  #include <malloc.h>
  902. X  int fpq = 0;
  903. X  FILE *fpin, *fpout, *fp;
  904. X! char temp [16], *jcl, *jcwd = NULL;
  905. X  int i,j,k, debug = 0;
  906. X  int qpuid[10];
  907. X  int qpgid[10];
  908. X--- 15,21 ----
  909. X  #include <malloc.h>
  910. X  int fpq = 0;
  911. X  FILE *fpin, *fpout, *fp;
  912. X! char temp [16], *jcl, *jcwd = NULL, *command = NULL;
  913. X  int i,j,k, debug = 0;
  914. X  int qpuid[10];
  915. X  int qpgid[10];
  916. X***************
  917. X*** 130,138 ****
  918. X      extern char *optarg;
  919. X      extern int optind;
  920. X      if (argc == 1) usage (0);
  921. X!     while ((c = getopt (argc, argv, "dlm:n:r:s:v")) != -1)
  922. X      switch (c)
  923. X      {
  924. X          case 'd':   if (shell[0] == 0) debug ++;
  925. X                      break;
  926. X          case 'l':   lflag ++;
  927. X--- 130,140 ----
  928. X      extern char *optarg;
  929. X      extern int optind;
  930. X      if (argc == 1) usage (0);
  931. X!     while ((c = getopt (argc, argv, "c:dlm:n:r:s:v")) != -1)
  932. X      switch (c)
  933. X      {
  934. X+     case 'c':   command = optarg;
  935. X+             break;
  936. X          case 'd':   if (shell[0] == 0) debug ++;
  937. X                      break;
  938. X          case 'l':   lflag ++;
  939. X***************
  940. X*** 197,203 ****
  941. X          strcpy (monitor, fcptr);
  942. X      }
  943. X      }
  944. X!     if (*monitor != 0)
  945. X      {
  946. X          if (*monitor != '/') /* monitor should be full pathspec */
  947. X          { /* so add current working directory */
  948. X--- 199,205 ----
  949. X          strcpy (monitor, fcptr);
  950. X      }
  951. X      }
  952. X!     if ((*monitor != 0) && (strcmp(monitor, "MAIL") != 0))
  953. X      {
  954. X          if (*monitor != '/') /* monitor should be full pathspec */
  955. X          { /* so add current working directory */
  956. X***************
  957. X*** 214,220 ****
  958. X          }
  959. X          if (access(monitor, W_OK) == 0) /* monitor path is accessible */
  960. X          {
  961. X!             fp = fopen (monitor, "w");
  962. X              if (fp == NULL) /* monitor is a directory */
  963. X              {
  964. X                  if (monitor [strlen(monitor) - 1] != '/')
  965. X--- 216,222 ----
  966. X          }
  967. X          if (access(monitor, W_OK) == 0) /* monitor path is accessible */
  968. X          {
  969. X!             fp = fopen (monitor, "a");
  970. X              if (fp == NULL) /* monitor is a directory */
  971. X              {
  972. X                  if (monitor [strlen(monitor) - 1] != '/')
  973. X***************
  974. X*** 427,432 ****
  975. X--- 429,439 ----
  976. X      optind ++;
  977. X      if (optind < argc)
  978. X      {
  979. X+     if (command != NULL)
  980. X+     {
  981. X+         fprintf (stderr, "cannot have -c <command> AND job file\n");
  982. X+         qb_exit (-1);
  983. X+     }
  984. X          if (argv[optind][0] != '/')
  985. X          {
  986. X              /* no absolute path given so prefix with current path */
  987. X***************
  988. X*** 438,443 ****
  989. X--- 445,455 ----
  990. X      }
  991. X      if (lflag && (optind < argc))
  992. X      {
  993. X+     if (command != NULL)
  994. X+     {
  995. X+         fprintf (stderr, "cannot have -c <command> AND link file\n");
  996. X+         qb_exit (-1);
  997. X+     }
  998. X          fprintf (fpout, "#!L");
  999. X          fprintf (fpout, "%s\n", buff);
  1000. X          if (jobname[0] == 0)
  1001. X***************
  1002. X*** 459,481 ****
  1003. X                  qb_exit (-1);
  1004. X              }
  1005. X          }
  1006. X!         while (fgets (buff, 128, fpin) != NULL)
  1007. X!         {
  1008. X!             fputs (buff, fpout);
  1009. X!             if (*jobname == 0)
  1010. X!             {
  1011. X!                 fcptr = strrchr(buff, '\n');
  1012. X!                 if (fcptr != NULL) *fcptr = 0;
  1013. X!                 fcptr = strchr (buff, '=');
  1014. X!                 if (fcptr != NULL)
  1015. X!                 {
  1016. X!                     *fcptr = 0;
  1017. X!                     fcptr ++;
  1018. X!                     if (strcmp (buff, "JOBNAME") == 0)
  1019. X!                         strcpy (jobname, fcptr);
  1020. X!                 }
  1021. X!             }
  1022. X!         }
  1023. X          if (jobname[0] == 0)
  1024. X          {
  1025. X              /* no jobname (probably crqentry) so use last line of jcl for name */
  1026. X--- 471,501 ----
  1027. X                  qb_exit (-1);
  1028. X              }
  1029. X          }
  1030. X!     if (command != NULL)
  1031. X!     {
  1032. X!         fputs (command, fpout);
  1033. X!         strcpy (buff, command);
  1034. X!     }
  1035. X!     else
  1036. X!     {
  1037. X!         while (fgets (buff, 128, fpin) != NULL)
  1038. X!             {
  1039. X!                 fputs (buff, fpout);
  1040. X!                 if (*jobname == 0)
  1041. X!                 {
  1042. X!                     fcptr = strrchr(buff, '\n');
  1043. X!                     if (fcptr != NULL) *fcptr = 0;
  1044. X!                     fcptr = strchr (buff, '=');
  1045. X!                     if (fcptr != NULL)
  1046. X!                     {
  1047. X!                         *fcptr = 0;
  1048. X!                         fcptr ++;
  1049. X!                         if (strcmp (buff, "JOBNAME") == 0)
  1050. X!                             strcpy (jobname, fcptr);
  1051. X!                     }
  1052. X!                 }
  1053. X!         }
  1054. X!     }
  1055. X          if (jobname[0] == 0)
  1056. X          {
  1057. X              /* no jobname (probably crqentry) so use last line of jcl for name */
  1058. Xdiff -cr ./src/qbatch.h ../new/src/qbatch.h
  1059. X*** ./src/qbatch.h    Fri Nov  8 08:53:26 1991
  1060. X--- ../new/src/qbatch.h    Tue Nov 12 16:04:04 1991
  1061. X***************
  1062. X*** 6,11 ****
  1063. X--- 6,14 ----
  1064. X  /*             (c) Vita Fibres   1990 1991                              */
  1065. X  /*                                                                      */
  1066. X  /************************************************************************/
  1067. X+ /* first define whether you want queue logging enabled */
  1068. X+ #define LOGGING
  1069. X+ 
  1070. X  #include <stdio.h>
  1071. X  #include <string.h>
  1072. X  #include <sys/file.h>
  1073. X***************
  1074. X*** 24,30 ****
  1075. X  #define    qh_enabled   8       /* accept entries flag */
  1076. X  #define    qh_halt     16       /* suspend processing flag */
  1077. X  #define       qh_fixed    32       /* fixed context processing */
  1078. X! #define    qh_flagmax  32       /* should be highest above */
  1079. X  #define    qh_action qh_kill + qh_halt /* immediate action flags */
  1080. X  
  1081. X  struct queue_header {
  1082. X--- 27,34 ----
  1083. X  #define    qh_enabled   8       /* accept entries flag */
  1084. X  #define    qh_halt     16       /* suspend processing flag */
  1085. X  #define       qh_fixed    32       /* fixed context processing */
  1086. X! #define    qh_log      64    /* logging switched on      */
  1087. X! #define    qh_flagmax  64       /* should be highest above */
  1088. X  #define    qh_action qh_kill + qh_halt /* immediate action flags */
  1089. X  
  1090. X  struct queue_header {
  1091. Xdiff -cr ./src/qc.c ../new/src/qc.c
  1092. X*** ./src/qc.c    Fri Nov  8 08:53:32 1991
  1093. X--- ../new/src/qc.c    Fri Nov  8 12:35:49 1991
  1094. X***************
  1095. X*** 16,22 ****
  1096. X  
  1097. X  #include <stdlib.h>
  1098. X  #include "qbatch.h"
  1099. X! int mflag, sflag = 0, pflag = 0, pval = 0, fixedcontext = 0;
  1100. X  char *queuename;
  1101. X  char queue [64];
  1102. X  char qpath [64];
  1103. X--- 16,22 ----
  1104. X  
  1105. X  #include <stdlib.h>
  1106. X  #include "qbatch.h"
  1107. X! int mflag, sflag = 0, pflag = 0, pval = 0, fixedcontext = 0, logging = 0;;
  1108. X  char *queuename;
  1109. X  char queue [64];
  1110. X  char qpath [64];
  1111. X***************
  1112. X*** 36,42 ****
  1113. X          fprintf (stderr, "Must be root to create a queue\n");
  1114. X          qb_term (-1);
  1115. X      }
  1116. X!     while ((c = getopt (argc, argv, "fm:p:s:v")) != -1)
  1117. X      switch (c)
  1118. X      {
  1119. X          case 's':
  1120. X--- 36,42 ----
  1121. X          fprintf (stderr, "Must be root to create a queue\n");
  1122. X          qb_term (-1);
  1123. X      }
  1124. X!     while ((c = getopt (argc, argv, "flm:p:s:v")) != -1)
  1125. X      switch (c)
  1126. X      {
  1127. X          case 's':
  1128. X***************
  1129. X*** 50,55 ****
  1130. X--- 50,58 ----
  1131. X          case 'f':
  1132. X              fixedcontext ++; 
  1133. X              break;
  1134. X+         case 'l':
  1135. X+             logging ++; 
  1136. X+             break;
  1137. X          case 'm':
  1138. X              strcpy (monitor, optarg);
  1139. X          mflag ++;
  1140. X***************
  1141. X*** 77,83 ****
  1142. X          }
  1143. X      }
  1144. X      else strcpy (qpath, SPOOLPATH);
  1145. X!     if ((monitor[0] != 0) && (strcmp (monitor, "NONE")) != 0)
  1146. X      {
  1147. X          if (strlen (monitor) > 63)
  1148. X          {
  1149. X--- 80,86 ----
  1150. X          }
  1151. X      }
  1152. X      else strcpy (qpath, SPOOLPATH);
  1153. X!     if ((monitor[0] != 0) && (strcmp (monitor, "NONE") != 0) && (strcmp(monitor, "MAIL") != 0))
  1154. X      {
  1155. X          if (strlen (monitor) > 63)
  1156. X          {
  1157. X***************
  1158. X*** 118,124 ****
  1159. X      }
  1160. X      else 
  1161. X      {
  1162. X!     if (strcmp (monitor, "NONE") != 0)
  1163. X      {
  1164. X          strcpy (monitor, qpath);
  1165. X          if (monitor[strlen(monitor) -1] != '/') strcat (monitor, "/");
  1166. X--- 121,127 ----
  1167. X      }
  1168. X      else 
  1169. X      {
  1170. X!     if ((strcmp (monitor, "NONE") != 0) && (strcmp(monitor, "MAIL") != 0))
  1171. X      {
  1172. X          strcpy (monitor, qpath);
  1173. X          if (monitor[strlen(monitor) -1] != '/') strcat (monitor, "/");
  1174. X***************
  1175. X*** 174,179 ****
  1176. X--- 177,188 ----
  1177. X      if ((head.qh_flags & qh_fixed) == 0)
  1178. X           head.qh_flags += (unsigned int) qh_fixed;
  1179. X      else    head.qh_flags -= (unsigned int) qh_fixed;
  1180. X+     }
  1181. X+     if (logging)
  1182. X+     {
  1183. X+     if ((head.qh_flags & qh_log) == 0)
  1184. X+          head.qh_flags += (unsigned int) qh_log;
  1185. X+     else    head.qh_flags -= (unsigned int) qh_log;
  1186. X      }
  1187. X      lseek (fpq, 0, SEEK_SET);
  1188. X      write (fpq, &head, sizeof(head));
  1189. Xdiff -cr ./src/qf.c ../new/src/qf.c
  1190. X*** ./src/qf.c    Fri Nov  8 08:53:40 1991
  1191. X--- ../new/src/qf.c    Tue Nov 12 09:36:36 1991
  1192. X***************
  1193. X*** 11,17 ****
  1194. X  #include <stdlib.h>
  1195. X  #include "qbatch.h"
  1196. X  int mflag = 0, jflag = 0, qflag = 0, pflag = 0, aflag = 0,rflag = 0, sflag = 0, nflag = 0;
  1197. X! int lflag = 0;
  1198. X  char buff[128];
  1199. X  FILE *fpq, *fp;
  1200. X  char *queuename;
  1201. X--- 11,17 ----
  1202. X  #include <stdlib.h>
  1203. X  #include "qbatch.h"
  1204. X  int mflag = 0, jflag = 0, qflag = 0, pflag = 0, aflag = 0,rflag = 0, sflag = 0, nflag = 0;
  1205. X! int lflag = 0, Lflag=0;
  1206. X  char buff[128];
  1207. X  FILE *fpq, *fp;
  1208. X  char *queuename;
  1209. X***************
  1210. X*** 93,99 ****
  1211. X      int c;
  1212. X      extern char *optarg;
  1213. X      extern int   optind;
  1214. X!     while ((c = getopt (argc, argv, "ae:jlmnpqrsv")) != -1)
  1215. X      switch (c)
  1216. X      {
  1217. X          case 'q':
  1218. X--- 93,99 ----
  1219. X      int c;
  1220. X      extern char *optarg;
  1221. X      extern int   optind;
  1222. X!     while ((c = getopt (argc, argv, "ae:jLlmnpqrsv")) != -1)
  1223. X      switch (c)
  1224. X      {
  1225. X          case 'q':
  1226. X***************
  1227. X*** 102,107 ****
  1228. X--- 102,110 ----
  1229. X          case 'j':
  1230. X              jflag ++;
  1231. X              break;
  1232. X+         case 'L':
  1233. X+             Lflag ++;
  1234. X+             break;
  1235. X          case 'l':
  1236. X              lflag ++;
  1237. X              break;
  1238. X***************
  1239. X*** 180,185 ****
  1240. X--- 183,202 ----
  1241. X          printf("%d\n", head.qh_noentries);
  1242. X      fclose (fpq);
  1243. X          exit (0);
  1244. X+     }
  1245. X+     if (Lflag != 0)
  1246. X+     {
  1247. X+     if ((head.qh_flags & qh_log) != 0)
  1248. X+     {
  1249. X+         printf("%s",head.qh_spool);
  1250. X+         if (head.qh_spool[strlen(head.qh_spool) -1] != '/')
  1251. X+         printf("/");
  1252. X+          printf ("%s.log\n", queuename);
  1253. X+          exit(0);
  1254. X+         }
  1255. X+         else
  1256. X+         fprintf (stderr, "Logging is switched off for %s\n", queuename);
  1257. X+         exit (-1);
  1258. X      }
  1259. X      if (rflag != 0)
  1260. X      {
  1261. Xdiff -cr ./src/qp.c ../new/src/qp.c
  1262. X*** ./src/qp.c    Fri Nov  8 08:53:41 1991
  1263. X--- ../new/src/qp.c    Tue Nov 12 12:31:25 1991
  1264. X***************
  1265. X*** 11,27 ****
  1266. X  
  1267. X  #include "qbatch.h"
  1268. X  #include <malloc.h>
  1269. X! int fpq = 0,
  1270. X!     fplck = 0,
  1271. X!     fptemp = 0;
  1272. X!     result,
  1273. X!     interrupt = 0;
  1274. X  FILE *fpin,
  1275. X       *mon;
  1276. X  struct tm *jtimes;
  1277. X  char exit_message[64];
  1278. X  char envflg[5], envvar[255];
  1279. X! char temp[16],
  1280. X     *jcl,
  1281. X     *jcwd = NULL;
  1282. X  int i,
  1283. X--- 11,34 ----
  1284. X  
  1285. X  #include "qbatch.h"
  1286. X  #include <malloc.h>
  1287. X! 
  1288. X! /* pointers to qp's structures for external use (in logging.c) */
  1289. X! struct queue_header * ehead = &head;    
  1290. X! struct queue_entry * eentry = &entry;    
  1291. X! 
  1292. X! int fpq = 0;
  1293. X! int fplck = 0;
  1294. X! int fptemp = 0;
  1295. X! int result;
  1296. X! int interrupt = 0;
  1297. X! int mail = 0;
  1298. X  FILE *fpin,
  1299. X       *mon;
  1300. X  struct tm *jtimes;
  1301. X+ time_t end_time;
  1302. X  char exit_message[64];
  1303. X  char envflg[5], envvar[255];
  1304. X! char temp[128],
  1305. X     *jcl,
  1306. X     *jcwd = NULL;
  1307. X  int i,
  1308. X***************
  1309. X*** 229,235 ****
  1310. X      write (fplck, &ppid, sizeof(ppid));
  1311. X      fsync(fplck);
  1312. X      head.qh_pid = ppid; /* set up header data .. */
  1313. X!     head.qh_flags &= (qh_enabled+qh_fixed);     /* ,..flags */
  1314. X      head.qh_proc = time ((time_t *) 0);        /* set up start time */
  1315. X      head.qh_queued = 0;
  1316. X      head.qh_real = 0;
  1317. X--- 236,242 ----
  1318. X      write (fplck, &ppid, sizeof(ppid));
  1319. X      fsync(fplck);
  1320. X      head.qh_pid = ppid; /* set up header data .. */
  1321. X!     head.qh_flags &= (qh_enabled+qh_fixed+qh_log);     /* ,..flags */
  1322. X      head.qh_proc = time ((time_t *) 0);        /* set up start time */
  1323. X      head.qh_queued = 0;
  1324. X      head.qh_real = 0;
  1325. X***************
  1326. X*** 300,315 ****
  1327. X          else
  1328. X          {       /* get entry and fork it */
  1329. X              read (fpq, &entry, sizeof (entry));
  1330. X!             if (entry.qe_monitor[0] != 0)
  1331. X              {
  1332. X                  mon = fopen (entry.qe_monitor, "a");
  1333. X              }
  1334. X              else
  1335. X              {
  1336. X!                 mon = fopen (head.qh_defmon, "a");
  1337. X              }
  1338. X              head.qh_start = time ((time_t *) 0);        /* set up start time */
  1339. X!         q_queued = head.qh_start - entry.qe_submitted;
  1340. X              jtimes = (struct tm *)localtime (&head.qh_start);
  1341. X          fprintf (mon, "##\n## Queue %s entry %d (uid = %d : %s) Job: %s\n"
  1342. X                      ,queuename, entry.qe_jobno, entry.qe_uid, entry.qe_uname, entry.qe_jobname);
  1343. X--- 307,355 ----
  1344. X          else
  1345. X          {       /* get entry and fork it */
  1346. X              read (fpq, &entry, sizeof (entry));
  1347. X!             if ((strcmp (entry.qe_monitor, "MAIL") != 0) && (entry.qe_monitor[0] != 0))
  1348. X              {
  1349. X+         /* check if non-default monitor can be accessed */
  1350. X+         mon = fopen(entry.qe_monitor, "r");
  1351. X+         if (mon == NULL)
  1352. X+         {
  1353. X+             /* either does not exist or no access */
  1354. X+             /* so try to create it */
  1355. X+             i = open (entry.qe_monitor, O_CREAT+O_EXCL, 0644);
  1356. X+             if (i == -1)
  1357. X+             {
  1358. X+             /* must exist but no access */
  1359. X+             fprintf (stderr, "Cannot access monitor\n");
  1360. X+             qb_exit(-1);
  1361. X+             }
  1362. X+             /* created, so close, and change owner and group */
  1363. X+             /* to that of submittor */
  1364. X+             close (i);
  1365. X+             chown (entry.qe_monitor, entry.qe_uid, entry.qe_gid);
  1366. X+         }
  1367. X+         else fclose (mon);
  1368. X                  mon = fopen (entry.qe_monitor, "a");
  1369. X              }
  1370. X              else
  1371. X              {
  1372. X!         if ((strcmp (entry.qe_monitor, "MAIL") == 0) || (strcmp (head.qh_defmon, "MAIL") == 0))
  1373. X!         {
  1374. X!             mail = 1;
  1375. X!                 strcpy (temp, head.qh_spool);
  1376. X!                 if (temp[strlen(temp) -1] != '/') strcat (temp, "/");
  1377. X!             strcat(temp, "qmonXXXXXX");
  1378. X!             mktemp(temp);
  1379. X!             mon = fopen(temp,"w");
  1380. X!         }
  1381. X!         else
  1382. X!         {
  1383. X!             mail = 0;
  1384. X!             mon = fopen (head.qh_defmon, "a");
  1385. X!             chmod (head.qh_defmon, 0644);
  1386. X!         }
  1387. X              }
  1388. X              head.qh_start = time ((time_t *) 0);        /* set up start time */
  1389. X!         q_queued = (head.qh_start - entry.qe_submitted)*100;
  1390. X              jtimes = (struct tm *)localtime (&head.qh_start);
  1391. X          fprintf (mon, "##\n## Queue %s entry %d (uid = %d : %s) Job: %s\n"
  1392. X                      ,queuename, entry.qe_jobno, entry.qe_uid, entry.qe_uname, entry.qe_jobname);
  1393. X***************
  1394. X*** 386,392 ****
  1395. X                      envs[j++] = qentry;
  1396. X              j = 0;
  1397. X                      jtimes = (struct tm *)localtime (&head.qh_start);
  1398. X!                     if (entry.qe_monitor[0] != 0)
  1399. X                      {
  1400. X                          mon = freopen (entry.qe_monitor, "a", stdout);
  1401. X                          mon = freopen (entry.qe_monitor, "a", stderr);
  1402. X--- 426,432 ----
  1403. X                      envs[j++] = qentry;
  1404. X              j = 0;
  1405. X                      jtimes = (struct tm *)localtime (&head.qh_start);
  1406. X!                     if ((entry.qe_monitor[0] != 0) && (strcmp (entry.qe_monitor, "MAIL") !=0))
  1407. X                      {
  1408. X                          mon = freopen (entry.qe_monitor, "a", stdout);
  1409. X                          mon = freopen (entry.qe_monitor, "a", stderr);
  1410. X***************
  1411. X*** 393,400 ****
  1412. X                      }
  1413. X                      else
  1414. X                      {
  1415. X!                         mon = freopen (head.qh_defmon, "a", stdout);
  1416. X!                         mon = freopen (head.qh_defmon, "a", stderr);
  1417. X                      }
  1418. X                      if (setuid (entry.qe_uid) != 0)
  1419. X              {
  1420. X--- 433,448 ----
  1421. X                      }
  1422. X                      else
  1423. X                      {
  1424. X!             if (mail)
  1425. X!             {
  1426. X!                 mon = freopen (temp, "a",  stdout);
  1427. X!                 mon = freopen (temp, "a",  stderr);
  1428. X!             }
  1429. X!             else
  1430. X!             {
  1431. X!                 mon = freopen (head.qh_defmon, "a", stdout);
  1432. X!                 mon = freopen (head.qh_defmon, "a", stderr);
  1433. X!             }
  1434. X                      }
  1435. X                      if (setuid (entry.qe_uid) != 0)
  1436. X              {
  1437. X***************
  1438. X*** 420,426 ****
  1439. X  /*
  1440. X                   set child on track, now update queue and wait for it to finish
  1441. X  */
  1442. X!             head.qh_flags &= (qh_enabled+qh_fixed);     /* ,..flags */
  1443. X                  entry.qe_status = childid;  /* and entry status */
  1444. X                  lseek (fpq, 0, SEEK_SET);
  1445. X                  head.qh_pid = ppid;
  1446. X--- 468,474 ----
  1447. X  /*
  1448. X                   set child on track, now update queue and wait for it to finish
  1449. X  */
  1450. X!             head.qh_flags &= (qh_enabled+qh_fixed+qh_log);     /* ,..flags */
  1451. X                  entry.qe_status = childid;  /* and entry status */
  1452. X                  lseek (fpq, 0, SEEK_SET);
  1453. X                  head.qh_pid = ppid;
  1454. X***************
  1455. X*** 433,448 ****
  1456. X          q_wait(exit_message);
  1457. X          qb_get_timer(&q_real, &q_user, &q_system);
  1458. X                  childid = 0;
  1459. X!                 if (entry.qe_monitor[0] != 0)
  1460. X                  {
  1461. X                      mon = fopen (entry.qe_monitor, "a");
  1462. X                  }
  1463. X                  else
  1464. X                  {
  1465. X!                     mon = fopen (head.qh_defmon, "a");
  1466. X                  }
  1467. X!                 head.qh_start = time ((time_t *) 0);        /* set up end time */
  1468. X!                 jtimes = (struct tm *)localtime (&head.qh_start);
  1469. X              fprintf (mon, "##\n## Queue %s entry %d (uid = %d : %s) Job: %s\n"
  1470. X                          ,queuename, entry.qe_jobno, entry.qe_uid, entry.qe_uname, entry.qe_jobname);
  1471. X              fprintf (mon, "## stopped %s" ,asctime (jtimes));
  1472. X--- 481,497 ----
  1473. X          q_wait(exit_message);
  1474. X          qb_get_timer(&q_real, &q_user, &q_system);
  1475. X                  childid = 0;
  1476. X!                 if ((strcmp(entry.qe_monitor, "MAIL") != 0) && (entry.qe_monitor[0] != 0))
  1477. X                  {
  1478. X                      mon = fopen (entry.qe_monitor, "a");
  1479. X                  }
  1480. X                  else
  1481. X                  {
  1482. X!             if (mail) mon = fopen (temp, "a");
  1483. X!                     else      mon = fopen (head.qh_defmon, "a");
  1484. X                  }
  1485. X!                 end_time = time ((time_t *) 0);        /* set up end time */
  1486. X!                 jtimes = (struct tm *)localtime (&end_time);
  1487. X              fprintf (mon, "##\n## Queue %s entry %d (uid = %d : %s) Job: %s\n"
  1488. X                          ,queuename, entry.qe_jobno, entry.qe_uid, entry.qe_uname, entry.qe_jobname);
  1489. X              fprintf (mon, "## stopped %s" ,asctime (jtimes));
  1490. X***************
  1491. X*** 454,464 ****
  1492. X              fprintf (mon, "##  (%s)\n", exit_message);
  1493. X          fprintf (mon,"##\n");
  1494. X                  fclose (mon);
  1495. X              }
  1496. X              if (entry.qe_notify > 0)
  1497. X              {
  1498. X                  /* notify user */
  1499. X!                 sprintf (buff, "/usr/bin/bv/jobdone %s %d %d %s %s \"%s\"", queuename, entry.qe_jobno, entry.qe_notify, entry.qe_uname, entry.qe_tty, entry.qe_jobname);
  1500. X                  system (buff);
  1501. X              }
  1502. X              fpq = open (queue, O_RDWR);
  1503. X--- 503,531 ----
  1504. X              fprintf (mon, "##  (%s)\n", exit_message);
  1505. X          fprintf (mon,"##\n");
  1506. X                  fclose (mon);
  1507. X+ #ifdef LOGGING
  1508. X+         if ((head.qh_flags & qh_log) != 0) q_log();
  1509. X+ #endif
  1510. X+         if (mail)
  1511. X+         {
  1512. X+             mon = fopen (temp, "r");
  1513. X+ #ifdef SUBJECT
  1514. X+                    sprintf (path, "%s %s \"Monitor for your job in \'%s\' queue\" %s", MAILPATH, SUBJECT, queuename, entry.qe_uname);
  1515. X+ #else
  1516. X+             sprintf (path, "%s %s", MAILPATH, entry.qe_uname);
  1517. X+ #endif /* SUBJECT */
  1518. X+             fpin = popen (path, "w");
  1519. X+             while (fgets (buff, 128, mon) != NULL)
  1520. X+                 fputs (buff, fpin);
  1521. X+             fclose (mon);
  1522. X+             pclose (fpin);
  1523. X+             unlink(temp);
  1524. X+         }
  1525. X              }
  1526. X              if (entry.qe_notify > 0)
  1527. X              {
  1528. X                  /* notify user */
  1529. X!                 sprintf (buff, "%s/jobdone %s %d %d %s %s \"%s\"", BINDIR, queuename, entry.qe_jobno, entry.qe_notify, entry.qe_uname, entry.qe_tty, entry.qe_jobname);
  1530. X                  system (buff);
  1531. X              }
  1532. X              fpq = open (queue, O_RDWR);
  1533. X***************
  1534. X*** 465,471 ****
  1535. X          q_lock(fpq);
  1536. X              read (fpq, &head, sizeof(head));
  1537. X              head.qh_start = 0;
  1538. X!         head.qh_queued += (q_queued*100);
  1539. X          head.qh_real += q_real;
  1540. X          head.qh_user += q_user;
  1541. X          head.qh_system += q_system;
  1542. X--- 532,538 ----
  1543. X          q_lock(fpq);
  1544. X              read (fpq, &head, sizeof(head));
  1545. X              head.qh_start = 0;
  1546. X!         head.qh_queued += q_queued;
  1547. X          head.qh_real += q_real;
  1548. X          head.qh_user += q_user;
  1549. X          head.qh_system += q_system;
  1550. Xdiff -cr ./src/qt.c ../new/src/qt.c
  1551. X*** ./src/qt.c    Fri Nov  8 08:53:27 1991
  1552. X--- ../new/src/qt.c    Tue Nov 12 09:58:07 1991
  1553. X***************
  1554. X*** 40,46 ****
  1555. X  }
  1556. X  void usage()
  1557. X  {
  1558. X!     puts("Usage: qt -[e]|[f]|[h]|[k]|[r]|[s]|[u]|[t]|[v] <queuename>");
  1559. X      exit (0);
  1560. X  }
  1561. X  void ext(flag)
  1562. X--- 40,46 ----
  1563. X  }
  1564. X  void usage()
  1565. X  {
  1566. X!     puts("Usage: qt -[e]|[f]|[h]|[k]|[l]|[L]|[r]|[s]|[u]|[t]|[v] <queuename>");
  1567. X      exit (0);
  1568. X  }
  1569. X  void ext(flag)
  1570. X***************
  1571. X*** 63,69 ****
  1572. X  {
  1573. X      extern char *optarg;
  1574. X      extern int   optind;
  1575. X!     if ((c = getopt (argc, argv, "efhklrstuv")) == -1) usage();
  1576. X      if (c == 'v') q_version();
  1577. X      if (optind >= argc)
  1578. X      {
  1579. X--- 63,69 ----
  1580. X  {
  1581. X      extern char *optarg;
  1582. X      extern int   optind;
  1583. X!     if ((c = getopt (argc, argv, "efhkLlrstuv")) == -1) usage();
  1584. X      if (c == 'v') q_version();
  1585. X      if (optind >= argc)
  1586. X      {
  1587. X***************
  1588. X*** 96,101 ****
  1589. X--- 96,102 ----
  1590. X      case 'k':    ext (head.qh_flags & qh_kill);
  1591. X      case 'r':    ext (head.qh_flags & qh_repeat);
  1592. X      case 's':    ext (head.qh_flags & qh_stop);
  1593. X+     case 'L':    ext (head.qh_flags & qh_log);
  1594. X      }
  1595. X      /* done the rest, must be -u  or -l*/
  1596. X      if ((head.qh_flags & qh_fixed) == 0)
  1597. Xdiff -cr ./src/whatgen ../new/src/whatgen
  1598. X*** ./src/whatgen    Fri Nov  8 08:53:20 1991
  1599. X--- ../new/src/whatgen    Tue Nov 12 09:00:04 1991
  1600. X***************
  1601. X*** 9,12 ****
  1602. X  #************************************************************************#
  1603. X  set `cat patchlevel.h`
  1604. X  echo  "static char QbSID[]= \042@(#) QBATCH (c) \tVersion: 2.$3 \
  1605. X! (4 October 1991)\042;">what.h
  1606. X--- 9,12 ----
  1607. X  #************************************************************************#
  1608. X  set `cat patchlevel.h`
  1609. X  echo  "static char QbSID[]= \042@(#) QBATCH (c) \tVersion: 2.$3 \
  1610. X! (12 November 1991)\042;">what.h
  1611. END_OF_FILE
  1612.   if test 50591 -ne `wc -c <'./patches/qbatch.p1'`; then
  1613.     echo shar: \"'./patches/qbatch.p1'\" unpacked with wrong size!
  1614.   fi
  1615.   # end of './patches/qbatch.p1'
  1616. fi
  1617. echo shar: End of archive 2 \(of 2\).
  1618. cp /dev/null ark2isdone
  1619. MISSING=""
  1620. for I in 1 2 ; do
  1621.     if test ! -f ark${I}isdone ; then
  1622.     MISSING="${MISSING} ${I}"
  1623.     fi
  1624. done
  1625. if test "${MISSING}" = "" ; then
  1626.     echo You have unpacked both archives.
  1627.     rm -f ark[1-9]isdone
  1628. else
  1629.     echo You still must unpack the following archives:
  1630.     echo "        " ${MISSING}
  1631. fi
  1632. exit 0
  1633. exit 0 # Just in case...
  1634. -- 
  1635. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1636. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1637. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1638. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1639.