home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume31 / mbox / part09 < prev    next >
Encoding:
Text File  |  1992-07-09  |  60.6 KB  |  2,281 lines

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  3. Subject:  v31i025:  mbox - A BBS for UNIX and MINIX v1.6 PL10, Part09/11
  4. Message-ID: <1992Jul10.050454.27784@sparky.imd.sterling.com>
  5. X-Md4-Signature: 36fba9a16b021e51687011cc478594cd
  6. Date: Fri, 10 Jul 1992 05:04:54 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  10. Posting-number: Volume 31, Issue 25
  11. Archive-name: mbox/part09
  12. Environment: MINIX, ISC, ESIX, SVR3
  13. Supersedes: mbox: Volume 29, Issue 63-72
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # Contents:  Announce10a Installation etc/deutsch.shorth
  22. #   etc/english.shorth src/defs.h src/getline.c src/postfach.c
  23. #   src/proto.h src/suchen.c src/xmd.c
  24. # Wrapped by kent@sparky on Thu Jul  9 23:26:03 1992
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. echo If this archive is complete, you will see the following message:
  27. echo '          "shar: End of archive 9 (of 11)."'
  28. if test -f 'Announce10a' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'Announce10a'\"
  30. else
  31.   echo shar: Extracting \"'Announce10a'\" \(4767 characters\)
  32.   sed "s/^X//" >'Announce10a' <<'END_OF_FILE'
  33. XAnnouncement for the BBS-package ix/MBox 1.6 PL10a                 14.06.1992
  34. X
  35. X
  36. XThe package includes a BBS for UNIX. The following derivations and compilers
  37. Xhave been tested:
  38. X
  39. X- MINIX 386 (You have to have the 386 version!) with BCC
  40. X
  41. X- MINIX 386 with GCC 1.37 (with or w/o ESTDIO-patches)
  42. X
  43. X- ESIX SVR3 with CC (MSC) or GCC
  44. X
  45. X- ISC 2.21 with "Shared Libs"
  46. X
  47. X- DELL UNIX 2.1 SVR4 with GCC 2.1
  48. X
  49. XIf you don't have one of those systems or anything that's compatible to
  50. Xany of them, you may stop reading now!
  51. X
  52. XNOTE: The 64+64 limitation of Coherent and plain MINIX makes it impossible
  53. X      to run ix/MBox BBS! The BBS itself needs more than 170kB of memory!
  54. X
  55. X
  56. XFor all who are still reading, some other requirements. The ix/MBox uses
  57. Xsome UNIX services to stay compatible to the UNIX world and to make updates
  58. Xmore easy. You need:
  59. X
  60. X- a mailer like SMAIL (RMAIL) or UMAIL 
  61. X
  62. X- a news-package B/C-NEWS (INEWS) or WNEWS
  63. X
  64. X- a uucp-system like HDB, Taylor or MNXUUCP or UUCP1.2
  65. X
  66. X(The packages UMAIL and WNEWS are MINIX stuff by Fred v. Kempen, UUCP1.2
  67. Xis the (best) UUCP-package for MINIX by Will Rose)
  68. X
  69. X
  70. X  
  71. XYou're STILL (!) reading? Ok, now the features of the BBS. If you're missing
  72. Xa feature that is important for you, just talk to me. Maybe I've forgotten
  73. Xto mention it, or I'm able to offer it with the next patchlevel!
  74. X
  75. XThe BBS ...
  76. X
  77. X... uses NEWS to handle all boards/articles. You may use the BBS or your
  78. X    prevered newsreader to maintain the articles.
  79. X
  80. X... uses an internal mailer for mails between BBS-users.
  81. X
  82. X... uses (R/S)MAIL to receive/deliver mails from BBS-users to system-users
  83. X    of the same or foreigen sites and vice versa.
  84. X
  85. X... uses a variable command set. If you don't like the presetted commands,
  86. X    just change the config-file to have your own commands set.
  87. X
  88. X... all commands are fitted out with a user-level and a prototype-flag.
  89. X    You may have several commands with the same function, but only the
  90. X    commands with the prototype-flag set will be shown in the command-
  91. X    survey.
  92. X
  93. X... has "user defined commands". If you like to offer an external newsreader
  94. X    or mailer to your users, you only have to state that in a config-file.
  95. X
  96. X... is able to communicate in various languages. A german and an english
  97. X    language-file are delivered with this package. It takes about two or
  98. X    three hours to build language- and help-files for other countries.
  99. X
  100. X... offers PD-areas like all other boards. The trick is, that the articles
  101. X    in the PD-boards are including a pointer to the real PD-package. You
  102. X    are able to maintain that areas like all other boards. You don't have to
  103. X    copy your PD-directories!
  104. X   
  105. X... uses SX/SZ/SB and RX/RZ/RB as filetransfer protocols. Also ASCII up- 
  106. X    and download are available for text and PD transfer.
  107. X
  108. X... has it's own line-editor (B)LED. Users with higher level may use
  109. X    fullscreen-editors, of course. You only have to put all offered editors
  110. X    in a config-file.
  111. X
  112. X... offers games to the users. Again, there's a config-file, which
  113. X    includes the list of your online-games (rogue/nethack etc.).
  114. X
  115. X... may call a CHAT-program. If you don't have one, please tell me. I've
  116. X    a PD-mutliport-chat program, too. Otherwise you can use TALK or
  117. X    phone as a two-person chat.
  118. X
  119. X... is able to read Bellcore RTF (Richtext Format) and Qouted-Printable.
  120. X
  121. X... creates MIME-Headers. This, and the RTF-feature are the first steps to
  122. X    multimedia-mail. 
  123. X
  124. X... allows to change the headerfield of news-articles and mails. (Depending
  125. X    on userlevel, of course!)
  126. X
  127. X... allows to reedit articles, if you are the autor. If you are the sysop,
  128. X    you may reedit everything ;-)
  129. X
  130. X... is able to generate statistics on calls, downloads, news-articles.
  131. X
  132. X... builds hitlists on calls per user, downloads per file, etc.
  133. X
  134. X... contains a users database with online-maintenance-facility.
  135. X
  136. X... allows users to setup the BBS to hit their preferences. They may
  137. X    choose:
  138. X
  139. X    - TERMINAL      ANSI X3.64, VT100, VT52, Dump (have a look at TERMCAP)
  140. X
  141. X    - EDITOR        LED, VI, EMACS, PED, MINED (or whatever you offer)
  142. X
  143. X    - PROMPT        BOARD, TIME, RATES (with or w/o BELL)
  144. X
  145. X    - OUTPUT        TYPE, MORE, MORE with marks, direction, lines, etc. ...
  146. X
  147. X    - INTRO         INFOTEXT, STATE, both
  148. X       
  149. X    - SCANNER       DATE&TIME, DATE, change scanner date
  150. X
  151. X
  152. X... supports the following commands by default:
  153. X
  154. X    +, -, ACCOUNT, AREA, BOARD, CHAT, DIR, DATE, DELETE, DOWNLOAD, DIRECTION,
  155. X    EDIT, FINGER, FORWARD, GAMES, GOODBYE, HELP, MAIL, MACRO, MESSAGE, MINIX,
  156. X    PORTINFO, PROTOCOL, PM, READ, SETUP, SYSINFO, SIGNATURES, STATE,
  157. X    STATISTICS, SEARCH, TIME, USERS, UPLOAD, VERSION, WRITE
  158. X
  159. X
  160. X
  161. XLet's stop this list here. If you're interested, let me have a mail. I'll
  162. Xsend the package in six UUE-parts (each 60kB) to you.
  163. END_OF_FILE
  164.   if test 4767 -ne `wc -c <'Announce10a'`; then
  165.     echo shar: \"'Announce10a'\" unpacked with wrong size!
  166.   fi
  167.   # end of 'Announce10a'
  168. fi
  169. if test -f 'Installation' -a "${1}" != "-c" ; then 
  170.   echo shar: Will not clobber existing file \"'Installation'\"
  171. else
  172.   echo shar: Extracting \"'Installation'\" \(4213 characters\)
  173.   sed "s/^X//" >'Installation' <<'END_OF_FILE'
  174. X
  175. X
  176. X
  177. X
  178. X
  179. X
  180. X
  181. X            
  182. X
  183. X                 ix/MBox  R E A D M E
  184. X          Mailbox-Programm fuer UNIX(-Derivate)
  185. X            
  186. X               Volker Schuermann
  187. X              Wuppertal, FRG, 07.12.1991
  188. X
  189. X
  190. X
  191. X
  192. X
  193. X
  194. X
  195. X
  196. X
  197. X
  198. XFolgendes wird jetzt als bereits geschehen (!) vorausgesetzt:
  199. X
  200. X1. Wir befinden uns im zukuenftigen "Mailbox-HOME"-Verzeichnis (~HOME)
  201. X
  202. X2. Wir haben "root.root"-Permissions (sprich sind als "root" aktiv)
  203. X
  204. X3. Wir haben das Archiv "mbox.tar.Z" komplett ausgepackt und in etwa
  205. X   diese Verzeichnisse/Dateien erhalten:
  206. X
  207. X   ./TUTORIAL
  208. X   ./README
  209. X
  210. X   ./src/*.c
  211. X   ./src/*.h
  212. X   ./src/Makefile
  213. X   ./src/CROSSREF
  214. X
  215. X   ./etc/active
  216. X   .  
  217. X   .  
  218. X   .
  219. X   ./etc/users.data
  220. X
  221. X
  222. X   Das heisst "src" und "etc" sind Unterverzeichnisse von (~HOME) und
  223. X   "TUTORIAL" etc. befinden sich in (~HOME). Sollte das nicht der Fall
  224. X   sein, muessen wir diese Stuktur im (~HOME) entweder von Hand
  225. X   herstellen, oder das Archiv "mbox.tar.Z" nochmal an entsprechender
  226. X   Stelle auspacken!
  227. X
  228. X
  229. X
  230. XWir wechseln jetzt ins "./src"-Verzeichnis, um die MBox an ihre neue
  231. XUmgebung anzupassen. Zwei Dateien muessen bearbeitet werden:
  232. X
  233. X1. Das "Makefile", das einige Informationen zum verwendeten Betriebs-
  234. X   system erhalten muss. Es sollte genuegen die entsprechenden 
  235. X   Eintraege durch Entfernen des "#" in der ersten Spalte zu aktivieren
  236. X   bzw. durch Voranstellen eines "#" auszukommentieren.
  237. X
  238. X   Die Variablen OWNER und GROUP muessen auf Werte gesetzt werden, die
  239. X   z.B. denen von "/bin/su" entsprechen - OWNER.GROUP muss Zugriff auf
  240. X   alle NEWS-, MAIL- und UUCP-Dateien/Verzeichnisse haben ... maximale
  241. X   Prioritaet ist also Voraussetzung!
  242. X
  243. X   Wenn SETUID "root" fuer die MBox NICHT gewuenscht wird, haben wir
  244. X   viel, viel Arbeit vor uns. Offiziell MUSS die MBox mit SETUID
  245. X   "root" gefahren werden !
  246. X
  247. X
  248. X
  249. X2. Das Definitions-File "mbox.h", in dem alle system-spezifischen
  250. X   Informationen gespeichert werden. Alle Eintraege, deren Kommentar
  251. X   mit einem ">" beginnt, muessen geprueft bzw. geaendert werden -
  252. X   bei allen anderen ist Vorsicht angebracht!
  253. X
  254. X   Es empfielt sich von "mbox.h" eine Kopie anzufertigen, um bei evtl.
  255. X   Fehlschlaegen das Original zu Rate ziehen zu koennen!
  256. X   
  257. X
  258. X
  259. XJetzt kommen wir zum spannenden Teil der Aktion. Wir starten "make"
  260. Xund hoffen (den ueblichen Zauber lassen wir mal weg, denn Aberglaube
  261. Xist ganz, ganz schlecht - bringt Unglueck :-)
  262. X
  263. XWenn wir nicht allzuviel falsch gemacht haben bei der Anpassung der
  264. Xbeiden Dateien, sollte sich das "Makefile" irgendwann kommentarlos
  265. Xverabschieden und uns mit einem Schwung neuer Programme in $(BIN) 
  266. Xzuruecklassen:
  267. X
  268. X$(BIN)/mbox        die Mailbox 
  269. X$(BIN)/mb-daemon        ein Daemon der INDEX-Dateien aus NEWS bildet
  270. X$(BIN)/xmd              ein Programm das Post an Mailbox-User zustellt
  271. X$(BIN)/bled             ein "anstaendiger" Zeileneditor
  272. X
  273. Xmbrsh                   eine neue SHELL, die von der Mailbox genutzt wird
  274. X
  275. XSollten diese Programme nicht vorhanden sein, geht's zurueck an den Start.
  276. XEntweder haben wir uns einen "Make error" eingefangen (dann muessen wir
  277. Xuns "Makefile" nochmal vornehmen), oder wir haben in "mbox.h" einen dieser
  278. Xklassischen Syntax-Fehler fabriziert ... viel Spass beim Suchen!
  279. X
  280. X
  281. XSo, wenn wir hier angekommen sind, sollten wir uns ein paar Stunden Pause
  282. Xgoennen, denn jetzt kommt Arbeit auf uns zu. Herumexperimentieren wuerde
  283. Xuns nicht weit bringen, wir sollten in aller Ruhe das "TUTORIAL" lesen
  284. Xund versuchen die dort beschrieben Dateien anzupassen ...
  285. X
  286. XTrotzdem duerfen wir uns schonmal auf die Schulter klopfen, die erste
  287. XHuerde ist genommen!
  288. X
  289. XMfG Volker
  290. X
  291. X
  292. X
  293. XNachschlag: Die MINIX-Mailbox kommt mit der Version "rz 2.30" von Chuck
  294. XForsbergs RZ/SZ nicht klar. Auch wenn's uns nicht gefaellt, in diesem
  295. Xspeziellen Fall kommen wir um einen kleinen Patch nicht herum:
  296. X
  297. X1. Wir kopieren "rz.cdiff" nach "/usr/src/commands/zmodem"
  298. X
  299. X2. Wir wechseln ins "/usr/src/commands/zmodem"-Verzeichnis
  300. X
  301. X3. Mit dem Befehl "patch -cf rz.c rz.cdiff" bringen wir den Patch an
  302. X
  303. X4. Um sicher zu gehen kopieren wir wie folgt: "mv rz.c rz.c.old" und
  304. X   "mv rz.c~ rc.c"
  305. X
  306. X5. Ein "make" sorgt dafuer, dass die neue RZ/SZ-Version erstellt wird.
  307. X   Da RB/SB und RX/RX Links auf RZ/SZ sind, muessen diese Protokolle
  308. X   nicht gesondert behandelt werden.
  309. X
  310. XVORSICHT: Das gilt ausschliesslich fuer die Version "rz 2.30" !
  311. END_OF_FILE
  312.   if test 4213 -ne `wc -c <'Installation'`; then
  313.     echo shar: \"'Installation'\" unpacked with wrong size!
  314.   fi
  315.   # end of 'Installation'
  316. fi
  317. if test -f 'etc/deutsch.shorth' -a "${1}" != "-c" ; then 
  318.   echo shar: Will not clobber existing file \"'etc/deutsch.shorth'\"
  319. else
  320.   echo shar: Extracting \"'etc/deutsch.shorth'\" \(4720 characters\)
  321.   sed "s/^X//" >'etc/deutsch.shorth' <<'END_OF_FILE'
  322. X?                          Befehlsuebersicht (levelabhaengig)
  323. X? *                        Befehlsuebersicht (alle Befehle)
  324. XBefehl ?                   Informationen zu "Befehl"
  325. X
  326. X0                          Inhalt des Befehlspuffers
  327. X1-9                        Befehl aus dem Puffer abrufen
  328. X
  329. X+                          Wechseln ins naechste Brett mit neuen Artikeln
  330. X
  331. X-                          Wechseln ins vorherige Brett mit neuen Artikeln
  332. X
  333. XANRUFER                    Anruferprotokoll
  334. XANRUFER *                  Anruferprotokoll (komplett)
  335. XANRUFER #                  Statistik der Anrufe
  336. XANRUFER %                  Statistik der Anrufer (Hitliste)
  337. X
  338. XANSAGE                     Mitteilungstext anzeigen/aendern
  339. X
  340. XBRETT                      Bretter mit aktuellen Artikeln anzeigen
  341. XBRETT *                    Alle Bretter anzeigen (levelabhaengig)
  342. XBRETT **                   ALLE Bretter anzeigen                 
  343. XBRETT +                    Wechseln ins naechste Brett
  344. XBRETT -                    Wechseln ins vorherige Brett
  345. XBRETT !                    Aktuellen Brettnamen ausgeben
  346. XBRETT #                    Gruppen (Areas) ausgeben
  347. XBRETT ..           Innerhalb einer Gruppe ins vorherige Brett wechseln
  348. XBRETT Brettname            Ins Brett "Brettname" wechseln
  349. X
  350. XBRIEF User                 Persoenliche Nachricht an "User" senden
  351. XBRIEF Host!User            Persoenliche Nachricht an "User" auf "Host"
  352. X
  353. XCHAT                       Multiport Chatsystem
  354. X
  355. XDOWNLOAD                   Diese Funktion erlaubt es, Artikel und Programme
  356. X                           unter Protokoll-Kontrollen zu empfangen
  357. X
  358. XEDIT Artikel               Der Artikel mit der Nummer "Artikel" kann
  359. X                           nachtraeglich editiert werden 
  360. X
  361. XENDE               Mailbox verlassen
  362. XENDE *                     Mailbox verlassen (Scanner nicht aktuallisieren)
  363. X
  364. XGRUPPE +                   Zur nexten Gruppe einer Untergruppe
  365. XGRUPPE ++                  Zur nexten Gruppe
  366. XGRUPPE -                   Zur vorherigen Gruppe einer Untergruppe
  367. XGRUPPE --                  Zur vorherigen Gruppe
  368. X
  369. XHILFE                      Diese Kurzhilfe anzeigen
  370. XHILFE *                    Hilfstexte komplett ausgeben
  371. XHILFE Befehl               Hilfstext zum Befehl "Befehl" zeigen
  372. X
  373. XINHALT                     Index der aktuellen Artikel ausgeben
  374. XINHALT *                   Alle Artikel eines Brettes anzeigen
  375. X
  376. XLESEN                      Neue Artikel listen
  377. XLESEN *                    Alle Artikel listen
  378. XLESEN Artikel              Artikel mit der Nummer "Artikel" ausgeben
  379. XLESEN Artikel-Artikel      Artikel von Nummer "Artikel" bis "Artikel" zeigen
  380. X
  381. XLOESCHEN Artikel           Artikel Nummer "Artikel" loeschen
  382. XLOESCHEN Artikel-Artikel   Loeschen von "Artikel" bis "Artikel"
  383. X
  384. XMAKRO                      Makrovereinbarungen zeigen/aendern
  385. X
  386. XMINIX Shell-Befehl         Externes Kommando "Shell-Befehl" ausfuehren
  387. X
  388. XOUTDIAL                    Verbindung zu externen Hosts via Datex-P
  389. X
  390. XPM                         Ins persoenliche Verzeichnis wechseln
  391. X
  392. XPORTINFO                   Aktivitaeten der verschiedenen Terminals zeigen
  393. X
  394. XPOSTFACH                   Postfach einrichten
  395. X
  396. XRICHTUNG                   Leserichtung (alt <-> neu) aendern
  397. X
  398. XSCHREIBEN                  Artikel erfassen und speichern
  399. X
  400. XSETUP                      Persoenliche Anpassungen
  401. X
  402. XSPIELE               Verschiedene Spiele werden aufgelistet/aufgerufen
  403. X
  404. XSTATUS                     Ausgabe der eigenen Anpassungen
  405. X
  406. XSTATISTIK                  Datei-Statistik der versch. Bretter anzeigen
  407. XSTATISTIK *                Statistik komplett ausgeben
  408. XSTATISTIK $                Uebersicht der UUCP-Gebuehren 
  409. XSTATISTIK #                Protokoll der Downloads (PD-Bretter)
  410. XSTATISTIK %                Protokoll der Downloads (HITLISTE)
  411. X
  412. XSUCHEN Muster              Artikel eines Brettes nach "Muster" durchsuchen    
  413. X
  414. XSYSINFO                    Allgemeine Informationen zur Mailbox
  415. X
  416. XUNTERSCHRIFT               Unterschrift anzeigen/aendern
  417. X
  418. XUPLOAD                     Diese Funktion wird ueber den Befehl SCHREIBEN
  419. X                           automatisch aufgerufen
  420. X
  421. XUSER                       Userliste ausgeben
  422. XUSER *                     Userliste mit erweiteren Informationen
  423. XUSER #                     Userliste mit Up-/Download Verhaeltnis
  424. XUSER %                     Userliste zur Gebuehrenabrechnung
  425. XUSER Name                  Informationen ueber den Teilnehmern "Name"
  426. X
  427. XVERSION                    Versionsnummer ausgeben
  428. XVERSION *                  Versionsnummer und Definitionen ausgeben
  429. XVERSION #                  Versionsnummer und "Hall of Fame" ausgeben
  430. X
  431. XWEITERLEITEN               Weiterleitbare PMs anzeigen
  432. XWEITERLEITEN User          Weiterleitbare PM an "User" senden
  433. XWEITERLEITEN Artikel User  Artikel Nummer "Artikel" an "User" senden
  434. END_OF_FILE
  435.   if test 4720 -ne `wc -c <'etc/deutsch.shorth'`; then
  436.     echo shar: \"'etc/deutsch.shorth'\" unpacked with wrong size!
  437.   fi
  438.   # end of 'etc/deutsch.shorth'
  439. fi
  440. if test -f 'etc/english.shorth' -a "${1}" != "-c" ; then 
  441.   echo shar: Will not clobber existing file \"'etc/english.shorth'\"
  442. else
  443.   echo shar: Extracting \"'etc/english.shorth'\" \(4190 characters\)
  444.   sed "s/^X//" >'etc/english.shorth' <<'END_OF_FILE'
  445. X?                          reachable commands are shown 
  446. X? *                        all commands are shown
  447. Xcommand ?                  help on "command"
  448. X
  449. X0                          list command-buffers contents
  450. X1-9                        execute one of nine buffered commands 
  451. X
  452. X+                          go to the next board/group with NEW articles
  453. X
  454. X-                          go to the previous board/group with NEW articles
  455. X
  456. XACCOUNT               establish an account & a maildrop for a new user
  457. X
  458. XAREA +                     go to the next group of a subgroup
  459. XAREA ++                    go to the next group
  460. XAREA -                     go to a previous group of a subgroup
  461. XAREA --                    go to a previous group
  462. X
  463. XBOARD                      list boards with new articles
  464. XBOARD *                    list all boards depending on userlevel
  465. XBOARD **                   list ALL boards
  466. XBOARD +                    go to the next board
  467. XBOARD -                    go to the previous board
  468. XBOARD !                    display the name of the current board
  469. XBOARD #                    list areas in board
  470. XBOARD ..           step from one area to the previous one
  471. XBOARD boardname            jump to board "boardname"
  472. X
  473. XCHAT                       multiport chatsystem
  474. X
  475. XDATE               display current date
  476. X
  477. XDELETE               delete all your mail
  478. XDELETE article           delete article no. "article"
  479. XDELETE article-article       delete from "article" to "article"
  480. X
  481. XDIR                        index new articles
  482. XDIR *                      index ALL articles (of a board)
  483. X
  484. XDIRECTION                  reading direction OLD <> NEW ?
  485. X
  486. XDOWNLOAD                   receive a couple of articles under X-, Y-, Z-
  487. X                           or NONE-protocol 
  488. X
  489. XEDIT article               re-edit article no. "article"
  490. X
  491. XFINGER name                list infos about user "name"
  492. X
  493. XFORWARD                    list stored mails
  494. XFORWARD user               forward a stored mail to "user"
  495. XFORWARD article user       forward "article" to "user"
  496. X
  497. XGAMES               offer a (list of) game(s)
  498. X
  499. XGOODBYE               leave the BBS 
  500. X
  501. XHELP                       this shorthelp
  502. XHELP *                     display some pages of helpful descriptions
  503. XHELP command               show information on "command"
  504. X
  505. XMAIL user                  send mail to "user" 
  506. XMAIL host!user             send mail to "user" on system "host"
  507. XMAIL user@host.domain      send mail to "user" on system "host.domain"
  508. X
  509. XMACRO               display/declare macros
  510. X
  511. XMESSAGE                    show/change "hello" message
  512. X
  513. XMINIX OS-command           execute "OS-command" on MINIX-shell
  514. X
  515. XPORTINFO                   list all terminals, users, activities
  516. X
  517. XPROTOCOL                   protocol of all call(s/ers)
  518. XPROTOCOL *                 protocol (complete)
  519. XPROTOCOL #                 statistics of these calls
  520. XPROTOCOL %                 callers statistics (hitlist)
  521. X
  522. XPM                         move to your maildrop
  523. X
  524. XREAD                       read NEW articles
  525. XREAD *                     real ALL articles (of a board)
  526. XREAD article               show article no. "article"
  527. XREAD article-article       display from "article" to "article"
  528. X
  529. XSEARCH pattern             search for "pattern" in all articles of a group
  530. X
  531. XSETUP                      configure the BBS to your favor
  532. X
  533. XSIGNATURE           show/change your signature
  534. X
  535. XSTATE                      list your BBS-configuration
  536. X
  537. XSTATISTICS                 table containing NEWS-statistics
  538. XSTATISTICS *               table containing more NEWS-statistics
  539. XSTATISTICS $               UUCP-rates (only if UUCP supports this)
  540. XSTATISTICS #               download-statistics 
  541. XSTATISTICS %               download-statistics (hitlist)
  542. X
  543. XTIME                       local time and your online-time in seconds
  544. X
  545. XUSERS                      show users list
  546. XUSERS *                    show users list (more detailed)
  547. XUSERS #                    users up-/download ratio
  548. XUSERS %                    accounting information (payload ;-)
  549. XUSERS name                 list infos about user "name"
  550. X
  551. XVERSION                    print version
  552. XVERSION *                  display compiling definitions
  553. XVERSION #                  the "Hall of Fame"
  554. X
  555. XWRITE                      create a new article and post it 
  556. END_OF_FILE
  557.   if test 4190 -ne `wc -c <'etc/english.shorth'`; then
  558.     echo shar: \"'etc/english.shorth'\" unpacked with wrong size!
  559.   fi
  560.   # end of 'etc/english.shorth'
  561. fi
  562. if test -f 'src/defs.h' -a "${1}" != "-c" ; then 
  563.   echo shar: Will not clobber existing file \"'src/defs.h'\"
  564. else
  565.   echo shar: Extracting \"'src/defs.h'\" \(3235 characters\)
  566.   sed "s/^X//" >'src/defs.h' <<'END_OF_FILE'
  567. X/***************************************************************************/
  568. X/* Was jetzt folgt, ist fuer Experimente voellig ungeeignet. Jegliche Aen- */
  569. X/* derung bringt ueber kurz oder lang ernste Probleme fuer die Konsistenz  */
  570. X/* der ix/MBox.                                        */
  571. X/*                                       */
  572. X/* Auch wenn Aenderungen (zufaellig) erfolgreich sein sollten, duerfen sie */
  573. X/* nicht an dritte weitergeleitet werden.                   */
  574. X/*                                       */
  575. X/* Wer globale Variablen/Strukturen nicht akzeptiert, sollte jetzt auf der */
  576. X/* Stelle diese Datei verlassen !                       */
  577. X/***************************************************************************/
  578. X
  579. X  
  580. X#ifndef EXTERN
  581. X#define EXTERN extern
  582. X#endif
  583. X
  584. X/* --------------------------- HAENDE WEG !!! ---------------------------- */
  585. X
  586. X#include "proto.h"
  587. X
  588. X#define STRING         81
  589. X#define LSTRING         STRING + 4
  590. X#define LONGSTRING  256
  591. X#define BS            8
  592. X#define CR           13
  593. X#define LF           10
  594. X#define TAB           9
  595. X#define BELL          7
  596. X#define DEL         127
  597. X#define CTRL_X         24
  598. X#define CTRL_Z       26
  599. X#define CTRL_D        4
  600. X#define ESC          27
  601. X
  602. X#if defined( _SYS7) || defined(_SCO)
  603. X#define ENTER        13
  604. X#else
  605. X#define ENTER        10
  606. X#endif
  607. X
  608. X
  609. X#define fix( II )  ( II / 100 )
  610. X#define flt( II )  ( II - (fix( II ) * 100 ))
  611. X
  612. X#define MAKRO_MAX_REK 30
  613. X
  614. X#define DEF_MAX_SCR_LINES 23
  615. X
  616. XEXTERN int MAX_SCR_LINES;
  617. X
  618. XEXTERN int OLDUID;
  619. XEXTERN int OLDGID;
  620. X
  621. XEXTERN char PROMPT[STRING];
  622. XEXTERN char TERMINAL[STRING];
  623. X
  624. XEXTERN char EDDY[STRING];
  625. X
  626. XEXTERN char BRETT[STRING];
  627. XEXTERN char INHALT[STRING];
  628. XEXTERN char NG[STRING];
  629. X
  630. XEXTERN char UGROUPS[STRING];
  631. XEXTERN char MAKRO[STRING];
  632. X
  633. XEXTERN char MYNAME[STRING];
  634. X
  635. XEXTERN long LASTLOG;
  636. XEXTERN int LASTTIME;
  637. X
  638. XEXTERN int IS_BUFFERED;
  639. X
  640. XEXTERN int SHORT_HEADER;
  641. X
  642. XEXTERN long IDX_SIZE;
  643. X
  644. XEXTERN struct userdaten {
  645. X    int id;
  646. X    char name[31];
  647. X    char passwort[11];
  648. X    char sh_name[15];
  649. X    char nick[31];
  650. X    char wohnort[31];
  651. X    char strasse[31];
  652. X    char telefon1[31];
  653. X    char telefon2[31];
  654. X    char geburtsdatum[31];
  655. X        int terminal;
  656. X    int editor;
  657. X    int level;
  658. X        int bell;
  659. X    int prompt;
  660. X    int more;
  661. X    char lastlog[11]; 
  662. X    int seq;
  663. X        int intro;
  664. X    int lasttime;
  665. X     int lastmode;
  666. X    int leserichtung;
  667. X    int tlines;
  668. X    long upratio;
  669. X    long downratio;
  670. X    long elapsed;
  671. X    char newsgrps[STRING];
  672. X    char schluessel[STRING];
  673. X    char abused[STRING];
  674. X    char account[STRING];         
  675. X} USER;
  676. X
  677. X
  678. X
  679. X#define MAX_BEF 80
  680. X
  681. XEXTERN struct bef_struct {
  682. X    int id;
  683. X    int in;
  684. X     int ex;
  685. X    int prototyp;
  686. X    char befehl[(STRING/2)];
  687. X    char pfad[STRING];
  688. X} BEF[MAX_BEF];
  689. X
  690. X
  691. X#define MAX_MAK 30
  692. X
  693. XEXTERN struct mak_struct {
  694. X    char makname[STRING];
  695. X    char makwert[(STRING * 2)];
  696. X} MAK[MAX_MAK];
  697. X
  698. X
  699. X
  700. X#define MAX_NEWSGRPS 20
  701. X
  702. XEXTERN char newsgrp[MAX_NEWSGRPS][(STRING/3)];
  703. XEXTERN int newsgrpptr;
  704. X
  705. XEXTERN int MAILOUT_LEV;
  706. XEXTERN int ADMIN_LEV;
  707. XEXTERN int WRITE_EX_LEV;
  708. XEXTERN int WRITE_IN_LEV;
  709. XEXTERN int WRITE_INTERNAT;
  710. XEXTERN int PD_D_LEV;
  711. XEXTERN int PD_U_LEV;
  712. XEXTERN int EXE_LEV; 
  713. XEXTERN int GUEST_LEV;
  714. X
  715. XEXTERN char CONSOLE_REDIRECT[STRING];
  716. X
  717. XEXTERN int BB1;
  718. XEXTERN int BB2;
  719. XEXTERN int BB3;
  720. XEXTERN int BB4;
  721. XEXTERN int BB5;
  722. XEXTERN int BB6;
  723. XEXTERN int BB7;
  724. XEXTERN int BB8;
  725. XEXTERN int BB9;
  726. X
  727. XEXTERN char UUCPID[STRING];
  728. X
  729. XEXTERN int BAUDRATE;
  730. X
  731. X
  732. X/* --------------------------- HAENDE WEG !!! ---------------------------- */
  733. X
  734. X
  735. X
  736. X
  737. X
  738. X
  739. X
  740. X
  741. END_OF_FILE
  742.   if test 3235 -ne `wc -c <'src/defs.h'`; then
  743.     echo shar: \"'src/defs.h'\" unpacked with wrong size!
  744.   fi
  745.   # end of 'src/defs.h'
  746. fi
  747. if test -f 'src/getline.c' -a "${1}" != "-c" ; then 
  748.   echo shar: Will not clobber existing file \"'src/getline.c'\"
  749. else
  750.   echo shar: Extracting \"'src/getline.c'\" \(6790 characters\)
  751.   sed "s/^X//" >'src/getline.c' <<'END_OF_FILE'
  752. X/***************************************************************************/
  753. X/*        PROGRAMM  ix/Mbox                           */
  754. X/*             DATEI  getline.c                           */
  755. X/*        FUNKTIONEN  getline(), getint(), yesno()               */
  756. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  757. X/*  LETZTE AENDERUNG   09.02.1992                       */
  758. X/***************************************************************************/
  759. X
  760. X#include <stdio.h>
  761. X
  762. X#ifdef _MBOX
  763. X#include "mbox.h"
  764. X#else
  765. X#define BS        8
  766. X#define CR        13
  767. X#define LF        10
  768. X#define CTRL_X        24
  769. X#define CTRL_D        4
  770. X#define BELL        7
  771. X#define ESC        27
  772. X#define DEL        127
  773. X#define GBL06_MSG    'J'     
  774. X#define GBL07_MSG    'N'    
  775. X#ifdef _SYS7
  776. X#define ENTER        13
  777. X#else
  778. X#define ENTER         10
  779. X#endif
  780. X#endif
  781. X
  782. X#ifndef STRING
  783. X#define STRING 85
  784. X#endif
  785. X
  786. X/***************************************************************************/
  787. X/*      FUNKTION  getline()                           */
  788. X/*  BESCHREIBUNG  Eine Zeile (STRING) einlesen. Beendet wird mit ENTER,       */
  789. X/*          oder wenn die max. zulaessige Anzahl von Zeichen er-     */
  790. X/*          reicht ist.                                               */
  791. X/*     PARAMETER  siehe unten                                              */
  792. X/*     RUECKGABE  Eingelesene Zeile (STRING)                   */
  793. X/*  ---------------------------------------------------------------------  */
  794. X/*  len     -> Anzahl der max. einzulesenden Zeichen                */
  795. X/*                                       */
  796. X/*  mode    ->       0 = Kein Echo                       */
  797. X/*                1 = Mit Echo                           */
  798. X/*                2 = '*' als Echo                           */
  799. X/*             3 = ':' als drittes & sechstes Zeichen (Uhrzeit)      */
  800. X/*                 4 = '.' als drittes & sechstes Zeichen (Datum)        */
  801. X/*              5 = Ausschliesslich BUCHSTABEN               */
  802. X/*            10 = "bsc" vor der Eingabe "len"-mal ausgeben          */
  803. X/*           100 = nur Zahlen (und '.', ':')                         */
  804. X/*           1000 = String "deftext" + "bsc" ausgeben                 */
  805. X/*         10000 = bei "0-9" als erstes Zeichen -> sofort zurueck    */
  806. X/*                                           */
  807. X/*  bsc     -> Mit diesem Zeichen wird geloescht               */
  808. X/*                                           */
  809. X/*  deftext -> Text-Vorgabe                                                */
  810. X/*                                                               */
  811. X/***************************************************************************/
  812. X
  813. Xstatic int endless;
  814. X
  815. Xchar *getline(len, mode, bsc, deftext)
  816. Xint len, mode;
  817. Xchar bsc;
  818. Xchar deftext[];
  819. X{
  820. X  static char gls[STRING];
  821. X  char c;
  822. X  int gli, gll;
  823. X  char delim = '\0';
  824. X  int matrix = 0;
  825. X  int echo = 1, numerics = 0, defmode = 0, letters = 0;
  826. X  int escape = 0;
  827. X  int lenmem = len;
  828. X  int lastwasblank = 0;
  829. X
  830. X
  831. X  if (mode > 10000) {
  832. X    escape++;
  833. X    mode -= 10000;
  834. X  }
  835. X  if (mode > 1000) {
  836. X    mode -= 1000;
  837. X    defmode++;
  838. X  }
  839. X  if (mode > 100) {
  840. X    mode -= 100;
  841. X    numerics++;
  842. X  }
  843. X  if (mode > 10) {
  844. X    mode -= 10;
  845. X    matrix++;
  846. X  }
  847. X  if (mode > 2) {
  848. X    switch(mode){
  849. X        case 3    : delim = ':';
  850. X              break;
  851. X        case 4  : delim = '.';        
  852. X              break;
  853. X         case 5  : letters++;
  854. X              break;
  855. X    }
  856. X    mode = 1;
  857. X  }
  858. X  echo = mode;
  859. X
  860. X  if (defmode != 0) {
  861. X    if((deftext[0] < 32) || (deftext[0] > 126)) deftext[0] = '\0';
  862. X    gll = length(deftext);
  863. X    lenmem = len - gll;
  864. X    if(deftext[0] != '\0'){
  865. X        sprintf(gls, "%s", deftext);
  866. X        printf("%s", deftext);
  867. X    }
  868. X    else gls[0] = '\0';
  869. X  }
  870. X  else {
  871. X    gll = 0;
  872. X    gls[gll] = '\0';
  873. X    strcat(gls, "OOPS");
  874. X  }
  875. X
  876. X  if (matrix != 0) {
  877. X    for (gli = 0; gli < lenmem; gli++) {
  878. X        if (((gli == 2) || (gli == 5)) && (delim != '\0') && (gli != len)) {
  879. X            printf("%c", delim);
  880. X        }
  881. X        else {
  882. X            printf("%c", bsc);
  883. X        }
  884. X    }
  885. X    for (gli = 0; gli < lenmem; gli++) printf("%c", BS);
  886. X  }
  887. X
  888. X  do {
  889. X
  890. X    if (delim != '\0') {
  891. X        if (((gll == 2) || (gll == 5)) && (gll < len)){
  892. X            c = delim;
  893. X        }
  894. X        else {
  895. X            c = getint();  
  896. X        }
  897. X    }
  898. X    else {
  899. X        c = getint();  
  900. X    }        
  901. X    if (c > 127) c -= 128;    /* 7 BIT !! */
  902. X
  903. X    if (c == ESC) {
  904. X        c = getint();  
  905. X        c = getint();  
  906. X        if ((c == 'A') || (c == 'B')) {
  907. X            if (c == 'A') endless++;
  908. X            if (c == 'B') endless--;
  909. X            if (endless < 1) endless = 9;
  910. X            if (endless > 9) endless = 1;
  911. X            sprintf(gls, "%d", endless);
  912. X            return (char *) gls;
  913. X        }
  914. X        if (c == 'D') c = BS;
  915. X        if (c == 'C') c = ENTER;
  916. X    }
  917. X    if ((c == CTRL_X) || (c == CTRL_D) || (c == DEL)) {
  918. X        return("<BREAK>");
  919. X    }
  920. X    if (c != ENTER) {
  921. X        if ((c == BS) && (gll > 0)) {
  922. X            if (((gll == 3) || (gll == 6)) && (delim != '\0')) {
  923. X                gll -= 2;
  924. X                printf("%c%c%c%c", BS, BS, bsc, BS);
  925. X            } else {
  926. X                gll--;
  927. X                printf("%c%c%c", BS, bsc, BS);
  928. X            }
  929. X        }
  930. X        if (numerics == 0) {
  931. X            if (c >= 32) {
  932. X                if(letters != 0){
  933. X                    if((c < 'A') && (c != ' ')) c = 0;
  934. X                    if(c > 'z') c = 0;
  935. X                    if((c > 'Z') && (c < 'a')) c = 0;
  936. X
  937. X                    if(c == ' '){
  938. X                        if(lastwasblank != 0) c = 0;
  939. X                        lastwasblank++;
  940. X                    }
  941. X                    else{
  942. X                        if(c != 0) lastwasblank = 0;
  943. X                    }                
  944. X
  945. X                    /*
  946. X                    if((c == 0) && (USER.bell == 1))
  947. X                        printf("%c", BELL);
  948. X                    */
  949. X                    if(c == 0)
  950. X                        printf("%c", BELL);
  951. X                }
  952. X                if(c != 0){
  953. X                    gls[gll] = c;
  954. X                    gll++;
  955. X                }
  956. X            }
  957. X            else {
  958. X                c = 0;
  959. X            }
  960. X        }
  961. X        else {
  962. X            if ((c == '.') || (c == ':') || ((c >= '0') && (c <= '9'))) {
  963. X                if (((delim != '\0') && ((c == '.') || (c == ':'))) &&
  964. X                    ((gll != 2) && (gll != 5))) {
  965. X                    printf("%c", BELL);
  966. X                    c = 0;
  967. X                }
  968. X                else {
  969. X                    gls[gll] = c;
  970. X                    gll++;
  971. X                    gls[gll] = '\0';
  972. X                }
  973. X            }
  974. X            else {
  975. X                if (c != BS) printf("%c", BELL);
  976. X                c = 0;
  977. X            }
  978. X        }
  979. X        if (c != 0) {
  980. X            if (echo == 1) printf("%c", c);
  981. X            if (echo == 2) printf("*");
  982. X        }
  983. X    }
  984. X    if (gll == 1) {
  985. X        if ((escape != 0) && ((c > 47) && (c < 58))) {
  986. X            gls[gll] = '\0';
  987. X            return (char *) gls;
  988. X        }
  989. X    }
  990. X
  991. X  } while ((c != ENTER) && (gll < len));
  992. X
  993. X  gls[gll] = '\0';
  994. X
  995. X  return (char *) gls;
  996. X}
  997. X
  998. X
  999. X
  1000. X
  1001. X
  1002. X/***************************************************************************/
  1003. X/*      FUNKTION  getint()                            */
  1004. X/*  BESCHREIBUNG  Ein Zeichen wird mit Hilfe der "getch"-Funktion einge-   */
  1005. X/*          lesen. Es wird gewartet bis ein Zeichen erfasst ist.     */
  1006. X/*     PARAMETER  keine                                                    */
  1007. X/*     RUECKGABE  Eingelesenes Zeichen (INT)                   */
  1008. X/***************************************************************************/
  1009. X
  1010. Xint getint()
  1011. X{
  1012. X  int c;
  1013. X
  1014. X  do{
  1015. X    c = (int)getch();
  1016. X  }while((c == 0) || (c > 127));
  1017. X
  1018. X  return (int) c;
  1019. X}
  1020. X
  1021. X
  1022. X
  1023. X
  1024. X/***************************************************************************/
  1025. X/*      FUNKTION  yesno()                           */
  1026. X/*  BESCHREIBUNG  Die Zeichen "j", "J", "n" oder "N" werden ausschliess-   */
  1027. X/*          lich eingelesen und zurueckgegeben.                       */
  1028. X/*     PARAMETER  keine                                                       */
  1029. X/*     RUECKGABE  Eines der Zeichen (siehe oben) (INT)               */
  1030. X/***************************************************************************/
  1031. X
  1032. Xint yesno()
  1033. X{
  1034. X  int c;
  1035. X
  1036. X  do {
  1037. X    c = getint();
  1038. X    if (c >= 97) c -= 32;
  1039. X    if ((c != GBL06_MSG) && (c != GBL07_MSG)) c = 0;
  1040. X  } while (c == 0);
  1041. X
  1042. X  printf("%c", c);
  1043. X
  1044. X  return (int) c;
  1045. X}
  1046. X
  1047. X
  1048. END_OF_FILE
  1049.   if test 6790 -ne `wc -c <'src/getline.c'`; then
  1050.     echo shar: \"'src/getline.c'\" unpacked with wrong size!
  1051.   fi
  1052.   # end of 'src/getline.c'
  1053. fi
  1054. if test -f 'src/postfach.c' -a "${1}" != "-c" ; then 
  1055.   echo shar: Will not clobber existing file \"'src/postfach.c'\"
  1056. else
  1057.   echo shar: Extracting \"'src/postfach.c'\" \(8515 characters\)
  1058.   sed "s/^X//" >'src/postfach.c' <<'END_OF_FILE'
  1059. X/***************************************************************************/
  1060. X/*        PROGRAMM  ix/Mbox                           */
  1061. X/*             DATEI  postfach.c                       */
  1062. X/*        FUNKTIONEN  postfach()                       */
  1063. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1064. X/*  LETZTE AENDERUNG  18.03.1991                       */
  1065. X/***************************************************************************/
  1066. X  
  1067. X#include <stdio.h>
  1068. X#include <sys/types.h>
  1069. X#include <fcntl.h>
  1070. X#include <unistd.h>
  1071. X#include <ctype.h>
  1072. X
  1073. X#include "mbox.h"
  1074. X
  1075. X
  1076. X
  1077. X/***************************************************************************/
  1078. X/*      FUNKTION  postfach()                           */
  1079. X/*  BESCHREIBUNG  Postfach und versch. Dateien fuer einen neuen Teil-      */
  1080. X/*          nehmer einrichten.                                       */
  1081. X/*     PARAMETER  arg  =  '*'  =  normaler Aufruf, wird geprueft       */
  1082. X/*                   =  Aufruf von ADMIN                         */
  1083. X/*               =  '#'  =  Neuinstallation der UDBASE           */
  1084. X/*     RUECKGABE  keine                                                       */
  1085. X/***************************************************************************/
  1086. X
  1087. Xvoid postfach(arg)
  1088. Xchar arg[];
  1089. X{
  1090. X  int fd;
  1091. X  FILE *fp;
  1092. X  char s[STRING*2];
  1093. X  char t[STRING*2];
  1094. X  struct userdaten LOOSER;
  1095. X  struct userdaten POSTER;
  1096. X  int ok, i, j, c;
  1097. X  long ll;
  1098. X
  1099. X
  1100. X  if (arg[0] == '*') {
  1101. X    if ((strcomp(GUEST, USER.name) != 0) &&
  1102. X        (strcomp(POSTMASTER, USER.sh_name) != 0)) {
  1103. X        ansi("md");
  1104. X        printf(" %s\n", POS01_MSG);
  1105. X        ansi("me");
  1106. X        return;
  1107. X    }
  1108. X  }
  1109. X  
  1110. X  if (arg[0] == '#') {
  1111. X
  1112. X    if (arg[1] == '1') { /* ADMINISTRATION */
  1113. X
  1114. X        strcpy(USER.name, "Administration");
  1115. X        strcpy(USER.sh_name, POSTMASTER);
  1116. X        strcpy(USER.nick, "Sysop");
  1117. X
  1118. X        USER.id = 1;
  1119. X        USER.level = 10;
  1120. X
  1121. X        printf("%s - %s (%s)\n", POS04_MSG, USER.name, USER.sh_name);
  1122. X
  1123. X        fp = fopen(UDSEQ, "w");
  1124. X        if (fp == NULL) {
  1125. X            nerror("postfach.c", 63, "postfach", "Datei-Schreibfehler", UDSEQ);
  1126. X        }
  1127. X        fputs("1", fp);
  1128. X        fclose(fp);
  1129. X        
  1130. X        fp = fopen(UDBASE, "w");
  1131. X        fclose(fp);
  1132. X    }     
  1133. X    if (arg[1] == '2') { /* GUEST */
  1134. X    
  1135. X        strcpy(USER.name, GUEST);
  1136. X        strcpy(USER.sh_name, GBL10_MSG);
  1137. X        strcpy(USER.nick, POS03_MSG);
  1138. X
  1139. X        USER.id = 2;
  1140. X        USER.level = 0;
  1141. X    
  1142. X        printf("%s - %s (%s)\n", POS05_MSG, USER.name, USER.sh_name);
  1143. X    }
  1144. X
  1145. X    strcpy(USER.passwort, "*****");
  1146. X    strcpy(USER.wohnort, "");
  1147. X    strcpy(USER.strasse, "???");
  1148. X    strcpy(USER.telefon1, "???");
  1149. X    strcpy(USER.telefon2, "???");
  1150. X    strcpy(USER.geburtsdatum, "00.00.0000");
  1151. X    strcpy(USER.account, "00.00.0000 000.00");
  1152. X
  1153. X    goto INIT_UDBASE;
  1154. X  }
  1155. X
  1156. X  maybe_locked(UDBASE, "r"); 
  1157. X  fd = open(UDBASE, O_RDONLY);
  1158. X  if (fd == -1) {
  1159. X    nerror("postfach.c", 51, "postfach", "Datei-Lesefehler", UDBASE);
  1160. X  }
  1161. X  headline( POS06_MSG );
  1162. X  ansi("md");
  1163. X  printf("\n%s\n%s\n%s\n\n", POS07_MSG, POS08_MSG, POS09_MSG);
  1164. X  ansi("me");
  1165. X
  1166. X  RETRY_1:
  1167. X
  1168. X  printf("\n%s ", POS10_MSG);
  1169. X  strcpy(s, POSTER.name);
  1170. X  strcpy(POSTER.name, (char *) getline(30, 15, '.', ""));
  1171. X  if ((strcomp("<BREAK>", POSTER.name) == 0) || (POSTER.name[0] < 64) || (POSTER.name[1] < 64)) {
  1172. X    strcpy(POSTER.name, s);
  1173. X    printf("\n\n");
  1174. X    ansi("md");
  1175. X    printf("%s", POS11_MSG);
  1176. X    ansi("me");
  1177. X    printf("\n");
  1178. X    return;
  1179. X  }
  1180. X  ansi("md");
  1181. X  printf("\n%s", POS12_MSG);
  1182. X  ok = 0;
  1183. X  strcpy(POSTER.name, (char *) stripped(POSTER.name));
  1184. X  lseek(fd, 0L, SEEK_SET);
  1185. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (ok == 0)) {
  1186. X    if (strcomp(POSTER.name, LOOSER.name)    == 0) ok = 1;
  1187. X    if (strcomp(POSTER.name, LOOSER.nick)    == 0) ok = 1;
  1188. X    if (strcomp(POSTER.name, LOOSER.sh_name) == 0) ok = 1;
  1189. X  }
  1190. X
  1191. X  if (USER.level < ADMIN_LEV){
  1192. X      if ((strcomp("SYSOP", POSTER.name) == 0) ||
  1193. X          (strcomp("POST",  POSTER.name) == 0) ||
  1194. X          (strcomp("GAST",  POSTER.name) == 0) ||
  1195. X          (strcomp("ADMIN", POSTER.name) == 0) ||
  1196. X          (strcomp("COSYS", POSTER.name) == 0)) ok = 1;
  1197. X  }
  1198. X
  1199. X  if (ok == 1) {
  1200. X    printf(" %s\n", POS13_MSG);
  1201. X    ansi("me");
  1202. X    sprintf(POSTER.name, "%s", s);
  1203. X    goto RETRY_1;
  1204. X  }
  1205. X  ansi("me");
  1206. X
  1207. X  do {
  1208. X    printf("%c%s ", CR, POS14_MSG);
  1209. X    strcpy(s, (char *) getline(10, 11, '.', ""));
  1210. X    if (strcomp("<BREAK>", s) == 0) s[0] = '\0';
  1211. X    strcpy(POSTER.passwort, (char *) crypted(s));
  1212. X    if (length(POSTER.passwort) < 5) {
  1213. X        ansi("md");
  1214. X        printf("\n%s", POS15_MSG);        
  1215. X        ansi("me");
  1216. X    }
  1217. X  } while (length(POSTER.passwort) < 5);
  1218. X
  1219. XRETRY_2:
  1220. X
  1221. X  printf("\n%s ", POS16_MSG);
  1222. X  strcpy(s, getline(30, 15, '.', ""));
  1223. X  if (strcomp("<BREAK>", s) == 0) {
  1224. X    strcpy(s, "John Doe");
  1225. X  }
  1226. X  strcpy(POSTER.nick, (char *) stripped(s));
  1227. X
  1228. X  ansi("md");
  1229. X  printf("\n%s", POS12_MSG);
  1230. X  ok = 0;
  1231. X  lseek(fd, 0L, SEEK_SET);
  1232. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (ok == 0)) {
  1233. X    if (strcomp(POSTER.nick, LOOSER.nick)    == 0) ok = 1;
  1234. X    if (strcomp(POSTER.nick, LOOSER.name)    == 0) ok = 1;
  1235. X    if (strcomp(POSTER.nick, LOOSER.sh_name) == 0) ok = 1;
  1236. X  }
  1237. X
  1238. X  if (USER.level < ADMIN_LEV){
  1239. X      if ((strcomp("SYSOP", POSTER.nick) == 0) ||
  1240. X          (strcomp("POST",  POSTER.nick) == 0) ||
  1241. X          (strcomp("GAST",  POSTER.nick) == 0) ||
  1242. X          (strcomp("ADMIN", POSTER.nick) == 0) ||
  1243. X          (strcomp("COSYS", POSTER.nick) == 0)) ok = 1;
  1244. X  }
  1245. X
  1246. X  if (ok == 1) {
  1247. X    printf(" %s\n", POS13_MSG);
  1248. X    ansi("me");
  1249. X    goto RETRY_2;
  1250. X  }
  1251. X  ansi("me");
  1252. X
  1253. X
  1254. X  printf("%c%s ", CR, POS17_MSG);
  1255. X  strcpy(POSTER.wohnort, (char *) getline(30, 11, '.', ""));
  1256. X
  1257. X  printf("\n%s ", POS18_MSG);
  1258. X  strcpy(POSTER.strasse, (char *) getline(30, 11, '.', ""));
  1259. X
  1260. X  printf("\n%s ", POS19_MSG);
  1261. X  strcpy(POSTER.telefon1, (char *) getline(20, 11, '.', ""));
  1262. X
  1263. X  printf("\n%s ", POS20_MSG);
  1264. X  strcpy(POSTER.telefon2, (char *) getline(20, 11, '.', ""));
  1265. X
  1266. X  printf("\n%s ", POS21_MSG);
  1267. X  strcpy(POSTER.geburtsdatum, (char *) getline(10, 114, '?', ""));
  1268. X
  1269. X  close(fd);
  1270. X
  1271. X  ansi("md");
  1272. X  printf("\n\n%s\n%s\n\n", POS22_MSG, POS23_MSG);
  1273. X  ansi("me");
  1274. X
  1275. X  USER.level = 0;
  1276. X  if(USER.id == 1) USER.level = 10; /* POSTMASTER-Account */
  1277. X
  1278. X  if (arg[0] != '*') {
  1279. X    sprintf(s, "%s", arg);
  1280. X    s[14] = '\0';
  1281. X    strcpy(USER.sh_name, s);
  1282. X    USER.level = WRITE_EX_LEV;
  1283. X  }
  1284. X  else USER.sh_name[0] = '\0';
  1285. X
  1286. X  sprintf(USER.name, "%s", POSTER.name);
  1287. X  sprintf(USER.passwort, "%s", POSTER.passwort);
  1288. X  sprintf(USER.nick, "%s", POSTER.nick);
  1289. X  sprintf(USER.wohnort, "%s", POSTER.wohnort);
  1290. X  sprintf(USER.strasse, "%s", POSTER.strasse);
  1291. X  sprintf(USER.telefon1, "%s", POSTER.telefon1);
  1292. X  sprintf(USER.telefon2, "%s", POSTER.telefon2);
  1293. X  sprintf(USER.geburtsdatum, "%s", POSTER.geburtsdatum);   
  1294. X
  1295. X
  1296. X  INIT_UDBASE:
  1297. X
  1298. X  
  1299. X  USER.terminal = 1;
  1300. X  USER.editor = 1;
  1301. X  USER.prompt = 2;
  1302. X  USER.bell = 0;
  1303. X  USER.more = 1;
  1304. X  USER.seq = 0;
  1305. X  USER.intro = 3;
  1306. X  strcpy(USER.lastlog, (char *) "01.01.1970");
  1307. X  USER.lasttime = 0;
  1308. X  USER.lastmode = 2;
  1309. X  USER.leserichtung = 1;
  1310. X  USER.upratio = 0L;
  1311. X  USER.downratio = 0L;
  1312. X  USER.elapsed = 0L;
  1313. X  sprintf(USER.newsgrps, "%s", NEWS_MINIMUM);
  1314. X  strcpy(USER.account, "00.00.0000 000.00");
  1315. X
  1316. X  maybe_locked(UDSEQ, "r"); mblock(UDSEQ);
  1317. X  fp = fopen(UDSEQ, "r");
  1318. X  if (fp == NULL) {
  1319. X    nerror("postfach.c", 188, "postfach", "Datei-Lesefehler", UDSEQ);
  1320. X  }
  1321. X  fscanf(fp, "%d", &USER.id);
  1322. X  fclose(fp);
  1323. X  mbunlock(UDSEQ);
  1324. X
  1325. X  if(USER.id < 1) USER.id = 1;
  1326. X
  1327. X  maybe_locked(UDSEQ, "r"); mblock(UDSEQ);
  1328. X  fp = fopen(UDSEQ, "w");
  1329. X  if (fp == NULL) {
  1330. X    nerror("postfach.c", 196 , "postfach", "Datei-Schreibfehler", UDSEQ);
  1331. X  }
  1332. X  fprintf(fp, "%d\n", (USER.id + 1));
  1333. X  fclose(fp);
  1334. X  mbunlock(UDSEQ);
  1335. X
  1336. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  1337. X  fd = open(UDBASE, O_RDWR);
  1338. X  if (fd == -1) {
  1339. X    nerror("postfach.c", 204, "postfach", "Datei-Lesefehler", UDBASE);
  1340. X  }
  1341. X  ll = lseek(fd, 0L, SEEK_END);
  1342. X  write(fd, &USER, sizeof(USER));
  1343. X  close(fd);
  1344. X  mbunlock(UDBASE);
  1345. X
  1346. X  sprintf(s, "%s/usr/%d", HOME, USER.id);
  1347. X  mkdir(s, 0777);
  1348. X
  1349. X  sprintf(s, "%s/usr/%d/seq", HOME, USER.id);
  1350. X  fp = fopen(s, "w");
  1351. X  fputs("1\n", fp);
  1352. X  fclose(fp);
  1353. X
  1354. X  sprintf(s, "%s/usr/%d/.hello", HOME, USER.id);
  1355. X  fp = fopen(s, "w");
  1356. X  fputs("\n", fp);
  1357. X  fclose(fp);
  1358. X
  1359. X  sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
  1360. X  fp = fopen(s, "w");
  1361. X  fputs("\n", fp);
  1362. X  fclose(fp);
  1363. X
  1364. X  if (arg[0] != '*') {
  1365. X    sprintf(s, "cp /usr/%s/%s %s/usr/%d/.signature &", USER.sh_name, SIGNATURE,
  1366. X        HOME, USER.id);
  1367. X    system(s);
  1368. X  }
  1369. X  sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  1370. X  fp = fopen(s, "w");
  1371. X  fprintf(fp, "%s\n", GBL05_MSG);
  1372. X  fputs("===============================================================================\n", fp);
  1373. X  fclose(fp);
  1374. X
  1375. X  if (arg[0] == '#') {
  1376. X    return; /* UDBASE installiert */
  1377. X  }
  1378. X
  1379. X  i = 0;
  1380. X  strcpy(t, USER.name);
  1381. X  while(t[i] != '\0'){
  1382. X    if(t[i] == ' ') t[i] = '.';
  1383. X    i++;
  1384. X  }
  1385. X
  1386. X  sprintf(s, "/bin/sh ./etc/alias.sh \"%s\"", t);
  1387. X  system( s );
  1388. X
  1389. X
  1390. X  sprintf(s, "%s \"%s\" (%d)", POS24_MSG, USER.name, USER.id);
  1391. X  control(s, 3);
  1392. X
  1393. X  printf("\n");
  1394. X  init_user( POS25_MSG );
  1395. X  
  1396. X}
  1397. X
  1398. END_OF_FILE
  1399.   if test 8515 -ne `wc -c <'src/postfach.c'`; then
  1400.     echo shar: \"'src/postfach.c'\" unpacked with wrong size!
  1401.   fi
  1402.   # end of 'src/postfach.c'
  1403. fi
  1404. if test -f 'src/proto.h' -a "${1}" != "-c" ; then 
  1405.   echo shar: Will not clobber existing file \"'src/proto.h'\"
  1406. else
  1407.   echo shar: Extracting \"'src/proto.h'\" \(4491 characters\)
  1408.   sed "s/^X//" >'src/proto.h' <<'END_OF_FILE'
  1409. X/***************************************************************************/
  1410. X/*        PROGRAMM  ix/Mbox                           */
  1411. X/*             DATEI  proto.h                           */
  1412. X/*        FUNKTIONEN  Prototypen der Funktionen                   */
  1413. X/*             AUTOR  Olaf's CPROTO                       */
  1414. X/*  LETZTE AENDERUNG  28.05.1992                       */
  1415. X/***************************************************************************/
  1416. X
  1417. X#if defined(__STDC__) || defined(__cplusplus)
  1418. X# define P_(s) s
  1419. X#else
  1420. X# define P_(s) ()
  1421. X#endif
  1422. X
  1423. X/* admin.c */
  1424. Xvoid user_aendern P_((void));
  1425. Xvoid user_anzeigen P_((void));
  1426. Xvoid user_loeschen P_((void));
  1427. Xint setup_get P_((int max));
  1428. Xvoid wait_until_keypressed P_((void));
  1429. Xvoid admin P_((void));
  1430. Xvoid setup P_((void));
  1431. X
  1432. X/* befehl.c */
  1433. Xint bef P_((char befehl[], char arg[]));
  1434. X
  1435. X/* baudrate.c */
  1436. Xint baudrate P_((int try));
  1437. X
  1438. X/* control.c */
  1439. Xvoid control P_((char text[], int mode));
  1440. Xvoid whodo P_((char text[]));
  1441. X
  1442. X/* coreleft.c */
  1443. Xint coreleft P_((void));
  1444. X
  1445. X/* ctrlx.c */
  1446. Xvoid ctrlx P_((void));
  1447. Xvoid noctrlx P_((void));
  1448. X
  1449. X/* derror.c */
  1450. Xvoid nerror P_((char file[], int line, char function[], char descr[], char er[]));
  1451. X
  1452. X/* games.c */
  1453. Xint games P_((void));
  1454. X
  1455. X/* getch.c */
  1456. Xint getch P_((void));
  1457. X
  1458. X/* getline.c */
  1459. Xchar *getline P_((int len, int mode, int bsc, char deftext[]));
  1460. Xint getint P_((void));
  1461. Xint yesno P_((void));
  1462. X
  1463. X/* help.c */
  1464. Xint help P_((char cmd[]));
  1465. X
  1466. X/* intro.c */
  1467. Xvoid intro P_((void));
  1468. Xvoid init_user P_((char info[]));
  1469. X
  1470. X/* lesen.c */
  1471. Xchar *getsite P_((char arg[]));
  1472. Xint checkdomaintype P_((char arg[]));
  1473. Xvoid ansage P_((void));
  1474. Xvoid unterschrift P_((void));
  1475. Xvoid lesen P_((char arg[]));
  1476. X
  1477. X/* lesen2.c */
  1478. Xint anzeigen P_((int art, int von, int bis));
  1479. Xvoid lesen2 P_((char arg[], int mode));
  1480. Xvoid inhalt2 P_((char arg[], int mode));
  1481. Xvoid loeschen2 P_((char arg[], int mode));
  1482. X
  1483. X/* loop.c */
  1484. Xvoid sigcatch P_((int sig));
  1485. Xchar *cut_bef P_((char s[]));
  1486. Xchar *cut_arg P_((char s[]));
  1487. Xchar *rates P_((void));
  1488. Xvoid loop P_((void));
  1489. X
  1490. X/* mail.c */
  1491. Xchar *fetch_reciepy P_((char REP[]));
  1492. Xint brief P_((char arg[]));
  1493. X
  1494. X/* main.c */
  1495. Xvoid logout P_((void));
  1496. Xvoid init P_((void));
  1497. Xvoid fixoutput P_((void));
  1498. X/* int main P_((void)); */
  1499. X
  1500. X/* makro.c */
  1501. Xchar *makro P_((char s[]));
  1502. Xvoid set_makros P_((void));
  1503. Xvoid get_makros P_((void));
  1504. Xvoid add_makro P_((char s[]));
  1505. Xint makro_definition P_((char s[]));
  1506. X
  1507. X/* mb-daemon.c */
  1508. Xint reflector P_((char arg[], char msg[]));
  1509. Xint pdsize P_((char arg[]));
  1510. Xchar *scan P_((char arg[]));
  1511. Xvoid mix P_((char s[], char t[]));
  1512. Xint main P_((int argc, char *argv[]));
  1513. X
  1514. X/* mbrsh.c */
  1515. Xint main P_((int argc, char *argv[]));
  1516. X
  1517. X/* misc.c */
  1518. Xvoid scanner P_((int mode));
  1519. Xvoid schreiben P_((char arg[]));
  1520. Xint prf P_((char arg[]));
  1521. Xint pruefe P_((char arg[]));
  1522. X
  1523. X/* misc2.c */
  1524. Xint chk_newsgrp P_((char s[]));
  1525. Xint subb P_((char s[]));
  1526. Xvoid loeschen P_((char arg[]));
  1527. Xint brett P_((char arg[]));
  1528. X
  1529. X/* nerror.c */
  1530. Xvoid nerror P_((char file[], int line, char function[], char descr[], char er[]));
  1531. X
  1532. X/* outdial.c */
  1533. Xvoid outdial P_((void));
  1534. X
  1535. X/* pd.c */
  1536. Xvoid pd P_((char arg[], char keywds[]));
  1537. Xvoid status P_((void));
  1538. Xvoid mkix P_((char pfad[]));
  1539. Xvoid statistik P_((void));
  1540. Xvoid download P_((char arg[]));
  1541. X
  1542. X/* portinfo.c */
  1543. Xvoid port P_((char arg[]));
  1544. Xvoid show_level P_((void));
  1545. Xvoid userliste P_((char arg[]));
  1546. Xvoid finger P_((char arg[]));
  1547. X
  1548. X/* postfach.c */
  1549. Xvoid postfach P_((char arg[]));
  1550. X
  1551. X/* show.c */
  1552. Xint show P_((char fname[], int maxlines, int mode));
  1553. Xint more P_((void));
  1554. X
  1555. X/* suchen.c */
  1556. Xvoid suchen P_((char muster[]));
  1557. X
  1558. X/* tools.c */
  1559. Xchar *whoami P_((void));
  1560. Xchar *stripped P_((char st[]));
  1561. Xchar *upcased P_((char st[]));
  1562. Xint length P_((char st[]));
  1563. Xchar *strcopy P_((char st[], int v, int b));
  1564. Xchar *bigcopy P_((char st[], int v, int b));
  1565. Xint strcomp P_((char s[], char t[]));
  1566. Xint ansi P_((char code[]));
  1567. X/* char *termansi P_((char code[])); */
  1568. Xchar *mydate P_((int mode));
  1569. Xchar *mytime P_((int mode));
  1570. Xchar *crypted P_((char s[]));
  1571. Xlong dateconv P_((char d[]));
  1572. Xchar *datereconv P_((long l));
  1573. Xint timeconv P_((char t[]));
  1574. Xchar *timereconv P_((int i));
  1575. Xchar *shortname P_((char longname[]));
  1576. Xint maybe_locked P_((char name[], char mode[]));
  1577. Xchar *numstripped P_((char s[]));
  1578. Xvoid headline P_((char line[]));
  1579. Xvoid mblock P_((char path[]));
  1580. Xvoid mbunlock P_((char path[]));
  1581. Xint tty P_((void));
  1582. Xchar *ttyna P_((void));
  1583. Xvoid clearline P_((void));
  1584. Xint isin P_((char pattern[], int c)); 
  1585. X
  1586. X/* weiterl.c */
  1587. Xvoid weiterleiten P_((char arg[]));
  1588. Xvoid carboncopy P_((char cc[], char bcc[]));
  1589. X
  1590. X/* xmd.c */
  1591. Xint brief P_((char arg[]));
  1592. Xint mailing P_((void));
  1593. Xint main P_((int argc, char *argv[]));
  1594. X
  1595. X#undef P_
  1596. X
  1597. X
  1598. X
  1599. END_OF_FILE
  1600.   if test 4491 -ne `wc -c <'src/proto.h'`; then
  1601.     echo shar: \"'src/proto.h'\" unpacked with wrong size!
  1602.   fi
  1603.   # end of 'src/proto.h'
  1604. fi
  1605. if test -f 'src/suchen.c' -a "${1}" != "-c" ; then 
  1606.   echo shar: Will not clobber existing file \"'src/suchen.c'\"
  1607. else
  1608.   echo shar: Extracting \"'src/suchen.c'\" \(4622 characters\)
  1609.   sed "s/^X//" >'src/suchen.c' <<'END_OF_FILE'
  1610. X/***************************************************************************/
  1611. X/*        PROGRAMM  ix/Mbox                           */
  1612. X/*             DATEI  suchen.c                           */
  1613. X/*        FUNKTIONEN  suchen(), edit()                       */
  1614. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1615. X/*  LETZTE AENDERUNG  13.06.1992                       */
  1616. X/***************************************************************************/
  1617. X
  1618. X#include <stdio.h>
  1619. X#include <signal.h>
  1620. X
  1621. X#include "mbox.h"
  1622. X
  1623. X
  1624. X/***************************************************************************/
  1625. X/*      FUNKTION  suchen()                           */
  1626. X/*  BESCHREIBUNG  Artikel im aktuellen Brett mit GREP nach muster durch-   */
  1627. X/*           suchen und entsprechende Artikel anzeigen.           */
  1628. X/*     PARAMETER  muster = Suchbegriff                           */
  1629. X/*     RUECKGABE  keine                                                    */
  1630. X/***************************************************************************/
  1631. X
  1632. Xvoid suchen( muster )
  1633. Xchar muster[];
  1634. X{
  1635. X  FILE *fp;
  1636. X
  1637. X  char s[STRING];
  1638. X  char t[STRING];
  1639. X  char tmp[STRING];
  1640. X  char ex[LONGSTRING];
  1641. X
  1642. X  int fpid;
  1643. X  int found = 0;
  1644. X  int ok = 0;
  1645. X  int i;
  1646. X  
  1647. X
  1648. X  if(muster[0] == '\0'){
  1649. X    ansi( "md" );
  1650. X    printf("\n\n%s ", SUC01_MSG);
  1651. X    ansi( "me" );
  1652. X    strcpy(muster, (char *) getline(60, 1, 32, ""));
  1653. X    if(muster[0] == '\0'){
  1654. X        printf(" <- %s\n", SUC02_MSG);
  1655. X        return;
  1656. X    }
  1657. X  }
  1658. X
  1659. X  i = 0;
  1660. X  while(muster[i] != '\0'){
  1661. X    if(muster[i] == '"') muster[i] = ' ';
  1662. X    i++;
  1663. X  }
  1664. X
  1665. X  sprintf(s, " %s \"%s\" %s [%s] ", SUC03_MSG, (char *) stripped(muster), SUC04_MSG, NG);
  1666. X  headline( s );
  1667. X
  1668. X  printf("%s .", SUC05_MSG);
  1669. X
  1670. X  sprintf(tmp, "%s/such.%d", TMP, getpid());
  1671. X
  1672. X  if(strcomp("PM", BRETT) == 0){
  1673. X    sprintf(t, "%s/usr/%d", HOME, USER.id);
  1674. X    chdir( t );
  1675. X  }
  1676. X  else{
  1677. X    chdir( BRETT );
  1678. X  }
  1679. X
  1680. X  switch( (fpid = fork()) ){
  1681. X        case -1 :
  1682. X                break;
  1683. X        case  0 :    while(1){
  1684. X                    printf(".");
  1685. X                    sleep(3);
  1686. X                }    
  1687. X                break;
  1688. X  }
  1689. X
  1690. X  sprintf(s, "%s \"%s\" * > %s 2> %s", GREP, (char *) stripped(muster), tmp, CPRN);
  1691. X  system( s );
  1692. X
  1693. X  kill( fpid, SIGKILL );
  1694. X  wait( fpid );
  1695. X
  1696. X  printf("%c", CR);
  1697. X
  1698. X
  1699. X  fp = fopen( tmp, "r" );
  1700. X  if(fp == 0){
  1701. X    
  1702. X  }
  1703. X  while((fgets(ex, LONGSTRING, fp) != NULL) && (ok == 0)){
  1704. X    if(atoi(ex) != 0){    
  1705. X        if(show( (char *) stripped(ex), 9999, USER.more ) == -1) ok++;
  1706. X        found++;
  1707. X    }
  1708. X  }
  1709. X  fclose(fp);
  1710. X
  1711. X  chdir( HOME );
  1712. X
  1713. X  if(found == 0){
  1714. X    printf("%s \"%s\" %s\n", SUC06_MSG, (char *) stripped(muster), SUC07_MSG);
  1715. X  }
  1716. X
  1717. X  unlink( tmp );
  1718. X}
  1719. X
  1720. X
  1721. X/***************************************************************************/
  1722. X/*      FUNKTION  edit()                           */
  1723. X/*  BESCHREIBUNG                                 */
  1724. X/*     PARAMETER                                     */
  1725. X/*     RUECKGABE  keine                                                    */
  1726. X/***************************************************************************/
  1727. X
  1728. Xvoid edit( arg )
  1729. Xchar arg[];
  1730. X{
  1731. X  FILE *fp;
  1732. X  FILE *ff;
  1733. X
  1734. X  char s[STRING];
  1735. X  char t[STRING];
  1736. X  char d[STRING];
  1737. X  char p1[STRING];
  1738. X  char p2[STRING];
  1739. X
  1740. X  int ok = 0;
  1741. X  int yet = 0;
  1742. X
  1743. X  if (arg[0] == '\0') {
  1744. X    ansi( "md" );
  1745. X    printf(" <- %s\n", SUC07aMSG);
  1746. X    ansi( "me" ); 
  1747. X    return;
  1748. X  }
  1749. X
  1750. X  if (strcomp(BRETT, "PM") != 0) {
  1751. X        sprintf(t, "%s/%s", BRETT, arg); 
  1752. X  }
  1753. X  else {
  1754. X    sprintf(t, "%s/usr/%d/%s", HOME, USER.id, arg);
  1755. X    /*
  1756. X    ansi( "md" );
  1757. X    printf(" <- %s\n", SUC08_MSG);
  1758. X    ansi( "me" ); 
  1759. X    return;
  1760. X    */
  1761. X  }
  1762. X  
  1763. X  if((USER.level < ADMIN_LEV) && (USER.level >= EXE_LEV)){
  1764. X     fp = fopen( t, "r" );
  1765. X    if(fp == NULL){
  1766. X        ansi( "md" );
  1767. X        printf(" <- %s\n", SUC10_MSG);
  1768. X        ansi( "me" ); 
  1769. X        return;
  1770. X    }
  1771. X    while((fgets(s, 80, fp) != 0) && (ok == 0)){
  1772. X        if(strcomp("From: ", s) == 0){
  1773. X            strcpy(d, (char *) strcopy(s, 6, 80));
  1774. X            if(strcomp(USER.name, d) == 0) ok++;
  1775. X        }
  1776. X    }
  1777. X    fclose(fp);
  1778. X    if(ok == 0){
  1779. X        ansi( "md" );
  1780. X        printf(" <- %s\n", SUC09_MSG);
  1781. X        ansi( "me" ); 
  1782. X        return;
  1783. X    }
  1784. X  }
  1785. X
  1786. X  if(USER.level >= EXE_LEV){
  1787. X    sprintf(s, "%s %s", EDDY, t);
  1788. X    noctrlx();
  1789. X    system(s);
  1790. X    ctrlx();
  1791. X  }
  1792. X  else{
  1793. X    sprintf(p1, "%s/%dED1", TMP, getpid());
  1794. X    sprintf(p2, "%s/%dED2", TMP, getpid());
  1795. X
  1796. X    fp = fopen( t, "r" );
  1797. X    if(fp == NULL){
  1798. X        ansi( "md" );
  1799. X        printf(" <- %s\n", SUC08_MSG);
  1800. X        ansi( "me" ); 
  1801. X        return;
  1802. X    }
  1803. X     ff = fopen( p1, "w" );
  1804. X    while(fgets(s, 80, fp) != NULL){
  1805. X        fputs(s, ff);
  1806. X        if(strcomp("From: ", s) == 0){
  1807. X            strcpy(d, (char *) strcopy(s, 6, 80));
  1808. X            if(strcomp(USER.name, d) == 0) ok++;
  1809. X        }
  1810. X        if((strlen(s) < 3) && (yet == 0)){
  1811. X            fclose(ff);
  1812. X            ff = fopen( p2, "w" );
  1813. X            yet++;
  1814. X        }
  1815. X    }
  1816. X    fclose(fp);
  1817. X    fclose(ff);
  1818. X
  1819. X    if(ok == 0){
  1820. X        ansi( "md" );
  1821. X        printf(" <- %s\n", SUC09_MSG);
  1822. X        ansi( "me" ); 
  1823. X        unlink( p1 );
  1824. X        unlink( p2 );
  1825. X        return;
  1826. X    }
  1827. X
  1828. X    sprintf(s, "%s %s", EDDY, p2);
  1829. X    noctrlx();
  1830. X    system(s);
  1831. X    ctrlx();
  1832. X
  1833. X    sprintf(s, "cat %s > %s", p1, t);
  1834. X    system( s );
  1835. X    sprintf(s, "cat %s >> %s", p2, t);
  1836. X    system( s );
  1837. X
  1838. X    unlink( p1 );
  1839. X    unlink( p2 );
  1840. X  }
  1841. X}
  1842. END_OF_FILE
  1843.   if test 4622 -ne `wc -c <'src/suchen.c'`; then
  1844.     echo shar: \"'src/suchen.c'\" unpacked with wrong size!
  1845.   fi
  1846.   # end of 'src/suchen.c'
  1847. fi
  1848. if test -f 'src/xmd.c' -a "${1}" != "-c" ; then 
  1849.   echo shar: Will not clobber existing file \"'src/xmd.c'\"
  1850. else
  1851.   echo shar: Extracting \"'src/xmd.c'\" \(8786 characters\)
  1852.   sed "s/^X//" >'src/xmd.c' <<'END_OF_FILE'
  1853. X/***************************************************************************/
  1854. X/*        PROGRAMM  ix/Mbox                           */
  1855. X/*             DATEI  xmd.c                           */
  1856. X/*        FUNKTIONEN  brief(), mailing(), main()               */
  1857. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1858. X/*  LETZTE AENDERUNG  15.02.1992                       */
  1859. X/***************************************************************************/
  1860. X
  1861. X#include <sys/types.h>
  1862. X#include <sys/stat.h>
  1863. X#include <unistd.h>
  1864. X#include <stdio.h>
  1865. X#include <fcntl.h>
  1866. X#include <time.h>
  1867. X
  1868. X#include "mbox.h"
  1869. X
  1870. X
  1871. Xchar tmp[STRING];
  1872. Xchar alias[MAX_XMD_ALIAS][2][STRING];
  1873. Xint INTERACT;
  1874. X
  1875. X
  1876. X
  1877. X/***************************************************************************/
  1878. X/*      FUNKTION  brief()                           */
  1879. X/*  BESCHREIBUNG  Leitet einen Brief weiter an einen MBox-Account.       */
  1880. X/*          Auf diese Weise ist der Mbox-User auch unter der         */
  1881. X/*          Adresse 'Real.Name@UUCPID' erreichbar.           */
  1882. X/*     PARAMETER  arg  =  Mbox-User-Name                                   */
  1883. X/*     RUECKGABE  keine                                                    */
  1884. X/***************************************************************************/
  1885. X
  1886. Xbrief(arg)
  1887. Xchar arg[];
  1888. X{
  1889. X  FILE *fp;
  1890. X  FILE *ff;
  1891. X  int fd;
  1892. X  int i;
  1893. X  int ok;
  1894. X  struct userdaten LOOSER;
  1895. X
  1896. X  struct tm *timeptr;
  1897. X  time_t timer;
  1898. X
  1899. X  int receiver;
  1900. X  static int mail_id;
  1901. X  int EX_PM = 0;
  1902. X  int REPLY = 0;
  1903. X  int lines = 0;
  1904. X  int local = 0;
  1905. X
  1906. X
  1907. X  char s[STRING];
  1908. X  char t[STRING];
  1909. X  char top[STRING];
  1910. X  char subject[STRING];
  1911. X  char autor[STRING];
  1912. X  char rec_char[STRING];
  1913. X  char ex[255];
  1914. X  char user[STRING];
  1915. X  char c;
  1916. X  char protokoll;
  1917. X  char destination[STRING];
  1918. X
  1919. X  i = 0;
  1920. X  ok = 0;
  1921. X
  1922. X  strcpy(user, (char *) stripped(arg));
  1923. X  strcpy(subject, XMD01_MSG);
  1924. X
  1925. X  JUNK:    receiver = 0;
  1926. X
  1927. X  fd = open(UDBASE, O_RDONLY);
  1928. X  if (fd == -1) {
  1929. X    printf("\nSHIT!\n");
  1930. X    exit(-1);
  1931. X  }
  1932. X  lseek(fd, 0L, SEEK_SET);
  1933. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (receiver == 0)) {
  1934. X    if ((strcomp(user, LOOSER.name) == 0) ||
  1935. X        (strcomp(LOOSER.name, user) == 0) ||
  1936. X        (strcomp(user, LOOSER.nick) == 0) ||
  1937. X        (strcomp(user, LOOSER.sh_name) == 0)) {
  1938. X        receiver = LOOSER.id;
  1939. X        strcpy(rec_char, LOOSER.name);
  1940. X    }
  1941. X  }
  1942. X  close(fd);
  1943. X
  1944. X  if (receiver == 0) {
  1945. X    sprintf(subject, "[xmd:] '%s' ???   ", user);
  1946. X    strcpy(user, POSTMASTER);
  1947. X    goto JUNK;
  1948. X  }
  1949. X  sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  1950. X  fp = fopen(s, "r");
  1951. X  fgets(s, 80, fp);
  1952. X  mail_id = atoi( s );
  1953. X  fclose(fp);
  1954. X
  1955. X  sprintf(destination, "%s/usr/%d/%d", HOME, receiver, mail_id);
  1956. X  fp = fopen(destination, "w");
  1957. X
  1958. X  sprintf(s, "%s %s (%s)\n", GBL01_MSG, X_MAIL_DEMON, "xmd");
  1959. X  fputs(s, fp);
  1960. X
  1961. X  time(&timer);
  1962. X  timeptr = localtime(&timer);
  1963. X  strcpy(t, (char *) asctime(timeptr));
  1964. X
  1965. X  sprintf(s, "%s %s", GBL02_MSG, t);
  1966. X  fputs(s, fp);
  1967. X
  1968. X  sprintf(s, "%s %s\n\n", GBL03_MSG, subject);
  1969. X  fputs(s, fp);
  1970. X
  1971. X  fprintf(fp, "%s\n\n", XMD02_MSG);
  1972. X
  1973. X  lines = 7;
  1974. X
  1975. X  autor[0] = '\0';
  1976. X  subject[0] = '\0';
  1977. X
  1978. X  ff = fopen(tmp, "r");
  1979. X  if (ff == NULL) {
  1980. X    return;
  1981. X  }
  1982. X  while (fgets(s, 80, ff) != NULL) {
  1983. X    i = 0;
  1984. X    while(s[i] != '\0'){
  1985. X        if(s[i] > 127){
  1986. X            s[i] = '?';
  1987. X        }
  1988. X        i++;
  1989. X    }
  1990. X    fputs(s, fp);
  1991. X    lines++;
  1992. X    if((strcomp("Subject: ", s) == 0) && (subject[0] == '\0')){
  1993. X        strcpy(subject, (char *) stripped(strcopy(s, 9, 80)));
  1994. X    }
  1995. X    if((strcomp("From: ", s) == 0) && ((autor[0] == '\0') || (local = 1))){
  1996. X        strcpy(autor, (char *) stripped(strcopy(s, 6, 80)));
  1997. X        local = 0;
  1998. X    }
  1999. X    if(strcomp("From ", s) == 0){
  2000. X        strcpy(autor, (char *) stripped(strcopy(s, 5, 80)));
  2001. X        local = 1;
  2002. X    }
  2003. X  }
  2004. X  fclose(ff);
  2005. X  fclose(fp);
  2006. X
  2007. X  i = 0; 
  2008. X  while(autor[i] != '\0'){
  2009. X    if(autor[i] == '(') autor[(i-1)] = '\0';
  2010. X    i++;
  2011. X  }
  2012. X
  2013. X  if((local == 1) && (strcomp("postmaster", autor) == 0)){
  2014. X    fclose(fp);
  2015. X    unlink(destination);
  2016. X    if(INTERACT == 0) printf("[%s]\n", arg);
  2017. X    fp = fopen( XMDLOG, "a" );
  2018. X    fprintf(fp, "-%-30.30s%s\n", (char *) stripped(arg), subject);
  2019. X    fclose(fp);
  2020. X    return;
  2021. X  }
  2022. X
  2023. X  sprintf(s, "%s/usr/%d/INDEX", HOME, receiver);
  2024. X  fp = fopen(s, "a");
  2025. X
  2026. X  sprintf(s, "%d              ", mail_id);
  2027. X  s[6] = '\0';
  2028. X  fputs(s, fp);
  2029. X
  2030. X  sprintf(ex, "%s                                  ", subject);
  2031. X  ex[26] = '\0';
  2032. X  fputs(ex, fp);
  2033. X
  2034. X  sprintf(ex, "  %s                                        ", autor);
  2035. X  ex[22] = '\0';
  2036. X  fputs(ex, fp);
  2037. X
  2038. X
  2039. X  strcpy(s, (char *) mydate(1));
  2040. X  strcpy(t, (char *) mytime(1));
  2041. X  sprintf(ex, "  %s  %s         ", s, t);
  2042. X  ex[19] = '\0';
  2043. X  fputs(ex, fp);
  2044. X
  2045. X  sprintf(s, "%-5.d\n", lines);
  2046. X  fputs(s, fp);
  2047. X
  2048. X  fclose(fp);
  2049. X
  2050. X  sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  2051. X  fp = fopen(s, "w");
  2052. X  rewind(fp);
  2053. X  fprintf(fp, "%d\n", (int) (mail_id + 1));
  2054. X  fclose(fp);
  2055. X
  2056. X  if(INTERACT == 0) printf("%s\n", arg);
  2057. X
  2058. X  ff = fopen( XMDLOG, "a" );
  2059. X  fprintf(ff, " %-30.30s%s\n", (char *) stripped(arg), subject);
  2060. X  fclose(ff);
  2061. X}
  2062. X
  2063. X
  2064. X
  2065. X
  2066. X
  2067. X/***************************************************************************/
  2068. X/*      FUNKTION  mailing()                           */
  2069. X/*  BESCHREIBUNG  Isoliert den Mbox-User-Namen aus der UUCP-Adresse und       */
  2070. X/*                ruft mit diesem Namen die Routine "brief()" auf.       */
  2071. X/*     PARAMETER  keine                                                       */
  2072. X/*     RUECKGABE  keine                                                    */
  2073. X/***************************************************************************/
  2074. X
  2075. Xmailing()
  2076. X{
  2077. X  FILE *fp;
  2078. X  char s[255];
  2079. X  char t[STRING];
  2080. X  int i, j;
  2081. X
  2082. X  fp = fopen(tmp, "r");
  2083. X  if (fp == NULL) {
  2084. X    printf("\nPuhhh???\n");
  2085. X    exit(-1);
  2086. X  }
  2087. X  while (fgets(s, 80, fp) != NULL) {
  2088. X    if (strcomp("To:", s) == 0) {
  2089. X
  2090. X        i = 1;
  2091. X        while(strcomp("EOL", alias[i][1]) != 0){    
  2092. X            if(strcomp(alias[i][1], s) == 0) strcpy(s, alias[i][2]);
  2093. X            i++;
  2094. X        }
  2095. X
  2096. X        i = 0;
  2097. X        j = 0;
  2098. X        while ((s[i] != '\0') && (s[i] != '@')) {
  2099. X            if (s[i] == '!') j = i;
  2100. X            if ((s[i] == '.') || (s[i] == '%')) s[i] = ' ';
  2101. X            i++;
  2102. X        }
  2103. X        i--;
  2104. X        if (j == 0) {
  2105. X            strcpy(t, (char *) strcopy(s, 4, i));
  2106. X        } else {
  2107. X            strcpy(t, (char *) strcopy(s, (j + 1), length(s)));
  2108. X        }
  2109. X        brief(t);
  2110. X    }
  2111. X  }
  2112. X
  2113. X  fclose(fp);
  2114. X
  2115. X
  2116. X  unlink(tmp);
  2117. X
  2118. X}
  2119. X
  2120. X
  2121. X
  2122. X
  2123. X/***************************************************************************/
  2124. X/*      FUNKTION  main() (xmd)                           */
  2125. X/*  BESCHREIBUNG  Der Briefkasten des ERRORUSERS (POSTMASTER) wird ge-       */
  2126. X/*          scannt. Alle Eintraege fuer Mbox-User, deren Adresse     */
  2127. X/*          im Format 'Real.Name@UUCPID' vorliegen, werden zuge-       */
  2128. X/*          stellt.                                                  */
  2129. X/*     PARAMETER  keine                                                       */
  2130. X/*     RUECKGABE  keine                                                    */
  2131. X/***************************************************************************/
  2132. X
  2133. Xmain(argc, argv)
  2134. Xint argc;
  2135. Xchar *argv[];
  2136. X{
  2137. X  FILE *fp;
  2138. X  FILE *ff;
  2139. X  char s[255];
  2140. X  char t[255];
  2141. X  char dump[STRING];
  2142. X  char maildrop[STRING];
  2143. X  int toggle = 0;
  2144. X  int l;
  2145. X  int c;
  2146. X
  2147. X  setuid(0);
  2148. X  setgid(0);
  2149. X  umask(0000);
  2150. X
  2151. X  chdir(HOME);
  2152. X
  2153. X  ff = fopen( XMDLOG, "a" );
  2154. X  fprintf(ff, "\n\n========================== %s - %s ==============================\n\n", (char *) mydate( 1 ), (char *) mytime( 0 ));
  2155. X  fclose(ff);
  2156. X
  2157. X  if(argc < 2){
  2158. X    fp = fopen(ERRMBOX, "r");
  2159. X    INTERACT = 0;
  2160. X  }
  2161. X  else{
  2162. X    if(argv[2][0] == '-'){
  2163. X        sprintf(maildrop, "%s/%dPIP", TMP, getpid());
  2164. X        fp = fopen(maildrop, "w");
  2165. X        c = 0;
  2166. X        do{
  2167. X            c = fgetc(stdin);
  2168. X            if((c != EOF) && (c != 4)){
  2169. X                fputc(c, fp);
  2170. X                printf("%c", c);
  2171. X            }
  2172. X        }while((c != EOF) && (c != 4));
  2173. X        fclose(fp);
  2174. X        fp = fopen(maildrop, "r");
  2175. X        INTERACT = 1;    
  2176. X    }
  2177. X    else{
  2178. X        sprintf(maildrop, "%s/%s", MAILDROP, argv[1]);
  2179. X        fp = fopen(maildrop, "r");
  2180. X        INTERACT = 1;
  2181. X    }
  2182. X  }
  2183. X  if(INTERACT == 0) printf("\n");
  2184. X
  2185. X  if (fp == NULL) {
  2186. X    if(INTERACT == 0) printf("\nNo mail.\n");
  2187. X    return;
  2188. X  }
  2189. X
  2190. X  l = 1; 
  2191. X  ff = fopen( XMD_ALIAS, "r" );
  2192. X  if(ff != 0){
  2193. X    while(fgets(s, 80, ff) != 0){
  2194. X        if((s[0] > 64) && (l < MAX_XMD_ALIAS)){
  2195. X            strcpy(alias[l][1], (char *) stripped(s));
  2196. X            fgets(s, 80, ff);
  2197. X            strcpy(alias[l][2], (char *) stripped(s));
  2198. X            l++;
  2199. X        }
  2200. X    }
  2201. X    fclose(ff);
  2202. X  }
  2203. X  strcpy(alias[l][1], "EOL");
  2204. X
  2205. X  sprintf(dump, "%s/%d.DUMP", TMP, getpid());
  2206. X  ff = fopen(dump, "w");
  2207. X
  2208. X  while (fgets(s, 80, fp) != NULL) {
  2209. X    l = 2;
  2210. X    if (s[0] == '>') {
  2211. X        if(s[1] != ' ') l = 1;
  2212. X        strcpy(t, (char *) strcopy(s, l, length(s)));
  2213. X        strcpy(s, t);
  2214. X        if (strcomp("OOPS", s) != 0) {
  2215. X            fputs(s, ff);
  2216. X        }
  2217. X    }
  2218. X    else{
  2219. X        fputs(s, ff);
  2220. X    }
  2221. X  }
  2222. X  fclose(ff);
  2223. X  fclose(fp);
  2224. X
  2225. X  fp = fopen(dump, "r");
  2226. X
  2227. X  sprintf(tmp, "%s/%d.XMD", TMP, getpid());
  2228. X
  2229. X  ff = fopen(tmp, "w");
  2230. X
  2231. X  while (fgets(s, 80, fp) != NULL) {
  2232. X    if ((strcomp("From ", s) == 0) || (strcomp("From: ", s) == 0)){
  2233. X        if (toggle == 1) {
  2234. X            if (ff != 0) fclose(ff);
  2235. X            mailing();
  2236. X            ff = fopen(tmp, "w");
  2237. X        }
  2238. X        toggle = 1;
  2239. X    }
  2240. X    if (toggle == 1) fputs(s, ff);
  2241. X  }
  2242. X  if (ff != 0) fclose(ff);
  2243. X  if (toggle == 1) mailing();
  2244. X  fclose(fp);
  2245. X  
  2246. X  unlink(tmp);
  2247. X  unlink(dump);
  2248. X  
  2249. X  if(INTERACT == 0)
  2250. X     sprintf(s, "> %s", ERRMBOX);
  2251. X  else{
  2252. X    if(getgid() == GUEST_GID){
  2253. X         sprintf(s, "> %s", maildrop);
  2254. X    }
  2255. X  }
  2256. X  system(s);
  2257. X}
  2258. END_OF_FILE
  2259.   if test 8786 -ne `wc -c <'src/xmd.c'`; then
  2260.     echo shar: \"'src/xmd.c'\" unpacked with wrong size!
  2261.   fi
  2262.   # end of 'src/xmd.c'
  2263. fi
  2264. echo shar: End of archive 9 \(of 11\).
  2265. cp /dev/null ark9isdone
  2266. MISSING=""
  2267. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  2268.     if test ! -f ark${I}isdone ; then
  2269.     MISSING="${MISSING} ${I}"
  2270.     fi
  2271. done
  2272. if test "${MISSING}" = "" ; then
  2273.     echo You have unpacked all 11 archives.
  2274.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2275. else
  2276.     echo You still must unpack the following archives:
  2277.     echo "        " ${MISSING}
  2278. fi
  2279. exit 0
  2280. exit 0 # Just in case...
  2281.