home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume9 / ux-maze < prev    next >
Internet Message Format  |  1991-01-28  |  93KB

  1. From sparky!kent Mon Jan 28 11:20:05 1991
  2. Received: from sparky.UUCP by uunet.uu.net (5.61/1.14) with UUCP 
  3.     id AA04279; Mon, 28 Jan 91 11:19:45 -0500
  4. Received: by sparky.IMD.Sterling.COM (4.1/smail2.5/04-08-90)
  5.     id AA13408; Mon, 28 Jan 91 09:29:56 CST
  6. From: kent@sparky.IMD.Sterling.COM (Kent Landfield)
  7. Message-Id: <9101281529.AA13408@sparky.IMD.Sterling.COM>
  8. Subject: no subject (file transmission)
  9. To: kent@uunet.uu.net
  10. Date: Mon, 28 Jan 91 9:29:55 CST
  11. X-Mailer: ELM [version 2.3 PL2]
  12. Status: OR
  13.  
  14. From: acliu%skat.usc.edu@usc.edu (Alex C. Liu)
  15. Newsgroups: comp.sources.misc
  16. Subject: v09i101: UX-Maze Mail Based File Server
  17. Message-ID: <75838@uunet.UU.NET>
  18. Date: 6 Jan 90 00:32:03 GMT
  19. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  20.  
  21. Posting-number: Volume 9, Issue 101
  22. Submitted-by: acliu%skat.usc.edu@usc.edu (Alex C. Liu)
  23. Archive-name: ux-maze
  24.  
  25. /* I Send This to Comp.sources.unix, a month Ago, and haven't seen
  26.    anything yet, so I am posting it to Comp.sources.misc        */
  27.  
  28. The UX-Maze Server is a program that allows the average Joe has his
  29. very OWN mail file server. You only need a C compiler and decent
  30. implementations of Unix and Sendmail.  Not only that, but the program
  31. is smart enough to detect what kind of program you are trying to send.
  32. And uncompress it (if needed), uuencode it (or btoa encode it, if that
  33. is what the user wants, or use a very portable Hex format), and if the
  34. file is bigger than an user defined limit, it will "split" the file
  35. first!
  36.  
  37. NOTE:
  38.   READ ALL the sources, and be VERY sure what you are doing before
  39. installing this software!
  40.  
  41. This distribution for the server contains the sources for:
  42.  m-ser         Main C file server program
  43.  M_SER.sh      Shell script driver for m-ser. (Called by sendmail's
  44.                forward)
  45.  auto-stat     C program that prints out Systems statistics.
  46.  auto-stat.sh  AT script that will do System statistics periodically.
  47.  viewstat.sh   Shell script driver for auto-stat to display
  48.                statistics.
  49.  
  50. Also, in the file doc.shar I have the documentation files I use in my
  51. "help" directory.
  52.  
  53. Read the README file for instructions on how to set up the whole
  54. thing...
  55.  
  56. The following package is Copyrighted 1989 by Alejandro Liu.  All
  57. rights reserved.  You are given permission to freely copy and
  58. distribute unmodified versions of this program.
  59.  
  60. ----cut here----cut here----cut here----cut here----cut here----cut here----
  61. #! /bin/sh
  62. # This is a shell archive.  Remove anything before this line, then unpack
  63. # it by saving it into a file and typing "sh file".  To overwrite existing
  64. # files, type "sh file -c".  You can also feed this as standard input via
  65. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  66. # will see the following message at the end:
  67. #        "End of shell archive."
  68. # Contents:  README Makefile MK_WORLD.proto M_SER.proto auto-stat.proto
  69. #   viewstat.proto bencode.h cmds.h m_buf_type.h m_buffer.h mazesym.h
  70. #   server_strs.h auto-stat.c bencode.c m-ser.c m_buffer.c msgs.c
  71. #   parse.c sendfile.c strcase.c TODO
  72. # Wrapped by acliu@skat.usc.edu on Fri Jan  5 15:45:02 1990
  73. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  74. if test -f README -a "${1}" != "-c" ; then 
  75.   echo shar: Will not over-write existing file \"README\"
  76. else
  77. echo shar: Extracting \"README\" \(4099 characters\)
  78. sed "s/^X//" >README <<'END_OF_README'
  79. X
  80. XThe following package is Copyrighted 1989 by Alejandro Liu.  All
  81. Xrights reserved.  You are given permission to freely copy and
  82. Xdistribute unmodified versions of this program.
  83. X
  84. X             UX-Maze Mail Server
  85. X             ===================
  86. X
  87. XThe UX-Maze Mail Server is a program that allows the average Joe has
  88. Xhis very OWN mail file server. You  only need a C compiler and decent
  89. Ximplementations of Unix and Sendmail.
  90. X
  91. XNOTE:
  92. X  READ ALL the sources, and be VERY sure what you are doing before
  93. Xinstalling this software!
  94. X
  95. XThis distribution for the server contains the sources for:
  96. X m-ser         Main C file server program
  97. X M_SER.sh      Shell script driver for m-ser. (Called by sendmail's
  98. X               forward)
  99. X auto-stat     C program that prints out Systems statistics.
  100. X auto-stat.sh  AT script that will do System statistics periodically.
  101. X viewstat.sh   Shell script driver for auto-stat to display
  102. X               statistics.
  103. X
  104. XAlso, in the file doc.shar I have the documentation files I use in my
  105. X"help" directory.
  106. X
  107. XHow to get the server working
  108. X=============================
  109. X
  110. XThe server basicly runs as a hook to sendmail called by the .forward
  111. Xfile.  To install it first:
  112. X o Go Through M_SER.proto and modify what ever is necessary.
  113. X   (For example, the Sed'd message that you receive in case of a fatal
  114. X    error. (Lines beginning with X))
  115. X     Any other mail processing commands that you want to add go at the
  116. X     second stage
  117. X o Look at the server_strs.h and modify any strings you want.  (The
  118. X   comments should be pretty straight foward)
  119. X o Look in msgs.c and modify the mail messages as you see appropiate.
  120. X o Change whatever is appropiate from the auto-stat.proto if you plan
  121. X   to use it.
  122. X o Look at MK_WORLD.proto and change whatever you thing is necessary.
  123. X o Look at the other files and fix any bugs you see (Bugs in my
  124. X   program?  Nah!  Just undocumented features!)
  125. X o Go and modify the Makefile.  (VERY important)
  126. X o Type "make world"  This will compile the whole thing, and create
  127. X   the volumes that you want as well as any necessary data files...
  128. X o If you are using the auto-stat.sh script, do:
  129. X    at -sm midnight auto-stat.sh
  130. X o Add a line to your ".forward" file that has the following:
  131. X    "|/user/john_doe/bin/M_SER.sh"
  132. X   Make world will do this for you...
  133. XIf everything went OK, (and if I didn't forget anything you may have a
  134. Xworking mail server)  You can send mail and try it out.
  135. XSee the files in "doc.shar" for instructions on how to use the server.
  136. X
  137. XNotes:
  138. XSome systems don't have a "Return-Path" line, for such situations you
  139. Xcan modify the cmds.h and parse.c files so you will use a different
  140. Xstring or add an alternte string for Mail return path generation.
  141. X
  142. XWith some effort the program will be able to run in batch mode.
  143. X
  144. XIf you have any questions/troubles, send mail to acliu@skat.usc.edu.
  145. X
  146. XDiscussions of special files in the ARCHIVE directory structure
  147. X===============================================================
  148. XThe Server considers the following files/directories special.  (Note,
  149. Xyou may be able to change this by modifying the program)
  150. X
  151. Xhelp (directory)
  152. XThis is the default Directory used by the SEND command.  Also, it is
  153. Xhere where all the files send out by the HELP command are saved.
  154. X
  155. Xhelp/intro
  156. XThis is the default HELP file.  Whenever a person uses the HELP
  157. Xcommand with no arguments, this file will be send.
  158. X
  159. Xcontents
  160. XThis file is sent whenever a person sends a command with no
  161. Xargumments.  Usually, it lists all the available volumes/directories
  162. Xin the server.
  163. X
  164. X(directory)/contents
  165. XThis is the default file sent by the SEND command when the user
  166. Xdoesn't specify any filename.  Also, is the file sent by the
  167. X"contents" command.  It usually lists all the available files in the
  168. Xcurrent volume.
  169. X
  170. XAny other file/directory is considered a normal, archived file or
  171. Xvolume.
  172. X
  173. XNOTE, that the file can be in any format, i.e. binary, compressed or
  174. Xbe very large, the server will automatically detect the file type,
  175. Xuncompress the file, and if it is binary will encode the program with
  176. Xa user selected encoding method.  It will also split the file if it is
  177. Xnecessary.
  178. X
  179. X
  180. END_OF_README
  181. if test 4099 -ne `wc -c <README`; then
  182.     echo shar: \"README\" unpacked with wrong size!
  183. fi
  184. # end of overwriting check
  185. fi
  186. if test -f Makefile -a "${1}" != "-c" ; then 
  187.   echo shar: Will not over-write existing file \"Makefile\"
  188. else
  189. echo shar: Extracting \"Makefile\" \(3472 characters\)
  190. sed "s/^X//" >Makefile <<'END_OF_Makefile'
  191. X#
  192. X# Simple Make file for m-arc
  193. X#
  194. X# You MUST change the following:
  195. X# Home directory of the user that owns the server
  196. XHOME = /usr/johndoe
  197. X# Where the executables for the software live...
  198. XBIN = $(HOME)/Archive.bin
  199. X# Command search path to whatever is appropiate in your system...
  200. XPATH = :/usr/ucb:/bin:/usr/bin:$(BIN)
  201. X# Full path to the file that is the m-ser execuable
  202. XMSER = $(BIN)/m-ser
  203. X# Where do you want your mail saved...
  204. XSYSBOX = /usr/spool/mail/johndoe
  205. X# Top Directory for you Archive
  206. XARCHIVE = $(HOME)/Archive
  207. X# Directory where you want to create some of the tmp files
  208. XTMPDIR = /usr/tmp
  209. X# Name of the Volumes that you will have in your server.
  210. X#   You must at least have the help volume, that is where the server
  211. X# finds all its documentation.
  212. XVOLUMES = help empty volume
  213. X# How often you plan to run the auto-stat.sh script (If you plan to
  214. X# use it)
  215. XFREQ = 30 days
  216. X# Mail address to mail the summaries.  (If you are using auto-stat.sh)
  217. XSYSLOG = tom@sad.stories.com
  218. X# Name of the Data sink
  219. XDEVNULL = /dev/null
  220. X#####################################################################
  221. XCC = cc
  222. XCFLAGS = -O -c
  223. XLFLAGS = -O -s
  224. XPROTOS = MK_WORLD.proto M_SER.proto auto-stat.proto viewstat.proto
  225. XSHELLS = MK_WORLD.sh M_SER.sh auto-stat.sh viewstat.sh
  226. XOBJS = bencode.o m_buffer.o sendfile.o m-ser.o parse.o strcase.o \
  227. X    msgs.o
  228. XSRCS = bencode.c m_buffer.c sendfile.c m-ser.c parse.c strcase.c \
  229. X    msgs.c auto-stat.c
  230. XHDRS = bencode.h m_buf_type.h m_buffer.h server_strs.h mazesym.h cmds.h
  231. XPRINTER = p-sal125
  232. XBINS = m-ser auto-stat
  233. X
  234. Xm-ser: $(OBJS)
  235. X    $(CC) $(LFLAGS) $(OBJS) -o m-ser
  236. X
  237. Xall: m-ser maintain M_SER.sh
  238. X
  239. Xworld: install everything 
  240. X
  241. Xeverything: MK_WORLD.sh
  242. X    MK_WORLD.sh
  243. X
  244. Xinstall: all 
  245. X    cp  m-ser M_SER.sh auto-stat.sh auto-stat viewstat.sh $(BIN)
  246. X    chmod 755 $(BIN)/M_SER.sh $(BIN)/auto-stat.sh $(BIN)/viewstat.sh
  247. X
  248. XM_SER.sh: M_SER.proto
  249. X    sed -e "s!_PATH_!$(PATH)!" \
  250. X        -e "s!_MSER_!$(MSER)!" \
  251. X        -e "s!_ARCHIVE_!$(ARCHIVE)!" \
  252. X        -e "s!_MBOX_!$(SYSBOX)!" \
  253. X        -e "s!_TMPDIR_!$(TMPDIR)!" < M_SER.proto > M_SER.sh
  254. X
  255. XMK_WORLD.sh: MK_WORLD.proto
  256. X    sed -e "s!_ARCDIR_!$(ARCHIVE)!" \
  257. X        -e "s!_VOLUMES_!$(VOLUMES)!" \
  258. X        -e "s!_BIN_!$(BIN)!" \
  259. X        -e "s!_DEVNULL_!$(DEVNULL)!" \
  260. X        -e "s!_HOME_!$(HOME)!" \
  261. X        < MK_WORLD.proto > MK_WORLD.sh
  262. X    chmod 755 MK_WORLD.sh
  263. X
  264. Xbencode.o: bencode.c bencode.h mazesym.h
  265. X    $(CC) $(CFLAGS) bencode.c
  266. X
  267. Xm_buffer.o: m_buffer.c m_buf_type.h
  268. X    $(CC) $(CFLAGS) m_buffer.c
  269. X
  270. Xsendfile.o: mazesym.h server_strs.h sendfile.c
  271. X    $(CC) $(CFLAGS) sendfile.c
  272. X
  273. Xm-ser.o: m-ser.c m_buffer.h mazesym.h server_strs.h
  274. X    $(CC) $(CFLAGS) m-ser.c
  275. X
  276. Xparse.o: parse.c m_buffer.h mazesym.h bencode.h cmds.h server_strs.h
  277. X    $(CC) $(CFLAGS) parse.c
  278. X
  279. Xstrcase.o: strcase.c
  280. X    $(CC) $(CFLAGS) strcase.c
  281. X
  282. Xmsgs.o: msgs.c server_strs.h mazesym.h
  283. X    $(CC) $(CFLAGS) msgs.c
  284. X
  285. Xmaintain: auto-stat auto-stat.sh viewstat.sh
  286. X
  287. Xauto-stat: auto-stat.c mazesym.h
  288. X    $(CC) $(LFLAGS) -o auto-stat auto-stat.c
  289. X
  290. Xviewstat.sh: viewstat.proto
  291. X    sed -e "s!BIN!$(BIN)!" \
  292. X        -e "s!DEVNULL!$(DEVNULL)!" \
  293. X        -e "s!DIR!$(ARCHIVE)!" \
  294. X        < viewstat.proto > viewstat.sh
  295. X
  296. Xauto-stat.sh: auto-stat.proto
  297. X    sed -e "s!_TMPDIR_!$(TMPDIR)!" \
  298. X        -e "s!_ARCDIR_!$(ARCHIVE)!" \
  299. X        -e "s!_BIN_!$(BIN)!" \
  300. X        -e "s!_SYSLOG_!$(SYSLOG)!" \
  301. X        -e "s!_INTERVAL_!$(FREQ)!" \
  302. X           < auto-stat.proto > auto-stat.sh
  303. X
  304. Xlove:
  305. X    @echo not war?
  306. X
  307. Xwar:
  308. X    @echo Yeah! Fight on!
  309. X
  310. Xlint:
  311. X    lint $(SRCS)
  312. X
  313. Xprint: 
  314. X    pr -f -l64 $(PROTOS) $(SRCS) $(HDRS) | lpr -P$(PRINTER)
  315. X
  316. Xclean:
  317. X    rm -f $(SHELLS) $(OBJS) $(BINS)
  318. X    rm -f *~
  319. END_OF_Makefile
  320. if test 3472 -ne `wc -c <Makefile`; then
  321.     echo shar: \"Makefile\" unpacked with wrong size!
  322. fi
  323. # end of overwriting check
  324. fi
  325. if test -f MK_WORLD.proto -a "${1}" != "-c" ; then 
  326.   echo shar: Will not over-write existing file \"MK_WORLD.proto\"
  327. else
  328. echo shar: Extracting \"MK_WORLD.proto\" \(1613 characters\)
  329. sed "s/^X//" >MK_WORLD.proto <<'END_OF_MK_WORLD.proto'
  330. X#!/bin/sh
  331. X# The following is modified by Makefile.
  332. XSYSDIR=_ARCDIR_
  333. XVOLUMES="_VOLUMES_"
  334. XBIN=_BIN_
  335. XTOP=_HOME_
  336. XDEVNULL=_DEVNULL_
  337. Xumask 022
  338. X# You can change this if you don't like it...
  339. X#
  340. X# Creating the Archive directory
  341. X#
  342. Xif (test ! -d $SYSDIR) then
  343. X    echo Creating the ARCHIVEs directory: $SYSDIR
  344. X    if (mkdir $SYSDIR) then
  345. X       echo Done.
  346. X    else
  347. X       echo Error! Aborting!
  348. X       exit 1
  349. X    fi
  350. Xfi
  351. Xecho Entering Archive directory
  352. Xcd $SYSDIR
  353. Xecho Creating Archive volumes...
  354. Xfor VOL in $VOLUMES
  355. Xdo
  356. X   if (test -d $VOL) then
  357. X      echo $VOL already exits.  Skiping...
  358. X   else
  359. X      echo Creating $VOL directory
  360. X      mkdir $VOL
  361. X      echo Creating Contents File...
  362. X      sed "s/^X//"  > $VOL/contents <<END_OF_CONTENTS
  363. XX
  364. XXThis Volume is currently empty
  365. XX
  366. XEND_OF_CONTENTS
  367. X      if (test $VOL = help -a ! -f $VOL/intro) then
  368. X         sed "s/^X//" > $VOL/intro <<END_OF_INTRO
  369. XX
  370. XX Sorry, no documentation is yet available
  371. XX
  372. XEND_OF_INTRO
  373. X      fi
  374. X    fi
  375. Xdone
  376. Xecho Creating Main Contents file
  377. Xif (test ! -f contents) then
  378. X     sed "s/^X//" > contents  <<END_OF_ROOT
  379. XX
  380. XX This archive contains the following volumes:
  381. XX
  382. XX _VOLUMES_
  383. XX
  384. XEND_OF_ROOT
  385. Xfi
  386. Xecho Creating new Log file
  387. X$BIN/auto-stat $DEVNULL Logfile > $DEVNULL <<DUMMY_HEADER
  388. X%SL STARTED LOG 0 Havent even started operations...
  389. XDUMMY_HEADER
  390. Xecho Done with making the world...
  391. Xif (test -f $TOP/.forward) then
  392. X   if (test `grep "$BIN/M_SER.sh" $TOP| wc -l` != 1) then
  393. X       echo Modifying your ".foward" file
  394. X       echo \"!$BIN/M_SER.sh\" >> $TOP/.forward
  395. X   fi
  396. Xelse
  397. X   echo Creating a .forward file
  398. X   echo \"!$BIN/M_SER.sh\" > $TOP/.forward
  399. Xfi
  400. Xecho DONE...
  401. END_OF_MK_WORLD.proto
  402. if test 1613 -ne `wc -c <MK_WORLD.proto`; then
  403.     echo shar: \"MK_WORLD.proto\" unpacked with wrong size!
  404. fi
  405. # end of overwriting check
  406. fi
  407. if test -f M_SER.proto -a "${1}" != "-c" ; then 
  408.   echo shar: Will not over-write existing file \"M_SER.proto\"
  409. else
  410. echo shar: Extracting \"M_SER.proto\" \(1384 characters\)
  411. sed "s/^X//" >M_SER.proto <<'END_OF_M_SER.proto'
  412. X#!/bin/sh
  413. X#   :   :   :   :   :   :   :   :   :   :   :   :   :   :   :   :   :   :   :
  414. X#----------------------------------------------------------------------
  415. X# This is the Shell script driver for the UX-Maze Server.  It is in charge
  416. X# of saving the messages into a temporary file, and pass it to the server.
  417. X# it also it is in charge of saving the message if necessary.  (Or pass it
  418. X# to any other Mail processing program if necessary)  The reason why I chose
  419. X# to do this in Shell instead of in the C program was because that I migh want
  420. X# to add other things latter.  (Like an autobounce mail program)
  421. X#
  422. Xexport PATH; PATH=_PATH_
  423. XMSER=_MSER_
  424. XMSerPath=_ARCHIVE_
  425. XSYSBOX=_MBOX_
  426. XMsgTmp=_TMPDIR_/tmpmail.$$
  427. Xumask 022
  428. X#
  429. X# Check if somebody is using our tmp filename, is somebody is, we just save
  430. X# the mail (The benefit of the doubt?)
  431. Xif (test -f $MsgTmp) then
  432. X   sed -e "s/^X//" >> $SYSBOX <<END_NOTICE
  433. XX
  434. XXFrom UX-MaZe Mail Notification system
  435. XXReturn-Path: No where
  436. XXFrom: UX-Maze_server `date`
  437. XXSubject: $MsgTmp file is busy
  438. XX
  439. XXUnparsed message follows....
  440. XX
  441. XEND_NOTICE
  442. X   cat >> $SYSBOX
  443. X   exit
  444. Xfi
  445. X#
  446. X# Save message in MsgTmp for the momemnt
  447. Xecho '' > $MsgTmp
  448. Xcat >> $MsgTmp
  449. X#
  450. X# First Stage.  Pass message through UX-Maze server
  451. Xif ($MSER $MSerPath < $MsgTmp) then
  452. X# secnond stage.  Pass message throuh any program you want
  453. X   cat $MsgTmp >> $SYSBOX
  454. Xfi
  455. X# Clean up our mess
  456. Xrm $MsgTmp
  457. END_OF_M_SER.proto
  458. if test 1384 -ne `wc -c <M_SER.proto`; then
  459.     echo shar: \"M_SER.proto\" unpacked with wrong size!
  460. fi
  461. # end of overwriting check
  462. fi
  463. if test -f auto-stat.proto -a "${1}" != "-c" ; then 
  464.   echo shar: Will not over-write existing file \"auto-stat.proto\"
  465. else
  466. echo shar: Extracting \"auto-stat.proto\" \(939 characters\)
  467. sed "s/^X//" >auto-stat.proto <<'END_OF_auto-stat.proto'
  468. X#!/bin/sh
  469. X# at script that sumarizes the Log file
  470. X#
  471. Xumask 022
  472. Xcd _ARCDIR_
  473. Xdate
  474. Xtmpf00=_TMPDIR_/log.$$
  475. Xtmpf01=_TMPDIR_/sum.$$
  476. Xtmpf02=_TMPDIR_/rpt.$$
  477. Xecho Starting Statistics report generator
  478. Xecho ""
  479. Xecho Uncompressing Old-Log file
  480. Xif (test -f Old-Log.Z) then
  481. X    zcat Old-Log > $tmpf01
  482. Xelse
  483. X    if (test -f Old-Log) then
  484. X        cp Old-Log $tmpf01
  485. X    else
  486. X        touch $tmpf01
  487. X    fi
  488. Xfi
  489. Xcp Logfile $tmpf00
  490. Xif (_BIN_/auto-stat $tmpf01 Logfile < $tmpf00 > $tmpf02) then
  491. X    echo Completed Without Errors, updating Files
  492. X    mv $tmpf01 Old-Log
  493. X    if (test -f Old-Log.Z) then
  494. X        rm Old-Log.Z
  495. X    fi
  496. X    compress -v Old-Log
  497. X    mail -s "Archiver LogFile" _SYSLOG_ < $tmpf00
  498. X    mail -s "Archiver Summary" _SYSLOG_ < $tmpf02
  499. X    rm $tmpf00 $tmpf02
  500. Xelse
  501. X    echo Error Detected.  Restoring files!
  502. X    mv $tmpf00 Logfile
  503. X    compress -v Old-Log
  504. X    rm $tmpf01 $tmpf02
  505. Xfi
  506. Xecho Done at `date`
  507. Xat -sm midnight + _INTERVAL_ _BIN_/auto-stat.sh
  508. X
  509. END_OF_auto-stat.proto
  510. if test 939 -ne `wc -c <auto-stat.proto`; then
  511.     echo shar: \"auto-stat.proto\" unpacked with wrong size!
  512. fi
  513. # end of overwriting check
  514. fi
  515. if test -f viewstat.proto -a "${1}" != "-c" ; then 
  516.   echo shar: Will not over-write existing file \"viewstat.proto\"
  517. else
  518. echo shar: Extracting \"viewstat.proto\" \(100 characters\)
  519. sed "s/^X//" >viewstat.proto <<'END_OF_viewstat.proto'
  520. X#!/bin/sh
  521. X#Display Statistics, but no File updating!
  522. XBIN/auto-stat DEVNULL \
  523. X DEVNULL < DIR/Logfile
  524. END_OF_viewstat.proto
  525. if test 100 -ne `wc -c <viewstat.proto`; then
  526.     echo shar: \"viewstat.proto\" unpacked with wrong size!
  527. fi
  528. # end of overwriting check
  529. fi
  530. if test -f bencode.h -a "${1}" != "-c" ; then 
  531.   echo shar: Will not over-write existing file \"bencode.h\"
  532. else
  533. echo shar: Extracting \"bencode.h\" \(429 characters\)
  534. sed "s/^X//" >bencode.h <<'END_OF_bencode.h'
  535. X/*
  536. X * file: bencode.h
  537. X *    Symbol definitions for the different Encoding methods available
  538. X */
  539. X
  540. X/* Internal constants to indentify the encoding method */
  541. X#define UUENCODE    0    /* Default Encoder */
  542. X#define BTOA        1    /* Very Good (nice) encoder, prefered */
  543. X#define HEX        2    /* Very dumb, but sure fire method */
  544. X
  545. X/* Strings that define the Encoder commands */
  546. X#define N_UUENCODE    "uuencode"
  547. X#define N_BTOA        "btoa"
  548. X#define N_HEX        "hex"
  549. X
  550. END_OF_bencode.h
  551. if test 429 -ne `wc -c <bencode.h`; then
  552.     echo shar: \"bencode.h\" unpacked with wrong size!
  553. fi
  554. # end of overwriting check
  555. fi
  556. if test -f cmds.h -a "${1}" != "-c" ; then 
  557.   echo shar: Will not over-write existing file \"cmds.h\"
  558. else
  559. echo shar: Extracting \"cmds.h\" \(751 characters\)
  560. sed "s/^X//" >cmds.h <<'END_OF_cmds.h'
  561. X/*
  562. X * file: cmds.h
  563. X *    List of commands
  564. X */
  565. X
  566. X#define NCMDS        10        /* Number of Commands */
  567. X
  568. X#define BENCODE        1        /* Token definitions */
  569. X#define MAXSIZE        2
  570. X#define PATH        4
  571. X#define END        3
  572. X#define CONTENTS    17        /* If the number is > 15 then the */
  573. X#define HELP        18        /* Command can't be used until a */
  574. X#define SEND        19        /* Path is set */
  575. X#define    RECEIVE        20
  576. X#define INDEX        21
  577. X
  578. Xstatic char *cmdlist[] = {        /* Command strings */
  579. X  "Return-Path:",        /* PATH Command */
  580. X  "path",   "contents",  "help",    "send",  "receive",
  581. X  "index",  "bencode",   "maxsize", "end",   NULL
  582. X};
  583. X
  584. Xstatic int tokens[] = {            /* Token values */
  585. X  PATH,                /* Return-Path */
  586. X  PATH,        CONTENTS,     HELP,        SEND,     RECEIVE,
  587. X  INDEX,    BENCODE,     MAXSIZE,   END,      NULL
  588. X};
  589. END_OF_cmds.h
  590. if test 751 -ne `wc -c <cmds.h`; then
  591.     echo shar: \"cmds.h\" unpacked with wrong size!
  592. fi
  593. # end of overwriting check
  594. fi
  595. if test -f m_buf_type.h -a "${1}" != "-c" ; then 
  596.   echo shar: Will not over-write existing file \"m_buf_type.h\"
  597. else
  598. echo shar: Extracting \"m_buf_type.h\" \(165 characters\)
  599. sed "s/^X//" >m_buf_type.h <<'END_OF_m_buf_type.h'
  600. X/*
  601. X * File: m_buf_type.h
  602. X *   Define Data types for m_buffer.c routines
  603. X */
  604. X
  605. Xstruct MBline {
  606. X  struct MBline *next;
  607. X  char *line;
  608. X};
  609. X
  610. Xtypedef struct MBline msgbuf;
  611. X
  612. END_OF_m_buf_type.h
  613. if test 165 -ne `wc -c <m_buf_type.h`; then
  614.     echo shar: \"m_buf_type.h\" unpacked with wrong size!
  615. fi
  616. # end of overwriting check
  617. fi
  618. if test -f m_buffer.h -a "${1}" != "-c" ; then 
  619.   echo shar: Will not over-write existing file \"m_buffer.h\"
  620. else
  621. echo shar: Extracting \"m_buffer.h\" \(118 characters\)
  622. sed "s/^X//" >m_buffer.h <<'END_OF_m_buffer.h'
  623. X/*
  624. X * File: m_buffer.h
  625. X *   Include file for msg loader
  626. X */
  627. X
  628. X#include "m_buf_type.h"
  629. Xextern struct MBline *readmsg();
  630. END_OF_m_buffer.h
  631. if test 118 -ne `wc -c <m_buffer.h`; then
  632.     echo shar: \"m_buffer.h\" unpacked with wrong size!
  633. fi
  634. # end of overwriting check
  635. fi
  636. if test -f mazesym.h -a "${1}" != "-c" ; then 
  637.   echo shar: Will not over-write existing file \"mazesym.h\"
  638. else
  639. echo shar: Extracting \"mazesym.h\" \(173 characters\)
  640. sed "s/^X//" >mazesym.h <<'END_OF_mazesym.h'
  641. X/*
  642. X * File: mazesym.h
  643. X *   Defined Constants For Different things
  644. X */
  645. X
  646. X#define YES    1
  647. X#define NO    0
  648. X#define L_TSTR  1024
  649. X#define TSTR    128
  650. X#define ERROR   -1
  651. X#define NOERROR 0
  652. END_OF_mazesym.h
  653. if test 173 -ne `wc -c <mazesym.h`; then
  654.     echo shar: \"mazesym.h\" unpacked with wrong size!
  655. fi
  656. # end of overwriting check
  657. fi
  658. if test -f server_strs.h -a "${1}" != "-c" ; then 
  659.   echo shar: Will not over-write existing file \"server_strs.h\"
  660. else
  661. echo shar: Extracting \"server_strs.h\" \(1362 characters\)
  662. sed "s/^X//" >server_strs.h <<'END_OF_server_strs.h'
  663. X/*
  664. X * file: sever_strs.h
  665. X *  Customizing strings for server 
  666. X *
  667. X */
  668. X
  669. X/* Nice msg strings */
  670. X#define SBJ_SENDACK    "Mail server request for"
  671. X#define SBJ_SENDSACK    "Mail splitted file"
  672. X#define SBJ_INDXACK    "Mail index request for"
  673. X#define SBJ_RECVACK    "Mail acknoledges receive file"
  674. X#define SBJ_RECNOT    "Mail file received file"
  675. X#define SBJ_WRN        "Mail send request for directory"
  676. X#define PREFIX        "Mail Error:"
  677. X
  678. X/* Magic Strings! */
  679. X#define SUBJLEN        9
  680. X#define SUBJECT        "Subject: %s"
  681. X#define SUBJLINE    "Mail-Archive-Request"
  682. X
  683. X/* Moderator's mail addresses */
  684. X#define MODERATOR    "Thomas-Jefferson@independance.hall.usa JohnDoe@wizards.dec.com"
  685. X
  686. X/* Standard Filenames */
  687. X#define LOGFILE        "Logfile"
  688. X#define INCOMING    "incoming"
  689. X
  690. X/* Default filenames */
  691. X#define HELPD        "help"
  692. X#define CONTENTSF    "contents"
  693. X#define INTROF        "intro"
  694. X#define VOLF        "none"
  695. X#define FILEF        "none"
  696. X#define DINDEX        "."
  697. X#define DENCODE        UUENCODE
  698. X#define DSIZE        0
  699. X#define ROOTD        "."
  700. X
  701. X/* Command prototypes */
  702. X#define MAILSENDF    "mail -s '%s %s' '%s' < '%s'"
  703. X#define MAILSENDS    "mail -s '%s %s' '%s' < '%s'"
  704. X#define MAILLS        "ls -l '%s' | mail -s '%s %s' '%s'"
  705. X#define MAILTHX        "fmt < %s | mail -s '%s %s %s' '%s'"
  706. X#define RECNOTE        "fmt < %s | mail -s '%s %s/%s' '%s'"
  707. X#define ZCATCMD        "zcat '%s' > '%s'"
  708. X#define MAILERR        "echo '%s %s' | mail -s '%s %s' '%s'"
  709. X#define SENDWRN        "fmt < %s | mail -s '%s %s' '%s'"
  710. END_OF_server_strs.h
  711. if test 1362 -ne `wc -c <server_strs.h`; then
  712.     echo shar: \"server_strs.h\" unpacked with wrong size!
  713. fi
  714. # end of overwriting check
  715. fi
  716. if test -f auto-stat.c -a "${1}" != "-c" ; then 
  717.   echo shar: Will not over-write existing file \"auto-stat.c\"
  718. else
  719. echo shar: Extracting \"auto-stat.c\" \(11910 characters\)
  720. sed "s/^X//" >auto-stat.c <<'END_OF_auto-stat.c'
  721. X/***********                            *
  722. X * File: auto-stat.c                    *
  723. X * Creates Summary files from Logfiles  *
  724. X *                             **********/
  725. X#include <stdio.h>
  726. X#include <sys/types.h>
  727. X#include <sys/timeb.h>
  728. X#include <time.h>
  729. X#include <ctype.h>
  730. X#include "mazesym.h"
  731. X
  732. Xtypedef struct treenode {               /* Structure for counting:  */
  733. X  char *name;                           /*     Popular files */
  734. X  unsigned short count;                 /*     Top users */
  735. X  struct treenode *left, *right;        /*     Common Errors */
  736. X} nodetree;
  737. X
  738. XFILE *out;                              /* File Pointer for Old-Log file */
  739. Xchar inbuf[TSTR],                       /* Line Buffer for input and scanf */
  740. X     userName[TSTR],                    /* Stores request's user name */
  741. X     tfname[TSTR];                      /* Temp file name storage */
  742. X
  743. Xlong requestCount = 0,                  /* Number of request processed */
  744. X     contentsCount = 0,                 /* Number of Count Requests */
  745. X     indexCount = 0,                    /* Number of Index requests */
  746. X     helpCount = 0,                     /* Number of Help Requests */
  747. X     sendCount = 0,                     /* Number of Send Requests */
  748. X     sendfCount = 0,                    /* Actual number of Files Sent */
  749. X     receiveCount = 0,                  /* Number of Receive Requests */
  750. X     totalRuntime = 0,                  /* Total Run time in seconds */
  751. X     errorCount = 0,                    /* Number of Errors */
  752. X     lineCount = 0,                     /* Number of lines and bytes read */
  753. X     byteCount = 0;
  754. X
  755. Xnodetree *users = 0,                    /* Root node for user's tree */
  756. X         *files = 0,                    /* Root node for file's tree */
  757. X         *errors = 0;                   /* Root node for error tree */
  758. X
  759. X/*
  760. X * Main Function for auto-stat
  761. X *   Usage: cd systemdir ; auto-stat Old-Logfile < Logfile > report
  762. X * Creates or updates Logfile.sum
  763. X */
  764. X
  765. Xmain(argc, argv)
  766. X     int argc;
  767. X     char *argv[];
  768. X{
  769. X  nodetree *Psort(), *tree(), *tmp;     /* Tree Updating subroutine */
  770. X  time_t beginDate, endDate,            /* Clock variables */
  771. X         runtime;                       /* Current entry runtime */
  772. X  unsigned short rank;                  /* For system updating */
  773. X
  774. X  if (out = fopen(argv[2], "w")) {    /* Create empty Log File */
  775. X    endDate = time((time_t *)NULL);
  776. X    fprintf(out, "%%SL STARTED LOG %ld %s", endDate, ctime(&endDate));
  777. X    fclose(out);
  778. X  }
  779. X  else {
  780. X    fprintf(stderr, "%s: Can't create Empty Log file\n", argv[0]);
  781. X    exit(1);
  782. X  }
  783. X  if (out = fopen(argv[1], "a")) {      /* Open the summary file */
  784. X    do
  785. X      if (!reads(inbuf)) {              /* Find the beginning of Log file */
  786. X        fprintf(stderr,"%s: Corrupted Log file?\n", argv[0]);
  787. X        exit(1);
  788. X      }
  789. X    while (strncmp(inbuf,"%SL STARTED LOG ",12));
  790. X    sscanf(inbuf,"%%SL STARTED LOG %ld",&beginDate);/* Get the Log strttime */
  791. X    endDate = time((time_t *)NULL);
  792. X    fprintf( out, "@BP %ld \n", beginDate);     /* Print Heading */
  793. X    printf("\fUX-Maze Archive server Statistics report\n");
  794. X    printf("========================================\n\n");
  795. X    printf("Accounting Period from %s", ctime(&beginDate));
  796. X    printf("                    to %s", ctime(&endDate));
  797. X    printf("(Period Length: ");
  798. X    {
  799. X      long total;
  800. X      unsigned short seconds, minutes, hours, days;
  801. X      seconds = minutes = days = 0;
  802. X      total = endDate - beginDate;
  803. X      seconds = total % 60;             /* Calculate seconds */
  804. X      minutes = (total / 60) % 60;      /* Minutes */
  805. X      hours = (total / 3600) % 24;      /* Hours */
  806. X      days = total / 86400;             /* Days */
  807. X      if (days)                         /* And print them out! */
  808. X        printf(" %d days,", days);
  809. X      if (hours)
  810. X        printf(" %d hours,", hours);
  811. X      if (minutes)
  812. X        printf(" %d minutes,", minutes);
  813. X      if (seconds)
  814. X        printf(" %d seconds.", seconds);
  815. X      fprintf(out,"@PL %ld\n", total);
  816. X    }
  817. X    printf(")\n\n");
  818. X    /* Begin reading Entries */
  819. X    while (reads(inbuf))                        /* Look for a Start entry indicator */
  820. X      if (!strncmp(inbuf, ">MS M-Server started: ", 18)) {
  821. X        strcpy(userName, "ghostRider v1.0"); /* Reset User Name */
  822. X        requestCount++;                 /* Update Request count */
  823. X        do
  824. X          if (reads(inbuf))             /* Examine entries */
  825. X            processLine();          
  826. X          else                  /* If premature EOF, simulate EOR */
  827. X            strcpy(inbuf, "<ME M-Server end.  Run time = 10 seconds");
  828. X        while (strncmp(inbuf, "<ME M-Server end.",10));
  829. X        fixuser(userName);              /* Make Username "beautiful" */
  830. X        users = tree(users, userName);
  831. X        sscanf(inbuf, "<ME M-Server end.  Run time = %d ", &runtime);
  832. X        totalRuntime += runtime;
  833. X      }
  834. X
  835. X    /* Sort users, files and errors by popularity */
  836. X    users = Psort(users);
  837. X    errors = Psort(errors);
  838. X    files = Psort(files);
  839. X
  840. X    /* Print out the Results */
  841. X    printf("Number of Bytes Processed: %ld ( %ld Lines)\n\n",
  842. X           byteCount, lineCount);
  843. X    fprintf(out, "@PD %ld %ld\n",byteCount, lineCount);
  844. X    printf("Total Number of Requests:   %12ld\n", requestCount);
  845. X    fprintf(out, "@NR %ld\n", requestCount);
  846. X    printf("Number of Contents Commands:%12ld\n", contentsCount);
  847. X    printf("Number of Index Commands:   %12ld\n", indexCount);
  848. X    printf("Number of Help Commands:    %12ld\n", helpCount);
  849. X    printf("Number of Send Commands:    %12ld\n", sendCount);
  850. X    fprintf(out, "@CT %ld %ld %ld %ld\n",
  851. X        contentsCount, indexCount, helpCount, sendCount);
  852. X    printf("Total Files Sent:           %12ld\n", sendfCount);
  853. X    printf("Number of Files Received:   %12ld\n\n", receiveCount);
  854. X    printf("Total Number of Errors:     %12ld\n\n", errorCount);
  855. X    if (requestCount) 
  856. X      printf("Total Runtime: %ld\t\tAverage Run time = %ld\n",
  857. X         totalRuntime, totalRuntime / requestCount);
  858. X    else
  859. X      printf("Total Runtime: %ld\t\tAverage Run time = NA\n",
  860. X         totalRuntime);
  861. X    fprintf(out, "@ST %ld %ld %ld %ld\n",
  862. X        sendfCount, receiveCount, errorCount, totalRuntime);
  863. X    printf("\f\n==============================================================\
  864. X============\n");
  865. X    printf("System's Top Users:\n");
  866. X    printf("Rank NoRqs %%Rqs  MailAddress\n");
  867. X    printf("==== ===== ====  ====================\n");
  868. X    rank = 0;
  869. X    tmp = users;
  870. X    fprintf(out, "@BU\n");
  871. X    while (tmp) {
  872. X      if (requestCount)
  873. X    printf("%4d %5d %4d  %s\n", ++rank, tmp->count,
  874. X           (100 * tmp->count + 50) / requestCount, tmp->name);
  875. X      else
  876. X    printf("No Requests!!!!!!\n");
  877. X      fprintf(out, "@UR %d %s\n", tmp->count, tmp->name);
  878. X      tmp = tmp->right;
  879. X    }
  880. X    printf("     =====\n");
  881. X    printf("     %5d\n", requestCount);
  882. X    printf("\f\n==============================================================\
  883. X============\n");
  884. X    printf("System's Most Popular Files\n");
  885. X    printf("Rank NDLS %%DLS  File name\n");
  886. X    printf("==== ==== ====  ======================\n");
  887. X    rank = 0;
  888. X    tmp = files;
  889. X    fprintf(out, "@BF\n");
  890. X    while (tmp) {
  891. X      if (sendfCount) 
  892. X    printf("%4d %4d %4d  %s\n", ++rank, tmp->count,
  893. X           (100 * tmp->count + 50) / sendfCount, tmp->name);
  894. X      else
  895. X    printf("No Downloads!!!!\n");
  896. X      fprintf(out, "@PF %d %s\n", tmp->count, tmp->name);
  897. X      tmp = tmp->right;
  898. X    }
  899. X    printf("     ====\n");
  900. X    printf("     %4d\n", sendfCount);
  901. X    printf("\f\n==============================================================\
  902. X============\n");
  903. X    printf("System's Most Common Errors\n");
  904. X    printf("Rank NTMS %%TMS  Error Code       Rank NTMS %%TMS  Error Code\n");
  905. X    printf("==== ==== ====  ===========      ==== ==== ====  ===========\n");
  906. X    rank = 0;
  907. X    tmp = errors;
  908. X    fprintf(out, "@BE\n");
  909. X    while (tmp) {
  910. X      if (errorCount)
  911. X    printf("%4d %4d %4d  %8s", ++rank, tmp->count,
  912. X           (100 * tmp->count + 50) / errorCount, tmp->name);
  913. X      else
  914. X    printf("* * * * None * * * *\n");
  915. X      if (rank % 2)
  916. X        printf("         ");
  917. X      else
  918. X        printf("\n");
  919. X      fprintf(out, "@EL %d %s\n", tmp->count, tmp->name);
  920. X      tmp = tmp->right;
  921. X    }
  922. X    if (rank % 2)
  923. X      printf("\n");
  924. X    fprintf(out, "@ER %ld\n", endDate);
  925. X    fclose(out);
  926. X    printf("\n==============================================================\
  927. X============\n");
  928. X    printf("Note: The percentages may not add up to 100 due to rounding \
  929. Xerrors\n");
  930. X  }
  931. X  else {
  932. X    fprintf(stderr, "%s: Can't open Output (%s) file!\n", argv[0], argv[1]);
  933. X    exit(1);
  934. X  }
  935. X}
  936. X
  937. X
  938. XprocessLine()
  939. X{
  940. X  nodetree *tree();                     /* Tree Updating subroutine */
  941. X  if (inbuf[0] == '$') {                 /* Update Error Count */
  942. X    errorCount++;
  943. X    inbuf[3] = '\000';
  944. X    errors = tree(errors, &inbuf[1]);
  945. X  }
  946. X  else if (!strncmp(inbuf, "&SR ", 4))
  947. X    sendCount++;                /* Update the Send Request Count */
  948. X  else if (!strncmp(inbuf, "&IR ", 4))
  949. X    indexCount++;
  950. X  else if (!strncmp(inbuf, "&CN ", 4)) {
  951. X    contentsCount++;
  952. X    do
  953. X      if (reads(inbuf)) {
  954. X        if (inbuf[0] == '$' || inbuf[0] == '&') 
  955. X          processLine();
  956. X      }
  957. X      else
  958. X        strcpy(inbuf, "<ME M-Server end.  Run time = 10 seconds");
  959. X    while (inbuf[0] == '#');
  960. X  }
  961. X  else if (!strncmp(inbuf, "&RR ", 4)) 
  962. X    receiveCount++;
  963. X  else if (!strncmp(inbuf, "&HL ", 4))
  964. X    helpCount++;
  965. X  else if (!strncmp(inbuf, "#SF ", 4) || !strncmp(inbuf, "#PS ", 4)) {
  966. X    sendfCount++;
  967. X    if (inbuf[1] == 'S') 
  968. X      sscanf(inbuf, "#SF Sending file %s", tfname);
  969. X    else
  970. X      sscanf(inbuf, "#PS Prepare Split Send of %s", tfname);
  971. X    files = tree(files, tfname);
  972. X  }
  973. X  else if (!strncmp(inbuf, "&SP ", 4))
  974. X    sscanf(inbuf, "&SP Path Set to %s", userName);
  975. X}
  976. X
  977. Xnodetree *tree(p, w)
  978. X     nodetree *p;
  979. X     char *w;
  980. X{
  981. X  char *strsave(), *malloc();
  982. X  int cond;
  983. X
  984. X  if (p == NULL) {
  985. X    p = (nodetree *) malloc( sizeof(nodetree));
  986. X    p->name = strsave(w);
  987. X    p->count = 1;
  988. X    p->left = p->right = NULL;
  989. X  }
  990. X  else if (!(cond=strcmp(w, p->name)))
  991. X    p->count++;
  992. X  else if (cond < 0)
  993. X    p->left = tree(p->left, w);
  994. X  else
  995. X    p->right = tree(p->right, w);
  996. X  return(p);
  997. X}
  998. X
  999. Xchar *strsave(s)
  1000. X     char *s;
  1001. X{
  1002. X  char *p, *malloc();
  1003. X  p  = malloc(strlen(s) + 1);
  1004. X  strcpy(p,s);
  1005. X  return(p);
  1006. X}
  1007. X
  1008. X
  1009. Xnodetree *Psort(p)
  1010. X     nodetree *p;
  1011. X{
  1012. X  nodetree *walktree();
  1013. X  nodetree *root;
  1014. X  root = NULL;
  1015. X  root = walktree(p, root);
  1016. X  return(root);
  1017. X}
  1018. X
  1019. Xnodetree *walktree(p, root)
  1020. X     nodetree *p, *root;
  1021. X{
  1022. X  nodetree *walktree();
  1023. X  if (p != NULL) {
  1024. X    root = walktree(p->left, root);
  1025. X    if (root) {
  1026. X      nodetree *a, *b;
  1027. X      a = root;
  1028. X      for (;;)
  1029. X    if (p->count > a->count) {
  1030. X      b = (nodetree *)malloc(sizeof(nodetree));
  1031. X      b->right = a;
  1032. X      if (!(b->left = a->left))
  1033. X        root = b;
  1034. X      b->name = strsave(p->name);
  1035. X      b->count = p->count;
  1036. X      a->left = b;
  1037. X      if (a = b->left)
  1038. X        a->right = b;
  1039. X      break;
  1040. X    }
  1041. X    else
  1042. X      if (a->right)
  1043. X        a = a->right;
  1044. X      else {
  1045. X        b = (nodetree *) malloc(sizeof(nodetree));
  1046. X        b->right = NULL;
  1047. X        b->left = a;
  1048. X        b->name = strsave(p->name);
  1049. X        b->count = p->count;
  1050. X        a->right = b;
  1051. X        break;
  1052. X      }
  1053. X    }
  1054. X    else {
  1055. X      root = (nodetree *)malloc(sizeof(nodetree));
  1056. X      root->left = root->right = NULL;
  1057. X      root->name = strsave(p->name);
  1058. X      root->count = p->count;
  1059. X    }
  1060. X    root = walktree(p->right, root);
  1061. X  }
  1062. X  return(root);
  1063. X}
  1064. X
  1065. Xfixuser(p)                      /* Beautify user name */
  1066. X     char *p;
  1067. X{
  1068. X  unsigned short i, j;
  1069. X  if (*p == '<') {              /* Strip the leading and trailing angle */
  1070. X    j = strlen(p);              /* angle brackets */
  1071. X    for (i = 1; i <= j; i++)
  1072. X      p[i-1]=p[i];
  1073. X  }
  1074. X  if (p[j = (strlen(p) - 1)] == '>')
  1075. X    p[j] = '\000';
  1076. X  j = strlen(p);
  1077. X  for (i = 0; i < j ; i++)      /* Make the User name lower case */
  1078. X    if (isupper(p[i]))
  1079. X      p[i] = tolower(p[i]);
  1080. X}
  1081. X
  1082. Xreads(s)
  1083. X     char *s;
  1084. X{
  1085. X  int x;
  1086. X  x = (int)gets(s);
  1087. X  lineCount++;
  1088. X  byteCount += strlen(s);
  1089. X  return(x);
  1090. X}
  1091. END_OF_auto-stat.c
  1092. if test 11910 -ne `wc -c <auto-stat.c`; then
  1093.     echo shar: \"auto-stat.c\" unpacked with wrong size!
  1094. fi
  1095. # end of overwriting check
  1096. fi
  1097. if test -f bencode.c -a "${1}" != "-c" ; then 
  1098.   echo shar: Will not over-write existing file \"bencode.c\"
  1099. else
  1100. echo shar: Extracting \"bencode.c\" \(5983 characters\)
  1101. sed "s/^X//" >bencode.c <<'END_OF_bencode.c'
  1102. X/********                                   *
  1103. X * Implements several Binary to Ascii encoding methods.*
  1104. X *                                             *******/
  1105. X#include <strings.h>
  1106. X#include <stdio.h>
  1107. X#include "bencode.h"
  1108. X#include "mazesym.h"
  1109. X
  1110. X/*
  1111. X * int bencode(char *fnme, char bcode, char *nicnme)
  1112. X *  Encodes a file.
  1113. X *     fnme points to the filename.
  1114. X *     bcode contains the encoding method (see bencode.h)
  1115. X *     nicnme points to a name to save the file under
  1116. X *  returns NON-ZERO on error, ZERO for success
  1117. X *  fnme will contain the filename of the encoded file and the old file
  1118. X *  will be destroyed
  1119. X */
  1120. X
  1121. Xbencode(fnme, bcode, nicnme)
  1122. X     char *fnme,            /* Name of file to encode */
  1123. X          *nicnme,            /* Nice name used to save file under */
  1124. X           bcode;            /* Method for encoding */
  1125. X{
  1126. X  char tname[L_tmpnam];            /* Used to keep the input */
  1127. X  FILE *in, *out;            /* File Pointers */
  1128. X
  1129. X  strcpy(tname, fnme);            /* Make a copy of the input filename*/
  1130. X  tmpnam(fnme);                /* Create an output filename */
  1131. X
  1132. X  if (!(in = fopen(tname, "r")))    /* Do some common things */
  1133. X    return(ERROR);
  1134. X  if (!(out = fopen(fnme, "w"))) {
  1135. X    fclose(in);
  1136. X    return(ERROR);
  1137. X  }
  1138. X  switch(bcode) {
  1139. X    case UUENCODE:            /* Encoding method jump table */
  1140. X      uuencode(in, out, nicnme);
  1141. X      break;
  1142. X    case BTOA:
  1143. X      btoa(in, out);
  1144. X      break;
  1145. X    case HEX:
  1146. X      hexf(in,out, nicnme);
  1147. X      break;
  1148. X    }
  1149. X  fclose(out);                /* Clean up the mess */
  1150. X  fclose(in);
  1151. X  unlink(tname);
  1152. X  return(NOERROR);
  1153. X}
  1154. X
  1155. X/*
  1156. X * uuencode:  Encodes a file usinge uuencoding.  (From USENET distribution)
  1157. X */
  1158. X#define UUENC(c)    (((c) & 077) + ' ')
  1159. Xuuencode(in, out, name)
  1160. X     FILE *in, *out;
  1161. X     char *name;
  1162. X{
  1163. X  char buf[80];
  1164. X  int i,n;
  1165. X  fprintf(out, "begin 644 %s\n", name);
  1166. X  for (;;) {
  1167. X    n = UUfr(in, buf, 45);
  1168. X    uuputc(n, out);
  1169. X    for(i = 0; i<n; i += 3) 
  1170. X      UUoutdec(&buf[i], out);
  1171. X    putc('\n', out);
  1172. X    if (n<=0)
  1173. X      break;
  1174. X  }
  1175. X  fprintf(out, "end\n");
  1176. X}
  1177. XUUoutdec(p, f)
  1178. X     char *p;
  1179. X     FILE *f;
  1180. X{
  1181. X  int c1, c2, c3, c4;
  1182. X  c1 = *p >> 2;
  1183. X  c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
  1184. X  c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 003;
  1185. X  c4 = p[2] & 077;
  1186. X  uuputc(c1,f);
  1187. X  uuputc(c2,f);
  1188. X  uuputc(c3,f);
  1189. X  uuputc(c4,f);
  1190. X}
  1191. Xint
  1192. XUUfr(fd, buf, cnt)
  1193. X     FILE *fd;
  1194. X     char *buf;
  1195. X     int cnt;
  1196. X{
  1197. X  int c,i;
  1198. X  for (i=0; i<cnt; i++) {
  1199. X    c = getc(fd);
  1200. X    if (c == EOF)
  1201. X      return(i);
  1202. X    buf[i] = c;
  1203. X  }
  1204. X  return(cnt);
  1205. X}
  1206. Xuuputc(x, f)                /* Patches UUencoding to */
  1207. X     int x;                /* To replace spaces with */
  1208. X     FILE *f;                /* "`" */
  1209. X{
  1210. X  x = UUENC(x);
  1211. X  if (x == ' ')
  1212. X    putc('`', f);
  1213. X  else
  1214. X    putc(x,f);
  1215. X}
  1216. X
  1217. X/*
  1218. X * hexf(in, out, file)
  1219. X * Encodes a file in Hex format.  This method is dumb but super portable
  1220. X * FORMAT:
  1221. X *    hexf filename                 (Beginning of file)
  1222. X *      :08238C35128C357C0932
  1223. X *       ^^!-----up to----!^^
  1224. X *       ||    35 Bytes    || 
  1225. X *       ||    in Hex      ++-> (Checksum for this line (not including byte
  1226. X *       ||                      count)  It is just a MOD(256) addition of
  1227. X *       ||                      all bytes in the line)
  1228. X *       ||
  1229. X *       ++-> Byte Count.  Number of Bytes in the line (Not including checksum)
  1230. X *      end                     (Indicates EOF)
  1231. X * (Simple huh?)
  1232. X */
  1233. Xhexf(in, out, f)
  1234. X     FILE *in, *out;            /* I/O buffers */
  1235. X     char *f;                /* Filename */
  1236. X{
  1237. X  unsigned char buf[35];        /* Buffer for Current line */
  1238. X  int i, n, chks;
  1239. X
  1240. X  fprintf(out, "hexf %s\n", f);        /* Display Hex File header */
  1241. X  for (;;) {
  1242. X    n = UUfr(in, buf, 35);        /* Use UUencode UUfr (like read(2))*/
  1243. X    fprintf(out, ":%-02X", n);        /* Print Byte count */
  1244. X    chks = 0;
  1245. X    for (i=0;i<n;i++) {            /* Encode characters */
  1246. X      chks += buf[i];
  1247. X      fprintf(out, "%-02X", buf[i]);
  1248. X    }
  1249. X    fprintf(out, "%-02X\n", chks & 0xff); /* Print Checksum */
  1250. X    if (n <= 0)
  1251. X      break;
  1252. X  }
  1253. X  fprintf(out, "end\n");        /* Indicate EOF */
  1254. X}
  1255. X
  1256. X/*
  1257. X * btoa(in, out) Of all the encoding methods, this one is the best.
  1258. X * Not only makes it printable ascii, but it is also more efficient
  1259. X * than uuencode and also compresses things!
  1260. X *
  1261. X * Taken from btoa version 4.0 by Paul Rutter Joe Orost
  1262. X *
  1263. X * computes the number of bytes and three kinds of simple checksums
  1264. X * incomming bytes are connected into 32 bit words, then printed in
  1265. X * base 85 exp(85,5) > exp(2,32)
  1266. X * The ASCII characters used are between '!' and 'u'
  1267. X * 'z' encodes 32-bit zero; 'x' is used to mark the end of encoded
  1268. X * data
  1269. X *
  1270. X */
  1271. X#define MAXPERLINE    78
  1272. X#define EN(c)        (int)((c)+'!')
  1273. Xlong int Ceor, Csum, Crot, ccount, bcount, word;
  1274. Xbtoa(in, out)
  1275. X     FILE *in, *out;
  1276. X{
  1277. X  long int n;
  1278. X  int c;
  1279. X  Ceor = Csum = Crot = ccount = bcount = word = 0;
  1280. X  fprintf(out, "xbtoa Begin\n");
  1281. X  n  = 0;
  1282. X  while ((c = getc(in)) != EOF) {
  1283. X    encode(c, out);
  1284. X    n += 1;
  1285. X  }
  1286. X  while (bcount != 0)
  1287. X    encode(0, out);
  1288. X  if (ccount != 0)
  1289. X    putc('\n', out);
  1290. X  fprintf(out, "xbtoa End N %ld %lx E %lx S %lx R %lx\n",
  1291. X      n, n, Ceor, Csum, Crot);
  1292. X}
  1293. Xencode(c, out)
  1294. X     int c;
  1295. X     FILE *out;
  1296. X{
  1297. X  Ceor ^= c;
  1298. X  Csum += c;
  1299. X  Csum += 1;
  1300. X  if (Crot & 0x80000000) {
  1301. X    Crot <<= 1;
  1302. X    Crot += 1;
  1303. X  }
  1304. X  else
  1305. X    Crot <<=1;
  1306. X  Crot += c;
  1307. X  word <<= 8;
  1308. X  word |= c;
  1309. X  if (bcount == 3) {
  1310. X    wordout(word, out);
  1311. X    bcount = 0;
  1312. X  }
  1313. X  else
  1314. X    bcount += 1;
  1315. X}
  1316. Xwordout(word, out)
  1317. X     long int word;
  1318. X     FILE *out;
  1319. X{
  1320. X  if (word) {
  1321. X    int tmp = 0;
  1322. X    if (word < 0) {        /* Because some don't support unsinged long */
  1323. X      tmp = 32;
  1324. X      word = word - (long)(85L * 85 * 85 * 85 * 32);
  1325. X    }
  1326. X    if (word < 0) {
  1327. X      tmp = 64;
  1328. X      word =  word - (long)(85L * 85 * 85 * 85 * 32);
  1329. X    }
  1330. X    charout(EN((word / (long)(85L * 85 * 85 * 85)) + tmp),out);
  1331. X    word %= (long)(85L * 85 * 85 * 85);
  1332. X    charout(EN(word / (85L * 85 * 85)),out);
  1333. X    word %= (85L * 85 * 85);
  1334. X    charout(EN(word / (85L * 85)),out);
  1335. X    word %= (85L * 85);
  1336. X    charout(EN(word / (85L)),out);
  1337. X    word %= 85;
  1338. X    charout(EN(word),out);
  1339. X  }
  1340. X  else
  1341. X    charout('z',out);
  1342. X}
  1343. X
  1344. Xcharout(c,out)
  1345. X     int c;
  1346. X     FILE *out;
  1347. X{
  1348. X  putc(c, out);
  1349. X  ccount += 1;
  1350. X  if (ccount == MAXPERLINE) {
  1351. X    putc('\n',out);
  1352. X    ccount = 0;
  1353. X  }
  1354. X}
  1355. X
  1356. END_OF_bencode.c
  1357. if test 5983 -ne `wc -c <bencode.c`; then
  1358.     echo shar: \"bencode.c\" unpacked with wrong size!
  1359. fi
  1360. # end of overwriting check
  1361. fi
  1362. if test -f m-ser.c -a "${1}" != "-c" ; then 
  1363.   echo shar: Will not over-write existing file \"m-ser.c\"
  1364. else
  1365. echo shar: Extracting \"m-ser.c\" \(2386 characters\)
  1366. sed "s/^X//" >m-ser.c <<'END_OF_m-ser.c'
  1367. X/*************
  1368. X * file: m-ser.c
  1369. X *
  1370. X *   m-ser implements a very simple mail archive.
  1371. X     You send message to the server, through .forward mechanism.  The
  1372. X     message gets read through stdin.  And the program parses it.
  1373. X     First it checks  for a Line that starts with:
  1374. X        Subject: Mail-Archive-Request
  1375. X     (Note that this can be redefined)
  1376. X     if it is not found, the server exits with a Zero status (meaning that
  1377. X     it did nothing)
  1378. X
  1379. X     After the server has identified that this is a Archive request, it
  1380. X     reads input for the following strings:
  1381. X         Return-Path <PATH>
  1382. X    path <PATH>
  1383. X       Sets the current return path to <PATH>
  1384. X    help [file]
  1385. X       Sends a help file.  If no help file is specified the default
  1386. X       is "intro"
  1387. X    send volume file
  1388. X       Sends a file in the volume directory.  the defaults are help
  1389. X       and contents respectively
  1390. X        contents volume
  1391. X       Sends a file named contents in the volume directory (Default
  1392. X       'help')
  1393. X    index volume
  1394. X       Sends the "ls -l" output from the volume directory (Default .)
  1395. X    receive volume file
  1396. X       Stops parsing the message and saves the entire thing somewhere. *
  1397. X                                       *
  1398. X     This file contains the main function for the server           *
  1399. X                                 ***********/
  1400. X#include "m_buffer.h"
  1401. X#include "mazesym.h"
  1402. X#include <stdio.h>
  1403. X#include "server_strs.h"
  1404. X
  1405. Xchar *workdir;
  1406. X
  1407. Xmain(argc, argv)
  1408. X     int argc;
  1409. X     char *argv[];
  1410. X{
  1411. X  msgbuf *root, *tmp;            /* Message buffer pointers */
  1412. X  char isreq = NO,            /* Flag: Is this a request? */
  1413. X       dline[TSTR];            /* Temp string for parsing */
  1414. X
  1415. X  workdir = argv[1];            /* Change to the Server Directory */
  1416. X  enterdir();
  1417. X
  1418. X  tmp = root = readmsg(stdin);        /* Read the msg being piped to us */
  1419. X  while (tmp && !isreq) {        /* Check for Magic String */
  1420. X    if (!strncmp(tmp->line, SUBJECT, SUBJLEN)) {
  1421. X      sscanf(tmp->line, SUBJECT, dline);/* Grab subject line string */
  1422. X      if (!strcasecmp(dline, SUBJLINE))
  1423. X    isreq = YES;
  1424. X    }
  1425. X    tmp = tmp->next;
  1426. X  }
  1427. X  if (isreq) {
  1428. X    parse(root);            /* Parse message */
  1429. X    exit(1);                /* Tell shell what we did */
  1430. X  }
  1431. X  else {
  1432. X    exit(0);                /* Tell shell we did nothing! */
  1433. X  }
  1434. X    /* Here we should deallocate data */
  1435. X}
  1436. X
  1437. X/*
  1438. X * This routine enters the Server directory.  On error it will immediatly
  1439. X * Exit with (0) no matter what.
  1440. X * (NO parameters are tranferred)
  1441. X */
  1442. Xenterdir()
  1443. X{
  1444. X  if (chdir(workdir)) /* CHDIR, if error, we exit with '0' */
  1445. X    exit(0);
  1446. X}
  1447. END_OF_m-ser.c
  1448. if test 2386 -ne `wc -c <m-ser.c`; then
  1449.     echo shar: \"m-ser.c\" unpacked with wrong size!
  1450. fi
  1451. # end of overwriting check
  1452. fi
  1453. if test -f m_buffer.c -a "${1}" != "-c" ; then 
  1454.   echo shar: Will not over-write existing file \"m_buffer.c\"
  1455. else
  1456. echo shar: Extracting \"m_buffer.c\" \(928 characters\)
  1457. sed "s/^X//" >m_buffer.c <<'END_OF_m_buffer.c'
  1458. X/*
  1459. X * File: m_buffer.c
  1460. X *
  1461. X * Implements a simple buffer for a mail message.
  1462. X *
  1463. X */
  1464. X
  1465. X#include "m_buf_type.h"
  1466. X#include <stdio.h>
  1467. X#define TSTR    1024
  1468. X
  1469. Xstruct MBline *readmsg(fp)
  1470. X     FILE *fp;
  1471. X{
  1472. X  unsigned char iobuffer[TSTR];
  1473. X  int datain, ptr = 0;
  1474. X  struct MBline *temp, *root;
  1475. X  
  1476. X  root = temp = (struct MBline *)malloc(sizeof(struct MBline));
  1477. X  for (;;) {
  1478. X    datain = getc(fp);
  1479. X    if (datain == EOF || datain == '\n' || ptr == TSTR) {
  1480. X      iobuffer[ptr++] = '\000';
  1481. X      temp->line = (unsigned char *)malloc(ptr);
  1482. X      strcpy(temp->line, iobuffer);
  1483. X      if (datain == EOF) {
  1484. X    temp->next = NULL;
  1485. X    return(root);
  1486. X      }
  1487. X      temp = temp->next = (struct MBline *)malloc(sizeof(struct MBline));
  1488. X      ptr = 0;
  1489. X    }
  1490. X    else
  1491. X      iobuffer[ptr++] = datain;
  1492. X  }
  1493. X}
  1494. X
  1495. Xwritemsg( start, fp)
  1496. X     struct MBline *start;
  1497. X     FILE *fp;
  1498. X{
  1499. X  while (start) {
  1500. X    fputs(start->line, fp);
  1501. X    putc('\n', fp);
  1502. X    start = start->next;
  1503. X  }
  1504. X}
  1505. END_OF_m_buffer.c
  1506. if test 928 -ne `wc -c <m_buffer.c`; then
  1507.     echo shar: \"m_buffer.c\" unpacked with wrong size!
  1508. fi
  1509. # end of overwriting check
  1510. fi
  1511. if test -f msgs.c -a "${1}" != "-c" ; then 
  1512.   echo shar: Will not over-write existing file \"msgs.c\"
  1513. else
  1514. echo shar: Extracting \"msgs.c\" \(4265 characters\)
  1515. sed "s/^X//" >msgs.c <<'END_OF_msgs.c'
  1516. X/************
  1517. X * file: msgs.c                        *
  1518. X *    Prints verbose messages to users            *
  1519. X                        *********/
  1520. X#include <stdio.h>
  1521. X#include "mazesym.h"
  1522. X#include "server_strs.h"
  1523. X
  1524. Xchar tmpf[L_tmpnam],            /* Buffer for tmp filenames */
  1525. X     auxb[L_TSTR];            /* Buffer for sh commands */
  1526. XFILE *fp;                /* File Pointer for tmp file */
  1527. X
  1528. X/*
  1529. X * Message Sent whenever we are sending a directory
  1530. X */
  1531. Xwritewarn(dirn, mailpath, errP)
  1532. X     char *dirn,            /* Directory that will be sent out */
  1533. X          *mailpath;            /* Mail address of user */
  1534. X     FILE *errP;            /* File Pointer for error logging */
  1535. X{
  1536. X  tmpnam(tmpf);
  1537. X  if (!(fp = fopen(tmpf, "w"))) {
  1538. X    fprintf(errP,"$NM Can't create error mail! %s\n", tmpf);
  1539. X    return;
  1540. X  }
  1541. X  fprintf(fp, "Dear Human:\n\n");
  1542. X  fprintf(fp, "  The file %s, that you requested, turned out to be a", dirn);
  1543. X  fprintf(fp, " directory.  All ");
  1544. X  fprintf(fp, "files that were found in that directory will ");
  1545. X  fprintf(fp, "shortly arrive after this ");
  1546. X  fprintf(fp, "message.\n");
  1547. X  fprintf(fp, "  Even though the server supports the request of directories,");
  1548. X  fprintf(fp, " please try to limit such request in order to reduce Software");
  1549. X  fprintf(fp, " overhead.\n\n");
  1550. X  fprintf(fp, "                       Sincerely, UX-Maze File Server\n\n");
  1551. X  fprintf(fp, "Thank your for using the UX-Maze File Server.\n\n");
  1552. X  fprintf(fp, "UX-Maze File Server,\n");
  1553. X  fprintf(fp, " Copyright 1989 by Alex C. Liu, All rights reserved.\n");
  1554. X  fclose(fp);
  1555. X  sprintf(auxb, SENDWRN, tmpf, SBJ_WRN, dirn, mailpath);
  1556. X  if (system(auxb))
  1557. X    fprintf(errP, "$NF Can't fork mail to send Warning: %s\n", dirn);
  1558. X  unlink(tmpf);
  1559. X}
  1560. X
  1561. X/*
  1562. X * writeRnt()
  1563. X * Prints the message send to the moderator(s) whenever there is a mail
  1564. X * Submission.
  1565. X */
  1566. X
  1567. XwriteRnt(fname, volume, file, mailpath, tod, errP)
  1568. X     char *fname,            /* Archive filename */
  1569. X          *volume,            /* Volume for file */
  1570. X      *file,            /* Name for file */
  1571. X        *mailpath,            /* Mail Address of USER */
  1572. X      *tod;                /* when the message was received */
  1573. X     FILE *errP;            /* Error loging pointer */
  1574. X{
  1575. X  tmpnam(tmpf);
  1576. X  if (!(fp = fopen(tmpf, "w"))) {
  1577. X    fprintf(errP,"$NM Can't create error mail! %s\n", tmpf);
  1578. X    return;
  1579. X  }
  1580. X  fprintf(fp, "Dear Moderator:\n");
  1581. X  fprintf(fp, "   The UX-Maze File Server received a file submission on\n");
  1582. X  fprintf(fp, "%s, from %s.  The file was\ncalled '%s' and was ",
  1583. X      tod, mailpath, file);
  1584. X  fprintf(fp, "meant to be in '%s'.  Currently the file is stored ",
  1585. X      volume);
  1586. X  fprintf(fp, "the '%s' directory and saved as '%s'.\n", INCOMING, fname);
  1587. X  fprintf(fp, "                Sincerely, UX-Maze File Server\n\n");
  1588. X  fprintf(fp, "UX-Maze File Server,\n");
  1589. X  fprintf(fp, " Copyright 1989 by Alex C. Liu, All rights reserved.\n");
  1590. X  fclose(fp);
  1591. X  sprintf(auxb, RECNOTE, tmpf, SBJ_RECNOT , volume, file, MODERATOR);
  1592. X  if (system(auxb))
  1593. X    fprintf(errP, "$NF Can't fork mail to send Moderator Note: %s\n", tmpf);
  1594. X  unlink(tmpf);
  1595. X}
  1596. X
  1597. X/*
  1598. X * writeAck()
  1599. X *  This funtions prints out the message that is send to the user whenever
  1600. X * he/she submits a file
  1601. X */
  1602. X
  1603. XwriteAck(file, volume, mailpath, errP)
  1604. X     char *file,            /* Name of submitted file */
  1605. X          *volume,            /* Name of dest volume */
  1606. X          *mailpath;            /* Where to send the mail to */
  1607. X     FILE *errP;            /* Error Log */
  1608. X{
  1609. X  tmpnam(tmpf);
  1610. X  if (!(fp = fopen(tmpf, "w"))) {
  1611. X    fprintf(errP,"$NM Can't create error mail! %s\n", tmpf);
  1612. X    return;
  1613. X  }
  1614. X  fprintf(fp, "Dear Contributor,\n\n");
  1615. X  fprintf(fp, "  The UX-Mail Archive Server would like to thank your for\n");
  1616. X  fprintf(fp, "your contribution of '%s' to the '%s' volume.  Right\n",
  1617. X      file, volume);
  1618. X  fprintf(fp, "now the file has been saved in the '%s' volume and awaits\n",
  1619. X      INCOMING);
  1620. X  fprintf(fp, "validation from the Moderator of the group.  If you have any ");
  1621. X  fprintf(fp, "questions, feel free to contact any of the addresses bellow.");
  1622. X  fprintf(fp, "\n\n            Sincerely, UX-Maze File Server\n\n");
  1623. X  fprintf(fp, "Moderators' e-mail addresses:\n");
  1624. X  fprintf(fp, "   %s\n\n", MODERATOR);
  1625. X  fprintf(fp, "UX-Maze File Server,\n");
  1626. X  fprintf(fp, " Copyright 1989 by Alex C. Liu, All rights reserved.\n");
  1627. X  fclose(fp);
  1628. X  sprintf(auxb, MAILTHX, tmpf, SBJ_RECVACK, volume, file, mailpath);
  1629. X  if (system(auxb))
  1630. X    fprintf(errP, "$NF Can't fork mail to send Rec Ack: %s\n", tmpf);
  1631. X  unlink(tmpf);
  1632. X}
  1633. END_OF_msgs.c
  1634. if test 4265 -ne `wc -c <msgs.c`; then
  1635.     echo shar: \"msgs.c\" unpacked with wrong size!
  1636. fi
  1637. # end of overwriting check
  1638. fi
  1639. if test -f parse.c -a "${1}" != "-c" ; then 
  1640.   echo shar: Will not over-write existing file \"parse.c\"
  1641. else
  1642. echo shar: Extracting \"parse.c\" \(9307 characters\)
  1643. sed "s/^X//" >parse.c <<'END_OF_parse.c'
  1644. X/***********
  1645. X * File: parse.c
  1646. X * Heart and soul of the mail server                        *
  1647. X   here is the Parsing function and the logging and msg reporting functions *
  1648. X                                *************/
  1649. X/********* This actually ONE BIG Hack!!! **************/
  1650. X
  1651. X#include <stdio.h>
  1652. X#include <sys/types.h>
  1653. X#include <sys/timeb.h>            /* Needed for time stamping */
  1654. X#include <time.h>
  1655. X#include <sys/stat.h>            /* Needed to ident Volumes in INDX */
  1656. X#include "bencode.h"
  1657. X#include "server_strs.h"
  1658. X#include "m_buffer.h"
  1659. X#include "mazesym.h"
  1660. X#include "cmds.h"
  1661. X
  1662. Xchar mailpath[TSTR],            /* Email Return Path */
  1663. X     bcode,                /* Current Encoding method */
  1664. X     pathen,                /* Flag to indicate if path is active*/
  1665. X     logf[L_tmpnam];            /* Logfile entry */
  1666. Xunsigned long maxsize;            /* Maximum message size */
  1667. XFILE *errP;                /* FP to Error log */
  1668. Xtime_t tod;                /* Current time of day */
  1669. Xmsgbuf *root;                /* Stores beginning of message */
  1670. X
  1671. X/*
  1672. X * parse(msgbuf *root)
  1673. X *   root points to the beginning of the message buffer.
  1674. X * This is almost the heart and soul of this program since it parses and
  1675. X * executes commands.
  1676. X *
  1677. X */
  1678. Xparse(msgl)
  1679. X     msgbuf *msgl;            /* Message Buffer pointer */
  1680. X{
  1681. X  char cmd[TSTR],            /* Read in command */
  1682. X       arg1[TSTR], arg2[TSTR];        /* Current command argumments */
  1683. X  unsigned i, mtc;
  1684. X
  1685. X  root = msgl;
  1686. X  bcode = UUENCODE;            /* Default Encoding method */
  1687. X  maxsize = 0;                /* Default message size = infinity */
  1688. X  pathen = NO;                /* No current path set yet... */
  1689. X
  1690. X  tmpnam(logf);                /* Prepare a temp file to log errors */
  1691. X  errP = fopen(logf, "w");        /* Open Log file */
  1692. X                    /* Create a TimeStamp */
  1693. X  fprintf(errP, "____________________________\n");
  1694. X  tod = time((time_t *)0);        /* Get the time for timestamp */
  1695. X  fprintf(errP, ">MS M-Server started: (%ld) %s", tod, ctime(&tod));
  1696. X
  1697. X  while (msgl) {            /* Extract command & Argumments */
  1698. X    cmd[0] = arg1[0] = arg2[0] = NULL;    /* Initialize empty strings */
  1699. X    sscanf(msgl->line, "%s %s %s", cmd, arg1, arg2);
  1700. X    mtc = 0;                /* No command matched */
  1701. X    for (i = 0; i<NCMDS && !mtc; i++)
  1702. X      if (!strcasecmp(cmdlist[i], cmd)) /* Command recognized */
  1703. X    mtc = tokens[i];
  1704. X    if (mtc < 16 || pathen) {        /* Check if allowed command */
  1705. X      switch (mtc) {
  1706. X        case PATH:
  1707. X      if (!strcmp("<MAILER-DAEMON>", arg1)) { /* Bounced Mail, do a */
  1708. X        if (pathen)                /* Quick Exit */
  1709. X          fprintf(errP,
  1710. X              "$BM Bounced Mail Detected (%s %s) from %s\n",
  1711. X              cmd, arg1, mailpath);
  1712. X        else
  1713. X          fprintf(errP,
  1714. X              "$BM Bounced Mail Detected (%s %s)\n",
  1715. X              cmd, arg1);
  1716. X        closelog();
  1717. X        exit(0);
  1718. X      }
  1719. X      pathen = YES;            /* Enable Path name */
  1720. X      strcpy(mailpath, arg1);    /* Set the Path */
  1721. X      fprintf(errP,"&SP Path Set to %s\n", arg1);
  1722. X      break;
  1723. X    case CONTENTS:
  1724. X      fprintf(errP,"&CN Contents Request for %s\n", arg1);
  1725. X      if (!arg1[0])            /* Default value */
  1726. X        strcpy(arg1, ROOTD);
  1727. X      SendF(arg1, CONTENTSF);    /* Send File arg1/contents */
  1728. X      break;
  1729. X    case HELP:
  1730. X      fprintf(errP, "&HL Help Request for %s\n", arg1);
  1731. X      if (!arg1[0])
  1732. X        strcpy(arg1, INTROF);    /*Default value */
  1733. X      SendF("help", arg1);
  1734. X      break;
  1735. X    case SEND:
  1736. X      fprintf(errP, "&SR Send Request: %s %s\n", arg1, arg2);
  1737. X      if (!arg1[0])         /* Fill Default values */
  1738. X        strcpy(arg1, HELPD);
  1739. X      if (!arg2[0])
  1740. X        strcpy(arg2, CONTENTSF);
  1741. X      SendF(arg1, arg2);
  1742. X      break;
  1743. X    case RECEIVE:
  1744. X      fprintf(errP, "&RR *** Receive Request: %s %s\n", arg1, arg2);
  1745. X      if (!arg1[0])            /* Default Values */
  1746. X        strcpy(arg1, VOLF);
  1747. X      if (!arg2[0])
  1748. X        strcpy(arg2, FILEF);
  1749. X      ReceiveF(arg1, arg2, msgl->next);
  1750. X      closelog();
  1751. X      exit(1);            /* Stop Parsing NOW! */
  1752. X    case INDEX:
  1753. X      fprintf(errP, "&IR Index Request %s\n", arg1);
  1754. X      if (!arg1[0])         /* Default Value */
  1755. X        strcpy(arg1, DINDEX);
  1756. X      if (!chkpath(arg1)) 
  1757. X        sendIndex(arg1);
  1758. X      break;
  1759. X    case BENCODE:
  1760. X      fprintf(errP, "&BE Set B-Encoding to %s\n", arg1);
  1761. X      if (!arg1[0])            /* Default Encoder */
  1762. X        bcode = DENCODE;
  1763. X      else
  1764. X        setbcode(arg1);
  1765. X      break;
  1766. X    case MAXSIZE:
  1767. X      fprintf(errP, "&MS Set Max Message Size to %s\n",arg1);
  1768. X      if (!arg1[0])            /* Default size */
  1769. X        maxsize = 0;
  1770. X      else                /* Set size */
  1771. X        maxsize = atoi(arg1);
  1772. X      break;
  1773. X    case END:
  1774. X      fprintf(errP, "&XX End Parsing\n");
  1775. X      closelog();
  1776. X      exit(1);
  1777. X    }
  1778. X    }
  1779. X    msgl = msgl->next;
  1780. X  }
  1781. X  closelog();
  1782. X}
  1783. X
  1784. X/*
  1785. X * Closes the Logfile and appends it to the "real" log file
  1786. X *
  1787. X */
  1788. Xcloselog()
  1789. X{
  1790. X  FILE *errP2;
  1791. X  int key;                /* Stamp Run time */
  1792. X  fprintf(errP, "<ME M-Server end.  Run time = %ld seconds\n",
  1793. X      time((time_t *)0) - tod);
  1794. X  fclose(errP);
  1795. X  if (!(errP2 = fopen(logf, "r")))    /* Append Log entry */
  1796. X    exit(0);
  1797. X  if (!(errP = fopen(LOGFILE, "a")))
  1798. X    exit(0);
  1799. X  while ((key = getc(errP2)) != EOF)   
  1800. X    putc(key,errP);
  1801. X  fclose(errP);
  1802. X  fclose(errP2);
  1803. X  unlink(logf);                /* Clean up tmp log entry */
  1804. X}
  1805. X
  1806. X/*
  1807. X * SendF(char *volume, char *file)
  1808. X *    Wrapper for the send file function
  1809. X * (Prepares the way for sendfile)
  1810. X */
  1811. XSendF(volume, file)
  1812. X     char *volume,            /* Directory to send things from */
  1813. X          *file;            /* File to send */
  1814. X{
  1815. X  if (chkpath(volume))            /* Check for weird Volume name */
  1816. X    return;                /* File checking done by sendfile */
  1817. X  if (chdir(volume)) {            /* Can't access that volume? */
  1818. X    fprintf(errP, "$BV Bad Volume %s\n", volume);
  1819. X    sendMSG("Cant access volume %s", volume);
  1820. X    return;
  1821. X  }                    /* Log and send file */
  1822. X  fprintf(errP, "#TS To Send %s %s\n", volume, file);
  1823. X  sendfile(file, mailpath, bcode, maxsize);
  1824. X  enterdir();                /* Return to the Home directory */
  1825. X}
  1826. X
  1827. X/*
  1828. X * sendIndex(char *volume) Sends the "ls -l" of the volume
  1829. X */
  1830. XsendIndex(volume)
  1831. X     char *volume;            /* Directory we are interested in */
  1832. X{
  1833. X  char auxb[L_TSTR];            /* SH command */
  1834. X  struct stat st_bff;            /* Stat, find if named volume exists */
  1835. X
  1836. X  if (chkpath(volume))             /* Check for strange File Paths */
  1837. X    return;
  1838. X  if (stat(volume, &st_bff) || !(st_bff.st_mode & S_IFDIR)) {
  1839. X                    /* Check if directory exists */
  1840. X
  1841. X    fprintf(errP, "$BV Bad Volume %s\n", volume);
  1842. X    sendMSG("Cant access volume %s", volume);
  1843. X    return;
  1844. X  }
  1845. X  sprintf(auxb, MAILLS, volume, SBJ_INDXACK, volume, mailpath);
  1846. X  if (system(auxb))
  1847. X    fprintf(errP, "$VF Cannot mail ls-l (Can't Fork?)\n");
  1848. X}
  1849. X
  1850. X/*
  1851. X * ReceiveF(char *volume, char *file)
  1852. X * Receives a file through mail and stores it in the incomming directory
  1853. X */
  1854. XReceiveF(volume, file)
  1855. X     char *volume,            /* Receiving volume */
  1856. X          *file;            /* Receiving file */
  1857. X{
  1858. X  FILE *fp;                /* File Pointer for input file */
  1859. X  char fname[TSTR],            /* Receiving storage filename */
  1860. X       *p,                /* Used to parse the filename */
  1861. X       auxb[L_TSTR];            /* Command buffer */
  1862. X  if (chdir(INCOMING)) {        /* Oops with incoming directory */
  1863. X    fprintf(errP, "$CI Can't enter incoming directory!!!\n");
  1864. X    closelog();                /* Exit NOW! */
  1865. X    exit(0);
  1866. X  }
  1867. X  strcpy(fname, volume);        /* Create the storage filename */
  1868. X  strcat(fname, "/");               
  1869. X  strcat(fname, file);
  1870. X  p = fname;
  1871. X  while (*p) {                /* Convert any "/"s to ":"s */
  1872. X    if (*p == '/')
  1873. X      *p  = ':';
  1874. X    p++;
  1875. X  }
  1876. X  if (isreadable(fname)) {        /* File of the same name exist */
  1877. X    char ftmp[TSTR];            /* Create a numbered version of it */
  1878. X    int    genno;
  1879. X    genno = 0;
  1880. X    do {
  1881. X      sprintf(ftmp, "%s.%-02d", fname, genno++);
  1882. X    } while (isreadable(ftmp));
  1883. X    strcpy(fname,ftmp);
  1884. X  }
  1885. X  if (!(fp = fopen(fname, "w"))) {
  1886. X    fprintf(errP, "$IF Can't open incoming file %s\n", fname);
  1887. X    closelog();
  1888. X    exit(0);
  1889. X  }
  1890. X  fprintf(errP, "#RF Receiving file %s %s in %s\n", volume, file, fname);
  1891. X  fprintf(fp, "Received from %s at %s", mailpath, ctime(&tod));
  1892. X  fprintf(fp, "Program name: %s/%s      Archive Name: %s\n",
  1893. X      volume, file, fname);
  1894. X  fprintf(fp, 
  1895. X      "--------Cute Here--------Cute Here---------Cute Here---------\n");
  1896. X  writemsg(root, fp);
  1897. X/*
  1898. X * This function will save the whole file.  The reason is I want to save
  1899. X * the whole file for debugging purposes
  1900. X */
  1901. X
  1902. X  fclose(fp);
  1903. X  writeAck(file, volume, mailpath, errP);
  1904. X  writeRnt(fname, volume, file, mailpath, ctime(&tod), errP);
  1905. X  enterdir();                    /* Return to Main Directory */
  1906. X}
  1907. X
  1908. X  
  1909. X/*
  1910. X * n_bcode
  1911. X *   List of supported encoding packages
  1912. X */
  1913. Xstatic char *n_bcode[] = {
  1914. X  N_UUENCODE, N_BTOA, N_HEX, NULL
  1915. X};
  1916. X
  1917. X
  1918. X/*
  1919. X * setbcode(char *type)
  1920. X *   Change binary encoding system
  1921. X */
  1922. X
  1923. Xsetbcode(tp)
  1924. X     char *tp;
  1925. X{
  1926. X  char i;
  1927. X
  1928. X  for (i = 0; n_bcode[i] ; i++)
  1929. X    if (!strcasecmp(n_bcode[i], tp))
  1930. X      bcode = i;
  1931. X}
  1932. X
  1933. X/*
  1934. X * sendMSG(char *frmt, char *errcde)
  1935. X *   Sends A Mail message indicating what error was received.
  1936. X */
  1937. XsendMSG(frmt, errcde)
  1938. X     char *frmt,            /* Subject Format Template */
  1939. X          *errcde;            /* Error Code used */
  1940. X{
  1941. X  char auxb[L_TSTR],            /* Buffer for sh commnication */
  1942. X       subj[TSTR];            /* Buffer for building the subject) */
  1943. X  sprintf(subj, frmt, errcde);
  1944. X  sprintf(auxb, MAILERR, PREFIX, subj, PREFIX, subj, mailpath);
  1945. X  if (system(auxb)) 
  1946. X    fprintf(errP, "$VF Can't mail Error Report '%s' (Vfork failed?)\n", subj);
  1947. X}
  1948. X
  1949. X/*
  1950. X * errlog(char *fmt, char *errcde)
  1951. X *    Log errors to the log file
  1952. X */
  1953. Xerrlog(fmt, errcde)
  1954. X     char *fmt,                /* Template for generating text */
  1955. X          *errcde;            /* Text for error message */
  1956. X{
  1957. X  fprintf(errP, fmt, errcde);        /* Log Error Message */
  1958. X}
  1959. X
  1960. X/*
  1961. X *  sendWRN(char *dirn)
  1962. X *    Sends a message indicating that dirn is a directory and the files in
  1963. X *  there will be following soon
  1964. X */
  1965. XsendWRN(dirn)
  1966. X     char *dirn;
  1967. X{
  1968. X  writewarn(dirn, mailpath, errP);
  1969. X}
  1970. X
  1971. END_OF_parse.c
  1972. if test 9307 -ne `wc -c <parse.c`; then
  1973.     echo shar: \"parse.c\" unpacked with wrong size!
  1974. fi
  1975. # end of overwriting check
  1976. fi
  1977. if test -f sendfile.c -a "${1}" != "-c" ; then 
  1978.   echo shar: Will not over-write existing file \"sendfile.c\"
  1979. else
  1980. echo shar: Extracting \"sendfile.c\" \(13323 characters\)
  1981. sed "s/^X//" >sendfile.c <<'END_OF_sendfile.c'
  1982. X/*******
  1983. X * sendfile.c                            *
  1984. X *   Implements an "smart" file mailer.        *
  1985. X                     ********/
  1986. X#include <sys/types.h>            /* For SYSTEM calls */
  1987. X#include <sys/stat.h>
  1988. X#include <stdio.h>            /* Obvious huh? */
  1989. X#include <dirent.h>            /* Directory Functions */
  1990. X#include <ctype.h>            /* For Scanning files */
  1991. X#include "server_strs.h"        /* Strings to use */
  1992. X#include "mazesym.h"            /* Standard symbols */
  1993. X/*#include "bencode.h"*/
  1994. X
  1995. X/*
  1996. X * int sendfile(char *fname, char *rpath, char bcode, long size)
  1997. X *   Mails a file to an address.
  1998. X *  fname points to the full path of the filename (Or the path relative
  1999. X *    to the current directory)
  2000. X *  rpath points to the mail return path
  2001. X *  bcode number representing the preferred binary encoding mechanism
  2002. X *  size  is the maximum size in bytes of a single mail message (If size
  2003. X *  is zero, the maximum size is taken to be infinity)
  2004. X *   FIRST, the stat's for the file are checked, to see
  2005. X *    1) Read Permission
  2006. X *        If not allowed to read, we give out a message
  2007. X *    2) Filetype
  2008. X *        If it is a directory we go to a special routine to
  2009. X *        handle those cases
  2010. X *        If it is a symlink we read the link and try again.
  2011. X *   the file is scanned (and copied to /tmp) to see if it
  2012. X *   contains binary data.
  2013. X *   if the file contains binary data the "bcode" is checked to see what
  2014. X *   routine is to be used to encode the binary data.
  2015. X *   The file is again checked for size.  If the file exceeds the
  2016. X *   limit we use an alternate routine that splits and mail.
  2017. X *   We just mail the message.
  2018. X */
  2019. X
  2020. Xsendfile(fname, rpath, bcode, maxsiz)
  2021. X     char *fname,    /* Filename to send */
  2022. X          *rpath,    /* Where to send the mail to */
  2023. X      bcode;    /* Binary encoding method  (Defined in "bencode.h")*/
  2024. X     unsigned long maxsiz; /* Max message size (0 = infinity) */
  2025. X{
  2026. X  struct stat st_bff;    /* stat buffer */
  2027. X  int i;        /* Multi purpose index */
  2028. X  FILE *fp, *fb;    /* Pointer to file for filescans and copies */
  2029. X  char tname[L_tmpnam], /* Buffer for Temp filename */
  2030. X       auxb[L_TSTR],    /* Buffer for Communicating with system shell */
  2031. X       isbin = NO;    /* Flag to indicate if it is a binary file */
  2032. X
  2033. X  if (chkpath(fname))            /* Check for Strange File Paths */
  2034. X    return;
  2035. X  if (stat(fname, &st_bff)) {        /* Get the file permissions */
  2036. X    strcat(fname, ".Z");        /* If couldnt find first time assume */
  2037. X    if (stat(fname, &st_bff)) {        /* Compressed filename */
  2038. X      errlog("$FN File Not Found %s\n", fname);
  2039. X      sendMSG("%s: File Not Found", fname);
  2040. X      return;
  2041. X    }
  2042. X  }
  2043. X
  2044. X  if (st_bff.st_mode & S_IFDIR) {    /* Check if it is a directory */
  2045. X    senddir(fname, rpath, bcode, maxsiz);
  2046. X    return;
  2047. X  }
  2048. X
  2049. X  if (!isreadable(fname)) {        /* Check if we have read access */
  2050. X    errlog("$NA Can't Access %s\n", fname);
  2051. X    sendMSG("Sorry, you dont have access to the file %s", fname);
  2052. X    return;
  2053. X  }
  2054. X
  2055. X  tmpnam(tname);            /* Create a temporary file name */
  2056. X  if (fname[(i = strlen(fname) -1)] == 'Z' && fname[i - 1] == '.') {
  2057. X                    /* Check if it is a compressed file */
  2058. X    fname[i-1] = '\000';         /* Get Rid of .Z suffix */
  2059. X    sprintf(auxb, ZCATCMD, fname, tname);
  2060. X    if (system(auxb)) {            /* Uncompress file */
  2061. X      errlog("$VF Can't vfork %s process\n", "zcat");
  2062. X      sendMSG("Cant send file %s for lack of resources. (Try again later)",
  2063. X          fname);
  2064. X      return;
  2065. X    }
  2066. X    if (!(fp = fopen(tname, "r"))) {    /* Non-copy scanfile */
  2067. X      errlog("$SE System Error %s\n", fname);
  2068. X      sendMSG("System Error Detected, for file: %s, try again later", fname);
  2069. X      return;
  2070. X    }
  2071. X    while ((i = getc(fp)) != EOF && !isbin)
  2072. X      if (!isprint(i) && i != '\n' && i != '\t' && i != '\f')
  2073. X    isbin = YES;
  2074. X    fclose(fp);
  2075. X  }
  2076. X  else {
  2077. X    if (!(fp = fopen(fname, "r"))) {    /* Scan file and copy it to temp */
  2078. X      errlog("$NA Can't Access %s\n", fname);
  2079. X      sendMSG("Sorry, you dont have access to the file %s", fname);
  2080. X      return;
  2081. X    }
  2082. X    if (!(fb = fopen(tname, "w"))) {
  2083. X      errlog("$SE System Error on fopen %s\n", tname);
  2084. X      sendMSG("System Error Detected, for file  %s, try again later", fname);
  2085. X      fclose(fp);
  2086. X      return;
  2087. X    }
  2088. X    while ((i = getc(fp)) != EOF) {
  2089. X      if (!isprint(i) && i != '\n' && i != '\t' && i != '\f')
  2090. X    isbin = YES;
  2091. X      if (putc(i, fb) == EOF) {
  2092. X    errlog("$ND No diskspace? for tfile %s\n", tname);
  2093. X    sendMSG("Cant send file %s for lack of diskspace, try again later",
  2094. X        fname);
  2095. X    fclose(fb);
  2096. X    fclose(fp);
  2097. X    unlink(tname);
  2098. X    return;
  2099. X      }
  2100. X    }
  2101. X    fclose(fb);
  2102. X    fclose(fp);
  2103. X  }
  2104. X
  2105. X  if (isbin)             /* It was binary so we have to encode file */
  2106. X    if (bencode(tname, bcode, fname)) {
  2107. X      errlog("$BE Bad Binary Encoding for %s\n", tname);
  2108. X      sendMSG("Cant send file %s for lack of diskspace, try again later",
  2109. X          fname);
  2110. X      return;
  2111. X    }
  2112. X
  2113. X  if (maxsiz) {                   /* Check for file size */
  2114. X    if (stat(tname, &st_bff)) {
  2115. X      errlog("$SE System Error %s\n", fname);
  2116. X      sendMSG("System Error Detected, for file %s, try again later", fname);
  2117. X      unlink(tname);
  2118. X      return;
  2119. X    }
  2120. X    if (st_bff.st_size > maxsiz) {
  2121. X                /* Too big, need a different method to send */
  2122. X      sendsplit(tname, fname, maxsiz, rpath);
  2123. X      return;
  2124. X    }
  2125. X  }
  2126. X  sprintf(auxb, MAILSENDF, SBJ_SENDACK, fname, rpath, tname);
  2127. X  errlog("#SF Sending file %s\n", fname);
  2128. X  if (system(auxb))         /* Mail the file Over */
  2129. X    errlog("$ME mail: Can't fork? for %s\n", fname);
  2130. X  unlink(tname);        /* Clean up our mess */
  2131. X}
  2132. X
  2133. X/*
  2134. X * int senddir(char *dirname, char *mailpath, char bcode, unsigned long maxsiz)
  2135. X *  This function is called by sendfile whenever it encounters a directory.
  2136. X *  What it does, is, it first opens the directory (thus finding out that it
  2137. X *  is readable)  Mails a message
  2138. X *  Starts reading the directory.  For eachfile, it will call sendfile
  2139. X *  (recursion) to do the actual work.
  2140. X */
  2141. Xsenddir(dirname, mailpath, bcode, maxsiz)
  2142. X     char *dirname,        /* name of the directory */
  2143. X          *mailpath,        /* Who will get the mail */
  2144. X          bcode;        /* This and maxsiz are passed directly */
  2145. X     int  maxsiz;        /* to sendfile */
  2146. X{
  2147. X  DIR *Dp;            /* Directory pointer */
  2148. X  struct dirent *dp;        /* Directory entry */
  2149. X  char fname[L_TSTR];        /* Buffer for building filenames */
  2150. X
  2151. X  if (!(Dp = opendir(dirname))) {    /* Read directory */
  2152. X    errlog("$NA No Access to %s\n", dirname);
  2153. X    sendMSG("Sorry, you don't have access to that directory %s", dirname);
  2154. X    return;
  2155. X  }
  2156. X  errlog("#OD Opening Directory %s\n", dirname);
  2157. X  sendWRN(dirname);
  2158. X  for (dp = readdir(Dp); dp != NULL; dp=readdir(Dp))
  2159. X    if (strcmp(".",dp->d_name) && strcmp("..",dp->d_name)) { 
  2160. X                               /* Don't process "." or ".." */
  2161. X      strcpy(fname, dirname);    /* For each file, "sendfile" it! */
  2162. X      strcat(fname, "/");
  2163. X      strcat(fname, dp->d_name);
  2164. X      sendfile(fname, mailpath, bcode, maxsiz);
  2165. X    }
  2166. X}
  2167. X
  2168. X/*
  2169. X * int sendsplit(char *tname, char *fname, unsigned long maxsiz, char *rpath)
  2170. X * This routine will send the file "tname" as "fname" but it will also split
  2171. X * it so it will be less than "maxsiz". Upon completion, it will unlink
  2172. X * tname and any extra junk files.
  2173. X *
  2174. X * (NOTE, we assume reasonably sized line lengths)
  2175. X */
  2176. X/* We use the following template for the sending files 
  2177. X#!/bin/sh
  2178. X#-------------------Cut Here And "sh file"--------------------------------
  2179. XPATH=/bin:/usr/bin:/usr/ucb ; export PATH
  2180. Xif test -f XFNAMEX -a "${1}" != "-c" ; then 
  2181. X  echo shar: Will not over-write existing file \"XFNAMEX\"
  2182. Xelse
  2183. Xecho shar: Extracting \"XFNAMEX\" \(56 characters\)
  2184. Xsed "s/^X//" >XFNAMEX <<'END_OF_FILE'
  2185. XX
  2186. XX I N S E R T    X F N A M E X     I N    H E R E
  2187. XX
  2188. XEND_OF_FILE
  2189. Xif test SIZE -ne `wc -c <XFNAMEX`; then
  2190. X    echo shar: \"XFNAMEX\" unpacked with wrong size!
  2191. Xfi
  2192. Xfi
  2193. Xecho shar: End of shell archive.
  2194. Xexit 0
  2195. X*/
  2196. X
  2197. Xsendsplit(orgnme, nicenme, maxsize, rpath)
  2198. X     char *orgnme,        /* File to send */
  2199. X          *nicenme,            /* Name to put in the subject line */
  2200. X          *rpath;            /* Mail Path to use */
  2201. X     unsigned long maxsize;    /* Max message size */
  2202. X{
  2203. X  char tname[L_tmpnam],        /* Buffer where to store temp name */
  2204. X       niceprt[TSTR];        /* String to build part filenames */
  2205. X  unsigned short partc = 0;     /* Part count number */
  2206. X  unsigned long sizek = 0;    /* Message Size Count */
  2207. X  int keyc;            /* Used for file reading */
  2208. X  FILE *fin, *fout;        /* Files used for I/O */
  2209. X
  2210. X  errlog("#PS Prepare Split Send of %s\n", nicenme);
  2211. X  tmpnam(tname);        /* Build Temp filename */
  2212. X  if (!(fin = fopen(orgnme, "r"))) {
  2213. X                /* Open the file to split */
  2214. X    errlog("$SE splitsend Can't open org file %s\n", orgnme);
  2215. X    sendMSG("System Error Detected, for file %s, try again later", nicenme);
  2216. X    unlink(orgnme);
  2217. X    return;
  2218. X  }
  2219. X  while ((keyc = getc(fin)) != EOF) {
  2220. X                    /* Create Output files */
  2221. X    if (!sizek) {        /* Do we need to open a new output file? */
  2222. X      if (!(fout = fopen(tname, "w"))) {
  2223. X                /* Couldn't Open it! */
  2224. X    errlog("$NO splitsend Can't open out file %s\n", tname);
  2225. X    sendMSG("Cant send file %s (lack of diskspace),try again later",
  2226. X        nicenme);
  2227. X    fclose(fin);
  2228. X    unlink(orgnme);
  2229. X    return;
  2230. X      }                /* Copy the Start of the SHAR file */
  2231. X      sprintf(niceprt, "%s.%-02d", nicenme, partc);
  2232. X      fprintf(fout,"#!/bin/sh\n");
  2233. X      fprintf(fout,
  2234. X          "#---------------Cute here and \"sh file\"------------------\n");
  2235. X      fprintf(fout,
  2236. X          "#Wrapping by Alex C. Liu and his very naive and cumbersome\n");
  2237. X      fprintf(fout,"#DummySplitShar!\n");
  2238. X      fprintf(fout,"PATH=/bin:/usr/bin:/usr/ucb ; export PATH\n");
  2239. X      fprintf(fout,"if test -f %s -a \"${1}\" != \"-c\" ; then\n", niceprt);
  2240. X      fprintf(fout,
  2241. X          "   echo shar: Will not over-write existing file \\\"%s\\\"\n",
  2242. X          niceprt);
  2243. X      fprintf(fout,"else\n");
  2244. X      fprintf(fout,"echo shar: Extracting \\\"%s\\\"\n", niceprt);
  2245. X      fprintf(fout,"sed \"s/^X//\" > %s <<'END_OF_FILE'\nX", niceprt);
  2246. X    }
  2247. X    if (putc(keyc, fout) == EOF) {
  2248. X                /* Just copy the files */
  2249. X      errlog("$ND splitsend Can't write file  %s\n", tname);
  2250. X      sendMSG("Cant send file %s (lack of diskspace),try again later",
  2251. X          nicenme);
  2252. X      fclose(fin);
  2253. X      fclose(fout);
  2254. X      unlink(tname);
  2255. X      unlink(orgnme);
  2256. X      return;
  2257. X    }
  2258. X    sizek++;
  2259. X    if (keyc == '\n') {
  2260. X      if (sizek < maxsize)    /* Only check sizes at the end of a line */
  2261. X    putc('X',fout);
  2262. X      else {
  2263. X    endfout(fout, sizek, niceprt, partc, tname, rpath, NO);
  2264. X    partc++;
  2265. X    sizek=0;
  2266. X      }
  2267. X    }
  2268. X  }
  2269. X  sizek++;            /* We append an extra LF just in case */
  2270. X  putc('\n', fout);
  2271. X  endfout(fout, sizek, niceprt, partc, tname, rpath, YES);
  2272. X  fclose(fin);            /* Clean up the mess */
  2273. X  unlink(tname);
  2274. X  unlink(orgnme);
  2275. X}
  2276. X
  2277. X/*
  2278. X * This routine should have been part of the sendsplit routine, it simply
  2279. X * outputs the EOF indicator and the size test of the SHAR file
  2280. X *
  2281. X */
  2282. Xendfout(fout, sizek, niceprt, partc, tname, rpath, flast)
  2283. X  FILE *fout;                /* Ouput File Pointer */
  2284. X  unsigned long sizek;            /* Estimated file size for test */
  2285. X  unsigned short partc;            /* Number of part we are ending */
  2286. X  char *niceprt,            /* Nice Printable file name for part */
  2287. X       *tname,                /* Actual file name */
  2288. X       *rpath,                /* Mail Return Path */
  2289. X       flast;                /* Flag Last File */
  2290. X{
  2291. X  char auxb[L_TSTR];            /* Buffer for building sh command */
  2292. X  fprintf(fout, "END_OF_FILE\n");    /* Display EOF for shar file */
  2293. X  fprintf(fout, "if test %d -ne `wc -c < %s`; then\n", sizek, niceprt);
  2294. X  fprintf(fout, "    echo shar: \\\"%s\\\" unpacked with wrong size!\n",
  2295. X      niceprt);
  2296. X  fprintf(fout, "fi\nfi\n");
  2297. X  if (flast) {
  2298. X    fprintf(fout, "echo 'shar: End of Part%-02d (Last Part)'\n", partc);
  2299. X    fprintf(fout,
  2300. X        "echo 'shar: Now simply concatenate (cat) the files together!'\n");
  2301. X  }
  2302. X  else 
  2303. X    fprintf(fout, "echo shar: End of shell archive part%-02d\n", partc);
  2304. X  fprintf(fout, "exit 0\n");
  2305. X  fclose(fout);
  2306. X  errlog("#SS Sending Part %s\n", niceprt);
  2307. X  sprintf(auxb, MAILSENDS, SBJ_SENDSACK, niceprt, rpath, tname);
  2308. X  if (system(auxb))         /* Mail the file Over */
  2309. X    errlog("$ME mail: Can't fork? for %s\n", niceprt);
  2310. X}
  2311. X
  2312. X/*
  2313. X * int isreadable(char *file)
  2314. X *   Returns non-zero if the file is readable, otherwise it returns NULL
  2315. X * (It simply FOPENS  the file to tell if it is readable or not.
  2316. X */
  2317. Xisreadable(fx)
  2318. X     char *fx;
  2319. X{
  2320. X  FILE *rv;            /* Store the Return Value from FOPEN */
  2321. X  if (rv = fopen(fx, "r"))    /* Try to open the file */
  2322. X    fclose(rv);            /* If succeed, we close it */
  2323. X  return((int)rv);        /* Return the results of the fopen */
  2324. X}
  2325. X
  2326. X/*
  2327. X * int chkpath(char *path)
  2328. X *   Checks a filename for funny things going on.  (i.e. security bugs)
  2329. X * returns non-zero in case of something bad happend
  2330. X * Also logs the stuff into the log file 
  2331. X *  It will check for a file beginning with "/" and "../"s inside the
  2332. X * filename.
  2333. X */
  2334. X
  2335. Xint chkpath(path)
  2336. X     char *path;
  2337. X{
  2338. X  char *current;
  2339. X  current = path;
  2340. X  if (*current == '/' || !strncmp(current, "../", 3)) {
  2341. X    sendMSG("Your file specification of %s is not a valid filename", path);
  2342. X    errlog("$IA ******* Intruder Alert *******  (%s)\n", path);
  2343. X    return(ERROR);
  2344. X  }
  2345. X
  2346. X  while (*(++current))
  2347. X    if (!strncmp(current, "/../", 4)) {
  2348. X      sendMSG("Your file specification of %s is not a valid filename", path);
  2349. X      errlog("$IA ******* Intruder Alert *******  (%s)\n", path);
  2350. X      return(ERROR);
  2351. X    }
  2352. X  current = path;
  2353. X  while (*current) {            /* Fix Quotes */
  2354. X    if (*current == '\'') {
  2355. X      errlog("$IA ******* Intruder Alert *******  (%s)\n", path);
  2356. X      *current = '.';
  2357. X    }
  2358. X    current++;
  2359. X  }
  2360. X  return(NOERROR);
  2361. X}
  2362. END_OF_sendfile.c
  2363. if test 13323 -ne `wc -c <sendfile.c`; then
  2364.     echo shar: \"sendfile.c\" unpacked with wrong size!
  2365. fi
  2366. # end of overwriting check
  2367. fi
  2368. if test -f strcase.c -a "${1}" != "-c" ; then 
  2369.   echo shar: Will not over-write existing file \"strcase.c\"
  2370. else
  2371. echo shar: Extracting \"strcase.c\" \(641 characters\)
  2372. sed "s/^X//" >strcase.c <<'END_OF_strcase.c'
  2373. X/**********
  2374. X * File: strcase.c
  2375. X *   Implements the case insensitive comparison described in the man page  *
  2376. X * But for some reason doesn't get linked to the  program.           *
  2377. X                                    *********/
  2378. X#include <ctype.h>
  2379. X
  2380. Xstrcasecmp( s1, s2)
  2381. X     char *s1, *s2;
  2382. X{
  2383. X  char c1, c2;
  2384. X  s1--;s2--;                 /* Predecrement pointers */
  2385. X  do {
  2386. X    if (isupper(c1 = *(++s1))) c1 = tolower(c1); /* Make the uppercase */
  2387. X    if (isupper(c2 = *(++s2))) c2 = tolower(c2);
  2388. X                    /* Lowercase (case insensitive) */
  2389. X    if (c1 - c2)            /* Compare characters */
  2390. X      return(s1 - s2);            /* They ARE differnet */
  2391. X  }  while (c1);
  2392. X  return(0);                /* They are the same */
  2393. X}
  2394. END_OF_strcase.c
  2395. if test 641 -ne `wc -c <strcase.c`; then
  2396.     echo shar: \"strcase.c\" unpacked with wrong size!
  2397. fi
  2398. # end of overwriting check
  2399. fi
  2400. if test -f TODO -a "${1}" != "-c" ; then 
  2401.   echo shar: Will not over-write existing file \"TODO\"
  2402. else
  2403. echo shar: Extracting \"TODO\" \(333 characters\)
  2404. sed "s/^X//" >TODO <<'END_OF_TODO'
  2405. XWe should directly tap into "sendmail" rather than use "mail" as a
  2406. Xintermediary.
  2407. X
  2408. XCreate Compile Options for BATCH mode
  2409. X
  2410. XI should be more careful when MALLOCating memory.  Currently we are not
  2411. Xfree'ing any of the stuff.  It is not that important since Unix will
  2412. Xdeallocate the memory for us, but I dunno about Xenix or other OS's...
  2413. END_OF_TODO
  2414. if test 333 -ne `wc -c <TODO`; then
  2415.     echo shar: \"TODO\" unpacked with wrong size!
  2416. fi
  2417. # end of overwriting check
  2418. fi
  2419. echo shar: End of shell archive.
  2420. exit 0
  2421. #! /bin/sh
  2422. # This is a shell archive.  Remove anything before this line, then unpack
  2423. # it by saving it into a file and typing "sh file".  To overwrite existing
  2424. # files, type "sh file -c".  You can also feed this as standard input via
  2425. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  2426. # will see the following message at the end:
  2427. #        "End of shell archive."
  2428. # Contents:  doc.shar
  2429. # Wrapped by acliu@skat.usc.edu on Fri Jan  5 15:45:22 1990
  2430. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  2431. if test -f doc.shar -a "${1}" != "-c" ; then 
  2432.   echo shar: Will not over-write existing file \"doc.shar\"
  2433. else
  2434. echo shar: Extracting \"doc.shar\" \(14911 characters\)
  2435. sed "s/^X//" >doc.shar <<'END_OF_doc.shar'
  2436. X#! /bin/sh
  2437. X# This is a shell archive.  Remove anything before this line, then unpack
  2438. X# it by saving it into a file and typing "sh file".  To overwrite existing
  2439. X# files, type "sh file -c".  You can also feed this as standard input via
  2440. X# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  2441. X# will see the following message at the end:
  2442. X#        "End of shell archive."
  2443. X# Contents:  binary.formats commands contents contribution intro
  2444. X# Wrapped by acliu@skat.usc.edu on Wed Dec 20 06:14:20 1989
  2445. XPATH=/bin:/usr/bin:/usr/ucb ; export PATH
  2446. Xif test -f binary.formats -a "${1}" != "-c" ; then 
  2447. X  echo shar: Will not over-write existing file \"binary.formats\"
  2448. Xelse
  2449. Xecho shar: Extracting \"binary.formats\" \(2370 characters\)
  2450. Xsed "s/^X//" >binary.formats <<'END_OF_binary.formats'
  2451. XXFILE: help binary.formats
  2452. XXLAST CHANGE: Dec 8th, 1989
  2453. XXVERSION: UX-Maze Server V2.0c
  2454. XX                   
  2455. XX         UX-Maze Encoded Binary File Formats
  2456. XX         ===================================
  2457. XX
  2458. XXIn order for one to be able to send binary data over 7bit connections
  2459. XXsuch as the ones in mail, one must be able to conver the Binary data
  2460. XXinto a more printable format and be able to put it back into binary.
  2461. XX
  2462. XXOne good think about computers, is that all standards aren't standard,
  2463. XXso  this server provides 3 different methods for encoding binary
  2464. XXinformation:
  2465. XX
  2466. XXuuencode
  2467. XX  This is the USENet's and UNIX's standard for sending binary data
  2468. XXover mail connections.  This is method is the default for the server.
  2469. XXFile's are expanded by 35% though.  Source code for decodeing
  2470. XXuuencoded files is available through this server in the file:
  2471. XX    unix-support uuencode
  2472. XX
  2473. XXbtoa
  2474. XX  This is a nice encoding programming originally distributed with the
  2475. XXUnix Compress package.  It is like uuencode, but it will expand the
  2476. XXfiles only 25%.  And also trys to compress strings of zeros into a
  2477. XXsingle character.  The source for this method is in:
  2478. XX    unix-support btoa
  2479. XX
  2480. XXhex
  2481. XX  This is a format I made up in order to help people who don't have
  2482. XXUnix or uudecoding capablities handy.  It is a very simple encoding
  2483. XXmethod, involving Binary->Hex conversion and some extra checksums
  2484. XXadded just because I wanted the protocol to look fancy.  Basicly, a
  2485. XXencoded file has the following form:
  2486. XX     ________________
  2487. XX    |Beginning of file
  2488. XX    |Some extra garbage
  2489. XX    |
  2490. XX    |hexf filename            <- Indicates that a hex file
  2491. XX    |:082345677667D87D8BC93            begins (Pretty much like
  2492. XXHex en-    |:03449A87C837F874B8374FF          the "begin" line in
  2493. XXcoded    |:033045BD311F34559302             uuencoding
  2494. XXbinary  |:0300040484993FA884BA6D
  2495. XXdata    |:1233BBC3349B33DFF4844
  2496. XX    | ^^|<----up to---->|^^
  2497. XX          ||    35 bytes     ||
  2498. XXNumbers <=++     in hex      ++=> Checksum
  2499. XXof bytes in        Mod256 addition of all
  2500. XXline (without)        bytes in the line w/o including
  2501. XXincluding the chksum      the byte count
  2502. XX    |:082345677667D87D8BC93
  2503. XX    |:03449A87C837F874B8374FF
  2504. XX    |:033045BD311F34559302
  2505. XX        |:0300040484993FA884BA6D
  2506. XX        |:1233BBC3349B33DFF4844
  2507. XX    |end                <- Indicates the end of the
  2508. XX    |Some more trailing garbage        hex file
  2509. XX    |________________
  2510. XXThis encoding method was design to be simple and at the same time
  2511. XXrobust.  So users from almost any o.s. will be able to write a
  2512. XXdecoder.
  2513. XEND_OF_binary.formats
  2514. Xif test 2370 -ne `wc -c <binary.formats`; then
  2515. X    echo shar: \"binary.formats\" unpacked with wrong size!
  2516. Xfi
  2517. X# end of overwriting check
  2518. Xfi
  2519. Xif test -f commands -a "${1}" != "-c" ; then 
  2520. X  echo shar: Will not over-write existing file \"commands\"
  2521. Xelse
  2522. Xecho shar: Extracting \"commands\" \(4272 characters\)
  2523. Xsed "s/^X//" >commands <<'END_OF_commands'
  2524. XXFILE: help commands
  2525. XXLAST CHANGE: Oct 29th, 1989
  2526. XXVERSION: UX-Maze Server V2.0c
  2527. XX
  2528. XX           UX-Maze Archive Server Command Requests
  2529. XX           =======================================
  2530. XX
  2531. XXThe UX-Maze File Server is a simple hook to the Unix's Sendmail
  2532. XXforwarding mechanism.  Mail Messages are piped to the program, and if
  2533. XXa Server Request is detected, the program will proceed to service any
  2534. XXrequests.  Requests are lines beginning with a keyboard and two or
  2535. XXless argumments.  You may put one several request in a message as long
  2536. XXas you put only one request per line.  Requests that the program
  2537. XXdoesn't understand are silently ignored.  Valid commands/requests are
  2538. XXas follows:
  2539. XX
  2540. XX(A word on notations.  Trough out this help system, Optional
  2541. XXparameters are denoted as surroned by [ ]s.  Volumes and directories
  2542. XXare treated as the same thing.  Note that Keywords are case
  2543. XXinsensitive but Filenames are NOT!)
  2544. XX
  2545. XXpath <mail path from server to user>
  2546. XX  Will set the mail return path to the word following the command.
  2547. XXAny other word is follwing the mail path is ignored.  This is used,
  2548. XXwhenever the Program is unable to find a suitable return address for
  2549. XXthe user.  Usually, you don't need to use this command, and just mail
  2550. XXyour request.  If after a reasonably length of time, you haven't get
  2551. XXany reply, you should try again, but specifing your path.
  2552. XX
  2553. XXhelp [topic]
  2554. XX  Will send you the help file on the topic that you specify in the
  2555. XXcommand line. Put ONE topic per line.  (Send a "help contents" to see a
  2556. XXlist of available files)
  2557. XX
  2558. XXbencode [uuencode|btoa|hex]
  2559. XX  Specifie what program to use when encoding binary files on mailing.
  2560. XXThey can be
  2561. XX   "uuencode"  the default (Unix standard)
  2562. XX   "btoa"      a non popular but VERY efficient method for encoding
  2563. XX            data (Uses btoa v4.0)
  2564. XX   "hex"       A Dumb and wasteful method, but very easy to decode.
  2565. XX               (Extremely portable!)
  2566. XXsee the file "help binary.formats" for more information
  2567. XX
  2568. XXmaxsize [number]
  2569. XX  Some mail connections will not allow messages above certain limit.
  2570. XXAs it often happens, there are several files that are way above this
  2571. XXlimit.  So in order to be sent, they would need to be splitted first.
  2572. XXThis command lets you specify, the ~maximum size for a file.  So when
  2573. XXthe file exceeds this limit it will be automatically splitted.  (Note
  2574. XXthat in case the maxsize is 0 (zero, the default) no size checking is
  2575. XXdone)
  2576. XX
  2577. XXcontents [volume_name]
  2578. XX  Will send a file explaining the contents of the specified volume.
  2579. XXIf the volume name is omitted it will send the contents file of the
  2580. XXhelp directory.  (Usually a list of all available volumes)
  2581. XX
  2582. XXindex [volume_name]
  2583. XX  Will send the output of a dir or 'ls -l' command.  If the
  2584. XXvolume_name is ommited, it will send the dir list  of the Archive's
  2585. XXroot directory, listing, the different directories.  This command will
  2586. XXprovide a more up-to-date listing of what's in a volume than with the
  2587. XXcontents command, with the disadvantage, that it does not contain
  2588. XXexplanation of the available files.
  2589. XX
  2590. XXsend [volume_name] [file_name]
  2591. XX  Will send the file 'file_name' in volume 'volume_name'.  If the
  2592. XXfile_name is not specified, it will send the contents of the
  2593. XX'volume_name'.  If neither is specified, it will send the list of
  2594. XXvolumes.  If the [file_name] is a directory, the server will send ALL
  2595. XXthe files in that directory.  Use the directory send option with care!
  2596. XXIf you wish to request individual files in a directory use as
  2597. XXfilename:  "directory/file_name"
  2598. XX  Also, the program will check if the file is binary.  If it is binary
  2599. XXit will use an encoding method chosen by the user with the "bencode"
  2600. XXcommand.  If no encoding method has been specified the server will as
  2601. XXa default send the file uuencoded.
  2602. XX  The user may also specified the maximum file size with the maxsize
  2603. XXcommand.  If the file is biffer than the allowed maximum, the program
  2604. XXwill automatically split the files and individually shar the parts for
  2605. XXyou.
  2606. XX
  2607. XXreceive [volume_name] [file_name]
  2608. XX  Will make the server to consider what follows after that line as a
  2609. XXFile submission.  And the file will be saved in the incomming
  2610. XXdirectory as:
  2611. XX    volume_name:file_name    or
  2612. XX    volume_name:file_name.# (where # is a number to avoid
  2613. XX   overwriting files)
  2614. XX
  2615. XXend
  2616. XX  This will stop the server for looking the rest of the message for
  2617. XXservice requests.
  2618. XX
  2619. XEND_OF_commands
  2620. Xif test 4272 -ne `wc -c <commands`; then
  2621. X    echo shar: \"commands\" unpacked with wrong size!
  2622. Xfi
  2623. X# end of overwriting check
  2624. Xfi
  2625. Xif test -f contents -a "${1}" != "-c" ; then 
  2626. X  echo shar: Will not over-write existing file \"contents\"
  2627. Xelse
  2628. Xecho shar: Extracting \"contents\" \(400 characters\)
  2629. Xsed "s/^X//" >contents <<'END_OF_contents'
  2630. XXFILE: help contents
  2631. XXLAST CHANGE: Dec 20th, 1989
  2632. XXVERSION: UX-Maze Server V2.0c
  2633. XX                   
  2634. XX              Current list of help files
  2635. XX
  2636. XXbinary.formats
  2637. XX==============
  2638. XX  Explanation of the binary encoding methods used by this program.
  2639. XX
  2640. XXcommands
  2641. XX========
  2642. XX  Explanation of commands
  2643. XX
  2644. XXcontribution
  2645. XX============
  2646. XX  Quick instructions on how to submit files to the server.
  2647. XX
  2648. XXintro
  2649. XX=====
  2650. XX  Quick introduction to the server.
  2651. XX
  2652. XEND_OF_contents
  2653. Xif test 400 -ne `wc -c <contents`; then
  2654. X    echo shar: \"contents\" unpacked with wrong size!
  2655. Xfi
  2656. X# end of overwriting check
  2657. Xfi
  2658. Xif test -f contribution -a "${1}" != "-c" ; then 
  2659. X  echo shar: Will not over-write existing file \"contribution\"
  2660. Xelse
  2661. Xecho shar: Extracting \"contribution\" \(1143 characters\)
  2662. Xsed "s/^X//" >contribution <<'END_OF_contribution'
  2663. XXFILE: help contribution
  2664. XXLAST CHANGE: Dec 8th, 1989.
  2665. XXVERSION: UX-Maze Server V2.0c
  2666. XX                   
  2667. XX          Submitting files using the UX-Maze Server
  2668. XX          =========================================
  2669. XX
  2670. XXAs with any user supported file database, its contents are as good as
  2671. XXits submissions by users.  So, if you have anything to share please,
  2672. XXdon't hesitate to submit it.
  2673. XX
  2674. XX        How to Submit files to the Mail Archive server
  2675. XX        ==============================================
  2676. XX
  2677. XXThe Mail-Archive-Server has provisions to receive file contributions
  2678. XXfrom users all over the net.  To do so, you have to Send mail to me,
  2679. XXwith a Subject line of:
  2680. XX   Subject: Mail-Archive-Request
  2681. XX
  2682. XXand at the beginning of your message (that is, BEFORE the file that
  2683. XXyou wish to submit) enter the following line:
  2684. XX   receive volume file  (VERY Improtant, if you don't put it, the
  2685. XXserver will not know what to do with your file and as a default it
  2686. XXwill erase it)
  2687. XX
  2688. XXInmediatly after that, insert the file that you want to submit.
  2689. XXPlease try to submit files in UUencoded format or Unix-Shar archives.
  2690. XXYou may send Plain ASCII files anytime though.
  2691. XX
  2692. XX          FEEL FREE TO SUBMIT STUFF ANYTIME
  2693. XX
  2694. XEND_OF_contribution
  2695. Xif test 1143 -ne `wc -c <contribution`; then
  2696. X    echo shar: \"contribution\" unpacked with wrong size!
  2697. Xfi
  2698. X# end of overwriting check
  2699. Xfi
  2700. Xif test -f intro -a "${1}" != "-c" ; then 
  2701. X  echo shar: Will not over-write existing file \"intro\"
  2702. Xelse
  2703. Xecho shar: Extracting \"intro\" \(4010 characters\)
  2704. Xsed "s/^X//" >intro <<'END_OF_intro'
  2705. XXFILE: help intro
  2706. XXLAST CHANGE: Dec 8th, 1989.
  2707. XXVERSION: UX-Maze Server V2.0c
  2708. XX
  2709. XX        Introduction to UX-Maze's Mail Archive Server
  2710. XX        =============================================
  2711. XX
  2712. XX                  DISCLAIMER
  2713. XX                  ----------
  2714. XX
  2715. XXAll the software in the UX-Maze Mail-Archive is provided AS IS with NO
  2716. XXWARRANTY.  I Cannot guarantee that it is good for any particular
  2717. XXpurpose, or even that it works.
  2718. XX
  2719. XXI try to attempt to examine the software submitted to me, but as with
  2720. XXall free software written by strangers, MAKE SURE YOU KNOW WHAT YOU'RE
  2721. XXINSTALLING BEFORE YOU INSTALL IT!
  2722. XX                   
  2723. XX               Server Software
  2724. XX                           ---------------
  2725. XX
  2726. XXThe way the Server is written, it is simply a "hook" to the sendmail
  2727. XXforwarding mechanism available in Unix.  The main program is written
  2728. XXin C but with some Shell script drivers and shell escapes.  The
  2729. XXsoftware is available from here, by requesting file:
  2730. XX   send unix-support server
  2731. XX
  2732. XXHow the Server Works:
  2733. XXTo make use of the server you have to send a Mail message to me,
  2734. XX<acliu@skat.usc.edu> and have a subject line:
  2735. XX   Subject: Mail-Archive-Request
  2736. XXTHIS IS VERY IMPORTANT!  If you don't have that line spelled exactly
  2737. XXlike that you won't get anything, and I will get a mailbox full of
  2738. XXjunk messages.  Somewhere along the header there should be a line
  2739. XXsaying:
  2740. XX   Return-Path: <your path from me to you>  (This can change from site
  2741. XX   to site, consult your local unix-mail guru for more info)
  2742. XXUsually, sendmail adds this automagically, but if it were not the
  2743. XXcase, you can specify a return path by puting a line in the body of
  2744. XXyour message saying:
  2745. XX   path <from me to you>
  2746. XX
  2747. XXIn the body of your message you put the Mail Archive request.  You can
  2748. XXput several request in a single message, one request per line.  The
  2749. XXfollowing request are honored:  (Send a "help commands" for details)
  2750. XX
  2751. XX   path <return path from to you>
  2752. XX       Forces M-AR to send the file to the mailing address specified
  2753. XX       in its argument
  2754. XX   help [topic]
  2755. XX       Sends help on the topic.  Default is this intro file. Make a
  2756. XX          help contents
  2757. XX       request for a list of what is available here.
  2758. XX   contents [volume]
  2759. XX       Sends the contents of the volume.  Defualt will send the list
  2760. XX       of available volumes AND the contents of the Help volume.
  2761. XX   index [volume]
  2762. XX       Sends the directory list of the volume.  Default will send the
  2763. XX       directory for help volume
  2764. XX   send [volume] [file]
  2765. XX       Sends the file on the specified volume.  Default Volume is
  2766. XX       help, and default file is contents.
  2767. XX   bencode [uuencode|btoa|hex]
  2768. XX       Default encoding method to send binary files. Whenever the
  2769. XX       server encounters binary data, it will use the latest bencode
  2770. XX       command to select what method to use.  (Default: uuencoding)
  2771. XX   maxsize [bytesize]
  2772. XX       Some mailer gateways will not accept messages larger than
  2773. XX       certain limit.  Whenever the file exceeds that limit, the
  2774. XX       server will split the file and shar the parts before sending
  2775. XX       them.  This command lets you define the max message size in
  2776. XX       bytes. (Default 0 = infinty)
  2777. XX   receive [volume] [file]
  2778. XX       Saves the message as if it were a submitted file.  (use this
  2779. XX       command to submit files to the server.)
  2780. XX   end
  2781. XX       Exits the server. (Optional)
  2782. XX
  2783. XXThe keywords are case insensitive BUT files are NOT.  So if you see a
  2784. XXfile named "gAMe" and you request "GamE".  You will get nothing!
  2785. XX
  2786. XX               Submitting files
  2787. XX               ================
  2788. XX
  2789. XX   The server allows other users to submit files to the server.  To do
  2790. XXthis, send a Server request as you would normally do, but instead of
  2791. XXsending normal request, you enter the following line:
  2792. XX
  2793. XX   receive volume file
  2794. XX
  2795. XXAnd after that, include a UUencoded/shar'ed version of the file you
  2796. XXare submitting.
  2797. XX
  2798. XXFor more info,
  2799. XX   help contribution
  2800. XX____________________________________________________________________
  2801. XXQuestions and suggestions, send them to the same address, but don't
  2802. XXput a Mail-Archive-Request subject line.  (Just think of it of yet
  2803. XXanother mail message)  
  2804. XEND_OF_intro
  2805. Xif test 4010 -ne `wc -c <intro`; then
  2806. X    echo shar: \"intro\" unpacked with wrong size!
  2807. Xfi
  2808. X# end of overwriting check
  2809. Xfi
  2810. Xecho shar: End of shell archive.
  2811. Xexit 0
  2812. END_OF_doc.shar
  2813. if test 14911 -ne `wc -c <doc.shar`; then
  2814.     echo shar: \"doc.shar\" unpacked with wrong size!
  2815. fi
  2816. # end of overwriting check
  2817. fi
  2818. echo shar: End of shell archive.
  2819. exit 0
  2820.  
  2821. ______________________________________________________________________
  2822. Alex C. Liu                   | INTERNET: acliu%skat@usc.edu
  2823. Voice: (213) 749-2730         | BITNET: acliu%skat@gamera
  2824. Q-Link: Alejandro             | UUCP: ...!usc!edu
  2825.  
  2826.