home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / vmsnet / sources / 307 < prev    next >
Encoding:
Internet Message Format  |  1992-08-21  |  46.8 KB

  1. Path: sparky!uunet!elroy.jpl.nasa.gov!swrinde!mips!mips!munnari.oz.au!network.ucsd.edu!mvb.saic.com!vmsnet-sources
  2. From: munroe@dmc.com (Dick Munroe)
  3. Newsgroups: vmsnet.sources
  4. Subject: UBBS, part 05/12
  5. Message-ID: <7868468@MVB.SAIC.COM>
  6. Date: 21 Aug 92 20:20:10 GMT
  7. Organization: Doyle, Munroe Consultants, Inc., Hudson, MA
  8. Lines: 1590
  9. Approved: Mark.Berryman@Mvb.Saic.Com
  10.  
  11. Submitted-by: munroe@dmc.com (Dick Munroe)
  12. Posting-number: Volume 3, Issue 113
  13. Archive-name: ubbs/part05
  14. -+-+-+-+-+-+-+-+ START OF PART 5 -+-+-+-+-+-+-+-+
  15. X`09`09istat=str$upcase(mail_name,mail_name)
  16. X`09`09fd.upload_text(31:60)=mail_name
  17. X`09`09done=.false.
  18. X`09`09end if
  19. X`09    end do
  20. X`09rewrite(unit=4)fd
  21. X`09close(unit=4)
  22. X`09return
  23. X 1003`09format(q,a)
  24. X`09end
  25. X`0C
  26. X`09subroutine archive_files
  27. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  28. Vcccc
  29. Xc
  30. Xc`09UBBS subroutines - ARCHIVE_FILES
  31. Xc`09This routine reads all of the FILES.IDX files and deletes and sets
  32. Xc`09the ARCHIVED flag for all those which have not been accessed since a
  33. Xc`09Specified date.
  34. Xc`09Dale Miller - UALR
  35. Xc
  36. Xc`09Rev. 7.1  19-Sep-1988
  37. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  38. Vcccc
  39. X`09implicit none
  40. X`09include 'bbs_inc.for'
  41. X`09include '($rmsdef)'
  42. X`09include 'sys$library:foriosdef.for/nolist'
  43. X`09character filnam1*100,filnam2*100,darea*3,tempfile*50,dsp*1
  44. X`09character*30 my_date,time
  45. X`09integer*4 long_ago(2)
  46. X`09integer d1,d2,dummy,istat,fc1,fc2,du1,du2,i,length
  47. X`09integer lib$find_file,lib$delete_file
  48. X`09integer fsize,rev_date(2),back_date(2),total_size
  49. X`09integer str$trim,str$upcase,sys$gettim,compquad
  50. X`09integer sys$bintim,sys$asctim
  51. X`09external uopen,getsize
  52. X
  53. X`09common/filesize/ fsize,rev_date,back_date
  54. X`09record/file_description/ fd
  55. X
  56. X 0009`09print*,'Enter date of interest (dd-mmm-yyyy)'
  57. X`09read(5,1001)my_date
  58. X 1001`09format(a)
  59. X`09istat=str$upcase(my_date,my_date)
  60. X `09my_date=my_date(:11)//' 00:00:00.00'
  61. X`09istat = sys$bintim(my_date,long_ago)
  62. X`09istat = sys$asctim(length,time,long_ago,)
  63. X`09print*,'Date is:'//time(:length)//'.  Is this correct?'
  64. X`09read(5,1001)dsp
  65. X`09istat=str$upcase(dsp,dsp)
  66. X`09if(dsp.ne.'Y') go to 9
  67. X
  68. X`09filnam1='ubbs_files:`5B000000`5D*.dir;*'
  69. X`09call str$trim(filnam1,filnam1,dummy)
  70. X`09fc1=0
  71. X`09total_size = 0
  72. X`09tempfile=filnam1
  73. X`09istat=rms$_nmf
  74. X`09istat=lib$find_file(tempfile,filnam1,fc1)
  75. X`09do while (istat.ne.rms$_nmf)
  76. X`09    d1=1
  77. X`09    do while(d1.ne.0)
  78. X`09`09d1=index(filnam1,'`5D')
  79. X`09`09filnam1=filnam1(d1+1:)
  80. X`09`09end do
  81. X`09    d2=index(filnam1,'.')-1
  82. X`09    darea=filnam1(:d2)
  83. X`09    write(6,*)' AF - Beginning '//darea
  84. Xc
  85. Xc Get the index file.
  86. Xc
  87. X`09open(unit=4,`09`09shared,
  88. X`091   file='ubbs_files:`5B'//darea//'`5Dfiles.idx',
  89. X`092   status='old',`09organization='indexed',
  90. X`093   access='keyed',`09form='unformatted',
  91. X`094   recl=192,`09`09recordtype='variable',
  92. X`095`09`09`09key=(1:18:character),
  93. X`096   useropen=uopen)
  94. X
  95. X`09fd.file_name=char(0)
  96. X`09read(4,keygt=fd.file_name,iostat=ios)fd
  97. X`09do while(ios.ne.for$ios_attaccnon)
  98. X`09    if(fd.file_name.eq.'$Header') go to 8888
  99. X`09    if(fd.archived) go to 8888
  100. X
  101. X`09    dummy = compquad(long_ago,fd.download_date)
  102. X`09    if(dummy.eq.1) then
  103. Xc`09`09Check to make sure it has been backed up.
  104. X`09`09if(fd.file_type.eq.'A'.or.fd.file_type.eq.'U') then
  105. X`09`09    filnam2='ubbs_files:`5B'//darea//'.ASC`5D'//fd.file_name
  106. X`09`09else
  107. X`09`09    filnam2='ubbs_files:`5B'//darea//'.BIN`5D'//fd.file_name
  108. X`09`09end if
  109. X`09`09if(index(fd.file_name,'.').eq.0) then
  110. X`09`09    call str$trim(filnam2,filnam2,dummy)
  111. X`09`09    filnam2(dummy+1:dummy+1)='.'
  112. X`09`09    end if
  113. X`09`09open(unit=17,file=filnam2,status='old',readonly,
  114. X`091`09    useropen=getsize)
  115. X`09`09close(unit=17)
  116. X`09`09dummy = compquad(back_date,rev_date)
  117. X`09`09if(dummy.ne.1) then
  118. X`09`09    print*,'File has not been backed up, archiving '//
  119. X`091`09`09'not possible:'//darea//' '//fd.file_name
  120. X`09`09    go to 8888
  121. X`09`09    end if
  122. X`09`09print*,'Deleting '//fd.file_name//' Size=',fd.file_size
  123. X`09`09total_size = total_size + fd.file_size
  124. X`09`09istat=lib$delete_file(filnam2)
  125. X`09`09fd.archived = .true.
  126. X`09`09rewrite(unit=4) fd
  127. X`09`09end if
  128. X
  129. X
  130. X 8888`09    read(4,keygt=fd.file_name,iostat=ios)fd
  131. X`09    end do
  132. X`09    close(unit=4)
  133. X
  134. Xc`09Now, go on to the next directory.
  135. X`09    istat=lib$find_file(tempfile,filnam1,fc1)
  136. X`09    end do
  137. X`09print*,'Total size of deleted files=',total_size
  138. X`09stop
  139. X`09end
  140. $ CALL UNPACK SYSOP.FOR;168 425261894
  141. $ create 'f'
  142. X`09subroutine cancel_io
  143. XC
  144. XC`09This routine is used to cancel the local I/O.
  145. XC
  146. XC`09The status return from the SYS$CANCEL's are not checked
  147. XC`09since this routine is called from the error routine.
  148. XC
  149. X`09implicit none
  150. X`09include 'bbs_inc.for'
  151. X`09integer status
  152. X`09integer sys$cancel
  153. XC
  154. XC`09Cancel the local I/O (if any).
  155. XC
  156. X`09status = sys$cancel(%val(lchan_in))
  157. X`09status = sys$cancel(%val(lchan_out))
  158. X`09call check_status('cancel_local',status)
  159. X`09return
  160. X`09end
  161. X`0C
  162. X`09subroutine wake_up
  163. XC
  164. XC`09Subroutine to wake up hibernate state.
  165. XC
  166. X`09implicit none
  167. X`09integer*4 status, sys$wake, check_status
  168. X
  169. X`09status = sys$wake(,)`09! Wake us up.
  170. X`09call check_status('wake_up',status)
  171. X`09return
  172. X`09end
  173. X`0C
  174. X`09subroutine init_timer(timer_pointer)
  175. XC
  176. XC`09The subroutine simply calls LIB$INIT_TIMER.
  177. XC
  178. X`09implicit none
  179. X
  180. X`09integer status, lib$init_timer, timer_pointer
  181. X
  182. X`09status = lib$init_timer(timer_pointer)
  183. X`09call check_status('init_timer',status)
  184. X`09return
  185. X`09end
  186. X`0C
  187. X`09subroutine elapsed_time(timer_pointer)
  188. XC
  189. XC`09This routine is called at the end of file transmission to output
  190. XC`09the elapsed time.  The LIB$INIT_TIMER must have been called previous
  191. XC`09to calling this routine.
  192. XC
  193. X`09implicit none
  194. X`09integer*4 timer_pointer
  195. X
  196. X`09external write_elapsed
  197. X
  198. X`09call lib$show_timer(timer_pointer,,write_elapsed,)
  199. X`09return
  200. X`09end
  201. X`0C
  202. X`09subroutine write_elapsed (time)
  203. XC
  204. XC`09This routine is used to write the elapsed time.
  205. XC
  206. X`09implicit integer*4 (a-z)
  207. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  208. X
  209. X`09CHARACTER*(*) TIME
  210. X`09INTEGER TIME_SIZE, INDEX
  211. X
  212. X`09TIME_SIZE = LEN(TIME)`09`09`09! Get the time string size.
  213. X`09TIME_SIZE = INDEX (TIME, '  BUFIO:')
  214. X`09CALL WRITE_USER('***'//TIME(1:TIME_SIZE)//'***'//crlf(:cl))
  215. X`09RETURN
  216. X`09END
  217. X`0C
  218. X`09INTEGER FUNCTION CHECK_STATUS(FACILITY_NAME,STATUS_CODE)
  219. XC
  220. XC`09Subroutine to check status from a System Service.
  221. XC
  222. XC`09Inputs:
  223. XC`09`09FACILITY_NAME - Subroutine name.
  224. XC`09`09STATUS_CODE - Status code.
  225. XC
  226. XC`09Outputs:
  227. XC`09`09Returns the status code passed in.
  228. XC
  229. X`09implicit integer*4 (a-z)
  230. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  231. XC
  232. XC`09Setup the error message.
  233. XC
  234. X`09CHARACTER*(*) FACILITY_NAME, ERROR_MESSAGE
  235. X`09PARAMETER (ERROR_MESSAGE = ss//
  236. X`091 '*** VAXNET Terminated with ERROR ***'//BELL//ss)
  237. X`09CHARACTER*80 MESS_TXT
  238. X`09INTEGER*4 STATUS_CODE
  239. X
  240. X`09CHECK_STATUS = STATUS_CODE`09! Pass back the status code.
  241. X
  242. X`09IF (STATUS_CODE .EQ. SS$_NORMAL) RETURN
  243. XC
  244. XC`09If the error is exceeded quota (probably buffered I/O quota),
  245. XC`09cancel the outstanding I/O so the write of the error message
  246. XC`09will complete successfully.
  247. XC
  248. X`09IF (STATUS_CODE .EQ. SS$_EXQUOTA) THEN
  249. X`09`09CALL CANCEL_IO()`09! Cancel the outstanding I/O.
  250. X`09ENDIF
  251. XC
  252. XC`09Report error message to the terminal.
  253. XC
  254. XC`09Set flags for GETMSG for:
  255. XC`09`09- Include text of message.
  256. XC`09`09- Include message identifier.
  257. XC`09`09- Include severity indicator.
  258. XC`09`09- Do not include facility name.
  259. XC
  260. X`09FLAGS = "7`09`09`09! Set up the flags.
  261. X`09CALL SYS$GETMSG(%VAL(STATUS_CODE),MSGLEN,MESS_TXT,%VAL(FLAGS),)
  262. XC
  263. X`09write(6,*)crlf(:cl)//'%'//facility_name//'-'//mess_txt(2:msglen)
  264. X`091   //bell//crlf(:cl)
  265. XC
  266. XC`09If the modem hangs up, show it was hungup, and insure a file
  267. XC`09transfer (if any) gets aborted.
  268. XC
  269. X`09IF (STATUS_CODE .EQ. SS$_HANGUP) THEN
  270. X`09`09CONTROLC_TYPED = .TRUE.`09! Set flag to abort transmission.
  271. X`09ENDIF
  272. X`09CALL HANGUP_MODEM()`09`09! Make sure modem is hungup.
  273. X`09CALL SYS$EXIT(%VAL(STATUS_CODE)) ! Exit with the status code.
  274. X`09END
  275. X`0C
  276. X`09LOGICAL FUNCTION GET_VAXFILE(FILE)
  277. XC
  278. XC`09This function is used to get the file name of the file
  279. XC`09on the VAX and then open it for either read or write.
  280. XC
  281. XC`09Inputs:
  282. XC`09`09FILE - string descriptor with the file name (if any).
  283. XC
  284. X`09implicit integer*4 (a-z)
  285. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  286. X`09INCLUDE '($RMSDEF)/NOLIST'
  287. X
  288. X
  289. X`09CHARACTER*(*) FILE, MODULE_NAME
  290. X
  291. X`09character cc*4
  292. X`09PARAMETER (MODULE_NAME = 'GET_VAXFILE')
  293. X
  294. X`09GET_VAXFILE = .FALSE.`09`09! Initialize to bad return.
  295. XC
  296. XC`09If we were passed a file name, use it.
  297. XC
  298. X`09VAX_FILE = FILE`09`09! Copy the file name
  299. X`09VSIZE = LEN(FILE)`09!    and the file size.
  300. XC
  301. XC`09Sending a file to the remote.
  302. XC
  303. XC`09Vaxnet> SEND vax_file remote_file
  304. XC
  305. X200`09IF (FLOW .EQ. TO_VAX) GO TO 500`09`09! Send a file to the VAX.
  306. XC
  307. XC
  308. XC`09Open the file for read.
  309. XC
  310. X400`09OPEN (UNIT=FILE_UNIT, TYPE='OLD', READONLY, SHARED,
  311. X`091`09`09`09FILE=VAX_FILE(1:VSIZE), ERR=9900)
  312. X`09GET_VAXFILE = .TRUE.`09`09`09! Return success.
  313. X`09RETURN
  314. XC
  315. XC`09Getting a file from the REMOTE.
  316. XC
  317. XC`09Vaxnet> GET remote_file vax_file
  318. XC
  319. XC
  320. XC`09Open the file for write.
  321. XC
  322. X500`09continue
  323. X`09if (file_type.eq.binary) then
  324. X`09    cc='none'
  325. X`09else
  326. X`09    cc='list'
  327. X`09endif
  328. X
  329. X`09OPEN (UNIT=FILE_UNIT, TYPE='NEW', NAME=VAX_FILE(1:VSIZE),
  330. X`091`09`09RECORDSIZE=OUT_SIZE, CARRIAGECONTROL=cc,
  331. X`091`09`09BUFFERCOUNT=2, ERR=9900)
  332. X`09GET_VAXFILE = .TRUE.`09`09`09! Return success.
  333. X`09RETURN
  334. X
  335. X9900`09continue
  336. Xc`09CALL RMS_ERROR (MODULE_NAME)`09`09! Report the RMS error.
  337. X`09RETURN
  338. X`09END
  339. X`0C
  340. X`09SUBROUTINE UPDATE_TOTALS (NBYTES)
  341. XC
  342. XC`09This routine is called after a record is successfully transmitted
  343. XC`09to update the various counters.
  344. XC
  345. X`09implicit integer*4 (a-z)
  346. X`09INCLUDE 'BBS_INC.FOR'
  347. X`09include 'kermit_inc.for'
  348. X
  349. X`09RETRY_COUNT = 0`09`09`09`09! Reinitialize retry counter.
  350. X`09BYTE_COUNT = BYTE_COUNT + NBYTES`09! Accumulate the byte count
  351. X`09RECORD_COUNT = RECORD_COUNT + 1`09`09!`09and the record count.
  352. X`09TOTAL_BYTES = TOTAL_BYTES + NBYTES`09! Update the total byte count.
  353. X`09TOTAL_RECORDS = TOTAL_RECORDS + 1`09!`09and the record count.
  354. X`09RETURN
  355. X
  356. X`09ENTRY CLEAR_COUNTS
  357. XC
  358. XC`09Entry to initialize counts.
  359. XC
  360. X`09BYTE_COUNT = 0`09`09`09`09! Clear byte count.
  361. X`09RECORD_COUNT = 0`09`09`09! Clear record count.
  362. X`09TOTAL_BYTES = 0`09`09`09`09! Clear total bytes.
  363. X`09TOTAL_RECORDS = 0`09`09`09! Clear total records.
  364. X`09ERROR_COUNT = 0`09`09`09`09! Clear error count.
  365. X`09ERROR_RECORD = 0`09`09`09! Clear error record #.
  366. X`09PARITY_ERRORS = 0`09`09`09! Initialize
  367. X`09OVERRUN_ERRORS = 0`09`09`09!      the
  368. X`09TIMEOUTS = 0`09`09`09`09!        various
  369. X`09FRAMING_ERRORS = 0`09`09`09!          counters.
  370. X`09RETRY_COUNT = 0`09`09`09`09!          `20
  371. X`09FILE_COUNT = 0`09`09`09`09! Number of file transfered.
  372. X`09BLOCK_COUNT = 0`09`09`09`09! Number of blocks transfered.
  373. X`09BLOCK_RECEIVED = 0`09`09`09! Received block number.
  374. X`09BLOCK_XMITTED = 0`09`09`09! Transmitted block number.
  375. X`09PACKET_COUNT = 0`09`09`09! Number of data packets.
  376. X`09TOTAL_PACKETS = 0`09`09`09! Total data packet count.
  377. X`09RETURN
  378. X
  379. X`09ENTRY COUNT_FILES
  380. XC
  381. XC`09This routine is called after each file transmission to reset
  382. XC`09some counters and to update the files copied count.
  383. XC
  384. X`09BYTE_COUNT = 0`09`09`09`09! Clear the byte count,
  385. X`09RECORD_COUNT = 0`09`09`09!`09the record count,
  386. X`09ERROR_COUNT = 0`09`09`09`09!`09the error count and,
  387. X`09ERROR_RECORD = 0`09`09`09!`09the error record number,
  388. X`09BLOCK_COUNT = 0`09`09`09`09!`09the data block count,
  389. X`09PACKET_COUNT = 0`09`09`09! `09the data packet count.
  390. X`09FILE_COUNT = FILE_COUNT + 1`09`09! Count number of files copied.
  391. X`09RETRY_COUNT = 0`09`09`09`09! Reinitialize retry counter.
  392. X`09RETURN
  393. X
  394. X`09ENTRY REPORT_TOTALS
  395. XC
  396. XC`09Entry to report the final statistics.
  397. XC
  398. X`09IF (PROTOCOL .EQ. XMODEM) THEN
  399. X`09    CALL SYS$FAO ('!/XMODEM Status Report:!/'//
  400. X`091`09'Total blocks:!7UL, total records:!7UL, total bytes:!8UL!/'//
  401. X`091`09'Parity errors:!6UL,      overruns:!7UL,    timeouts:!8UL!/',
  402. X`091`09`09SIZE, SCRATCH,
  403. X`091`09%VAL(BLOCK_COUNT), %VAL(RECORD_COUNT), %VAL(BYTE_COUNT),
  404. X`091`09%VAL(PARITY_ERRORS), %VAL(FRAMING_ERRORS),%VAL(OVERRUN_ERRORS))
  405. X`09ELSEIF (PROTOCOL .EQ. KERMIT) THEN
  406. X`09    CALL SYS$FAO ('!/KERMIT Status Report:!/'//
  407. X`091`09'Total packets:!7UL, total records:!7UL, total bytes:!8UL!/'//
  408. X`091`09'Parity errors:!7UL,      overruns:!7UL,    timeouts:!8UL!/',
  409. X`091`09`09SIZE, SCRATCH,
  410. X`091`09%VAL(TOTAL_PACKETS), %VAL(TOTAL_RECORDS), %VAL(TOTAL_BYTES),
  411. X`091`09%VAL(PARITY_ERRORS), %VAL(FRAMING_ERRORS),%VAL(OVERRUN_ERRORS))
  412. X`09ENDIF
  413. X`09CALL WRITE_USER (SCRATCH(1:SIZE))
  414. X`09END
  415. X`0C
  416. X`09LOGICAL FUNCTION REPORT_ERROR(DISPLAY)
  417. XC
  418. XC`09This routine is used to report a transmission error.  If the retry
  419. XC`09limit is exceeded, the function returns failure.
  420. XC
  421. XC`09Inputs:
  422. XC`09`09DISPLAY - Controls whether the error should be displayed.
  423. XC
  424. X`09implicit integer*4 (a-z)
  425. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  426. X
  427. X`09LOGICAL DISPLAY
  428. X`09CHARACTER*(*) RETRY_MSG
  429. X`09PARAMETER (RETRY_MSG = ss//
  430. X`091 '*** Retry limit exceeded, aborting file transmission ***'
  431. X`091 //BELL//ss)
  432. X
  433. X`09REPORT_ERROR = .TRUE.`09`09`09! Presume limit not exceeded.
  434. X`09ERROR_COUNT = ERROR_COUNT + 1`09`09! Bump the error count.
  435. X`09ERROR_RECORD = RECORD_COUNT + 1`09`09! Save the error record number.
  436. X`09RETRY_COUNT = RETRY_COUNT + 1`09`09! Bump the retry count.
  437. X
  438. X`09IF (RETRY_COUNT .GE. RETRY_LIMIT) THEN
  439. X`09`09REPORT_ERROR = .FALSE.`09`09! Show retry limit exceeded.
  440. XC`09`09CALL WRITE_USER(RETRY_MSG)`09! Tell the user what happened.
  441. X`09ENDIF
  442. X`09RETURN
  443. X`09END
  444. X`0C
  445. X`09SUBROUTINE REPORT_SUCCESS
  446. X`09implicit integer*4 (a-z)
  447. X`09include 'bbs_inc.for/nolist'
  448. XC
  449. XC`09Routine to display a successful transmission.
  450. XC
  451. X`09CALL CHECK_DISPLAY()
  452. X`09CALL SYS$FAO ('*** File "!AS" successfully transferred. ***!/',
  453. X`091   SIZE, SCRATCH, VAX_FILE(1:VSIZE))
  454. X`09CALL WRITE_USER (SCRATCH(1:SIZE))
  455. X`09RETURN
  456. X
  457. X`09ENTRY REPORT_ABORT
  458. XC
  459. XC`09Routine to display a aborted transmission.
  460. XC
  461. X`09CALL CHECK_DISPLAY()
  462. X`09CALL WRITE_USER('*** Transmission of file "'//VAX_FILE(1:VSIZE)//
  463. X`091`09`09'" aborted. ***'//crlf(:cl))
  464. X`09RETURN
  465. X`09END
  466. X`0C
  467. X`09SUBROUTINE CHECK_DISPLAY
  468. XC
  469. XC`09This routine simply writes single spacing to the local terminal
  470. XC`09if record information was displayed on the screen.
  471. XC
  472. X`09implicit integer*4 (a-z)
  473. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  474. X
  475. X`09IF (RECORD_COUNT .GE. DISPLAY_RECORD) THEN
  476. X`09    CALL WRITE_TTY (crlf(:cl))
  477. X`09    ENDIF
  478. X`09RETURN
  479. X`09END
  480. X`0C
  481. X`09subroutine setup_local(interactive)
  482. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  483. Vcccc
  484. Xc
  485. Xc`09UBBS subroutines - SETUP_LOCAL
  486. Xc
  487. Xc`09This routine is used to setup the local terminal characteristics.
  488. Xc
  489. Xc`09Inputs:
  490. Xc`09`09INTERACTIVE - logical .TRUE. for interactive mode.
  491. Xc`09`09`09`09else .FALSE. for normal mode.
  492. Xc
  493. Xc`09Dale Miller - UALR
  494. Xc
  495. Xc`09Rev. 4.8  03-Feb-1987
  496. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  497. Vcccc
  498. X`09implicit none
  499. X`09include 'bbs_inc.for/nolist'
  500. X`09include '($ttdef)/nolist'
  501. X`09include '($tt2def)/nolist'
  502. X
  503. X`09logical interactive
  504. X`09character*(*) module_name
  505. X`09parameter (module_name = 'setup_local')
  506. X`09integer sys$qiow
  507. X`09integer check_status,status
  508. X
  509. Xc`09Get the local terminal characteristics and set the terminal
  510. Xc`09to full duplex to allow simultanious reads and writes.
  511. X
  512. X`09status = sys$qiow(%val(lefn_in),%val(lchan_in),
  513. X`091   %val(io$_sensemode),liosb,,,local_char,%val(12),,,,)
  514. X`09if (.not. check_status(module_name,status)) return
  515. X
  516. Xc`09For interactive mode, we must enable full duplex (if not enabled)
  517. Xc`09and put the terminal in binary passall mode.  The terminal must
  518. Xc`09be in passall mode to prevent control characters (CTRL/C, CTRL/S,
  519. Xc`09CTRL/Q, CTRL/X, and CTRL/Y) from being processed by the terminal
  520. Xc`09driver when a read is not active.
  521. X
  522. X`09if (interactive) then
  523. X`09    local_char(3) = local_char(3) .or. tt2$m_pasthru
  524. X`09    local_char(2) = local_char(2) .and. (.not. tt$m_halfdup)
  525. X`09    local_char(2) = local_char(2) .or. tt$m_eightbit
  526. X`09    local_char(2) = local_char(2) .and. (.not. tt$m_ttsync)
  527. X`09else
  528. X`09    local_char(3) = local_char(3) .and. (.not. tt2$m_pasthru)
  529. X`09    local_char(2) = local_char(2) .and. (.not. tt$m_eightbit)
  530. X`09    local_char(2) = local_char(2) .or. tt$m_ttsync
  531. X`09    if((ur.editor.and.7) .eq. 7) then
  532. X`09`09local_char(2) = local_char(2) .or. (tt$_vt100 * 2**8)
  533. X`09`09local_char(3) = local_char(3) .or. tt2$m_ansicrt
  534. X`09`09local_char(3) = local_char(3) .or. tt2$m_deccrt
  535. X`09    else if ((ur.editor.and.3) .eq. 3) then
  536. X`09`09local_char(2) = local_char(2) .or. (tt$_vt52 * 2**8)
  537. X`09    end if
  538. X`09endif
  539. X
  540. Xc`09The CTRL/S state must be cleared before going into passall mode,
  541. Xc`09otherwise the read never completes because the CTRL/Q used to clear
  542. Xc`09the suspended state get put in the input buffer.  This results in
  543. Xc`09VAXNET getting hung in a hibernate even though reads are active.
  544. X
  545. X`09local_char(3) = local_char(3) .or. tt2$m_xon
  546. X`09status = sys$qiow(%val(lefn_in),%val(lchan_in),
  547. X`091   %val(io$_setmode),liosb,,,local_char,%val(12),,,,)
  548. X`09call check_status(module_name,status)
  549. X`09return
  550. X`09end
  551. X`0C
  552. X`09subroutine clear_typeahead
  553. Xc
  554. Xc`09Clears the typeahead buffer on the local channel.
  555. Xc`09Also sets up the local typeahead buffer.
  556. Xc
  557. X`09implicit integer*4 (a-z)
  558. X`09include 'bbs_inc.for/nolist'
  559. X
  560. X`09status = sys$qiow(%val(lefn_in),%val(lchan_in),
  561. X`091`09%val(io$_readlblk + io$m_purge),
  562. X`092`09liosb,,,rbuffer,%val(0),,,,)
  563. X`09call check_status('clear_typeahead',status)
  564. X`09tnext=1
  565. X`09return
  566. X`09end
  567. X`0C
  568. X`09SUBROUTINE WAITABIT(SECONDS)
  569. XC
  570. XC`09This subroutine just waits a little then returns.
  571. XC
  572. X`09implicit integer*4 (a-z)
  573. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  574. X
  575. X`09CHARACTER*(*) SECONDS
  576. X`09INTEGER*4 DELTA(2)
  577. X
  578. X`09STATUS = SYS$BINTIM('0 00:00:'//SECONDS,DELTA)
  579. X`09IF (.NOT. CHECK_STATUS('WAITABIT(BINTIM)',STATUS)) RETURN
  580. X`09STATUS = SYS$SETIMR(%VAL(TIMER_EFN),DELTA,,)
  581. X`09IF (.NOT. CHECK_STATUS('WAITABIT(SETIMR)',STATUS)) RETURN
  582. X`09STATUS = SYS$WAITFR(%VAL(TIMER_EFN))
  583. X`09CALL CHECK_STATUS('WAITABIT(WAITFR)',STATUS)
  584. X
  585. XC`09STATUS = SYS$SCHDWK(,,DELTA,,)`09! Schedule wakeup.
  586. XC`09IF (.NOT. CHECK_STATUS('WAITABIT(SCHDWK)',STATUS)) RETURN
  587. XC`09STATUS = SYS$HIBER()`09`09! Go into hibernation.
  588. X`09RETURN
  589. X`09END
  590. X`0C
  591. X`09LOGICAL FUNCTION CVT_DTB(STR,NUM)
  592. XC
  593. XC`09This routine is used to convert an ASCII string of numbers to
  594. XC`09an integer.
  595. XC
  596. XC`09Inputs:
  597. XC`09`09STR - string descriptor.
  598. XC`09`09NUM - integer to return number to.
  599. XC
  600. XC`09Outputs:
  601. XC`09`09.TRUE./.FALSE. = success/failure.
  602. XC
  603. X`09CHARACTER*(*) STR
  604. X`09INTEGER*4 NUM
  605. X
  606. X`09CVT_DTB = LIB$CVT_DTB(%VAL(LEN(STR)),%REF(STR),NUM)
  607. X`09RETURN
  608. X`09END
  609. X`0C
  610. X`09INTEGER FUNCTION GET_EFN(EVENT_FLAG)
  611. XC
  612. XC`09Get an event flag.
  613. XC
  614. X`09IMPLICIT NONE
  615. X`09INTEGER*4 EVENT_FLAG, CHECK_STATUS, LIB$GET_EF, STATUS
  616. X
  617. X`09STATUS = LIB$GET_EF(EVENT_FLAG)`09! Local input event flag.
  618. X`09CALL CHECK_STATUS('LIB$GET_EF',STATUS)
  619. X`09RETURN
  620. X`09END
  621. X`0C
  622. X`09integer function read_byte (seconds)
  623. Xc
  624. Xc`09This routine is used to read a single byte.
  625. Xc`09If any characters are in the local typeahead, they are used first.
  626. Xc
  627. Xc`09Inputs:
  628. Xc`09`09SECONDS = The timeout in seconds.
  629. Xc
  630. X`09implicit integer*4 (a-z)
  631. X`09include 'bbs_inc.for/nolist'
  632. X
  633. X`09integer seconds
  634. X`09logical*1 buff(1)
  635. X
  636. X`09if(tnext.gt.1) then
  637. X`09    read_byte = tbuffer(1)
  638. X`09    cbuffer=cbuffer(2:tnext)
  639. X`09    tnext=tnext-1
  640. X`09    return
  641. X`09else
  642. X`09    call raw_read (buff, 1, seconds, noterm)
  643. X`09    read_byte = buff(1) .and. bitmask
  644. X`09    return
  645. X`09endif
  646. X`09end
  647. X`0C
  648. X`09SUBROUTINE SEND_BYTE (BUFFER)
  649. XC
  650. XC`09This routine is used to write a single byte.
  651. XC
  652. X`09implicit integer*4 (a-z)
  653. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  654. X
  655. X`09LOGICAL*1 BUFFER(1), BUFF(1)
  656. X
  657. X`09BUFF(1) = BUFFER(1) .AND. BITMASK
  658. X`09CALL RAW_WRITE (BUFF(1),1)
  659. X`09RETURN
  660. X`09END
  661. X`0C
  662. X`09INTEGER FUNCTION RAW_READ (BUFFER, BYTES, SECONDS, termin)
  663. XC
  664. XC`09This routine is used to read raw data (no interpretation).
  665. XC
  666. XC`09Inputs:
  667. XC`09`09BUFFER = The buffer to read into.
  668. XC`09`09BYTES = The number of bytes to read.
  669. XC`09`09SECONDS = The timeout in seconds.
  670. Xc`09`09TERMIN  = The read terminator table
  671. XC
  672. X`09implicit integer*4 (a-z)
  673. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  674. X
  675. X`09CHARACTER*(*) MODULE_NAME
  676. X`09PARAMETER (MODULE_NAME = 'RAW_READ')
  677. X
  678. X`09LOGICAL*1 BUFFER(1)
  679. X`09integer*4 termin(2)
  680. X`09INTEGER BYTES, SECONDS, STATUS
  681. X
  682. X`09STATUS = SYS$QIOW (%VAL(LEFN_IN),%VAL(LCHAN_IN),
  683. X`091`09`09%VAL(IO$_TTYREADALL + IO$M_NOECHO + IO$M_TIMED),
  684. X`091`09`09LIOSB,,,BUFFER,%VAL(BYTES),
  685. X`091`09`09%VAL(SECONDS),termin,,)
  686. X
  687. X`09RAW_READ = STATUS`09`09! Copy the directive status.
  688. X`09IF (.NOT. CHECK_STATUS (MODULE_NAME, STATUS)) RETURN
  689. X`09RAW_READ = LIOSB(1)`09`09! Pass back I/O status.
  690. X`09RBYTE_COUNT = LIOSB(2)`09`09! Save the byte count.
  691. XC
  692. XC`09Check for various errors:
  693. XC
  694. X`09IF     (LIOSB(1) .EQ. SS$_TIMEOUT) THEN`09`09! Timeout error ?
  695. X`09`09TIMEOUTS = TIMEOUTS + 1`09`09`09! Yes, count it.
  696. X`09`09GO TO 200`09`09`09`09! And continue ...
  697. X`09ELSEIF (LIOSB(1) .EQ. SS$_PARITY) THEN`09`09! Parity error ?
  698. X`09`09PARITY_ERRORS = PARITY_ERRORS + 1`09! Yes, count it,
  699. X`09`09GO TO 200`09`09`09`09! And continue ...
  700. X`09ELSEIF (LIOSB(1) .EQ. SS$_DATAOVERUN) THEN`09! Data overrun ?
  701. X`09`09OVERRUN_ERRORS = OVERRUN_ERRORS + 1`09! Yes, count it.
  702. X`09`09GO TO 200`09`09`09`09! And continue ...
  703. X`09ELSEIF (LIOSB(1) .NE. SS$_ABORT) THEN`09`09! CTRL/C to abort.
  704. X`09`09CALL CHECK_STATUS (MODULE_NAME, RAW_READ)
  705. X`09ENDIF
  706. X`09RETURN
  707. XC
  708. XC`09Here for timeout and hardware errors.
  709. XC
  710. X200`09BUFFER(1) = 0`09`09`09`09! Force bad transmission
  711. X`09RBYTE_COUNT = 0`09`09`09`09!  by clearing buffer & BC.
  712. X`09RETURN
  713. X`09END
  714. X`0C
  715. X`09SUBROUTINE RAW_WRITE (BUFFER, BYTES)
  716. XC
  717. XC`09This routine is used to write raw data (no interpretation).
  718. XC
  719. XC`09Inputs:
  720. XC`09`09BUFFER - The buffer to write.
  721. XC`09`09BYTES - The number of bytes to write.
  722. XC
  723. X`09implicit integer*4 (a-z)
  724. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  725. X
  726. X`09CHARACTER*(*) MODULE_NAME
  727. X`09PARAMETER (MODULE_NAME = 'RAW_WRITE')
  728. X
  729. X`09LOGICAL*1 BUFFER(1)
  730. X`09INTEGER BYTES, STATUS
  731. X
  732. Xc`09CALL WRITE_DEBUG (MODULE_NAME, BUFFER, BYTES)
  733. X`09STATUS = SYS$QIOW (%VAL(LEFN_OUT),%VAL(LCHAN_OUT),
  734. X`091`09`09%VAL(IO$_WRITELBLK + IO$M_NOFORMAT),
  735. X`091`09`09XIOSB,,,BUFFER,%VAL(BYTES),,,,)
  736. X`09CALL CHECK_STATUS (MODULE_NAME, STATUS)
  737. X`09RETURN
  738. X`09END
  739. X`0C
  740. X`09SUBROUTINE XMODEM_TOTALS (BYTES)
  741. XC
  742. XC`09This routine is called after a record is successfully transmitted
  743. XC`09to update the various counters.  Since the routine is called while
  744. XC`09building a transmit buffer from multiple input records, the record
  745. XC`09display has a special entry which is called after tranmitting the
  746. XC`09current block.
  747. XC
  748. X`09implicit integer*4 (a-z)
  749. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  750. X
  751. X`09INTEGER BYTES
  752. X
  753. X`09BYTE_COUNT = BYTE_COUNT + BYTES`09`09! Accumulate the byte count
  754. X`09RECORD_COUNT = RECORD_COUNT + 1`09`09!`09and the record count.
  755. X`09RETURN
  756. X`09END
  757. X`0C
  758. X`09SUBROUTINE WRITE_USER(MSG)
  759. XC
  760. XC`09Write a buffer to the user and the log file if open.
  761. XC
  762. XC`09Inputs:
  763. XC`09`09MSG - string descriptor with message.
  764. XC
  765. X`09implicit integer*4 (a-z)
  766. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  767. X
  768. X`09CHARACTER*(*) MSG
  769. X`09INTEGER SIZE, STATUS
  770. X
  771. X`09SIZE = LEN(MSG)
  772. X`09GO TO 100
  773. X
  774. X`09ENTRY WRITE_BUFF (MSG)
  775. XC
  776. XC`09Entry to write to the log file and the terminal.
  777. XC
  778. X`09SIZE = LEN(MSG)
  779. X`09GO TO 100
  780. X
  781. X`09ENTRY WRITE_TTY (MSG)
  782. XC
  783. XC`09Entry to write to the terminal only.
  784. XC
  785. X`09SIZE = LEN(MSG)
  786. X100`09STATUS = SYS$QIOW(%VAL(LEFN_OUT),%VAL(LCHAN_OUT),
  787. X`091    %VAL(IO$_WRITELBLK + IO$M_NOFORMAT),
  788. X`091    LIOSB,,,%REF(MSG),%VAL(SIZE),,,,)
  789. X`09IF (.NOT. STATUS) THEN
  790. X`09    CALL LIB$SIGNAL(%VAL(STATUS))
  791. X`09    CALL SYS$EXIT(%VAL(STATUS))
  792. X`09    ENDIF
  793. X`09RETURN
  794. X`09END
  795. X`0C
  796. X`09SUBROUTINE RMS_ERROR (MODULE)
  797. XC
  798. XC`09This routine is called to report an RMS error.
  799. XC
  800. XC`09CALL ERRSNS(num,rmssts,rmsstv,iunit,)
  801. XC
  802. XC`09Where:`09num = fortran error code,
  803. XC`09`09rmssts = RMS completion status code.
  804. XC`09`09rmsstv = RMS status code.
  805. XC`09`09iunit = logical unit number.
  806. XC
  807. X`09IMPLICIT NONE
  808. X
  809. X`09INTEGER*4 FERR, RMSSTS, RMSSTV, LUN, CHECK_STATUS, ERROR
  810. X`09CHARACTER*(*) MODULE
  811. X
  812. X`09CALL ERRSNS (FERR,RMSSTS,RMSSTV,LUN,)`09! Get the last error code.
  813. X`09ERROR = RMSSTS`09`09`09`09! Copy the RMS error code.
  814. X`09IF (ERROR .EQ. 0) ERROR = FERR`09`09! Use the FORTRAN error code.
  815. X`09CALL CHECK_STATUS (MODULE, ERROR)`09! Go report the error message.
  816. X`09RETURN
  817. X`09END
  818. X`0C
  819. X`09SUBROUTINE WRITE_REMOTE (BUFFER, NBYTES)
  820. XC
  821. XC`09This subroutine is used to write a buffer to the remote.
  822. XC
  823. X`09implicit integer*4 (a-z)
  824. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  825. X
  826. X`09LOGICAL*1 BUFFER(1)
  827. X
  828. X`09BYTES = NBYTES + 1`09`09! Adjust the byte count.
  829. X`09BUFFER(BYTES) = CR`09`09! Append Terminator.
  830. X`09GO TO 100`09`09`09! And continue ...
  831. XC
  832. XC`09The next entry is used to write the buffer without appending
  833. XC`09a carriage return to the end of the message.
  834. XC
  835. X`09ENTRY WRITE_BYTE (BUFFER, NBYTES)
  836. X`09BYTES = NBYTES`09`09`09! Copy the byte count.
  837. X
  838. X100`09STATUS = SYS$QIOW(%VAL(LEFN_OUT),%VAL(LCHAN_OUT),
  839. X`091`09`09%VAL(IO$_WRITELBLK + IO$M_NOFORMAT),
  840. X`091`09`09XIOSB,,,BUFFER,%VAL(BYTES),,,,)
  841. X`09CALL CHECK_STATUS('WRITE_REMOTE',STATUS)
  842. X`09RETURN
  843. X`09END
  844. X`0C
  845. X`09SUBROUTINE HANGUP_MODEM
  846. XC
  847. XC`09This routine is called to hangup the modem.
  848. XC
  849. X`09implicit integer*4 (a-z)
  850. X`09INCLUDE 'BBS_INC.FOR/NOLIST'
  851. X
  852. X`09LOCAL_STATUS = SYS$QIOW(%VAL(LEFN_IN),%VAL(LCHAN_IN),
  853. X`091   %VAL(IO$_SETMODE + IO$M_HANGUP),LIOSB,,,,,,,,)
  854. X`09RETURN
  855. X`09END
  856. X`0C
  857. X`09subroutine fake_vaxnet
  858. Xc`09This code was surgically removed from VAXNET, and appears here
  859. Xc`09in a somewhat mangled, but usuable state.
  860. X`09implicit integer*4 (a-z)
  861. X`09include 'bbs_inc.for/nolist'
  862. X`09bitmask=sevenbit_mask
  863. Xc`09set up event flags
  864. X`09call get_efn(lefn_in)`09`09! Local input event flag
  865. X`09call get_efn(lefn_out)`09`09! Local output event flag
  866. XC
  867. XC`09Translate SYS$COMMAND, and assign a channel for QIO's.
  868. XC
  869. X`09I = 11`09`09`09`09! Size of SYS$COMMAND
  870. X`09LOCAL_DEVICE = 'SYS$COMMAND'
  871. X10`09STATUS = SYS$TRNLOG(LOCAL_DEVICE(1:I),I,LOCAL_DEVICE,,,)
  872. X`09IF (STATUS .NE. SS$_NOTRAN) GO TO 10
  873. XC
  874. XC`09Note in the following that I contains the true length, and remember
  875. XC`09that TRNLOG puts a stupid 4-byte header on the translations of
  876. XC`09SYS$INPUT/OUTPUT specifically.  This header only exists if the
  877. XC`09first byte starts with an escape character.
  878. XC
  879. X`09IF (LOCAL_DEVICE(1:1) .EQ. CHAR(esc)) THEN
  880. X`09`09S = 5`09`09`09! Point past header.
  881. X`09ELSE
  882. X`09`09S = 1`09`09`09! Use entire string.
  883. X`09ENDIF
  884. X`09STATUS = SYS$ASSIGN(LOCAL_DEVICE(S:I),LCHAN_IN,,)
  885. X`09IF (.NOT. STATUS) THEN
  886. X`09`09CALL LIB$SIGNAL(%VAL(STATUS))
  887. X`09`09CALL SYS$EXIT(%VAL(STATUS))
  888. X`09ENDIF
  889. X`09STATUS = SYS$ASSIGN(LOCAL_DEVICE(S:I),LCHAN_OUT,,)
  890. X
  891. X`09return
  892. X`09END
  893. X`0C
  894. X`09subroutine ctrl_o_check(*,*)
  895. Xc`09this routine will stick anything other than `5Ec, `5Eq, `5Es, and `5Eo
  896. Xc`09into the local typeahead buffer.
  897. Xc`09and take alternate returns for `5Eo or `5Ec
  898. Xc
  899. X`09implicit none
  900. X`09include 'bbs_inc.for/nolist'
  901. X`09logical*1 temp1(1)
  902. X
  903. X`09timeouts=0
  904. X`09call raw_read(temp1,1,0,noterm)
  905. X`09temp1(1) = temp1(1) .and. bitmask
  906. X`09do while(temp1(1).ne.0)
  907. X`09    if(temp1(1).eq.03) return 1`09!Control-c return statement
  908. X`09    if(temp1(1).eq.15) return 2`09!Control-o return statement
  909. X`09    if(temp1(1).eq.21.or.temp1(1).eq.24) tnext=1   !`5Ex/`5Eu
  910. X`09    if(temp1(1).eq.19) then
  911. X`09`09do while(temp1(1).ne.3.and.temp1(1).ne.17
  912. X`091`09    .and.temp1(1).ne.15)
  913. X`09`09    call raw_read(temp1,1,60,noterm)
  914. X`09`09    temp1(1) = temp1(1) .and. bitmask
  915. X`09`09    if(timeouts.gt.4) call finish_timeout
  916. X`09`09    if(tnext.lt.1024) then
  917. X`09`09`09tbuffer(tnext)=temp1(1)
  918. X`09`09`09tnext=tnext+1
  919. X`09`09    else
  920. X`09`09`09write(6,1001)bell
  921. X`09`09    endif
  922. X`09`09    end do
  923. X`09`09if(temp1(1).eq.03) return 1
  924. X`09`09if(temp1(1).eq.15) return 2
  925. X`09`09if(temp1(1).eq.17) return
  926. X`09`09end if
  927. X`09    if(tnext.lt.1024) then
  928. X`09`09tbuffer(tnext)=temp1(1)
  929. X`09`09tnext=tnext+1
  930. X`09`09temp1(1)=0
  931. X`09    else
  932. X`09`09write(6,1001)bell
  933. X`09`09temp1(1)=0
  934. X`09    endif
  935. X`09    timeouts=0
  936. X`09    call raw_read(temp1,1,0,noterm)
  937. X`09    temp1(1) = temp1(1) .and. bitmask
  938. X`09    end do
  939. X`09return
  940. X 1001`09format(a)
  941. X`09end
  942. X`0C
  943. X`09subroutine kill_mess (irec,status)
  944. X`09implicit integer*4 (a-z)
  945. X`09include 'bbs_inc.for/nolist'
  946. X`09include 'sys$library:foriosdef/nolist'
  947. Xc
  948. X`09character cdummy*1,zmail_to*30,zmail_from*30
  949. X`09character snum*6,qmail_to*30,yesno*3,string*30
  950. X`09character zfirst_name*20,zlast_name*20
  951. X`09byte dummyb
  952. X`09logical*1 reprint,found,nostop
  953. X
  954. X`09record /userlog_structure/ zur
  955. X
  956. X`09record /mail_header_structure/ mh
  957. X
  958. X 1001`09format(a)
  959. X
  960. X`09status=0
  961. X10000`09read(2,rec=irec,iostat=ios,err=90600) mh
  962. X`09unlock(unit=2)
  963. X`09istat = str$upcase(mh.mail_to,mh.mail_to)
  964. X`09if(mail_name.ne.mh.mail_to.and.mail_name.ne.mh.mail_from
  965. X`091   .and.(.not.sysop2)) then
  966. X`09    write(6,1001)crlf(:cl)//'That is not your message.'
  967. X`09    return
  968. X`09    end if
  969. X
  970. X`09write(6,1001)crlf(:cl)//'Are you sure? `5BYes`5D '
  971. X`09dummy=3
  972. X`09call get_upcase_string(yesno,dummy)
  973. X`09if(dummy.gt.0.and.yesno(1:1).eq.'N') then
  974. X`09    return
  975. X`09    end if
  976. X`09read(2,rec=irec,iostat=ios,err=90600) mh
  977. X`09mh.mail_deleted=.true.
  978. X`09write(2,rec=irec,iostat=ios,err=90600) mh
  979. X`09if(mh.mail_person.and..not.mh.mail_read) then
  980. X`09    istat=str$upcase(qmail_to,mh.mail_to)
  981. X`09    spc=index(qmail_to,' ')
  982. X`09    zfirst_name=qmail_to(1:spc-1)`09
  983. X`09    do ii=spc+1,30
  984. X`09`09if(zmail_to(ii:ii).ne.' ') go to 10200
  985. X`09`09end do
  986. X
  987. X10200`09    zlast_name=qmail_to(ii:30)
  988. X`09    zur.user_key=zlast_name//zfirst_name
  989. X`09    read(1,key=zur.user_key,iostat=ios,err=10400)zur
  990. X`09    zur.num_unread=zur.num_unread-1
  991. X`09    if (zur.num_unread.lt.0) zur.num_unread=0
  992. X`09    rewrite(1,err=90500)zur
  993. X`09    end if
  994. X
  995. X10400`09write(6,1001)crlf(:cl)
  996. X`09istat=str$trim(mh.mail_from,mh.mail_from,dummy1)
  997. X`09istat=str$trim(mh.mail_to,mh.mail_to,dummy2)
  998. X`09if(dummy1.lt.1.or.dummy1.gt.30) dummy1=30
  999. X`09if(dummy2.lt.1.or.dummy2.gt.30) dummy2=30
  1000. X`09write(6,1001)crlf(:cl)//'Message from '//mh.mail_from(1:dummy1)//
  1001. X`091    ' to '//mh.mail_to(1:dummy2)//' deleted.'//bell
  1002. X`09return
  1003. X
  1004. X90500`09status=1`09!error on userlog
  1005. X`09return
  1006. X
  1007. X90600`09status=2`09!error on message files
  1008. X`09return
  1009. X`09end
  1010. X`0C
  1011. X`09subroutine finish_timeout
  1012. X*`09this routine is called in case of a timeout.
  1013. X`09implicit integer*4 (a-z)
  1014. X`09include 'bbs_inc.for'
  1015. X`09write(6,1001)crlf(:cl)//'Your terminal has been idle too long.'
  1016. X`09write(6,1001)crlf(:cl)//'UBBS is signing off now.'
  1017. X`09read(1,key=ur.user_key,iostat=ios,err=90500)ur
  1018. X`09ur.seconds_today = current_units
  1019. X`09rewrite(1,iostat=ios,err=90500)ur
  1020. X90500`09continue`09`09!graceful non-handling of errors
  1021. X`09close(unit=1)
  1022. X`09close(unit=2)
  1023. X`09close(unit=3)
  1024. X`09interactive=.false.`09`09!reset before exiting
  1025. X`09call setup_local(interactive)
  1026. X`09write(6,1001)crlf(:cl)
  1027. X`09close(unit=6)
  1028. X`09call exit
  1029. X 1001`09format(a)
  1030. X`09end
  1031. X`0C
  1032. X`09integer function uopen(fab,rab,lun)
  1033. X`09implicit none
  1034. X
  1035. X`09include '($rabdef)'
  1036. X`09include '($fabdef)'
  1037. X
  1038. X`09record /rabdef/ rab
  1039. X`09record /fabdef/ fab
  1040. X`09integer sys$open,sys$connect
  1041. X
  1042. X`09integer lun,status
  1043. X`09
  1044. Xc`09modify the rab to simplify things
  1045. X`09rab.rab$l_rop = ibset(rab.rab$l_rop, rab$v_wat)
  1046. X
  1047. Xc`09actually open the file
  1048. X`09status=sys$open(fab)
  1049. X`09if(status) status=sys$connect(rab)
  1050. Xc`09return the status
  1051. X`09uopen=status
  1052. X`09return
  1053. X`09end
  1054. X`0C
  1055. X`09integer function getsize(fab,rab,lun)
  1056. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1057. Vcccc
  1058. Xc
  1059. Xc`09UBBS subroutines - GETSIZE
  1060. Xc`09This is a user open procedure to determine file size and file
  1061. Xc`09revision date.
  1062. Xc`09Dale Miller - UALR
  1063. Xc
  1064. Xc`09Rev. 6.1  08-Jun-1988
  1065. Xc`09Rev. 7.1  19-Sep-1988
  1066. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1067. Vcccc
  1068. Xc`09This user open finds out the file size.
  1069. X
  1070. X`09implicit none
  1071. X
  1072. X`09include '($rabdef)'
  1073. X`09include '($fabdef)'
  1074. X`09include '($xabdef)'
  1075. X`09include '($xabdatdef)'
  1076. X
  1077. X`09structure /xxx/
  1078. X`09    union
  1079. X`09`09map
  1080. X`09`09    record /xabdef/ xab
  1081. X`09`09end map
  1082. X`09`09map
  1083. X`09`09    record /xabdatdef/ dat
  1084. X`09`09end map
  1085. X`09    end union
  1086. X`09end structure
  1087. X
  1088. X`09record /xxx/ xabdat
  1089. X`09record /rabdef/ rab
  1090. X`09record /fabdef/ fab
  1091. X`09integer sys$open,sys$connect
  1092. X`09
  1093. X`09integer lun,status,fsize,rev_date(2),back_date(2)
  1094. X`09common/filesize/fsize, rev_date, back_date
  1095. X`09
  1096. Xc`09Initialize FAB block and set up link to XAB.
  1097. X`09fab.fab$b_bid = fab$c_bid
  1098. X`09fab.fab$b_bln = fab$c_bln
  1099. X`09fab.fab$l_xab = %loc(xabdat.xab.xab$b_cod)
  1100. X
  1101. Xc`09Set up the XAB block to be a XABDAT block.
  1102. X`09xabdat.xab.xab$b_cod = xab$c_dat
  1103. X`09xabdat.xab.xab$b_bln = xab$c_datlen
  1104. X`09xabdat.xab.xab$l_nxt = 0
  1105. X
  1106. Xc`09Actually open the file
  1107. X`09status=sys$open(fab)
  1108. X`09if(status) status=sys$connect(rab)
  1109. Xc`09Return the status
  1110. X`09getsize=status
  1111. Xc`09Store the size
  1112. X`09fsize=fab.fab$l_alq
  1113. Xc`09Store the revision date
  1114. X`09rev_date(1) = xabdat.xab.xab$q_rdt(1)
  1115. X`09rev_date(2) = xabdat.xab.xab$q_rdt(2)
  1116. Xc`09Store the backup date
  1117. X`09back_date(1) = xabdat.dat.xab$q_bdt(1)
  1118. X`09back_date(2) = xabdat.dat.xab$q_bdt(2)
  1119. X`09return
  1120. X`09end
  1121. X`0C
  1122. X`09INTEGER FUNCTION FIND_FILE (FILE,SIZE)
  1123. XC
  1124. XC`09This function is used to lookup a file spec containing wildcards.
  1125. XC
  1126. XC`09Inputs:
  1127. XC`09`09FILE - The file spec to lookup.
  1128. XC`09`09SIZE - The file spec size.
  1129. XC
  1130. XC`09Outputs:
  1131. XC`09`09Any error from LIB$FIND_FILE.
  1132. XC
  1133. X`09implicit integer*4 (a-z)
  1134. X`09INCLUDE 'bbs_inc.for'
  1135. X`09INCLUDE '($RMSDEF)/NOLIST'
  1136. X
  1137. X`09CHARACTER*(*) FILE, MODULE_NAME
  1138. X`09CHARACTER*128 FILE_NAME
  1139. X
  1140. X`09PARAMETER (MODULE_NAME = 'FIND_FILE')
  1141. X`09LOGICAL WILD_CARDS
  1142. X`09INTEGER FIND_CONTEXT, FILE_SIZE, SIZE, DFLAG, SON
  1143. X
  1144. X`09FILE_NAME = FILE(1:SIZE)`09! Copy the file specification.
  1145. X`09FILE_SIZE = SIZE`09`09! Copy the file size.
  1146. X`09FIND_CONTEXT = 0`09`09! Initialize the file context.
  1147. XC
  1148. XC`09Set flag to determine if device and/or directory is specified.
  1149. XC
  1150. X`09GO TO 100`09`09`09! Go find the specified file(s).
  1151. X
  1152. X`09ENTRY FIND_NEXT (FILE, SIZE)
  1153. XC
  1154. XC`09Find the first/next file name.
  1155. XC
  1156. X`09FIND_NEXT = RMS$_NMF`09`09! Initialize to "No more files"
  1157. X
  1158. X100`09STATUS = LIB$FIND_FILE (FILE_NAME(1:FILE_SIZE), FILE, FIND_CONTEXT)
  1159. X`09FIND_NEXT = STATUS`09`09! Pass back the status.
  1160. X
  1161. X`09SIZE = INDEX (FILE, ' ') - 1`09! End of expanded file name.
  1162. XC
  1163. XC`09Return the file name size minus the spaces it's padded with.
  1164. XC
  1165. X`09SIZE = INDEX (FILE, ' ') - 1`09! Return the file name size.
  1166. X`09IF (.NOT. STATUS) THEN
  1167. X`09    IF (STATUS .NE. RMS$_NMF) THEN
  1168. X`09`09    IF (STATUS .EQ. RMS$_PRV) THEN
  1169. X`09`09`09GO TO 100`09! Next file on privilege violation.
  1170. X`09`09    ENDIF
  1171. X`09    ELSE
  1172. X`09`09VAX_WILD = .FALSE.`09! Wildcards are no longer active.
  1173. X`09    ENDIF
  1174. X`09ENDIF
  1175. X`09RETURN
  1176. X`09END
  1177. X`0C
  1178. X`09subroutine type_file(filename)
  1179. X`09implicit none
  1180. X`09include 'bbs_inc.for'
  1181. X`09character*(*) filename
  1182. X`09character*512 record
  1183. X`09integer length
  1184. X
  1185. X`09open(unit=4,file=filename,status='old',readonly,
  1186. X`091   shared,err=0020)
  1187. X`09read(4,1002,iostat=ios)length,record
  1188. X`09do while (.not.ios)
  1189. X`09    call ctrl_o_check(*10,*10)
  1190. X`09    write(6,1001)crlf(:cl)//record(1:length)
  1191. X`09    read(4,1002,iostat=ios)length,record
  1192. X`09    end do
  1193. X 0010`09close(unit=4)
  1194. X 0020`09return
  1195. X 1001`09format(a)
  1196. X 1002`09format(q,a)
  1197. X`09end
  1198. X`0C
  1199. X`09subroutine make_readable(instring,length,outstring)
  1200. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1201. Vcccc
  1202. Xc
  1203. Xc`09UBBS subroutines - MAKE_READABLE
  1204. Xc`09This routine takes an input string and translates control characters
  1205. Xc`09to a displayable representation.
  1206. Xc`09Dale Miller - UALR
  1207. Xc
  1208. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1209. Vcccc
  1210. X`09implicit none
  1211. X`09character*(*) instring,outstring
  1212. X`09integer*4 length,i,j,temp
  1213. X`09character*3 text(33)
  1214. X`09integer*4 ltxt(33)
  1215. X`09data text/'NUL','SOH','STX','ETX','EOT','ENQ','ACK','BEL',
  1216. X`091`09  'BS ','HT ','LF ','VT ','FF ','CR ','SO ','SI ',
  1217. X`092`09  'DLE','DC1','DC2','DC3','DC4','NAK','SYN','ETB',
  1218. X`093`09  'CAN','EM ','SUB','ESC','FS ','GS ','RS ','US ','SP '/
  1219. X
  1220. X`09data ltxt/8*3,8*2,9*3,2,2*3,5*2/
  1221. X
  1222. X`09j=0
  1223. X`09do i=1,length
  1224. X`09    temp=ichar(instring(i:i))+1
  1225. X`09    if(temp.le.33) then
  1226. X`09`09outstring=outstring(1:j)//'<'//text(temp)(1:ltxt(temp))//'>'
  1227. X`09`09j=j+2+ltxt(temp)
  1228. X`09    else if(temp.eq.128) then
  1229. X`09`09outstring=outstring(1:j)//'<DEL>'
  1230. X`09`09j=j+5
  1231. X`09    else
  1232. X`09`09outstring=outstring(1:j)//instring(i:i)
  1233. X`09`09j=j+1
  1234. X`09    end if
  1235. X`09    end do
  1236. X`09length=j
  1237. X`09return
  1238. X`09end
  1239. X`0C
  1240. X`09integer function bbs_put_output(msg_str)
  1241. Xc
  1242. Xc`09This routine mimics lib$put_output for the bbs to allow it to use
  1243. Xc`09its own carriage control and interrupt routines
  1244. Xc
  1245. X`09implicit none
  1246. X`09include 'bbs_inc.for'
  1247. X`09character*(*) msg_str
  1248. X
  1249. X`09bbs_put_output = ss$_normal
  1250. X
  1251. X`09if (controlc_typed) return
  1252. X`09call ctrl_o_check(*10,*10)
  1253. X`09write(6,1001)crlf(:cl)//msg_str
  1254. X`09return
  1255. X
  1256. X 0010`09controlc_typed = .true.
  1257. X`09return
  1258. X
  1259. X 1001`09format(a)
  1260. X`09end
  1261. X`0C
  1262. X`09integer function bbs_get_input(get_str,prompt_str,out_len)
  1263. Xc
  1264. Xc`09This routine mimics lib$get_input for the bbs to allow it to use
  1265. Xc`09its own carriage control, typeahead buffer, and interrupt routines
  1266. Xc
  1267. X`09implicit none
  1268. X`09include 'bbs_inc.for'
  1269. X`09character*(*) get_str,prompt_str
  1270. X`09integer*2 out_len
  1271. X
  1272. X`09bbs_get_input = ss$_normal
  1273. X
  1274. X`09if (controlc_typed) go to 10
  1275. X
  1276. X`09call ctrl_o_check(*10,*10)
  1277. X`09write(6,1001)crlf(:cl)//prompt_str
  1278. X`09out_len=50
  1279. X`09call get_uplow_string(get_str,out_len)
  1280. X`09return
  1281. X
  1282. X 0010`09controlc_typed = .true.
  1283. X`09get_str=' '
  1284. X`09out_len=0
  1285. X`09return
  1286. X
  1287. X 1001`09format(a)
  1288. X 1002`09format(q,a)
  1289. X`09end
  1290. X`0C
  1291. X`09subroutine out(msg_str,*)
  1292. Xc
  1293. Xc`09This routine provides a convienient way to output a line and
  1294. Xc`09check the status on return.
  1295. Xc
  1296. X`09implicit none
  1297. X`09include 'bbs_inc.for'
  1298. X`09character*(*) msg_str
  1299. X
  1300. X`09call ctrl_o_check(*10,*10)
  1301. X`09write(6,1001)crlf(:cl)//msg_str
  1302. X`09return
  1303. X
  1304. X 0010`09return 1
  1305. X
  1306. X 1001`09format(a)
  1307. X`09end
  1308. X`0C
  1309. X`09subroutine add_elapsed_time(*)
  1310. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1311. Vcccc
  1312. Xc
  1313. Xc`09UBBS subroutines
  1314. Xc
  1315. Xc`09This routine is called at each entry to the main or mail menu.  It`20
  1316. Xc`09will add the time so far to the user's time and check it against
  1317. Xc`09the total allowed.  The LIB$INIT_TIMER must have been called previous
  1318. Xc`09to calling this routine.
  1319. Xc
  1320. Xc`09Rev. 3.6  25-Jun-1986
  1321. Xc`09Rev. 4.1  07-Jul-1986
  1322. Xc`09Rev. 4.4  15-Aug-1986
  1323. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1324. Vcccc
  1325. X
  1326. X`09implicit none
  1327. X`09include 'bbs_inc.for/nolist'
  1328. X`09character cdate*9,ctime*8
  1329. X`09real*8 systime,qdummy,mill10
  1330. X`09integer*4 zone,daynum,oldzone,istat
  1331. X`09integer*4 syst(2),hours
  1332. X`09integer lib$day_of_week,lib$stat_timer
  1333. X`09equivalence(systime,syst)
  1334. X`09data mill10/'ffffffffff676980'x/`09!Quadword -10,000,000
  1335. X`09
  1336. X 1001`09format(a)
  1337. X 1002`09format(i2)
  1338. X
  1339. Xc`09See if the date has changed.
  1340. X`09call date(cdate)
  1341. X`09if(cdate.ne.ur.current_day) then
  1342. X`09    read(1,key=ur.user_key,iostat=ios,err=90500)ur
  1343. X`09    ur.current_day=cdate
  1344. X`09    ur.seconds_today=0
  1345. X`09    rewrite(1,iostat=ios,err=90500)ur
  1346. X`09    initial_units=0
  1347. X`09    current_units=0
  1348. X`09    call init_timer(user_timer)
  1349. X`09    write(6,1001)crlf(:cl)//crlf(:cl)//'Your timer has been reset.'//
  1350. X`091`09crlf(:cl)//bell
  1351. X`09    end if
  1352. Xc
  1353. Xc`09Find out how badly to hit him.
  1354. X`09zone=lib$day_of_week(,daynum)
  1355. X`09call time(ctime)
  1356. X`09read(ctime,1002)hours
  1357. X`09zone=1
  1358. X`09if(hours.gt.18)zone=2
  1359. X`09if(hours.lt.08.or.daynum.ge.6)zone=4
  1360. X`09if(zone.ne.oldzone) then
  1361. X`09    read(1,key=ur.user_key,err=90500)ur
  1362. X`09    ur.seconds_today = current_units
  1363. X`09    rewrite(1,err=90500)ur
  1364. X`09    call init_timer(user_timer)
  1365. X`09    initial_units=ur.seconds_today
  1366. X`09    oldzone=zone
  1367. X`09    endif
  1368. X
  1369. Xc`09Return his time used as a quadword.
  1370. X`09istat=lib$stat_timer(1,qdummy,user_timer)
  1371. X
  1372. Xc`09Divide the system time by -10,000,000 to get seconds
  1373. X`09call ediv(qdummy,mill10,systime)
  1374. X
  1375. X`09current_units=syst(1)/zone+initial_units
  1376. X`09if(current_units.gt.allowable_units) return 1
  1377. X`09if(current_units.gt.ur.seconds_today+60) then
  1378. X`09    read(1,key=ur.user_key,iostat=ios,err=90500)ur
  1379. X`09    ur.seconds_today = current_units
  1380. X`09    rewrite(1,iostat=ios,err=90500)ur
  1381. X`09    endif
  1382. X`09return
  1383. X
  1384. X90500`09continue
  1385. X`09return 1
  1386. X`09end
  1387. X`0C
  1388. X`09subroutine arklug_files_section
  1389. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1390. Vcccc
  1391. Xc
  1392. Xc`09UBBS subroutines
  1393. Xc`09This routine takes care of the ARKLUG files section
  1394. Xc`09Dale Miller - UALR
  1395. Xc
  1396. Xc
  1397. Xc`09Rev. 3.5  19-Jun-1986
  1398. Xc`09Rev. 3.6  25-Jun-1986
  1399. Xc`09Rev. 6.1  08-Jun-1988
  1400. Xc`09Rev. 7.1  19-Sep-1988
  1401. Xc
  1402. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1403. Vcccc
  1404. X`09implicit none
  1405. X`09include 'bbs_inc.for/nolist'
  1406. X`09include 'sys$library:foriosdef/nolist'
  1407. X`09include '($rmsdef)'
  1408. X`09character cdummy*1,darea*3
  1409. X`09character filename*50,filnam*80,disk*4,line*200,ftyp*7
  1410. X`09character binasc*4,zfilnam*20,term*5,cdate*9
  1411. X`09character space*30/'                    '/
  1412. X`09logical*1 reprint,dummyl
  1413. X`09integer i,istat,per,spc,length,flen
  1414. X`09integer file_character/65/`09! The value of 'A' in decimal
  1415. X`09integer dummy,dummy1
  1416. X`09integer get_xmodem,send_xmodem
  1417. X`09integer fsize,rev_date(2),back_date(2)
  1418. X`09integer sflags/4/
  1419. X`09logical get_vaxfile,kermit_receive
  1420. X`09integer lib$spawn,lib$delete_file,str$trim,sys$setddir
  1421. X`09integer lbr$output_help,str$upcase,sys$trnlog,lib$set_logical
  1422. X`09real*8  noprivs/'000000000000000'x/
  1423. X`09external getsize,bbs_put_output,bbs_get_input
  1424. X`09record /userlog_structure/ zur
  1425. X
  1426. X`09common/filesize/fsize,rev_date,back_date
  1427. X
  1428. X 1001`09format(a)
  1429. X 1003`09format(q,a)
  1430. X 1004`09format('$!',a3,'=',a18,i3,1x,a)
  1431. X 1019`09format(a1,'file_',i6.6,'.dat')
  1432. X 1024   format(i5.5)
  1433. X
  1434. Xc`09Start the whole thing off
  1435. X 4000`09continue
  1436. X`09call date(cdate)
  1437. X`09write(term,1024)user_number`09! set up terminal name for Kermit
  1438. X`09write(6,1001)crlf(:cl)//
  1439. X`091   '(D)ownload, (U)pload, (H)elp or (E)xit? `5Bexit`5D '
  1440. X`09dummy=1
  1441. X`09call get_upcase_string(cdummy,dummy)
  1442. X`09if(cdummy.eq.'E'.or.dummy.eq.0) go to 4900
  1443. X`09if(cdummy.eq.'D') go to 4100
  1444. X`09if(cdummy.eq.'U') go to 4700
  1445. X`09if(cdummy.eq.'H') then
  1446. X`09    controlc_typed=.false.
  1447. X`09    istat=lbr$output_help(bbs_put_output,,
  1448. X`091`09'bbs_help file_transfer','ubbs_data:helplib',,bbs_get_input)
  1449. X`09    go to 4000
  1450. X`09    end if
  1451. X`09write(6,1001)crlf(:cl)//'Invalid selection.  Please try again.'
  1452. X`09go to 4000
  1453. X
  1454. X 4100`09continue`09`09!Download
  1455. X`09if (.not.approved_file_down) then
  1456. X`09    write(6,1001)crlf(:cl)//bell//
  1457. X`091`09'You are not yet approved for the files section.'
  1458. X`09    write(6,1001)crlf(:cl)//'Sorry.'
  1459. X`09    return
  1460. X`09    end if
  1461. X`09area='download'
  1462. X`09write(6,1001)crlf(:cl)//
  1463. X`091   'You are now entering DCL. You may move freely thru the DECUS'
  1464. X`09write(6,1001)crlf(:cl)//
  1465. X`091   'directory with DCL commands.  Kermit and Xmodem are available'
  1466. X`09write(6,1001)crlf(:cl)//'for downloading.'
  1467. X`09write(6,1001)crlf(:cl)//
  1468. X`091   'Note: You have only read permissions on all files.'//crlf(:cl)
  1469. X`09istat= sys$trnlog('SYS$DISK',,line,,,)
  1470. X`09istat=lib$set_logical('SYS$DISK','DUA10:')
  1471. X`09istat=sys$setddir('`5Bdecus`5D',dummy,filnam)
  1472. X`09call setup_local(.false.)
  1473. X`09istat=lib$spawn(,,,sflags,,,,,,,)
  1474. X`09call setup_local(.true.)
  1475. X`09istat=sys$setddir(filnam(1:dummy),,)
  1476. X`09istat=str$trim(line,line,dummy)
  1477. X`09istat=lib$set_logical('SYS$DISK',line(1:dummy))
  1478. X`09return
  1479. Xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
  1480. Vccc
  1481. X 4700`09continue`09`09!Upload
  1482. X`09area='upload'
  1483. X`09if (.not.approved_file_up) then
  1484. X`09    write(6,1001)crlf(:cl)//bell//
  1485. X`091`09'You are not yet approved for the files section.'
  1486. X`09    write(6,1001)crlf(:cl)//'Sorry.'
  1487. X`09    return
  1488. X`09    end if
  1489. X`09if(reprint.or.(.not.ur.xpert)) then
  1490. X`09    reprint=.false.
  1491. X`09    call out(crlf(:cl)//'The following upload areas'//
  1492. X`091`09' are available:',*4701)
  1493. X`09    call out('VAX - VAX/VMS',*4701)
  1494. X`09    call out('PDP - PDP 11 series',*4701)
  1495. X`09    call out('RNB - Rainbow',*4701)
  1496. X`09    call out('MIS - Miscellaneous files',*4701)
  1497. X 4701`09    write(6,1001)crlf(:cl)//'Enter area of interest? `5Bexit`5D'
  1498. X`09else
  1499. X`09    write(6,1001)crlf(:cl)//'Area? '
  1500. X`09end if
  1501. X`09dummy=3`09    `09   `20
  1502. X`09call get_uplow_string(darea,dummy)
  1503. X`09istat = str$upcase(darea,darea)
  1504. X`09if(dummy.eq.0.or.darea.eq.'EXI') go to 4900
  1505. X`09if(darea.eq.'?') then
  1506. X`09    reprint=.true.
  1507. X`09    go to 4700
  1508. X`09    end if
  1509. X`09if( (darea.ne.'VAX') .and. (darea.ne.'PDP') .and.
  1510. X`091   (darea.ne.'RNB') .and. (darea.ne.'MIS')) then
  1511. X`09    write(6,1001)crlf(:cl)//
  1512. X`091`09'That is not a valid area.  Please try again'
  1513. X`09    reprint=.true.
  1514. X`09    go to 4700
  1515. X`09    end if
  1516. X`09write(6,1001)crlf(:cl)//'(A)scii, (B)inary, (H)elp, (E)xit? `5Bexit`5D'
  1517. X`09dummy=1
  1518. X`09call get_upcase_string(cdummy,dummy)
  1519. X`09if (cdummy.eq.'E'.or.dummy.eq.0) go to 4900
  1520. X`09if (cdummy.eq.'A') then
  1521. X`09    file_type = ascii
  1522. X`09    ftyp='Ascii '
  1523. X`09    binasc='.asc'
  1524. X`09else if (cdummy.eq.'B') then
  1525. X`09    file_type=binary
  1526. X`09    ftyp='Binary'
  1527. X`09    binasc='.bin'
  1528. X`09else if (cdummy.eq.'H') then
  1529. X`09    controlc_typed=.false.
  1530. X`09    istat=lbr$output_help(bbs_put_output,,
  1531. X`091`09'bbs_help file','ubbs_data:helplib',,bbs_get_input)
  1532. X`09    go to 4700
  1533. X`09else
  1534. X`09    write(6,1001)crlf(:cl)//'Invalid selection. Please try again'
  1535. X`09    go to 4700
  1536. X`09end if
  1537. X
  1538. X`09if(file_type.eq.binary) then
  1539. X`09    write(6,1001)crlf(:cl)//'Binary transfers must be by xmodem'
  1540. X`09    write(6,1001)crlf(:cl)//'or Kermit protocol.'
  1541. X`09    write(6,1001)crlf(:cl)//'(K)ermit or (X)modem protocol? `5Bexit`5D '
  1542. X`09    dummy=1
  1543. X`09    call get_upcase_string(cdummy,dummy)
  1544. X`09    if(cdummy.eq.'E'.or.dummy.eq.0) go to 4900
  1545. X`09    if(cdummy.eq.'K') protocol=kermit
  1546. X`09    if(cdummy.eq.'X') protocol=xmodem
  1547. X`09    if(protocol.eq.unknown) go to 4720
  1548. X`09else
  1549. X 4720`09    write(6,1001)crlf(:cl)//'(A)scii, (K)ermit or'//
  1550. X`091`09' (X)modem protocol? `5Bexit`5D '
  1551. X`09    dummy=1
  1552. X`09    call get_upcase_string(cdummy,dummy)
  1553. X`09    if(cdummy.eq.'E'.or.dummy.eq.0) go to 4900
  1554. X`09    if(cdummy.eq.'A') protocol=asciid
  1555. X`09    if(cdummy.eq.'K') protocol=kermit
  1556. X`09    if(cdummy.eq.'X') protocol=xmodem
  1557. X`09    if(protocol.eq.unknown) go to 4720
  1558. X`09end if`09
  1559. Xc`09get the file name
  1560. X`09write(6,1001)crlf(:cl)//
  1561. X`091   'File names may consist of a-z, 0-9, underscore,'
  1562. X`09write(6,1001)crlf(:cl)//
  1563. X`091   'and at most 1 period.  Names may be 1-18 characters.'
  1564. X`09write(6,1001)crlf(:cl)//'File name? `5Bexit`5D'
  1565. X`09flen=18
  1566. X`09call get_filnam_string(filename,flen)
  1567. X`09if(flen.eq.0) go to 4900
  1568. Xc
  1569. Xc`09compute a dummy file name
  1570. Xc
  1571. X`09write(zfilnam,1019)char(file_character),user_number
  1572. X`09filnam='ubbs_files:`5Bupl`5D'//zfilnam
  1573. X`09file_character=file_character+1
  1574. Xc
  1575. Xc`09if he has made it this far, we are ready to upload.
  1576. Xc
  1577. X`09if(protocol.eq.xmodem) then
  1578. X`09    write(6,1001)crlf(:cl)//
  1579. X`091`09'Beginning xmodem upload -- Ctrl-d to abort.'
  1580. X`09    call init_timer(file_timer)
  1581. X`09    call clear_counts()
  1582. X`09    timeout_count=10
  1583. X`09    retry_limit=5
  1584. X`09    flow=to_vax
  1585. X`09    bitmask=eightbit_mask
  1586. X`09    dummyl=get_vaxfile(filnam)
  1587. X`09    dummyl=get_xmodem()
  1588. X`09    bitmask=sevenbit_mask
  1589. X`09    call waitabit('10')
  1590. X`09    call elapsed_time(file_timer)`09!Display elapsed time
  1591. X`09    call report_totals()`09`09!Report final stats
  1592. X`09    if(dummyl) then
  1593. X`09`09write(6,1001)crlf(:cl)//'Successful upload!'
  1594. X`09`09go to 4800
  1595. X`09    else
  1596. X`09`09write(6,1001)crlf(:cl)//'Upload failed'
  1597. X 4730`09`09istat = lib$delete_file(filnam//';*')
  1598. X`09    end if
  1599. X`09elseif (protocol.eq.kermit) then
  1600. +-+-+-+-+-+-+-+-  END  OF PART 5 +-+-+-+-+-+-+-+-
  1601.