home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume29 / mbox / part05 < prev    next >
Encoding:
Text File  |  1992-04-05  |  54.5 KB  |  2,120 lines

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  3. Subject:  v29i067:  mbox - A Bulletin Board System for UNIX and MINIX, Part05/10
  4. Message-ID: <1992Apr5.183510.29739@sparky.imd.sterling.com>
  5. X-Md4-Signature: a03efcf75524fc438a4c31a62cd716ea
  6. Date: Sun, 5 Apr 1992 18:35:10 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 29, Issue 67
  11. Archive-name: mbox/part05
  12. Environment: MINIX, ISC, ESIX, SVR3
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then feed it
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # Contents:  etc/help.hilfe etc/logo~ src/intro.c src/loop.c
  21. # Wrapped by kent@sparky on Sun Apr  5 11:57:42 1992
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. echo If this archive is complete, you will see the following message:
  24. echo '          "shar: End of archive 5 (of 10)."'
  25. if test -f 'etc/help.hilfe' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'etc/help.hilfe'\"
  27. else
  28.   echo shar: Extracting \"'etc/help.hilfe'\" \(17291 characters\)
  29.   sed "s/^X//" >'etc/help.hilfe' <<'END_OF_FILE'
  30. X#?
  31. XBefehl "?"
  32. X
  33. XDie beim aktuellen Level verfuegbaren Befehle werden angezeigt. Um auch die
  34. Xuebrigen Befehle anzeigen zu lassen, muss als Argument ein "*" angegeben
  35. Xwerden.
  36. X
  37. X#0
  38. XBefehl "0" ("1 - 9")
  39. X
  40. XUeber die Ziffern 0-9 wird der dynamische Befehlspuffer aufgerufen. Die Ziffer
  41. X0 zeigt die aktuelle Belegung dieser "Hot-Keys" an, 1-9 rufen denn gespreicherten
  42. XBefehl ab. Ausserdem kann man diese Befehle auch mit Hilfe der Cursortasten
  43. XUP und DOWN durchblaettern.
  44. X
  45. X#+
  46. XBefehl "+"
  47. X
  48. XDas naechste Brett mit neuen Nachrichten wird aufgerufen. Innerhalb des Brettes
  49. Xkann mit den ueblichen Befehlen (Inhalt, Lesen) gearbeitet werden.
  50. X
  51. X#-
  52. XBefehl "-"
  53. X
  54. XDas vorherige Brett mit neuen Nachrichten wird aufgerufen. Innerhalb des
  55. XBrettes kann mit den ueblichen Befehlen (Inhalt, Lesen) gearbeitet werden.
  56. X
  57. X#ANRUFER
  58. XBefehl "Anrufer" ("Protokoll")
  59. X
  60. XEine Liste der Anrufer wird angezeigt. Wird "*" als Parameter angegeben,
  61. Xzeigt das System ALLE Eintaege des Protokolls an, sonst nur die letzten 21.
  62. X
  63. XDie Option "#" (also "Anrufer #") erstellt eine Statistik aus den Daten
  64. Xder Anrufer-Liste.
  65. X
  66. X#ANSAGE
  67. XBefehl "Ansage"
  68. X
  69. XWenn ein anderer Teilnehmer Ihnen eine persoenliche Nachricht senden will,
  70. Xwird ihm der "Ansage"-Text angezeigt. Sollten sie z.B. fuer laenger Zeit
  71. Xverreisen und desshalb nicht sofort antworten koennen, teilen sie das im
  72. X"Ansage"-Text mit.
  73. X
  74. X#BRETT
  75. XBefehl "Brett" ("cd")
  76. X
  77. XDie Nachrichten dieser MBox sind nach Themen geordnet in verschiedenen
  78. XBrettern zusammengefasst. Der Ausdruck "Brett" ist in diesem Zusammenhang
  79. Xgleichbedeutend mit dem Begriff "Newsgroup" der UUCP-Terminologie.
  80. X
  81. X
  82. XDie verschiedenen Einsatzmoeglichkeiten des Befehls:
  83. X
  84. X"Brett"             Alle Bretter mit neuen Artikeln werden angezeigt.
  85. X"Brett *"           Alle Bretter des Systems werden angezeigt.
  86. X
  87. X"Brett +"           Es wird in's naechst hoehere Brett gewechselt.
  88. X
  89. X"Brett -"           Es wird in's naechst niedrigere Brett gewechselt. 
  90. X
  91. X"Brett !"           Der Name des aktuellen Brettes wird ausgegeben.
  92. X
  93. X"Brett BRETT"       Es wird in Brett "BRETT" gewechselt. Alle INHALT- und LESE-
  94. X                    Befehle beziehen sich jetzt auf "BRETT". 
  95. X
  96. X
  97. XDa verschienden Bretter allerdings nach dem Schema "Oberbrett.Unterbrett" auf-
  98. Xgebaut sind, gibt es noch einige spezielle Parameter:
  99. X
  100. X"Brett #"           Die sogenannten Oberbretter werden angezeigt. 
  101. X
  102. X"Brett OBERBRETT"   Wechselt ins Oberbrett OBERBRETT. Der Befehl INHALT
  103. X                    zeigt nun die Unterbretter dieses Oberbrettes an !!!
  104. X
  105. X"Brett UNTERBRETT"  Es wird ins Brett OBERBRETT.UNTERBRETT gewechselt.
  106. X
  107. X"Brett .."          Von OBERBRETT.UNTERBRETT gelangt man so wieder auf die
  108. X                    Ebene OBERBRETT.
  109. X
  110. X#BRIEF
  111. XBefehl "Brief" ("Mail");
  112. X
  113. XPersoenliche Post wird an Teilnehmer dieser MBox oder aber auch an User auf
  114. Xeinem fremden Rechner verschickt. 
  115. X
  116. XUm einen "internen" Teilnehmer anzuschreiben wird Folgendes eingegeben:
  117. X
  118. X"Brief USERNAME", "Brief ALIAS" oder "Brief SH-ACCOUNT"
  119. X
  120. XZ.B.: "Brief Volker Schuermann", "Brief volkers"
  121. X
  122. XDie MBox erkennt anhand dieser Angaben den Empfaenger und ruft zur Eingabe
  123. Xden Editor auf. Nun kann eine Nachricht geschrieben werden. Die persoenliche
  124. XUNTERSCHRIFT (siehe dort) wird der Nachricht angehaengt und mit verschickt.
  125. X
  126. X
  127. XBei einem Brief an "externe" Teilnehmer sieht die Anschrift etwas anderes
  128. Xaus:
  129. X
  130. X"Brief HOST!USER", "Brief USER@HOST.DOMAIN"
  131. X
  132. XZ.B.: "Brief unnet!volkers", "brief volkers@unnet.ruhr.sub.org"
  133. X
  134. XAnsonsten verhaelt sich der Vorgang genauso wie bei einer "internen" Nachricht.
  135. X
  136. XACHTUNG: Als eingetragener Teilnehmer duerfen Sie auch Post von "externen"
  137. XUsern empfangen. Folgende Adressierungs-Methode ist dabei verbindlich:
  138. X
  139. X"mail unnet!VORNAME.NAME"
  140. X
  141. XDie Adresse "unnet!VORNAME.NAME" entspricht "VORNAME.NAME@unnet.ruhr.sub.org"
  142. Xoder auch "..!unido!uka!smurf!horga!xenox!unnet!VORNAME.NAME" ... je nach 
  143. XDomain des Brief-Autoren.
  144. X
  145. X"VORNAME.NAME" steht in diesem Fall fuer Ihren (User-) Namen, kann aber auch
  146. Xkomplett durch Ihr Alias ersetzt werden (AUSNAHME !) ...
  147. X
  148. XZ.B.: "mail Volker.Schuermann@unnet.ruhr.sub.org"
  149. X
  150. X
  151. X#CHAT
  152. XBefehl "Chat" ("Dialog")
  153. X
  154. XSie betreten den Konferenzbereich. Dort koennen Sie sich mit anderen Teil-
  155. Xnehmern unterhalten. Dabei spielt es keine Rolle, ob Ihre Gespraechspartner
  156. Xebenfalls die MBox benutzen, oder auf Betriebssystem-Ebene arbeiten.
  157. X
  158. X#DOWNLOAD
  159. XBefehl "Download"
  160. X
  161. XDieser Befehl uebertraegt Artikel mit Hilfe eines Protokolls. Angeboten
  162. Xwerden ASCII (einfaches Auflisten der Textdatei) und SX/SZ/SB. Moegliche
  163. XParameter sind:
  164. X
  165. X"Download NUMMER"       Uebertraegt den Artikel No. "NUMMER".
  166. X
  167. X"Download NUM1-NUM2"    Uebertraegt die Artikel von No. "NUM1" bis "NUM2".
  168. X
  169. X"Download NUM-"         Alle Artikel von "NUM" bis 32000 werden uebertragen.
  170. X
  171. X"Download -NUM"         Alle Artikel von 1 bis "NUM" werden uebertragen.
  172. X
  173. XACHTUNG: "Download ??-??" uebertraegt alle angeforderten Artikel OHNE
  174. XUnterbrechung. Die UNIX-Befehle "RX/RZ/RB" unterstuetzen diesen Modus.
  175. X
  176. X#ENDE
  177. XBefehl "Ende" ("Quit")
  178. X
  179. XDas Programm wird beendet. Teilnehmer ohne SH-Account loesen mit diesem
  180. XBefehl auch die Verbindung ... also VORSICHT !
  181. X
  182. XNormalerweise wird nach der Eingabe des Befehls "Ende" das Scanner-Datum und
  183. Xdie Scanner-Zeit aktualisiert. Gibt man als Parameter ein "*" an, wird
  184. Xdiese Aktion unterbunden.
  185. X
  186. X#HILFE
  187. XBefehl "Hilfe"
  188. X
  189. XZu allen Befehlen dieses Systems gibt es mit "HILFE" eine kurze Information.
  190. X
  191. X"Hilfe"           eine Zusammenfassung der Befehle wird angezeigt.
  192. X"Hilfe *"         die gesamte Hilfsdatei wird ausgegeben.
  193. X"Hilfe BEFEHL"    zeigt nur den Eintrag zum Befehl "BEFEHL".
  194. X
  195. X#INHALT
  196. XBefehl "Inhalt" ("dir")
  197. X
  198. XWird als Parameter ein "*" angegeben, zeigt die MBox ein Inhaltsverzeichnis
  199. Xmit allen Eintraegen im aktuellen Brett an, sonst nur Neuzugaenge.
  200. X
  201. XIst das aktuelle Brett ein OBERBRETT, wird statt des Inhaltsverzeichnisses
  202. Xdie Liste der UNTERBRETTER ausgegeben.
  203. X
  204. X#LESEN
  205. XBefehl "Lesen" 
  206. X
  207. XDie per Parameter angeforderten Nachrichten werden angezeigt. Die Reihenfolge
  208. Xinnerhalb der einzelnen Artikel haengt von der Positionierung der Artikel-
  209. XNummern ab.
  210. X
  211. X"Lesen NUMMER"       Zeigt den Artikel No. "NUMMER" an.
  212. X
  213. X"Lesen NUM1-NUM2"    Zeigt die Artikel von No. "NUM1" bis "NUM2" an
  214. X                     Ist "NUM2" groesser als "NUM1" wird die Reihenfolge
  215. X                     bei der Ausgabe umgekehrt.
  216. X
  217. X"Lesen NUM-"         Alle Artikel von "NUM" bis 32000 werden angezeigt
  218. X
  219. X"Lesen -NUM"         Alle Artikel von 1 bis "NUM" werden angezeigt
  220. X
  221. X"Lesen"              Es werden alle neuen Artikel gezeigt (siehe INHALT)
  222. X
  223. X"Lesen *"            Saemtliche Eintraege eines Brettes werden ausgegeben
  224. X
  225. X
  226. XBei seitenweiser Ausgabe (siehe SETUP) kann mit der LEERTASTE weiterge-
  227. Xblaettert werden. Die Tasten "q" o. "Q" beenden die Anzeige.
  228. X
  229. XDie Ausgabe laesst sich mit "x", "X", "DEL", "CTRL-X" und "CTRL-D" komplett
  230. Xabbrechen (z.B. bei "Lesen *").
  231. X
  232. XIst der Artikel beendet, erscheint eine Eingabeaufforderung. Dort kann man
  233. Xentscheiden zwischen ABBRECHEN, BEANTWORTEN, NAECHSTE, VORHERIGE und
  234. XWIEDERHOLEN ... mit Hilfe dieser Auswahl kann man durch die einzelnen
  235. XNachrichten eines Brettes blaettern.
  236. X
  237. X#LOESCHEN
  238. XBefehl "Loeschen"
  239. X
  240. XDie per Parameter benannten Nachrichten werden geloescht. Wird keinerlei
  241. XAngabe gemacht, loescht das System ALLE Eintraege !
  242. X
  243. X"Loeschen NUMMER"     Loescht den Artikel No. "NUMMER"
  244. X
  245. X"Loeschen NUM1-NUM2"  Loescht die Artikel von No. "NUM1" bis "NUM2"
  246. X
  247. X"Loeschen NUM-"       Alle Artikel von "NUM" bis 32000 werden geloescht
  248. X
  249. X"Loeschen -NUM"       Alle Artikel von 1 bis "NUM" werden entfernt
  250. X
  251. X"Loeschen"            Es werden alle (!) persoenlichen Mails geloescht
  252. X
  253. XACHTUNG: Der Befehl ist NICHT rueckgaengig zu machen ! Da wir hier unter
  254. X         UNIX arbeiten, halten wird uns an die Devise: "Der User weiss was
  255. X         er tut, also KEINE Rueckfragen - wenn er loeschen will, will er
  256. X         loeschen ..."     
  257. X
  258. X#MAKRO
  259. XBefehl "Makro"
  260. X
  261. XUm haeufig wiederkehrende Befehlsfolgen nicht jedesmal komplett eingeben
  262. Xzu muessen, kann man Makros mit diesen Kommandos vereinbaren. Nach der
  263. XVereinbarung genuegt die Angabe des Makro-Names, um die Befehle aufzurufen.
  264. X
  265. XMakro = Befehlsfolge
  266. X===========================================================================
  267. Xandi  = BRIEF andreas@xenox.ruhr.de
  268. Xwalt  = BRIEF Walter, WEITERLEITEN weller!walterb
  269. Xgrp   = BRIEF volkers, WEITER xenox, WEITER stefans, WEITER joergg
  270. Xsts   = BRI Stefan S, WEI stefans@coduck.ruhr.sub.org, WEI unnet!stefans
  271. Xin    = +, INHALT, KEY, in
  272. Xpp    = PORTINFO, SLEEP 5, pp
  273. X
  274. XDie letzen beiden Beispiele demonstrieren "rekursive" Makros. Dabei werden
  275. Xdie Befehle "KEYPRESSED" (wartet auf einen Tastendruck - "CTRL-X", "x" und
  276. X"q" beenden den Vorgang) und "SLEEP nnn" (wartet "nnn" Sekunden) verwendet.
  277. X
  278. XMakros lassen sich auch in der Kommandozeile definieren. Es genuegt eine
  279. Xgueltige Vereinbarung inzugeben (siehe oben) - sie wird automagisch in
  280. Xdie Makro-Sammlung aufgenommen.
  281. X
  282. X#MINIX
  283. XBefehl "Minix" ("execute")
  284. X
  285. XMit entsprechendem LEVEL kann man mit dem Befehl "Minix OS-BEFEHL" ein
  286. XKommando auf Betriebssystem-Ebene ausfuehren.
  287. X
  288. XZ.B. "Minix date", "Minix whodo", "Minix ps -lax"
  289. X
  290. X#PM
  291. XBefehl "PM"
  292. X
  293. XDie oeffentlichen Bretter werden verlassen und das persoenliche Postfach
  294. Xgeoeffnet. Die Befehle INHALT, LESEN, LOESCHEN beziehen sich nun auf das
  295. XPostfach.
  296. X
  297. X#PORTINFO
  298. XBefehl "Portinfo" ("Wer")
  299. X
  300. XDas System holt sich Informationen ueber die Taetigkeit aller Teilnehmer und
  301. Xzeigt sie zusammen mit Name, Terminal-Port und Login-Zeit an. Ist der 
  302. XTeilnehmer in der MBox aktiv, wird ausserdem sein letzter Befehl angezeigt,
  303. Xbei SH-Usern wird der aktuellste Prozess angezeigt.
  304. X
  305. X#POSTFACH
  306. XBefehl "Postfach"
  307. X
  308. XUm persoenliche Post erhalten zu koennen, und um an die externen Bretter
  309. Xsenden zu duerfen, muss das System einen "Account" einrichten. Sie werden
  310. Xgebeten Ihren Namen und einige pers. Daten anzugeben. Wenn Sie nur inner-
  311. Xhalb der Box Post u. Nachrichten versenden wollen, genuegt der Name. Falls
  312. XSie aber auch an die extrenen Bretter senden wollen, und PMs an User auf
  313. Xanderen Rechnern verschicken wollen, MUSS auch die Anschrift stimmig ange-
  314. Xgeben werden ...
  315. X
  316. X#RICHTUNG
  317. XBefehl "Richtung"
  318. X
  319. XMit diesem Befehl kann die Leserichtung beeinflusst werden. D.h. ob zuerst
  320. Xdie aeltern, oder die neuer Artikel angezeigt werden sollen. Diese Einstellung
  321. Xgilt sowohl fuer den Befehl "Lesen" als auch fuer den Befehl "Inhalt".
  322. XMit dem Befehl "Setup" kann (im Untermenue "Textausgabe") die Leserichtung
  323. Xgespeichert werden. 
  324. X
  325. XACHTUNG: der Befehl "Richtung" setzt die im SETUP gespeicherte Vorgabe zwar
  326. X         fuer die Dauer der Session ausser Kraft, beim naechsten Login aber,
  327. X         wird der Vorgabewerte wieder aktiviert.
  328. X
  329. X#SCHREIBEN
  330. XBefehl "Schreiben"
  331. X
  332. XEin neuer Artikel kann mit diesem Befehl an eines der Bretter gesendet werden.
  333. XVor der eigentlichen Eingabe werden noch "Subject" (das Thema des Artikels)
  334. Xund "Keywords" (falls mal nach bestimmten Schluesselworten gesucht werden
  335. Xsollte) abgefragt. Anschliessend wird der Editor zur Erfassung gestartet.
  336. X
  337. XJe nach Brett und Userlevel wird der Artikel nach Beendigung der Eingabe
  338. Xentweder nur lokal verbreitet, oder aber an eines der UUCP-Netze verschickt.
  339. X
  340. X#SETUP
  341. XBefehl "Setup" ("Anschrift", "Ansi", "Bell", "More", "Terminal", "Passwort")
  342. X
  343. XIhre persoenlichen Daten und System-Parameter koennen mit diesem Befehl
  344. Xbearbeitet werden. 
  345. X
  346. XTerminal:  Sie haben die Wahl zwischen drei Terminal-Emulation und einer
  347. X           reinen Dump-Ausgabe. Vorzuziehen ist die "ANSI"-Einstellung, weil
  348. X           sie von allen gaengigen Terminal-Programmen unterstuetzt wird.
  349. X
  350. XEditor:    Es werden einige Editoren angeboten, deren Einsatz vom gewaehlten
  351. X           Terminaltyp abhaengig ist. GAESTE und User ohne SH-Account arbeiten
  352. X           generell mit einen zeilenorientierten Editor (LED).
  353. X
  354. XPrompt:    Der Prompt (die Eingabeaufforderung) kann verschiedene Informationen        
  355. X           ausgeben. Entweder das aktuelle Brett, die Uhrzeit oder die ver-
  356. X           brauchten Telefongebuehren (ACHTUNG: Feiertage werden NICHT berueck-
  357. X           sichtigt, Wechseln zwischen Norm- und Billigtarif waehrend der
  358. X           Verbindung wird NICHT registriert ... es gilt immer der Tarif zur
  359. X           Anzeigezeit).
  360. X
  361. XAusgabe:   Texte koennen entweder bildschirmweise, oder kontinuierlich ausge-
  362. X           geben werden. Bei der ersten Methode wird mit der LEERTASTE weiter-
  363. X           geblaettert, die Tasten "q" o. "Q"  beenden die Ausgabe. Die konti-
  364. X           nuierliche Ausgabe wird mit CTRL-S gestoppt und mit CTRL-Q  
  365. X           wieder aufgenommen. Mit CTRL-X (oder DEL) kann die Ausgabe abge-
  366. X           brochen werden.
  367. X    
  368. X           Ausserdem kann an dieser Stelle die Leserichtung vorgegegben werden.       
  369. X       D.h. es wird entschieden, ob zuerst die aelteren, oder zuerst die
  370. X           neueren Artikel angezeigt werden sollen.
  371. X
  372. XAnschrift: Persoenliche Daten wie (User-)Name, Anschrift etc. koennen mit
  373. X           dieser Option geandert werden. Je detailierter die Angaben, desto
  374. X           ehr wird eine Schreibberechtigung fuer extrene Bretter vergeben.
  375. X
  376. XPasswort:  Das Passwort sollte regelmaessig geandert werden, um die persoenl.
  377. X           Daten und die Post zu schuetzten.
  378. X
  379. XIntro:     Nach dem Anmelden im System kann man sich eine Statusmeldung und
  380. X           eine aktuelle Information anzeigen lassen. Beide Anzeigen koennen
  381. X           getrennt unterbunden werden.
  382. X
  383. XScanner:   Hier kann das Datum geaendert werden, das bei der Bestimmung
  384. X           aktueller Eintraege zugrunde gelegt wird. Je weiter zurueckdatiert
  385. X           wird, desto mehr Eintraege werden angezeigt. Ausserdem kann man
  386. X           zusaetzlich die Uhrzeit als Vergleichswert einsetzen.
  387. X
  388. X#SPIELE
  389. XBefehl "Spiele"
  390. X
  391. XEine Liste der ONLINE-Spiele wird angezeigt. Die Spiele verwenden z.T. 
  392. XTerminal-Emulationen - also ACHTUNG! Fast alle Spiele lassen sich mit
  393. X"Q" oder "q" beenden.
  394. X
  395. X#STATUS
  396. XBefehl "Status"
  397. X
  398. XIhre persoenlichen Daten und Einstellungen werden angezeigt. Dazu zaehlen
  399. Xauch Angaben ueber Up- und Downloads, Onlinezeit und die UUCP-Adressen.
  400. X
  401. X#STATISTIK
  402. XBefehl "Statistik"
  403. X
  404. XEin Statistik der versch. Bretter (NGs) und deren aktueller Inhalt wird
  405. Xangezeigt. Mit der Option "*" wird die komplette Ausgabe der Statistik
  406. Xbefohlen, und mit "$" kann eine Uebersicht der (Transfer-)Telefongebuehren
  407. Xabgefragt werden. Ausserdem laesst sich mit "#" ein Protokoll der Down-
  408. Xloads aus den versch. PD-Brettern abrufen. Wird stattdessen ein "%" angegeben,
  409. Xerfolgt eine Auswertung der Downloads. Das Ergebnis wird als "Hitliste"
  410. Xausgegeben.
  411. X
  412. X#SUCHEN
  413. XBefehl "Suchen"
  414. X
  415. XAlle (!) Artikel eine Brettes werden nach dem optional anzugebenden Such-
  416. Xmuster durchsucht. Die Artikel, die das Suchmuster enthalten, werden 
  417. Xangezeigt.
  418. X
  419. X#UPLOAD
  420. XBefehl "Upload"
  421. XDiesen Befehl gibt es NICHT. Der Befehl "Schreiben" bietet als Option
  422. Xden Upload an. Programm-Daten werden automatisch erkannt und entsprechend
  423. Xverarbeitet.
  424. X
  425. X#UNTERSCHRIFT
  426. XBefehl "Unterschrift"
  427. X
  428. XAlle Texte, die sie in dieser MBox schreiben, werden mit der "Unterschrift"
  429. Xbeendet. Sie koennen hier z.B. Ihre Anschrift, Ihre E-Mail Adresse oder
  430. Xeinen Spruch (Disclaimer) eingeben. Fuer UNIX-Kenner: der Befehl entspricht
  431. Xder ".signature". Ein Beispiel:
  432. X
  433. X-----------------------------------------------------------------------------
  434. XDAS MENSCHLICHE AN COMPUTERN   Volker Schuermann,D-5600 Wpt.21,Monhofsfeld 70
  435. XIST IHRE GEWISSENLOSIGKEIT !   DATA   +49 202 4660234    DATA  +49 202 462114
  436. X-----------------------------------------------------------------------------
  437. X
  438. X#USER
  439. XBefehl: "User" ("Teilnehmer")
  440. X
  441. XSie erhalten eine Liste der Teilnehmer in diesem MBox-System. Der Wert, der
  442. Xdem Namen folgt (z.B. "J. Random Looser (24)"), zeigt die UserID. Je niedriger
  443. Xdie Nummer, desto laenger ist der User eingtragen - jede Nummer wird nur
  444. Xeinmal vergeben.
  445. X
  446. XWird als Argument ein "*" angehaengt, gibt die MBox eine detailierte Liste aus,
  447. Xdie z.B. den letzen Anruf der jeweiligen User, das Userlevel etc. enthaelt.
  448. X
  449. XDetailierte Informationen ueber einzelnen User erhaelt man, wenn man als 
  450. XOption den Namen ("Vorname Name", "Alias", "Shell-Account") angibt.
  451. X
  452. X#VERSION
  453. XBefehl: "Version"
  454. X
  455. XDie aktulle Versionnummer wird angezeigt. Sollten Sie einmal einen Fehler
  456. Xim Programm finden, geben Sie diese Nummer bei Ihrer Fehlerbeschreibung 
  457. Xbitte an.
  458. X
  459. Xix/Mbox 0.8.2 by <volkers@unnet.ruhr.sub.org>    
  460. X        =====
  461. X
  462. XDie Fehlerberschreibung sende Sie per E-Mail an die Anschrift "<volkers@...>".
  463. X
  464. XMit der "Version #"-Option wird die MBox angwiesen eine Liste begabter Leute
  465. Xauszugeben, die massgeblich an der Entwicklung dieses Programms beteiligt
  466. Xwaren.
  467. X
  468. X#WEITERLEITEN
  469. XBefehl: "Weiterleiten"
  470. X
  471. XBriefe und Artikel koennen an andere Teilnehmer weitergeleitet werden. Dabei
  472. Xgilt folgende Schreibweise:
  473. X
  474. X"Weiterleiten"            Der Betreff der zuletzt geschriebenen PM (!) wird
  475. X                          angezeigt. Diese PM kann weitergeleitet werden.
  476. X
  477. X"Weiterleiten USER"       Die zuletztgeschrieben PM wird an den Teilnehmer
  478. X                          USER geschickt. 
  479. X
  480. X"Weiterleiten NNN USER"   Der Artikel/Brief NNN wird an den Teilnehmer USER
  481. X                          gesendet. 
  482. X
  483. XDie Briefe/Artikel koennen vor dem Versand ueberarbeitet werden. Die Syntax
  484. Xist VERBINDLICH, es darf immer nur EIN Empfaenger angegeben werden.
  485. X
  486. XUSER kann ein lokaler Teilnehmer, ein User auf einem anderen Rechner, oder
  487. Xaber der eigene SH-Account sein:
  488. X
  489. X"Weiterleiten Volker"            
  490. X"Weiterleiten volkers@xenox.ruhr.de", 
  491. X"Weiterleiten unnet!volkers"
  492. X
  493. X
  494. END_OF_FILE
  495.   if test 17291 -ne `wc -c <'etc/help.hilfe'`; then
  496.     echo shar: \"'etc/help.hilfe'\" unpacked with wrong size!
  497.   fi
  498.   # end of 'etc/help.hilfe'
  499. fi
  500. if test -f 'etc/logo~' -a "${1}" != "-c" ; then 
  501.   echo shar: Will not clobber existing file \"'etc/logo~'\"
  502. else
  503.   echo shar: Extracting \"'etc/logo~'\" \(243 characters\)
  504.   sed "s/^X//" >'etc/logo~' <<'END_OF_FILE'
  505. X
  506. X
  507. X
  508. Xooo o o ooo   ooo o ooo ooo   ooo oo   o  o o ooo o      o  oo  ooo ooo ooo o o
  509. X o  ooo oo     o  o ooo oo     o  ooo ooo o o oo  o     ooo o o oo  ooo o    o
  510. X o  o o ooo    o  o o o ooo    o  o o o o  o  ooo ooo   o o ooo ooo ooo ooo  o
  511. X
  512. X
  513. END_OF_FILE
  514.   if test 243 -ne `wc -c <'etc/logo~'`; then
  515.     echo shar: \"'etc/logo~'\" unpacked with wrong size!
  516.   fi
  517.   # end of 'etc/logo~'
  518. fi
  519. if test -f 'src/intro.c' -a "${1}" != "-c" ; then 
  520.   echo shar: Will not clobber existing file \"'src/intro.c'\"
  521. else
  522.   echo shar: Extracting \"'src/intro.c'\" \(13541 characters\)
  523.   sed "s/^X//" >'src/intro.c' <<'END_OF_FILE'
  524. X/***************************************************************************/
  525. X/*        PROGRAMM  ix/Mbox                           */
  526. X/*             DATEI  intro.c                           */
  527. X/*        FUNKTIONEN  intro(), init_user()                   */
  528. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  529. X/*  LETZTE AENDERUNG  18.03.1992                       */
  530. X/***************************************************************************/
  531. X
  532. X#include <sys/types.h>
  533. X#include <sys/stat.h>
  534. X#include <unistd.h>
  535. X#include <fcntl.h>
  536. X#include <stdio.h>
  537. X#include <time.h>
  538. X
  539. X#include "mbox.h"
  540. X
  541. Xtime_t time_start, time_now;
  542. X
  543. X
  544. Xvoid init_user();
  545. X
  546. X/***************************************************************************/
  547. X/*      FUNKTION  intro()                           */
  548. X/*  BESCHREIBUNG  Teilnehmer melden sich an. Beim Aufruf von SHELL, wird   */
  549. X/*          die Prozedur automagisch abgewickelt. Gaeste koennen     */
  550. X/*          ausserdem in dieser Funktion ein Terminal auswaehlen.    */
  551. X/*     PARAMETER  keine                                                    */
  552. X/*     RUECKGABE  keine                                                       */
  553. X/***************************************************************************/
  554. X
  555. Xvoid intro()
  556. X{
  557. X  FILE *fp;
  558. X  FILE *ff;
  559. X  int fd;
  560. X  char s[LSTRING];
  561. X  char t[STRING];
  562. X  char f[STRING];
  563. X  char tmp[STRING];
  564. X  char crypt_pw[STRING];
  565. X  char ex[255];
  566. X  char tmpuser[STRING];
  567. X  char moreLASTLOG[STRING];
  568. X  int i, calls;
  569. X  char c;
  570. X  int ok;
  571. X  int a, b;
  572. X  long lalo;
  573. X  struct userdaten LOOSER;
  574. X
  575. X  struct tm *timeptr;
  576. X  time_t timer;
  577. X  struct stat fst;
  578. X
  579. X  umask(0007);
  580. X
  581. X  sprintf(TERMINAL, "ansi");
  582. X  ansi("INIT");
  583. X
  584. X  time(&time_start);
  585. X
  586. X  fp = fopen( LOGO, "r" );
  587. X  if(fp != NULL){
  588. X    fclose(fp);
  589. X    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  590. X    ansi("cl");
  591. X    ansi("md");
  592. X        show( LOGO, 24, 0 );
  593. X    ansi("me");
  594. X    c = getint();    
  595. X  }
  596. X
  597. X  printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  598. X  ansi("cl");
  599. X
  600. X  ansi("md");
  601. X  printf("\n%s ", INT01_MSG);
  602. X  ansi("me");
  603. X  printf("%s", ORGANIZATION);
  604. X    
  605. X  ansi("md");
  606. X  printf("\n%s ", INT02_MSG);
  607. X  ansi("me");
  608. X  printf("%s %s %s", VERSION, PATCHLEVEL, AUTOR);
  609. X
  610. X  ansi("md");
  611. X  printf("\n%s ", INT03_MSG);
  612. X  ansi("me");
  613. X  printf("%s", SYSTEM);
  614. X
  615. X  BAUDRATE = (int) 0;
  616. X
  617. X  if (OLDGID == GUEST_GID) {    /* GAESTE */
  618. X
  619. X        TRY_AGAIN:
  620. X
  621. X    printf("\n\n%s ", GBL04_MSG);
  622. X    strcpy(LOOSER.name, (char *) getline(30, 11, '.', ""));
  623. X    if (LOOSER.name[0] == '\0') goto TRY_AGAIN;
  624. X
  625. X    strcpy(s, (char *) upcased(LOOSER.name));
  626. X
  627. X    if (strcomp(GUEST, s) != 0) {
  628. X
  629. X        printf("\n%s ", GBL09_MSG);
  630. X        strcpy(LOOSER.passwort, (char *) getline(10, 12, '.', ""));
  631. X        strcpy(crypt_pw, (char *) crypted(LOOSER.passwort));
  632. X
  633. X        maybe_locked(UDBASE, "r"); lockf(UDBASE);
  634. X        fd = open(UDBASE, O_RDONLY);
  635. X        if (fd == -1) {
  636. X            nerror("intro.c", 78, "intro", "Datei-Lesefehler", UDBASE);
  637. X        }
  638. X        ok = 0;
  639. X        while ((ok == 0) && (read(fd, &USER, sizeof(USER)) == sizeof(USER))) {
  640. X            if (((strcomp(LOOSER.name, USER.name) == 0) ||
  641. X              (strcomp(LOOSER.name, USER.nick) == 0)) &&
  642. X             ((strcomp(USER.passwort, (char *) crypt_pw) == 0) ||
  643. X              (strcomp(USER.passwort, LOOSER.passwort) == 0)))
  644. X                ok = 1;
  645. X        }
  646. X        close(fd);
  647. X        unlockf(UDBASE);
  648. X
  649. X        if (ok == 1) goto WELL_DONE;
  650. X        goto TRY_AGAIN;
  651. X    }
  652. X    strcpy(LOOSER.name, (char *) upcased(s));
  653. X
  654. X    maybe_locked(UDBASE, "r"); lockf(UDBASE);
  655. X    fd = open(UDBASE, O_RDONLY);
  656. X    if (fd == -1) {
  657. X        nerror("intro.c", 98, "intro", "Datei-Lesefehler", UDBASE);
  658. X    }
  659. X    ok = 0;
  660. X    while ((ok == 0) && (read(fd, &USER, sizeof(USER)) == sizeof(USER))) {
  661. X        if (strcomp(LOOSER.name, USER.name) == 0) ok = 1;
  662. X    }
  663. X    close(fd);
  664. X    unlockf(UDBASE);
  665. X
  666. X    ansi("md");
  667. X    printf("\n\n%s\n\n", INT04_MSG);
  668. X    ansi("me");
  669. X    printf("%s\n", INT05_MSG);
  670. X    ansi("md");
  671. X    printf("\n%s > ", INT06_MSG);
  672. X    ansi("me");
  673. X
  674. X    do {
  675. X        c = getint();
  676. X    } while ((c < '1') || (c > '4'));
  677. X    printf("%c", c);
  678. X    USER.terminal = c - 48;
  679. X
  680. X    strcpy(USER.name, (char *) GUEST);
  681. X    sprintf(USER.passwort, "%s", "*****");
  682. X
  683. X    USER.level       =  0;
  684. X    USER.prompt        =  2;
  685. X    USER.bell          =  0;
  686. X    USER.intro         =  1;
  687. X    USER.more          =  1;
  688. X    USER.editor        =  1;
  689. X    USER.lastmode      =  2;
  690. X    USER.leserichtung  =  2;
  691. X    USER.tlines        = 23;
  692. X    USER.schluessel[0] =  1;
  693. X
  694. X    sprintf(USER.newsgrps, "%s", NEWS_MINIMUM);
  695. X
  696. X    LASTLOG = (long) 19700101;
  697. X    LASTTIME = 0;
  698. X    sprintf(moreLASTLOG, "%s", "01.01.1970");
  699. X  }
  700. X  else {            /* USER */
  701. X
  702. X    printf("\n\n%s ....................", GBL04_MSG);
  703. X    for (i = 0; i < 20; i++) printf("%c", BS);
  704. X
  705. X    strcpy(tmpuser, (char *) whoami());
  706. X    printf("%s", tmpuser);
  707. X
  708. X    printf("\n%s ..........", GBL09_MSG);
  709. X
  710. X    for (i = 0; i < 10; i++) printf("%c", BS);
  711. X    for (i = 0; i < 10; i++) printf("*");
  712. X
  713. X    if (strcomp(tmpuser, "root") == 0) {
  714. X        strcpy(tmpuser, (char *) POSTMASTER);
  715. X
  716. X        s[0] = '\0'; strcat(s, (char *) ttyname(0));
  717. X        if(strcomp(PMS_TTY, s) != 0){
  718. X            printf("\n\n");
  719. X            ansi("mr");
  720. X            printf("%s", INT07_MSG);
  721. X            ansi("me");
  722. X            printf("\n\n");
  723. X            exit(-1);
  724. X        }
  725. X        else {
  726. X            USER.level = 10;
  727. X        }
  728. X    }
  729. X    maybe_locked(UDBASE, "r"); lockf(UDBASE);
  730. X    fd = open(UDBASE, O_RDONLY);
  731. X    if (fd == -1) {
  732. X        nerror("intro.c", 156, "intro", "Datei-Lesefehler", UDBASE);
  733. X    }
  734. X    ok = 0;
  735. X    while ((ok == 0) && (read(fd, &USER, sizeof(USER)) == sizeof(USER))) {
  736. X        if ((strcomp(tmpuser, USER.sh_name) == 0)) ok = 1;
  737. X    }
  738. X    close(fd);
  739. X    unlockf(UDBASE);
  740. X
  741. X    if (ok == 0) postfach(tmpuser);
  742. X
  743. X  }
  744. X
  745. X  WELL_DONE:
  746. X
  747. X  setuid( ROOT_UID );
  748. X  setgid( ROOT_GID ); 
  749. X
  750. X  if (strcomp(GUEST, USER.name) != 0) {
  751. X    LASTLOG = (long) dateconv(USER.lastlog);
  752. X    LASTTIME = USER.lasttime;
  753. X    sprintf(moreLASTLOG, "%s", USER.lastlog);
  754. X  }
  755. X  if (USER.lastmode == 2) LASTTIME = 0;
  756. X
  757. X  sprintf(UGROUPS, "%s/usr/%d/.active", HOME, USER.id);
  758. X
  759. X  maybe_locked( AGROUPS, "r" );
  760. X  fp = fopen(AGROUPS, "r");
  761. X  if (fp == NULL) {
  762. X    nerror("intro.c", 182, "intro", "Datei-Lesefehler", AGROUPS);
  763. X  }
  764. X  ff = fopen(UGROUPS, "w");
  765. X  if (ff == NULL) {
  766. X    nerror("intro.c", 195, "intro", "Datei-Schreibfehler", UGROUPS);
  767. X  }
  768. X  while (fscanf(fp, "%s %ld", s, &lalo) > 0) {
  769. X    if (LASTLOG < lalo) {
  770. X        sprintf(t, "%s 00000 00000 y\n", s);
  771. X        fputs(t, ff);
  772. X    }
  773. X    if (LASTLOG == lalo) {
  774. X    }
  775. X  }
  776. X  fclose(ff);
  777. X  fclose(fp);
  778. X
  779. X  sprintf(s, "%s \"%s\" (%d) %s", INT08_MSG, USER.name, USER.id, INT09_MSG);
  780. X  control(s, 3);
  781. X  whodo( INT10_MSG );
  782. X
  783. X  printf("\n\n");
  784. X
  785. X  if ((USER.level < 10) && (strcomp(MYNAME, USER.name) != 0)) {
  786. X
  787. X    maybe_locked(SEQ, "r"); lockf(SEQ);
  788. X    fp = fopen(SEQ, "r");
  789. X    if (fp == NULL) {
  790. X        nerror("intro.c", 223, "intro", "Datei-Lesefehler", SEQ);
  791. X    }
  792. X    fscanf(fp, "%d", &calls);
  793. X    fclose(fp);
  794. X    calls++;
  795. X
  796. X    fp = fopen(SEQ, "w");
  797. X    if (fp == NULL) {
  798. X        nerror("intro.c", 227, "intro", "Datei-Schreibfehler", SEQ);
  799. X    }
  800. X    fprintf(fp, "%d\n", calls);
  801. X    fclose(fp);
  802. X    unlockf(SEQ);
  803. X
  804. X    sprintf(tmp, "%s/%dT", TMP, getpid());
  805. X
  806. X    fp = fopen(tmp, "w");
  807. X    if (fp == NULL) {
  808. X        nerror("intro.c", 236, "intro", "Datei-Schreibfehler", tmp);
  809. X    }
  810. X    maybe_locked(CALLS, "r"); lockf(CALLS);
  811. X    ff = fopen(CALLS, "r");
  812. X    if (ff == NULL) {
  813. X        nerror("intro.c", 239, "intro", "Datei-Lesefehler", CALLS);
  814. X    }
  815. X    sprintf(s, "%s (%s)", USER.name, USER.nick);
  816. X    sprintf(t, "%s", numstripped(USER.wohnort));
  817. X    if (t[0] == '\0') sprintf(t, "%s", "   ");
  818. X
  819. X    sprintf(f, "%s", (char *) ttyna());
  820. X
  821. X    if (OLDGID == GUEST_GID){
  822. X        fprintf(fp, "%5.d  %-28.28s  %-17.17s %6.6s   %s  %s\n",
  823. X            calls, s, stripped(t), f, (char *) mydate(1), (char *) mytime(1));
  824. X    }
  825. X    else{
  826. X        fprintf(fp, "%5.d  %-28.28s  %-17.17s %6.6s   %s  %s\n",
  827. X            calls, s, stripped(t), f, (char *) mydate(1), (char *) mytime(1));
  828. X    }
  829. X
  830. X    if(PRO_ENTRIES < 10){
  831. X        nerror("intro.c", 291, "intro", "PRO_ENTRIES zu klein dimensioniert", "mbox.h");            
  832. X    }
  833. X
  834. X    i = 1;
  835. X    while ((fgets(s, 84, ff) != NULL) && (i <= PRO_ENTRIES)) {
  836. X        fputs(s, fp);
  837. X        i++;
  838. X    }
  839. X
  840. X    fclose(ff);
  841. X    fclose(fp);
  842. X
  843. X    sprintf(s, "cp %s %s > /dev/null", tmp, CALLS);
  844. X    system(s);
  845. X
  846. X    unlink(tmp);
  847. X    unlockf(CALLS);
  848. X  }
  849. X
  850. X  sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);  
  851. X  if(atol(USER.abused) == 0L){
  852. X      stat(s, &fst);
  853. X      IDX_SIZE = (long) fst.st_size;
  854. X  }
  855. X  else IDX_SIZE = atol(USER.abused);
  856. X
  857. X  init_user( INT11_MSG );
  858. X
  859. X  if (USER.intro < 3) {
  860. X
  861. X    a = 0;
  862. X    fp = fopen(UGROUPS, "r");
  863. X    if (fp == NULL) {
  864. X        nerror("intro.c", 283, "intro", "Datei-Lesefehler", AGROUPS);
  865. X    }
  866. X    while (fgets(ex, 200, fp) != NULL) a++;
  867. X    fclose(fp);
  868. X
  869. X    b = 0;
  870. X    sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);  
  871. X    
  872. X    fp = fopen(s, "r");
  873. X    if (fp == NULL) {
  874. X        nerror("intro.c", 291, "intro", "Datei-Lesefehler", s);
  875. X    }
  876. X    while (fgets(ex, 200, fp) != NULL){
  877. X        if(ex[0] < 65) b++;
  878. X    }
  879. X    fclose(fp);
  880. X    b -= 1;
  881. X
  882. X    ansi("md");
  883. X    printf("%s %d. %s %s %s.\n", 
  884. X        INT12_MSG, USER.seq, INT13_MSG, moreLASTLOG, INT14_MSG);
  885. X    printf("%s %d %s %d %s.\n", 
  886. X        INT15_MSG, a, INT16_MSG, b, INT17_MSG);
  887. X    ansi("me");
  888. X    printf("\n");
  889. X  }
  890. X  if ((USER.intro != 2) && (USER.intro != 4)) show(INTRO, 9999, 1);
  891. X
  892. X
  893. X
  894. X  
  895. X  fp = fopen(WHO, "a");
  896. X  if (fp == NULL) {
  897. X    nerror("intro.c", 309, "intro", "Datei-Lesefehler", WHO);
  898. X  }
  899. X  strcpy(s, (char *) USER.sh_name);
  900. X  if (s[0] == '\0') strcat(s, GBL10_MSG);
  901. X  sprintf(ex, "%-5.5s %s (%s)                                               ",
  902. X    (char *) ttyna(), USER.name, s);
  903. X
  904. X  ex[38] = '\0';
  905. X  fputs(ex, fp);
  906. X
  907. X  sprintf(ex, "  %s              ", (char *) ttyna());
  908. X  ex[11] = '\0';
  909. X  fputs(ex, fp);
  910. X
  911. X  strcpy(s, (char *) mytime(1));
  912. X  if (USER.level < 10)
  913. X    sprintf(ex, " %s   [%d] MBox: %s\n", s, USER.level, INT10_MSG);
  914. X  else
  915. X    sprintf(ex, " %s   [%d] MBox: %s\n", s, ADMIN_LEV, INT10_MSG);
  916. X
  917. X  fputs(ex, fp);
  918. X  fclose(fp);
  919. X  
  920. X
  921. X
  922. X  sprintf(MYNAME, "%s", USER.name);
  923. X
  924. X  sprintf(s, "%s", (char *) mydate(0));
  925. X  s[5] = '\0';
  926. X  if (strcomp(s, USER.geburtsdatum) == 0) {
  927. X    ansi("md");
  928. X    printf("\n\n%s\n", INT18_MSG);
  929. X    printf("%s\n\n", INT19_MSG);
  930. X    ansi("me");
  931. X  }
  932. X  if (strcomp("24.12.", s) == 0) {
  933. X    ansi("md");
  934. X    printf("\n\n%s\n", INT20_MSG);
  935. X    printf("%s\n\n", INT21_MSG);
  936. X    ansi("me");
  937. X  }
  938. X  if (strcomp("06.12.", s) == 0) {
  939. X    ansi("md");
  940. X    printf("\n\n%s\n", INT22_MSG);
  941. X    printf("\n%s\n\n", INT23_MSG);
  942. X    ansi("me");
  943. X  }
  944. X  if (strcomp("01.01.", s) == 0) {
  945. X    ansi("md");
  946. X    printf("\n\n%s\n", INT24_MSG);
  947. X    printf("%s\n\n", INT25_MSG);
  948. X    ansi("me");
  949. X  }
  950. X  if ((calls == 1000) || (calls == 10000) || (calls == 100000)) {
  951. X    ansi("md");
  952. X    printf("\n\n%s %d%s\n\n", INT26_MSG, calls, INT27_MSG);
  953. X    ansi("me");
  954. X  }
  955. X}
  956. X
  957. X
  958. X
  959. X/***************************************************************************/
  960. X/*      FUNKTION  init_user()                           */
  961. X/*  BESCHREIBUNG  Teilnehmer-Parameter werden zugewiesen, Rechte verteilt  */
  962. X/*          und die Daten aktualisiert.                              */
  963. X/*     PARAMETER  info  =  Ansage-Text                                     */
  964. X/*     RUECKGABE  keine                                                       */
  965. X/***************************************************************************/
  966. X
  967. Xvoid init_user(info)
  968. Xchar info[];
  969. X{
  970. X  FILE *fp;
  971. X  FILE *ff;
  972. X  int fd;
  973. X  char s[STRING];
  974. X  char t[STRING];
  975. X  int i;
  976. X  struct userdaten DUMMY;
  977. X  int dummy = sizeof(DUMMY);
  978. X  long ll, lalo;
  979. X  int lati;
  980. X  int ok;
  981. X
  982. X  printf("%s ..", info);
  983. X
  984. X  switch (USER.terminal) {
  985. X      case 1:
  986. X        sprintf(s, "eval '%s ansi' ", TSET);
  987. X        sprintf(TERMINAL, "ansi");
  988. X        break;
  989. X      case 2:
  990. X        sprintf(s, "eval '%s vt100' ", TSET);
  991. X        sprintf(TERMINAL, "vt100");
  992. X        break;
  993. X      case 3:
  994. X        sprintf(s, "eval '%s vt52' ", TSET);
  995. X        sprintf(TERMINAL, "vt52");
  996. X        break;
  997. X      case 4:
  998. X        sprintf(s, "eval '%s vt52' ", TSET);
  999. X        sprintf(TERMINAL, "vt52");
  1000. X        break;
  1001. X  }
  1002. X  printf(".");
  1003. X
  1004. X  ansi("INIT");
  1005. X
  1006. X  fp = fopen(EDITORS, "r");
  1007. X  if (fp == NULL) {
  1008. X    nerror("intro.c", 487, "intro", "Datei-Lesefehler", EDITORS);
  1009. X  }
  1010. X  i = 0;
  1011. X  while((fgets(s, 80, fp) != NULL) && (s[0] == '/'));
  1012. X  while ((i != USER.editor) && (fscanf(fp, "%s %s", s, EDDY) > 0)) i++;
  1013. X  fclose(fp);
  1014. X
  1015. X  printf(".");
  1016. X
  1017. X  if (USER.leserichtung == 0) USER.leserichtung = 2;
  1018. X
  1019. X  USER.seq++;
  1020. X
  1021. X  maybe_locked(UDBASE, "r"); lockf(UDBASE);
  1022. X  fd = open(UDBASE, O_RDWR);
  1023. X  if (fd == -1) {
  1024. X    nerror("intro.c", 395, "init_user", "Datei-Schreib/-Lesefehler", UDBASE);
  1025. X  }
  1026. X  while (read(fd, &DUMMY, dummy) == dummy) {
  1027. X    if (USER.id == DUMMY.id) {
  1028. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  1029. X    }
  1030. X  }
  1031. X  lseek(fd, ll, SEEK_SET);
  1032. X  write(fd, &USER, sizeof(USER));
  1033. X  close(fd);
  1034. X  unlockf(UDBASE);
  1035. X
  1036. X  printf(".");
  1037. X
  1038. X  sprintf(UGROUPS, "%s/usr/%d/.active", HOME, USER.id);
  1039. X  sprintf(MAKRO, "%s/usr/%d/.makro", HOME, USER.id);
  1040. X
  1041. X  maybe_locked( AGROUPS, "r" );
  1042. X  fp = fopen(AGROUPS, "r");
  1043. X  if (fp == NULL) {
  1044. X    nerror("intro.c", 412, "intro", "Datei-Lesefehler", AGROUPS);
  1045. X  }
  1046. X  ff = fopen(UGROUPS, "w");
  1047. X  if (ff == NULL) {
  1048. X    nerror("intro.c", 442, "intro", "Datei-Schreibfehler", UGROUPS);
  1049. X  }
  1050. X  while (fscanf(fp, "%s %ld %d", s, &lalo, &lati) > 0) {
  1051. X    if (LASTLOG < lalo) {
  1052. X        sprintf(t, "%s 00000 00000 y\n", s);
  1053. X        fputs(t, ff);
  1054. X    }
  1055. X    if (LASTLOG == lalo) {
  1056. X        if (LASTTIME <= lati) {
  1057. X            sprintf(t, "%s 00000 00000 y\n", s);
  1058. X            fputs(t, ff);
  1059. X        }
  1060. X    }
  1061. X  }
  1062. X  fclose(ff);
  1063. X  fclose(fp);
  1064. X
  1065. X  printf(".");
  1066. X
  1067. X  strcpy(BRETT, "PM");
  1068. X  sprintf(NG, "%s.PM", USER.name);
  1069. X  sprintf(INHALT, "%s/usr/%d/INDEX", HOME, USER.id);
  1070. X
  1071. X  printf(".");
  1072. X
  1073. X  if (USER.newsgrps[0] == '\0') sprintf(USER.newsgrps, "%s", NEWS_MINIMUM);
  1074. X
  1075. X  sscanf(USER.newsgrps, "%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s",
  1076. X    newsgrp[1], newsgrp[2], newsgrp[3], newsgrp[4], newsgrp[5],
  1077. X    newsgrp[6], newsgrp[7], newsgrp[8], newsgrp[9], newsgrp[10],
  1078. X    newsgrp[11], newsgrp[12], newsgrp[13], newsgrp[14], newsgrp[15]);
  1079. X
  1080. X  if((USER.tlines < 22) || (USER.tlines > 23)){
  1081. X    MAX_SCR_LINES = DEF_MAX_SCR_LINES;
  1082. X    USER.tlines = DEF_MAX_SCR_LINES;
  1083. X  }
  1084. X  else 
  1085. X    MAX_SCR_LINES = USER.tlines;
  1086. X
  1087. X
  1088. X  if(USER.schluessel[0] == 32)
  1089. X    SHORT_HEADER = 1;
  1090. X  else
  1091. X    SHORT_HEADER = 0;
  1092. X
  1093. X  if(USER.schluessel[1] == 0)
  1094. X    USER.schluessel[1] = 4;
  1095. X
  1096. X  if(USER.level >= WRITE_INTERNAT){
  1097. X    strcpy(UUCPID, UUCPID2);
  1098. X  }
  1099. X  else{
  1100. X    strcpy(UUCPID, UUCPID1);
  1101. X  }
  1102. X
  1103. X  if(USER.account[0] == '\0') strcpy(USER.account, "01.01.2001 000.00");
  1104. X
  1105. X  printf("%c", CR);
  1106. X}
  1107. END_OF_FILE
  1108.   if test 13541 -ne `wc -c <'src/intro.c'`; then
  1109.     echo shar: \"'src/intro.c'\" unpacked with wrong size!
  1110.   fi
  1111.   # end of 'src/intro.c'
  1112. fi
  1113. if test -f 'src/loop.c' -a "${1}" != "-c" ; then 
  1114.   echo shar: Will not clobber existing file \"'src/loop.c'\"
  1115. else
  1116.   echo shar: Extracting \"'src/loop.c'\" \(19593 characters\)
  1117.   sed "s/^X//" >'src/loop.c' <<'END_OF_FILE'
  1118. X/***************************************************************************/
  1119. X/*        PROGRAMM  ix/Mbox                           */
  1120. X/*             DATEI  loop.c                           */
  1121. X/*        FUNKTIONEN  sigcatch(), cut_bef(), cut_arg(), rates(), loop()       */
  1122. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1123. X/*  LETZTE AENDERUNG  29.02.1992                       */
  1124. X/***************************************************************************/
  1125. X   
  1126. X#include <stdio.h>
  1127. X#include <sys/types.h>
  1128. X#include <sys/wait.h>
  1129. X#include <time.h>
  1130. X#include <setjmp.h>
  1131. X#include <signal.h>
  1132. X#include <sys/stat.h>
  1133. X
  1134. X#include "mbox.h"
  1135. X
  1136. X
  1137. X
  1138. Xextern time_t time_start, time_now;
  1139. X
  1140. Xjmp_buf jmpenv;
  1141. X
  1142. X
  1143. X
  1144. X/***************************************************************************/
  1145. X/*      FUNKTION  sigcatch()                           */
  1146. X/*  BESCHREIBUNG  Wird aufgerufen, wenn eines der abgefangen Signale       */
  1147. X/*          eintrifft. Je nach Signal wird entweder ein CTRL-X       */
  1148. X/*          simuliert, oder das Programm ordnungsgemaesst beendet.   */
  1149. X/*     PARAMETER  sig  =  Nummer des ausloesenden Signals                  */
  1150. X/*     RUECKGABE  keine                                                    */
  1151. X/***************************************************************************/
  1152. X
  1153. Xvoid sigcatch(sig)
  1154. Xint sig;
  1155. X{
  1156. X  char tmp[80];  
  1157. X
  1158. X  signal(SIGINT,   SIG_IGN);
  1159. X  signal(SIGQUIT,  SIG_IGN);
  1160. X  signal(SIGHUP,   SIG_IGN);
  1161. X  signal(SIGABRT,  SIG_IGN);
  1162. X  signal(SIGTERM,  SIG_IGN);
  1163. X
  1164. X  chdir( HOME );
  1165. X  switch (sig) {
  1166. X    case SIGINT:
  1167. X    case SIGQUIT:
  1168. X        sprintf(tmp, "%s/I.%d", TMP, getpid());
  1169. X        unlink(tmp);
  1170. X        sprintf(tmp, "%s/show%d", TMP, getpid());
  1171. X        unlink(tmp);
  1172. X        unlockf( UDBASE );
  1173. X        printf("\n");
  1174. X        ansi("mr");
  1175. X        printf("%s", LOP01_MSG);
  1176. X        ansi("me");
  1177. X        printf("\n\n");
  1178. X        longjmp(jmpenv, 1);
  1179. X        break;
  1180. X      case SIGHUP:
  1181. X      case SIGABRT:
  1182. X      case SIGTERM:
  1183. X        printf("\n\n");
  1184. X        ansi("mr");
  1185. X        printf("%s", LOP02_MSG);
  1186. X        ansi("me");
  1187. X        printf("");
  1188. X        logout();
  1189. X        exit(-1);
  1190. X        break;
  1191. X  }
  1192. X}
  1193. X
  1194. X
  1195. X
  1196. X
  1197. X/***************************************************************************/
  1198. X/*      FUNKTION  cut_bef()                           */
  1199. X/*  BESCHREIBUNG  Filtert den Befehl aus der Eingabe eines Users.          */
  1200. X/*     PARAMETER  Eingabezeile                                             */
  1201. X/*     RUECKGABE  Der isolierte Befehl                                     */
  1202. X/***************************************************************************/
  1203. X
  1204. Xchar *cut_bef(s)
  1205. Xchar s[];
  1206. X{
  1207. X  static char bef[STRING];
  1208. X  int i = 0;
  1209. X
  1210. X  while (s[i] > 32) {
  1211. X    bef[i] = s[i];
  1212. X    i++;
  1213. X  }
  1214. X  bef[i] = '\0';
  1215. X  return (char *) bef;
  1216. X}
  1217. X
  1218. X
  1219. X
  1220. X/***************************************************************************/
  1221. X/*      FUNKTION  cut_arg()                           */
  1222. X/*  BESCHREIBUNG  Filtert das Argument aus der Eingabe des Users.          */
  1223. X/*     PARAMETER  Eingabezeile                                                */
  1224. X/*     RUECKGABE  Das isolierte Argument                                   */
  1225. X/***************************************************************************/
  1226. X
  1227. Xchar *cut_arg(s)
  1228. Xchar s[];
  1229. X{
  1230. X  static char arg[STRING];
  1231. X  int i = 0, a = 0;
  1232. X
  1233. X  while (s[i] > 32) i++;
  1234. X  if (s[i] == '\0') return (char *) "";
  1235. X
  1236. X  while (s[i] == 32) i++;
  1237. X
  1238. X  while (s[i] != '\0') {
  1239. X    arg[a] = s[i];
  1240. X    i++;
  1241. X    a++;
  1242. X  }
  1243. X  arg[a] = '\0';
  1244. X
  1245. X  while((arg[(a-1)] < 33) && (a > 1)){
  1246. X    a--;
  1247. X    arg[a] = '\0';
  1248. X  }
  1249. X
  1250. X  return (char *) arg;
  1251. X}
  1252. X
  1253. X
  1254. X
  1255. X
  1256. X/***************************************************************************/
  1257. X/*      FUNKTION  rates()                           */
  1258. X/*  BESCHREIBUNG  Ermittelt die Telefongebuehren des laufenden Anrufs und  */
  1259. X/*          bereitet sie als PROMPT auf.                             */
  1260. X/*     PARAMETER  keine                                                       */
  1261. X/*     RUECKGABE  PROMPT-Zeile fuer Gebuehren                              */
  1262. X/***************************************************************************/
  1263. X
  1264. Xchar *rates()
  1265. X{
  1266. X  static char s[STRING];
  1267. X  char t[STRING];
  1268. X  int nz, rz, wz;
  1269. X  int dif;
  1270. X  int n1, n2, r1, r2, w1, w2;
  1271. X  struct tm *timeptr;
  1272. X
  1273. X  time(&time_now);
  1274. X  dif = time_now - time_start;
  1275. X
  1276. X  n1 = dif / NZNT;
  1277. X  n1++;
  1278. X  n1 *= TARIF;
  1279. X  n2 = dif / NZBT;
  1280. X  n2++;
  1281. X  n2 *= TARIF;
  1282. X  r1 = dif / RZNT;
  1283. X  r1++;
  1284. X  r1 *= TARIF;
  1285. X  r2 = dif / RZBT;
  1286. X  r2++;
  1287. X  r2 *= TARIF;
  1288. X  w1 = dif / WZNT;
  1289. X  w1++;
  1290. X  w1 *= TARIF;
  1291. X  w2 = dif / WZBT;
  1292. X  w2++;
  1293. X  w2 *= TARIF;
  1294. X
  1295. X  timeptr = localtime(&time_now);
  1296. X  sprintf(t, "%s", asctime(timeptr));
  1297. X
  1298. X  if ((t[0] == 'S') || (timeptr->tm_hour > 18) || (timeptr->tm_hour < 8)) {
  1299. X    sprintf(s, "(%ds) NZ %d.%02.2d, RZ %d.%02.2d, WZ %d.%02.2d",
  1300. X     dif, fix(n2), flt(n2), fix(r2), flt(r2), fix(w2), flt(w2));
  1301. X  }
  1302. X  else {
  1303. X    sprintf(s, "(%ds) NZ %d.%02.2d, RZ %d.%02.2d, WZ %d.%02.2d",
  1304. X     dif, fix(n1), flt(n1), fix(r1), flt(r1), fix(w1), flt(w1));
  1305. X  }
  1306. X
  1307. X  return (char *) s;
  1308. X}
  1309. X
  1310. X
  1311. X
  1312. X
  1313. X/***************************************************************************/
  1314. X/*      FUNKTION  loop.c                           */
  1315. X/*  BESCHREIBUNG  Die Eingaben des Users werden entgegengenommen und die   */
  1316. X/*          entsprechenden Routinen aufgerufen und ausgefuehrt.      */
  1317. X/*     PARAMETER  keine                                                       */
  1318. X/*     RUECKGABE  keine                                                    */
  1319. X/***************************************************************************/
  1320. X
  1321. Xvoid loop()
  1322. X{
  1323. X  char s[STRING];
  1324. X  char t[STRING];
  1325. X  char l[LONGSTRING];
  1326. X  char befehl[STRING];
  1327. X  char argument[STRING];
  1328. X  char prompt[STRING];
  1329. X
  1330. X  char prev_befehl[10][STRING];
  1331. X  int wasok;
  1332. X
  1333. X  char c;
  1334. X
  1335. X  char bef_buff[(STRING * 2)];
  1336. X  int bef_rec;
  1337. X
  1338. X  int ende = 0, ok, dummy, i;
  1339. X  int pp;
  1340. X  int to_del;
  1341. X  int fpid;
  1342. X
  1343. X  struct stat fst;
  1344. X
  1345. X
  1346. X  sprintf(prev_befehl[1], "%s ", BEF[BB1].befehl);
  1347. X  sprintf(prev_befehl[2], "%s ", BEF[BB2].befehl); 
  1348. X  sprintf(prev_befehl[3], "%s ", BEF[BB3].befehl);
  1349. X  sprintf(prev_befehl[4], "%s ", BEF[BB4].befehl);
  1350. X  sprintf(prev_befehl[5], "%s ", BEF[BB5].befehl);
  1351. X  sprintf(prev_befehl[6], "%s ", BEF[BB6].befehl);
  1352. X  sprintf(prev_befehl[7], "%s ", BEF[BB7].befehl);
  1353. X  sprintf(prev_befehl[8], "%s ", BEF[BB8].befehl);
  1354. X  sprintf(prev_befehl[9], "%s ", BEF[BB9].befehl);
  1355. X
  1356. X  wasok = 1;
  1357. X
  1358. X  bef_buff[0] = '\0';
  1359. X
  1360. X  do {
  1361. X
  1362. X    if(setjmp(jmpenv) == 1){
  1363. X        bef_buff[0] = '\0';
  1364. X    }
  1365. X
  1366. X    FASTER:
  1367. X    
  1368. X    signal(SIGINT,  sigcatch);
  1369. X    signal(SIGQUIT, sigcatch);
  1370. X
  1371. X    signal(SIGHUP,  sigcatch);
  1372. X    signal(SIGABRT, sigcatch);
  1373. X    signal(SIGTERM, sigcatch);
  1374. X
  1375. X
  1376. X    sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  1377. X    stat(s, &fst);
  1378. X    if(fst.st_size > IDX_SIZE){
  1379. X        printf("%c\n\n%s\n", BELL, LOP03_MSG); 
  1380. X    }
  1381. X        IDX_SIZE = (long) fst.st_size;
  1382. X
  1383. X    if(bef_buff[0] != '\0'){
  1384. X        sprintf(s, "%s", bef_buff);        
  1385. X        IS_BUFFERED = 1;
  1386. X        bef_rec++;
  1387. X        goto BUFFERING;
  1388. X    }
  1389. X        else 
  1390. X        IS_BUFFERED = 0;
  1391. X
  1392. X
  1393. X    bef_rec = 0;
  1394. X
  1395. X    ansi("md");
  1396. X    prompt[0] = '\0';
  1397. X
  1398. X    switch (USER.prompt) {
  1399. X        case 1:
  1400. X            strcat(prompt, (char *) mytime(0));
  1401. X            break;
  1402. X        case 2:    
  1403. X            strcat(prompt, NG);
  1404. X            break;
  1405. X        case 3:    
  1406. X            strcat(prompt, (char *) rates());
  1407. X            break;
  1408. X    }
  1409. X    printf("\n[%s] %s > ", prompt, LOP06_MSG);
  1410. X    ansi("me");
  1411. X    if (USER.bell == 1) printf("%c", BELL);
  1412. X
  1413. X    befehl[0] = '\0';
  1414. X
  1415. X#ifdef _CORELEFT
  1416. X    if(coreleft() < _CORELEFT){
  1417. X        sprintf(s, "%d", _CORELEFT);
  1418. X        nerror( "loop.c", 288, "loop", "Speicherplatz kleiner ", s );
  1419. X    }
  1420. X#endif
  1421. X
  1422. X
  1423. X    do {
  1424. X        strcpy(s, (char *) getline(60, 11001, 32, befehl));
  1425. X        to_del = length(befehl);
  1426. X
  1427. X        if (s[0] == 48) {
  1428. X            headline( LOP05_MSG );
  1429. X            printf("\n");
  1430. X            for (i = 9; i > 0; i--) {
  1431. X                printf(" %d: %s\n", i, prev_befehl[i]);
  1432. X            }
  1433. X            goto FASTER;
  1434. X        }
  1435. X        if ((s[0] > 48) && (s[0] < 58)) {
  1436. X            sprintf(befehl, "%s", prev_befehl[(s[0] - 48)]);
  1437. X            printf("%c", CR);
  1438. X            if (ansi("ce") == 1) {
  1439. X                printf("                                                               ");
  1440. X            }
  1441. X            ansi("md");
  1442. X            printf("%c[%s] %s > ", CR, prompt, LOP06_MSG);
  1443. X            ansi("me");
  1444. X        }
  1445. X    } while ((s[0] > 47) && (s[0] < 58));
  1446. X
  1447. X    
  1448. X        if(makro_definition(s) != 0) goto FASTER;
  1449. X
  1450. X
  1451. X    BUFFERING:
  1452. X
  1453. X    if((bef_rec > MAKRO_MAX_REK) && (USER.level < (ADMIN_LEV+1))){
  1454. X        bef_buff[0] = '\0';
  1455. X        goto FASTER;
  1456. X    }
  1457. X
  1458. X        
  1459. X    strcpy(t, (char *) makro(s));
  1460. X    strcpy(s, t); 
  1461. X        
  1462. X    while ((s[0] == 32) || (s[0] == '.')) {
  1463. X        sprintf(befehl, "%s", (char *) strcopy(s, 1, length(s)));
  1464. X        sprintf(s, "%s", befehl);
  1465. X    }
  1466. X
  1467. X    i = 0; ok = 0;
  1468. X    while((ok == 0) && (s[i] != '\0')){
  1469. X        if(s[i] == ','){ 
  1470. X            strcpy(bef_buff, (char *) strcopy(s, (i+1), length(s)));
  1471. X            s[i] = '\0';
  1472. X            ok++;
  1473. X        }            
  1474. X        i++;
  1475. X    }
  1476. X    if(ok == 0) bef_buff[0] = '\0';
  1477. X    
  1478. X    strcpy(befehl, (char *) cut_bef(s));
  1479. X    strcpy(argument, (char *) cut_arg(s));
  1480. X    strcpy(s, (char *) upcased(befehl));
  1481. X    strcpy(befehl, s);
  1482. X
  1483. X    sprintf(s, "%s %s", befehl, argument);
  1484. X
  1485. X    if (wasok == 1) {
  1486. X        ok = 0;
  1487. X        for (i = 9; i > 0; i--) {
  1488. X            if ((strcomp(s, prev_befehl[i]) == 0) && (strcomp(prev_befehl[i], s) == 0))
  1489. X                ok++;
  1490. X        }
  1491. X        if ((ok == 0) && (befehl[0] > 32)) {
  1492. X            for (i = 9; i > 1; i--) {
  1493. X                sprintf(prev_befehl[i], "%s", prev_befehl[(i - 1)]);
  1494. X            }
  1495. X            sprintf(prev_befehl[1], "%s %s", befehl, argument);
  1496. X        }
  1497. X    }
  1498. X    else {
  1499. X        sprintf(prev_befehl[1], "%s %s", befehl, argument);
  1500. X    }
  1501. X
  1502. X    sprintf(s, "[%s] %s %s", LOP04_MSG, befehl, argument);
  1503. X    control(s, 3);
  1504. X
  1505. X    sprintf(s, "%s %s", befehl, argument);
  1506. X    whodo(s);
  1507. X
  1508. X
  1509. X    wasok = 0;
  1510. X
  1511. X    if (befehl[0] == '"') {
  1512. X        ansi("md");
  1513. X        /*
  1514. X        printf(" <- Nein, so daemlich kann kein User sein !\n");
  1515. X        */
  1516. X        printf(" %s\n", LOP07_MSG);
  1517. X        ansi("me");
  1518. X        goto FASTER;
  1519. X    }
  1520. X    if (befehl[0] == '\0') goto FASTER;
  1521. X
  1522. X
  1523. X    if(argument[0] == '?') {
  1524. X        strcpy(argument, befehl);
  1525. X        strcpy(befehl, BEF[BB7].befehl);
  1526. X     }
  1527. X
  1528. X/*  ?  */
  1529. X
  1530. X    if (befehl[0] == '?') {
  1531. X        if (argument[0] != '*') {
  1532. X            sprintf(s, " %s %d) ", LOP08_MSG, USER.level);
  1533. X        } else {
  1534. X            sprintf(s, " %s ", LOP09_MSG, USER.level);
  1535. X        }
  1536. X        headline(s);
  1537. X        printf("\n");
  1538. X        bef("?", argument);
  1539. X        goto FASTER;
  1540. X    }
  1541. X
  1542. X/* <BREAK> */
  1543. X
  1544. X    if (strcomp(befehl, "<BREAK>") == 0) {
  1545. X        printf("!@#?");
  1546. X        ansi("md");
  1547. X        printf(" %s", LOP10_MSG);
  1548. X        ansi("me");
  1549. X        printf("\n");
  1550. X        goto FASTER;
  1551. X    }
  1552. X    wasok = 1;
  1553. X
  1554. X
  1555. X    switch (bef(befehl, argument)) {
  1556. X
  1557. X        case 275:        /* RELOGIN */
  1558. X
  1559. X        logout();
  1560. X        intro();
  1561. X        break;
  1562. X
  1563. X
  1564. X        case 240:        /* MINIX */
  1565. X
  1566. X        if (argument[0] == '\0') {
  1567. X            ansi("md");
  1568. X            printf(" %s\n", LOP11_MSG);
  1569. X            ansi("me");
  1570. X        }
  1571. X        else {
  1572. X            printf("\n\n");
  1573. X            sprintf(s, "exec %s %s %d %d", RSH, argument, OLDUID, OLDGID);
  1574. X            system(s);
  1575. X        }
  1576. X        break;
  1577. X
  1578. X
  1579. X        case 110:
  1580. X        case 120:        /* + -  */
  1581. X
  1582. X        scanner(befehl[0]);
  1583. X        break;
  1584. X
  1585. X
  1586. X        case 190:        /* HILFE */
  1587. X
  1588. X        printf("\n\n");
  1589. X        if (argument[0] < 33)
  1590. X            help("=");
  1591. X        else {
  1592. X            if(argument[0] == '*'){    
  1593. X                help("*");
  1594. X            }
  1595. X            else{
  1596. X                strcpy(s, "#");
  1597. X                strcat(s, upcased(argument));
  1598. X                if (help(s) < 1) {
  1599. X                    ansi("md");
  1600. X                    printf("%s \"%s\" %s\n", LOP12_MSG, argument, LOP13_MSG);
  1601. X                    ansi("me");
  1602. X                }
  1603. X            }
  1604. X        }
  1605. X        break;
  1606. X
  1607. X
  1608. X        case 150:        /* BRETT */
  1609. X
  1610. X        brett(argument);
  1611. X        break;
  1612. X
  1613. X
  1614. X        case 130:        /* ANRUFER */
  1615. X
  1616. X        if(argument[0] == '#'){
  1617. X            statistik();
  1618. X            break;
  1619. X        }
  1620. X
  1621. X        if(argument[0] == '%'){
  1622. X            headline( LOP34_MSG );
  1623. X            printf("%s\n", LOP35_MSG);
  1624. X            printf("===============================================================================\n");
  1625. X            printf("%s ..", LOP29_MSG);
  1626. X    
  1627. X            switch( (fpid = fork()) ){
  1628. X                case -1 :
  1629. X                    break;
  1630. X                case  0 : 
  1631. X                    while(1){
  1632. X                        printf(".");
  1633. X                        sleep(2);
  1634. X                    }    
  1635. X                    break;
  1636. X            }
  1637. X            sprintf(t, "%s/%d.srt", TMP, getpid());
  1638. X            sprintf(l, SECONDCUT, CALLS, t);
  1639. X            system(l);             
  1640. X            kill( fpid, 9 );
  1641. X            (void) wait( fpid );
  1642. X            printf("%c", CR);
  1643. X            show(t, 9999, USER.more + 100);
  1644. X            unlink(t);
  1645. X            break;
  1646. X        }
  1647. X
  1648. X        headline( LOP14_MSG );
  1649. X        printf("%s\n", LOP15_MSG);
  1650. X        printf("===============================================================================\n");
  1651. X
  1652. X        if (argument[0] != '*') {
  1653. X            show(CALLS, 19, USER.more);
  1654. X        }
  1655. X        else {
  1656. X            show(CALLS, 9999, USER.more + 100);
  1657. X        }
  1658. X        break;
  1659. X
  1660. X
  1661. X        case 200:        /* INHALT */
  1662. X
  1663. X        inhalt2(argument, 'I');
  1664. X        break;
  1665. X
  1666. X
  1667. X        case 210:        /* LESEN */
  1668. X
  1669. X        dummy = (pruefe(argument));
  1670. X        if (dummy == 0) lesen(argument);
  1671. X        if (dummy == -1) lesen2(argument, 'L');
  1672. X        break;
  1673. X
  1674. X
  1675. X
  1676. X        case 230:        /* SCHREIBEN */
  1677. X
  1678. X        if (USER.level < WRITE_IN_LEV) {
  1679. X            ansi("md");
  1680. X            printf(" %s\n", LOP16_MSG);
  1681. X            ansi("me");
  1682. X        }
  1683. X        else
  1684. X            schreiben(argument);
  1685. X        break;
  1686. X
  1687. X
  1688. X        case 220:        /* LOESCHEN */
  1689. X
  1690. X        dummy = (pruefe(argument));
  1691. X        if (dummy == 0) loeschen(argument);
  1692. X        if (dummy == -1) loeschen2(argument, 'D');
  1693. X        break;
  1694. X
  1695. X
  1696. X        case 160:        /* BRIEF */
  1697. X
  1698. X        if (USER.level < WRITE_IN_LEV) {
  1699. X            ansi("md");
  1700. X            printf(" %s\n", LOP16_MSG);
  1701. X            ansi("me");
  1702. X        }
  1703. X        else
  1704. X            if((brief(argument) == 0) && (strcomp(GUEST, USER.name) != 0)){
  1705. X                sprintf(s, "%s?", USER.name);
  1706. X                brief(s);
  1707. X                sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  1708. X                stat(s, &fst);
  1709. X                    IDX_SIZE = (int) fst.st_size;
  1710. X            }
  1711. X            else bef_buff[0] = '\0';
  1712. X        break;
  1713. X
  1714. X
  1715. X        case 170:        /* CHAT */
  1716. X
  1717. X        sprintf(s, "exec %s %s \"%s\" %d %d", RSH, CHAT, USER.nick, OLDUID, OLDGID);
  1718. X        system(s);
  1719. X        break;
  1720. X
  1721. X
  1722. X        case 250:        /* PM */
  1723. X
  1724. X        strcpy(BRETT, "PM");
  1725. X        printf("\n");
  1726. X        sprintf(NG, "%s.PM", USER.name);
  1727. X        sprintf(INHALT, "%s/usr/%d/INDEX", HOME, USER.id);
  1728. X        break;
  1729. X
  1730. X
  1731. X        case 260:        /* POSTFACH */
  1732. X
  1733. X        postfach("*");
  1734. X        break;
  1735. X
  1736. X
  1737. X        case 300:        /* USER */
  1738. X
  1739. X        userliste(argument);
  1740. X        break;
  1741. X
  1742. X
  1743. X        case 140:        /* ANSAGE */
  1744. X
  1745. X        ansage();
  1746. X        break;
  1747. X
  1748. X
  1749. X        case 310:        /* UNTERSCHRIFT */
  1750. X
  1751. X        unterschrift();
  1752. X        break;
  1753. X
  1754. X
  1755. X        case 320:        /* VERSION */
  1756. X
  1757. X        printf("\n\n");
  1758. X        ansi("md");
  1759. X        printf("Version: ");
  1760. X        ansi("me");
  1761. X        printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  1762. X
  1763. X        if(argument[0] == '#'){
  1764. X            ansi("md");
  1765. X            printf("\nMein spezieller Dank gilt folgenden Mitarbeitern, Beta-Testern und Ratgebern: \n\n");
  1766. X            ansi("me");
  1767. X            
  1768. X            printf("andreas@xenox.ruhr.de       - fuer den \"NewsFeed\" und seine Geduld\n");
  1769. X            printf("                              bei unseren \"Sonderwuenschen\"\n\n");
  1770. X
  1771. X            printf("az@unnet.w.open.de          - fuer seinen Einsatz beim \"Einrichten\"\n");
  1772. X            printf("                              der Mailbox und der PD-Portierung\n\n");
  1773. X
  1774. X            printf("joergg@unnet.ruhr.sub.org   - fuer seine Ideen, Tips, konstruktive\n");
  1775. X            printf("                              Kritik und gruendliche Tests\n\n");        
  1776. X
  1777. X            printf("klausr@skylink.ruhr.sub.org - fuer viele Vorschlaege, und vor allem\n");            
  1778. X            printf("                              fuer seine praesizen Fehlerbeschreibungen\n\n");            
  1779. X
  1780. X            printf("stefans@coduck.ruhr.sub.org - fuer seine Hilfe bei der Installation\n");
  1781. X            printf("                              der 386er Patches und der PD-Beschaffung\n\n");
  1782. X
  1783. X            printf("walterb@weller.ruhr.sub.org - fuer seine Unterstuetzung bei der Portierung auf\n");
  1784. X            printf("                              UNIX SVR3 und bei der Installation\n\n");
  1785. X
  1786. X            printf("hergo@ivcmd.boerde.de       - fuer seine Hilfe bei der Bildung einer Referenz-\n");
  1787. X            printf("                              Version zur Verwendung von CDIFFs\n\n");
  1788. X            
  1789. X        }
  1790. X        
  1791. X        if(argument[0] == '*'){
  1792. X            ansi("md");
  1793. X            printf("\n%s ", LOP17_MSG);
  1794. X            ansi("me");
  1795. X#ifdef _SYS7
  1796. X            printf("-D_SYS7 ");
  1797. X#endif
  1798. X#ifdef _MBOX
  1799. X            printf("-D_MBOX ");
  1800. X#endif
  1801. X#ifdef _MINIX
  1802. X            printf("-D_MINIX ");
  1803. X#endif
  1804. X#ifdef _ESTDIO
  1805. X            printf("-D_ESTDIO ");
  1806. X#endif
  1807. X#ifdef _CORELEFT
  1808. X            printf("-D_CORELEFT ");
  1809. X#endif
  1810. X#ifdef _DATESTAMP
  1811. X            printf("-D_DATESTAMP ");
  1812. X#endif
  1813. X#ifdef _BAUDRATE
  1814. X            printf("-D_BAUDRATE ");
  1815. X#endif
  1816. X
  1817. X            printf("\n");
  1818. X        }
  1819. X
  1820. X        break;
  1821. X
  1822. X
  1823. X        case 270:        /* PORTINFO */
  1824. X
  1825. X        port( argument );
  1826. X        break;
  1827. X
  1828. X
  1829. X        case 280:        /* SETUP */
  1830. X
  1831. X        sprintf(s, "%s", NG);
  1832. X        sprintf(t, "%s", BRETT);
  1833. X        setup();
  1834. X        if (strcomp("PM", t) != 0) brett(s);
  1835. X        break;
  1836. X
  1837. X
  1838. X        case 125:        /* ADMIN */
  1839. X
  1840. X        sprintf(s, "%s", NG);
  1841. X        sprintf(t, "%s", BRETT);
  1842. X        admin();
  1843. X        if (strcomp("PM", t) != 0) brett(s);
  1844. X        break;
  1845. X
  1846. X
  1847. X        case 205:        /* ID */
  1848. X
  1849. X        if(strcomp("-c", argument) == 0){ /* Memory fault - core dumped */
  1850. X            printf("\n\nDebug-Modus: ");
  1851. X            fclose(0);   
  1852. X            break;
  1853. X        }
  1854. X
  1855. X        if(strcomp("*", argument) == 0){
  1856. X            BAUDRATE = baudrate( MAX_BPS );
  1857. X            printf("\n\n>>> Baudrate %d\n", BAUDRATE);
  1858. X            break;
  1859. X        }
  1860. X
  1861. X        if(strcomp("#", argument) == 0){
  1862. X            printf("\n\n>>> Coreleft %d\n", coreleft());
  1863. X            break;
  1864. X        }
  1865. X
  1866. X        printf("\n\n>>> %s (UID %d|%d|%d) (GID %d|%d|%d)\n", MYNAME,
  1867. X               getuid(), geteuid(), OLDUID,
  1868. X               getgid(), getegid(), OLDGID);
  1869. X        break;
  1870. X
  1871. X
  1872. X        case 215:        /* LEVEL */
  1873. X
  1874. X        show_level();
  1875. X        break;
  1876. X
  1877. X
  1878. X        case 290:        /* STATUS */
  1879. X
  1880. X        status();
  1881. X        break;
  1882. X
  1883. X
  1884. X        case 330:         /* MAKRO */
  1885. X
  1886. X        set_makros();
  1887. X        break;
  1888. X
  1889. X
  1890. X        case 340:        /* WEITERLEITEN */
  1891. X
  1892. X        weiterleiten( argument );
  1893. X        break;
  1894. X
  1895. X
  1896. X        case 350:           /* SLEEP */
  1897. X
  1898. X        dummy = atoi( argument );
  1899. X        if(dummy < 1) dummy = 1;
  1900. X        printf("\n");
  1901. X        ansi( "mr" );
  1902. X        printf(" %s ... ", LOP29_MSG);
  1903. X        ansi( "me" );    
  1904. X        sleep( dummy );
  1905. X        break;        
  1906. X
  1907. X
  1908. X        case 360:        /* KEYPRESSED */
  1909. X
  1910. X        printf("\n");
  1911. X        ansi("mr");
  1912. X        printf(" Taste ! ");
  1913. X        ansi("me");
  1914. X        dummy = getint();
  1915. X        if((dummy == CTRL_X) || (dummy == 'x') || (dummy == 'q')){
  1916. X            bef_buff[0] = '\0';
  1917. X            printf("\n");
  1918. X        }
  1919. X        break;
  1920. X
  1921. X
  1922. X        case 370:        /* DATUM */
  1923. X        
  1924. X        ansi("md");
  1925. X        printf("\n\n%s ", LOP18_MSG);
  1926. X        ansi("me"); 
  1927. X        printf("%s, ", (char *) mydate( 2 ));
  1928. X        printf("%s\n",  (char *) mydate( 0 ));
  1929. X        break;
  1930. X    
  1931. X
  1932. X        case 380:        /* ZEIT */
  1933. X
  1934. X        ansi("md");
  1935. X        printf("\n\n%s ", LOP19_MSG);
  1936. X        ansi("me");
  1937. X        printf("%s\n", (char *) mytime( 0 ));
  1938. X        ansi("md");
  1939. X        printf("Online: ");
  1940. X        ansi("me");
  1941. X        time(&time_now);
  1942. X        printf("%d %s\n",  (int) time_now - time_start, LOP20_MSG);
  1943. X        break;
  1944. X
  1945. X
  1946. X       case 390:        /* SPIELE */
  1947. X
  1948. X        games();
  1949. X        break;
  1950. X    
  1951. X
  1952. X        case 400:        /* RICHTUNG */
  1953. X
  1954. X        ansi("md");
  1955. X        printf("\n\n%s ", LOP21_MSG);
  1956. X        ansi("me");
  1957. X
  1958. X        if (USER.leserichtung == 1) {
  1959. X            USER.leserichtung = 2;
  1960. X            printf("%s\n", LOP22_MSG);
  1961. X        }
  1962. X        else {
  1963. X            USER.leserichtung = 1;
  1964. X            printf("%s\n", LOP22aMSG);
  1965. X        }
  1966. X        break;
  1967. X
  1968. X
  1969. X        case 410:           /* STATISTIK */
  1970. X
  1971. X        if ((argument[0] != '#') && (argument[0] != '$') && (argument[0] != '%')) {
  1972. X            headline( LOP23_MSG );
  1973. X            printf("%s\n", LOP24_MSG);
  1974. X            printf("===============================================================================\n");
  1975. X
  1976. X            if (argument[0] != '*') {
  1977. X                show(MB_DLOG, 19, USER.more);
  1978. X            }
  1979. X            else {
  1980. X                show(MB_DLOG, 9999, USER.more + 100);
  1981. X            }
  1982. X        }
  1983. X        if(argument[0] == '$') {
  1984. X            headline( LOP25_MSG );
  1985. X            show(UUCPCOSTS, 9999, USER.more);
  1986. X        }
  1987. X           if(argument[0] == '#') {
  1988. X            headline( LOP26_MSG );
  1989. X            printf("%s\n", LOP27_MSG);
  1990. X            printf("===============================================================================\n");
  1991. X
  1992. X            show(PDLOG, 9999, USER.more + 100);
  1993. X        }
  1994. X        if(argument[0] == '%') {
  1995. X            headline( LOP32_MSG );
  1996. X            printf("%s\n", LOP33_MSG);
  1997. X            printf("===============================================================================\n");
  1998. X            printf("%s ..", LOP29_MSG);
  1999. X    
  2000. X            switch( (fpid = fork()) ){
  2001. X                case -1 :
  2002. X                    break;
  2003. X                case  0 : 
  2004. X                    while(1){
  2005. X                        printf(".");
  2006. X                        sleep(2);
  2007. X                    }    
  2008. X                    break;
  2009. X            }
  2010. X            sprintf(t, "%s/%d.srt", TMP, getpid());
  2011. X            sprintf(l, SORTEDCUT, PDLOG, t);
  2012. X            system(l);             
  2013. X            kill( fpid, 9 );
  2014. X            (void) wait( fpid );
  2015. X            printf("%c", CR);
  2016. X            show(t, 9999, USER.more + 100);
  2017. X            unlink(t);
  2018. X        }
  2019. X
  2020. X        break;
  2021. X
  2022. X        case 430:        /* SUCHEN */
  2023. X
  2024. X        suchen( argument );
  2025. X        break;    
  2026. X
  2027. X                    
  2028. X        case 420:        /* RING */
  2029. X
  2030. X        ende = 1;
  2031. X        break;
  2032. X
  2033. X
  2034. X      case 440:        /* DOWNLOAD */
  2035. X
  2036. X        download( argument );
  2037. X        break;
  2038. X               
  2039. X
  2040. X        case 180:        /* ENDE */
  2041. X
  2042. X#ifdef _MINIX
  2043. X        if (tty() >= FIRST_EX_TTY) {
  2044. X            printf("\n\n");
  2045. X            ansi("mr");
  2046. X            printf("%c%s [%c, %c] > ", CR, LOP28_MSG, GBL06_MSG, GBL07_MSG);
  2047. X            ansi("me");
  2048. X            
  2049. X            c = yesno();
  2050. X        } else
  2051. X#endif
  2052. X            c = GBL06_MSG;
  2053. X
  2054. X
  2055. X        if (c == GBL06_MSG)
  2056. X            ende = 1;
  2057. X        else
  2058. X            printf("\n");
  2059. X
  2060. X        if(argument[0] == '*'){
  2061. X            USER.lasttime = LASTTIME;
  2062. X            strcpy(USER.lastlog, (char *) datereconv( LASTLOG ));
  2063. X        }
  2064. X        else{
  2065. X            strcpy(s, (char *) mydate(0));
  2066. X            s[10] = '\0';
  2067. X            strcpy(USER.lastlog, s);
  2068. X            strcpy(s, (char *) mytime(1));
  2069. X            USER.lasttime = timeconv(s);
  2070. X        }
  2071. X
  2072. X        break;
  2073. X
  2074. X        case -1:        /* LEVEL ??? */
  2075. X
  2076. X        wasok = 0;
  2077. X        ansi("md");
  2078. X        printf(" %s %d ...\n", LOP30_MSG, USER.level);
  2079. X        ansi("me");
  2080. X        break;
  2081. X
  2082. X        default:
  2083. X
  2084. X        wasok = 0;
  2085. X        ansi("md");
  2086. X        printf(" %s\n", LOP31_MSG);
  2087. X        ansi("me");
  2088. X    }
  2089. X
  2090. X  } while (ende == 0);
  2091. X}
  2092. END_OF_FILE
  2093.   if test 19593 -ne `wc -c <'src/loop.c'`; then
  2094.     echo shar: \"'src/loop.c'\" unpacked with wrong size!
  2095.   fi
  2096.   # end of 'src/loop.c'
  2097. fi
  2098. echo shar: End of archive 5 \(of 10\).
  2099. cp /dev/null ark5isdone
  2100. MISSING=""
  2101. for I in 1 2 3 4 5 6 7 8 9 10 ; do
  2102.     if test ! -f ark${I}isdone ; then
  2103.     MISSING="${MISSING} ${I}"
  2104.     fi
  2105. done
  2106. if test "${MISSING}" = "" ; then
  2107.     echo You have unpacked all 10 archives.
  2108.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2109. else
  2110.     echo You still must unpack the following archives:
  2111.     echo "        " ${MISSING}
  2112. fi
  2113. exit 0
  2114. exit 0 # Just in case...
  2115.