home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume29 / mbox / part04 < prev    next >
Text File  |  1992-04-06  |  56KB  |  2,357 lines

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  3. Subject:  v29i066:  mbox - A Bulletin Board System for UNIX and MINIX, Part04/10
  4. Message-ID: <1992Apr5.183425.29664@sparky.imd.sterling.com>
  5. X-Md4-Signature: fd1b8fce3ef98690d1c4044e80c65bdb
  6. Date: Sun, 5 Apr 1992 18:34:25 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 66
  11. Archive-name: mbox/part04
  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:  src/Makefile src/mail.c src/misc.c
  21. # Wrapped by kent@sparky on Sun Apr  5 11:57:41 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 4 (of 10)."'
  25. if test -f 'src/Makefile' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'src/Makefile'\"
  27. else
  28.   echo shar: Extracting \"'src/Makefile'\" \(9174 characters\)
  29.   sed "s/^X//" >'src/Makefile' <<'END_OF_FILE'
  30. X#---------------------------------------------------------------------------
  31. X#
  32. X#                       ix/MBox  M A K E F I L E
  33. X#          Mailbox-Programm fuer UNIX(-Derivate)
  34. X#            
  35. X#               Volker Schuermann
  36. X#              Wuppertal, FRG, 26.10.1991
  37. X#
  38. X#
  39. X#                   Modifiziert fuer SVR3    
  40. X#        
  41. X#          Walter Buerger <walterb@weller.ruhr.sub.org>
  42. X#              Ralf Heidelberg <ralf@heibox.ruhr.sub.org>
  43. X#          Solingen/Wuppertal, FRG, 08.11.1991
  44. X#
  45. X#
  46. X#                      Modifiziert fuer ISC 2.21
  47. X#
  48. X#              Hergo Pape <hergo@ivcmd.BOERDE.DE>
  49. X#               Magdeburg, FRG, 16.11.1991
  50. X#
  51. X#        
  52. X#                 DIFF-Support
  53. X#
  54. X#        Ralf Heidelberg <ralf@heibox.ruhr.sub.org>
  55. X#            Wuppertal, FRG, 07.01.1992
  56. X#
  57. X#
  58. X#               Modifiziert fuer ST Minix/c86
  59. X#      
  60. X#                Olaf <olaf@oski.toppoint.de>
  61. X#                     Kiel, FRG, 14.01.1992
  62. X#
  63. X#
  64. X#---------------------------------------------------------------------------
  65. X# CFLAGS: 
  66. X# 
  67. X# -D_SYS7         UNIX System 7 (z.B. MINIX, COHERENT, ...)
  68. X# -D_MBOX         IMMER!!!
  69. X# -D_MINIX        Fuer alles, was nur unter MINIX funxt
  70. X# -D_ISC          Fuer alles, was auch unter Interactive UNIX funxt
  71. X# -D_SCO          Fuer alles, was sogar unter SCO UNIX (!) funxt
  72. X# -D_ESTDIO       Earl Chew's "estdio.h" und GNU C 1.37
  73. X# -D_CORELEFT     Speicherplatzreserven ueberwachen (-D_CORELEFT=10000)
  74. X#          NUR ZU TESTZWECKEN (siehe "chmem +200000")!!! 
  75. X# -D_DATESTAMP    Zeit&Datum ins Console-Logfile aufnehmen
  76. X# -D_NOINDEX      Index-Dateien werden ONLINE gebildet 
  77. X#                 MB-DAEMON wird nicht per [crontab] sondern nur explizit
  78. X#                 fuer die gerade aktive Gruppe gestartet
  79. X# -D_BAUDRATE     Baudrate austesten (nur bei HST-Modems/Fixed BPS)
  80. X#
  81. X# MINIX 386 (BCC)
  82. X CC= bcc
  83. X LN= ln
  84. X CHMEM= chmem
  85. X CFLAGS= -D_MINIX -D_SYS7 -D_MBOX -D_BAUDRATE
  86. X LIB=
  87. X CONVERT= mv a.out $@
  88. X CHOWN= chown $(OWNER).$(GROUP) 
  89. X CHGRP= :
  90. X STRIP= strip $@
  91. X GETCH= getch.o
  92. X#
  93. X#
  94. X# MINIX 386 & ESTDIO.H
  95. X# CC= cc
  96. X# LN= ln
  97. X# CHMEM= chmem
  98. X# CFLAGS= -D_MINIX -D_SYS7 -D_ESTDIO -D_MBOX
  99. X# LIB= -lestdio
  100. X# CONVERT= mv a.out $@
  101. X# CHOWN= chown $(OWNER).$(GROUP) 
  102. X# CHGRP= :
  103. X# STRIP= strip $@
  104. X# GETCH= getch.o
  105. X#
  106. X#
  107. X# MINIX 386 (GCC 1.37)
  108. X# CC= gcc
  109. X# LN= ln
  110. X# CHMEM= : 
  111. X# CFLAGS= -O -D_MINIX -D_SYS7 -D_MBOX -D_ESTDIO 
  112. X# LIB=
  113. X# CONVERT= /usr/local/bin/gcc2minix < a.out > $@
  114. X# CHOWN= chown $(OWNER).$(GROUP) 
  115. X# CHGRP= :
  116. X# STRIP= strip $@
  117. X# GETCH= getch.o
  118. X#
  119. X#
  120. X# ESIX SVR3 
  121. X# CC= cc
  122. X# LN= ln
  123. X# CHMEM= chmem
  124. X# CFLAGS= -O -D_MBOX 
  125. X# LIB= -ltermcap -lcurses -lc_s -s
  126. X# CONVERT= mv a.out $@
  127. X# CHOWN= chown $(OWNER) 
  128. X# CHGRP= chgrp $(GROUP)
  129. X# STRIP= :
  130. X# GETCH= SysV.getch.o
  131. X#
  132. X#
  133. X# ISC 2.21 & "Shared Libs" 
  134. X# CC= gcc
  135. X# LN= ln
  136. X# CHMEM= :
  137. X# CFLAGS= -O -D_MBOX -D_ISC -traditional
  138. X# LIB= -ltermcap -lcurses -lc_s -s
  139. X# CONVERT= mv a.out $@
  140. X# CHOWN= chown $(OWNER) 
  141. X# CHGRP= chgrp $(GROUP)
  142. X# STRIP= :
  143. X# GETCH= SysV.getch.o
  144. X
  145. X
  146. X# Hier ist das $HOME-Verzeichnis der ix/MBox
  147. XMBOXHOME=/mbox
  148. X
  149. X
  150. X# Hier befinden sich alle BINARIES/EXECUTABLES
  151. XBIN=/usr/bin
  152. X
  153. X
  154. X# Damit zeigt BLED sein HELP-File an
  155. XBLPAGER=cat
  156. X
  157. X
  158. X# Hier findet man HELP-Files und Dokumentationen
  159. XHELPDIR=/usr/doc
  160. X
  161. X
  162. X# Es waere zwar wuenschenswert die MBox ohne "root.root"
  163. X# zu fahren, aber leider klappt's nicht :-(
  164. XOWNER=root
  165. XGROUP=root
  166. X
  167. X
  168. X
  169. X# Fuer den automagischen Update per "make diff"
  170. XDIFF=/usr/bin/cdiff
  171. X
  172. X# Enthaelt die geaenderten Quellen bzw. die original 1.6er Referencen
  173. XSRC      = /mbox/src
  174. XSRC_ORIG = /mbox/1.6
  175. X
  176. X# Und wer hat die aktuellen Aenderungen ausgefuehrt ?
  177. XADRESSE = "volkers@unnet.w.open.DE"
  178. X
  179. X
  180. X
  181. X
  182. XMBOX.OBJ=main.o $(GETCH) tools.o getline.o \
  183. X    intro.o nerror.o show.o    loop.o help.o admin.o mail.o control.o \
  184. X    misc.o lesen.o lesen2.o pd.o portinfo.o befehl.o misc2.o \
  185. X    postfach.o ctrlx.o makro.o weiterl.o coreleft.o games.o suchen.o \
  186. X    baudrate.o
  187. X
  188. XBLED.OBJ=bled.o $(GETCH) bltools.o blgetline.o derror.o
  189. X
  190. XXMD.OBJ=xmd.o tools.o derror.o
  191. X
  192. XMBRSH.OBJ=mbrsh.o
  193. X
  194. XMBD.OBJ=tools.o mb-daemon.o derror.o
  195. X
  196. XDIFF_FILES=SysV.getch.c admin.c befehl.c bled.c control.c coreleft.c \
  197. X    ctrlx.c defs.h derror.c games.c getch.c getline.c help.c intro.c \
  198. X    lesen.c lesen2.c loop.c mail.c main.c makro.c mb-daemon.c mbox.h \
  199. X    mbrsh.c misc.c misc2.c nerror.c patchlevel.h pd.c portinfo.c \
  200. X    postfach.c show.c suchen.c tools.c weiterl.c xmd.c baudrate.c
  201. X
  202. XPROGS=mbox bled mb-daemon mbrsh xmd
  203. X
  204. Xdefault:; @echo ''
  205. X      @echo 'Sie muessen eines der folgenden Kommandos verwenden:'
  206. X      @echo ''
  207. X      @echo 'make all       <-   Erstellt alle Dateien '
  208. X      @echo 'make world     <-   Richtet Verzeichnisse ein und verteilt die Rechte'
  209. X      @echo 'make inst      <-   Kopiert die Binaer-Dateien nach "$(BIN)"'
  210. X      @echo 'make clean     <-   Entfernt Objekt-Dateien'
  211. X      @echo 'make mbox      <-   Erstellt "mbox" (ix/MBox BBS)'
  212. X      @echo 'make mb-daemon <-   Erstellt "mb-daemon" (NEWS Scanner)'
  213. X      @echo 'make xmd       <-   Erstellt "xmd" (Mailing Agent)'
  214. X      @echo 'make mbrsh     <-   Erstellt "mbrsh" (Externe Shell)'
  215. X      @echo 'make bled      <-   Erstellt "bled" (B[etter] L[ine] ED[itor])'
  216. X      @echo ''
  217. X      @echo 'Aktive Definitionen:'
  218. X      @echo ''
  219. X      @echo 'Compiler [$(CC)]'
  220. X      @echo 'CFLAGS   [$(CFLAGS)]'
  221. X      @echo 'Lib(s)   [$(LIB)]'
  222. X      @echo 'Getch    [$(GETCH)]'
  223. X      @echo 'Root-ID  [$(OWNER).$(GROUP)]'
  224. X      @echo ''
  225. X
  226. Xall: $(PROGS)
  227. X    @echo ''
  228. X    @echo '- Alle Dateien wurden erstellt' 
  229. X    @echo ''
  230. X
  231. Xmbox:    $(MBOX.OBJ)
  232. X    @echo ''
  233. X    @echo '- Das Mailboxprogramm wird uebersetzt'
  234. X    @echo ''
  235. X    $(CC) $(CFLAGS) $(MBOX.OBJ) $(LIB) 
  236. X    @$(CONVERT)
  237. X    @$(CHOWN) $@
  238. X    @$(CHGRP) $@
  239. X    @chmod +x mbox
  240. X    @chmod ug+s mbox
  241. X    @$(CHMEM) +200000 mbox
  242. X    @$(STRIP)
  243. X
  244. Xbled:    $(BLED.OBJ) 
  245. X    @echo ''
  246. X    @echo '- Der Editor (BLED) wird uebersetzt'
  247. X    @echo ''
  248. X    $(CC) $(CFLAGS) $(BLED.OBJ) $(LIB) 
  249. X    @$(CONVERT)
  250. X    @$(CHMEM) +10000 bled    
  251. X    @$(STRIP)
  252. X    @chmod +x bled
  253. X
  254. Xxmd:    $(XMD.OBJ) 
  255. X    @echo ''
  256. X    @echo '- Der Mailing Agent (xmd) wird uebersetzt'
  257. X    @echo ''
  258. X    $(CC) $(CFLAGS) $(XMD.OBJ) $(LIB) 
  259. X    @$(CONVERT)
  260. X    @$(STRIP)
  261. X    @chmod +x xmd
  262. X
  263. Xmbrsh:  $(MBRSH.OBJ) 
  264. X    @echo ''
  265. X    @echo '- Die interne SHELL (mbrsh) wird uebersetzt'
  266. X    @echo ''
  267. X    $(CC) $(CFLAGS) $(MBRSH.OBJ) $(LIB) 
  268. X    @$(CONVERT)
  269. X    @$(STRIP)
  270. X    @chmod +x mbrsh
  271. X
  272. Xmb-daemon:    $(MBD.OBJ) 
  273. X    @echo ''
  274. X    @echo '- Der NEWS Scanner (mb-daemon) wird uebersetzt'
  275. X    @echo ''
  276. X    $(CC) $(CFLAGS) $(MBD.OBJ) $(LIB) 
  277. X    @$(CONVERT)
  278. X    @chmod +x mb-daemon
  279. X    @chmod ug+s mb-daemon
  280. X    @$(CHMEM) +64000 mb-daemon        
  281. X    @$(STRIP)
  282. X
  283. Xinst:    world all
  284. X    @echo
  285. X    @echo -n '- Die Mailbox wird installiert...'
  286. X    @cp mbox $(BIN)
  287. X    @cp bled $(BIN)
  288. X    @cp mbrsh $(MBOXHOME)
  289. X    @cp mb-daemon $(BIN)
  290. X    @cp xmd $(BIN)
  291. X    @cp bled.doc $(HELPDIR)
  292. X    @$(CHOWN) $(MBOXHOME)/* $(MBOXHOME)/etc/*
  293. X    @$(CHGRP) $(MBOXHOME)/* $(MBOXHOME)/etc/*
  294. X    @chmod +s $(BIN)/mbox
  295. X    @chmod +s $(BIN)/mb-daemon
  296. X    @echo  'fertig.'
  297. X    @echo
  298. X
  299. Xcopy:
  300. X    cp mbox bled mb-daemon xmd $(BIN)
  301. X    cp mbrsh $(MBOXHOME)
  302. X
  303. Xworld:;    @echo
  304. X    @echo -n '- Die Verzeichnisse werden eingerichtet ... '
  305. X    @if test -d $(MBOXHOME) ; then echo -n ''; else mkdir $(MBOXHOME) ; fi
  306. X    @if test -d $(BIN) ; then echo -n ''; else mkdir $(BIN) ; fi
  307. X    @if test -d $(MBOXHOME)/etc ; then echo -n ''; \
  308. X        else mkdir $(MBOXHOME)/etc ; fi
  309. X    @if test -d $(MBOXHOME)/lib ; then echo -n ''; \
  310. X        else mkdir $(MBOXHOME)/lib ; fi
  311. X    @if test -d $(MBOXHOME)/src ; then echo -n ''; \
  312. X        else mkdir $(MBOXHOME)/src ; fi
  313. X    @if test -d $(MBOXHOME)/usr ; then echo -n ''; \
  314. X        else mkdir $(MBOXHOME)/usr ; fi
  315. X    @$(CHOWN) $(MBOXHOME) $(MBOXHOME)/*
  316. X    @$(CHGRP) $(MBOXHOME) $(MBOXHOME)/*
  317. X    @chmod ug+rwx $(MBOXHOME)/lib
  318. X    @chmod o-rwx $(MBOXHOME)/lib
  319. X    @chmod ug+rwx $(MBOXHOME)/src
  320. X    @chmod o-rwx $(MBOXHOME)/src
  321. X    @chmod ug+rwx $(MBOXHOME)/etc
  322. X    @chmod o-rwx $(MBOXHOME)/etc
  323. X    @chmod ug+rwx $(MBOXHOME)/usr
  324. X    @chmod o-rwx $(MBOXHOME)/usr
  325. X    @echo 'fertig.'
  326. X    @echo ''
  327. X
  328. X
  329. Xclean:;    
  330. X    @echo ''
  331. X    @echo -n '- Alte Programme etc. werden entfernt ... ' 
  332. X    @rm -f *.o mbox mbrsh bled xmd mb-daemon bltools.c blgetline.c
  333. X    @echo 'fertig.'
  334. X    @echo ''
  335. X
  336. Xblgetline.o:    mbox.h patchlevel.h
  337. X    @if test -f blgetline.c ; then echo -n '' ; \
  338. X        else $(LN) getline.c blgetline.c ; fi
  339. X    $(CC) -c $(CFLAGS) blgetline.c
  340. X
  341. Xbltools.o:    mbox.h patchlevel.h
  342. X    @rm -f bltools.c
  343. X    @cat undef.c > bltools.c
  344. X    @cat tools.c >> bltools.c
  345. X    $(CC) -c $(CFLAGS) bltools.c
  346. X
  347. Xbled.o:    mbox.h patchlevel.h
  348. X    $(CC) -c $(CFLAGS) -D'HILFE "$(BLPAGER) $(HELPDIR)/bled.doc"' bled.c
  349. X
  350. Xdiff: $(DIFF_FILES)
  351. X    @echo DiffMailer by ralf@heibox.ruhr.sub.org >$@
  352. X    @echo Project: ix/MBox 1.6 >>$@
  353. X    @echo Adresse: $(ADRESSE)
  354. X    @echo Folgende Aenderungen sind in $? vorzunehmen >>$@
  355. X    @date >>$@
  356. X    @echo >>$@
  357. X    @for f in $? ; do \
  358. X    echo ----- $$f -----; \
  359. X    echo ----- $$f ----- >>$@; \
  360. X    $(DIFF) $(SRC)/$$f $(SRC_ORIG) | cat >>$@; \
  361. X    done
  362. X    @cat diff | mail -s "ix/MBox PATCHES" volkers@unnet.w.open.de
  363. X
  364. X
  365. Xadmin.o:        mbox.h defs.h
  366. Xbefehl.o:        mbox.h defs.h
  367. Xbled.o:            mbox.h defs.h
  368. Xbaudrate.o:        mbox.h defs.h
  369. Xcontrol.o:        mbox.h defs.h
  370. Xderror.o:        mbox.h defs.h
  371. Xgames.o:        mbox.h defs.h
  372. Xgetline.o:        mbox.h defs.h
  373. Xhelp.o:            mbox.h defs.h
  374. Xintro.o:        mbox.h defs.h
  375. Xlesen:            mbox.h defs.h
  376. Xlesen2.o:        mbox.h defs.h
  377. Xloop.o:            mbox.h defs.h
  378. Xmail.o:            mbox.h defs.h
  379. Xmain.o:            mbox.h defs.h
  380. Xmakro.o:        mbox.h defs.h
  381. Xmbd.o:            mbox.h defs.h
  382. Xmbrsh.o:        mbox.h defs.h
  383. Xmisc.o:            mbox.h defs.h
  384. Xmisc2.o:        mbox.h defs.h
  385. Xnerror.o:        mbox.h defs.h
  386. Xpd.o:            mbox.h defs.h
  387. Xportinfo.o:        mbox.h defs.h
  388. Xpostfach.o:        mbox.h defs.h
  389. Xshow.o:            mbox.h defs.h
  390. Xsuchen.o:        mbox.h defs.h
  391. Xtools.o:        mbox.h defs.h
  392. Xweiterl.o:        mbox.h defs.h
  393. Xxmd.o:            mbox.h defs.h
  394. X
  395. X
  396. X
  397. END_OF_FILE
  398.   if test 9174 -ne `wc -c <'src/Makefile'`; then
  399.     echo shar: \"'src/Makefile'\" unpacked with wrong size!
  400.   fi
  401.   # end of 'src/Makefile'
  402. fi
  403. if test -f 'src/mail.c' -a "${1}" != "-c" ; then 
  404.   echo shar: Will not clobber existing file \"'src/mail.c'\"
  405. else
  406.   echo shar: Extracting \"'src/mail.c'\" \(21793 characters\)
  407.   sed "s/^X//" >'src/mail.c' <<'END_OF_FILE'
  408. X/***************************************************************************/
  409. X/*        PROGRAMM  ix/Mbox                           */
  410. X/*             DATEI  mail.c                           */
  411. X/*        FUNKTIONEN  fetch_receipy(), brief()                   */
  412. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  413. X/*  LETZTE AENDERUNG  17.02.1992                       */
  414. X/***************************************************************************/
  415. X
  416. X#include <sys/types.h>
  417. X#include <sys/stat.h>
  418. X#include <unistd.h>
  419. X#include <stdio.h>
  420. X#include <fcntl.h>
  421. X#include <time.h>
  422. X
  423. X#include "mbox.h"
  424. X
  425. Xstatic int fetch_local;
  426. Xstatic char fetch_subj[STRING];
  427. X
  428. X
  429. X/***************************************************************************/
  430. X/*      FUNKTION  fetch_receipy()                       */
  431. X/*  BESCHREIBUNG  Im REPLY-Modus wird die Adresse des Empfaengers aus      */
  432. X/*              dessen Mail gefiltert.                                   */
  433. X/*     PARAMETER  REP  =  Datei mit der Mail des zukuenftigen Empfaengers  */
  434. X/*     RUECKGABE  Adresse des Empfaengers                                  */
  435. X/***************************************************************************/
  436. X
  437. Xchar *fetch_reciepy(REP)
  438. Xchar REP[];
  439. X{
  440. X  FILE *fp;
  441. X  char s[STRING];
  442. X  char t[STRING];
  443. X  char f[STRING];
  444. X  int ok = 0, i;
  445. X  int beg = 0;
  446. X  int bang = 0, at = 0, strange = 0, stranger = 0;
  447. X
  448. X  fetch_local = 0;
  449. X  fetch_subj[0] = '\0';
  450. X
  451. X  fp = fopen(REP, "r");
  452. X  if (fp == NULL) {
  453. X    nerror("mail.c", 31, "fetch_reciepy", "Datei_Lesefehler", REP);
  454. X  }
  455. X  while (fgets(f, 80, fp) != NULL) {
  456. X    if (strcomp("From: ", f) == 0) {
  457. X        beg = 6;
  458. X        ok = 1;
  459. X        strcpy(s, f);
  460. X    }
  461. X    if (strcomp("From ", f) == 0) { /* local mail */
  462. X        beg = 5; 
  463. X        ok = 1;
  464. X        strcpy(s, f);
  465. X    }
  466. X    if (strcomp("Reply-To: ", f) == 0) {
  467. X        beg = 10;
  468. X        ok = 1;
  469. X        strcpy(s, f);
  470. X    }
  471. X    if (strcomp("Subject: ", s) == 0) {
  472. X        strcpy(fetch_subj, (char *) strcopy(s, 9, 79));
  473. X    }
  474. X  }
  475. X  fclose(fp);
  476. X
  477. X  if (ok == 0) {
  478. X    return (char *) "OOPS";
  479. X  }
  480. X  i = beg;
  481. X  ok = 0;
  482. X
  483. X  while (s[i] != '\0') {
  484. X    if (s[i] == '(') ok = i - 2;
  485. X    if (s[i] == '<') strange = i + 1;
  486. X    if (s[i] == '>') stranger = i - 1;
  487. X    i++;
  488. X  }
  489. X  if (ok == 0) ok = i;
  490. X  strcpy(t, (char *) strcopy(s, beg, ok));
  491. X
  492. X  if ((strange != 0) && (stranger != 0)) {
  493. X    strcpy(t, (char *) strcopy(s, strange, stranger));
  494. X    return (char *) t;
  495. X  }
  496. X  i = 0;
  497. X  while (t[i] != '\0') {
  498. X    if (t[i] == '@') at = i;
  499. X    if (t[i] == '!') bang = i;
  500. X    i++;
  501. X  }
  502. X
  503. X  if (at != 0) {
  504. X    strcpy(s, (char *) strcopy(t, (at + 1), length(t)));
  505. X    if (strcomp(UUCPSITE, s) == 0) {    /* local user */
  506. X        fetch_local = 1;
  507. X        strcpy(s, (char *) strcopy(t, 0, (at - 1)));
  508. X        i = 0;
  509. X        while (s[i] != '\0') {
  510. X            if (s[i] == '.') s[i] = ' ';
  511. X            i++;
  512. X        }
  513. X        return (char *) s;
  514. X    }
  515. X  }
  516. X
  517. X  if (beg == 5) {  /* local mail */
  518. X    i = 0;
  519. X    while((t[i] != '\0') && (t[i] != ' ')) i++;
  520. X    t[i] = '\0';
  521. X  }
  522. X
  523. X  return (char *) t;
  524. X}
  525. X
  526. X
  527. X
  528. X
  529. X
  530. X
  531. X/***************************************************************************/
  532. X/*      FUNKTION  brief()                           */
  533. X/*  BESCHREIBUNG  Eine persoenliche Nachricht wird verschickt. Je nach     */
  534. X/*          Empfaenger-Adresse und Parameter wird die Post ins       */
  535. X/*          MBox-interne Mailsystem geschickt, oder an MAIL          */
  536. X/*          weitergleitet. Die Adresse des Empfaengers wird ent-     */
  537. X/*          weder als Parameter uebergeben, oder aus einer Datei     */
  538. X/*          gefiltert, auf die geantwortet werden soll (REPLY-Mode). */
  539. X/*     PARAMETER  arg  =  "~REPLY~"    =  REPLY-Modus aktivieren           */
  540. X/*              Es wird nicht unterschieden zwischen REPLY auf   */
  541. X/*              pers. Mail oder REPLY auf einen NEWS-Artikel.    */
  542. X/*              Die Datei mit der zu beantwortenden MSG liefert  */
  543. X/*              die Routine "lesen()".                           */
  544. X/*          arg  =  "Empfaenger" =  verwertbare Adresse fuer das     */
  545. X/*              interen Mail-System oder MAIL.                   */
  546. X/*     RUECKGABE   -1  =  Abbruch                                          */
  547. X/***************************************************************************/
  548. X
  549. Xint brief(arg)
  550. Xchar arg[];
  551. X{
  552. X  FILE *fp;
  553. X  FILE *ff;
  554. X  int fd;
  555. X  int i, j;
  556. X  int ok;
  557. X  struct userdaten LOOSER;
  558. X
  559. X  struct tm *timeptr;
  560. X  time_t timer;
  561. X
  562. X  int receiver;
  563. X  int mail_id;
  564. X  int EX_PM = 0;
  565. X  int REPLY = 0;
  566. X  int lines = 0;
  567. X  int WEITERLEITEN = 0;
  568. X  int HOLD = 0;
  569. X  int UMLEITUNG = 0;
  570. X
  571. X  char s[STRING];
  572. X  char t[STRING];
  573. X  char TEP[STRING];
  574. X  char REP[STRING];
  575. X  char f[STRING];
  576. X  char subject[STRING];
  577. X  char from[STRING];
  578. X  char rec_char[STRING];
  579. X  char ex[255];
  580. X  char user[STRING];
  581. X  char mesg_id[STRING];
  582. X  char refs[STRING];
  583. X  char date[STRING];
  584. X  char c;
  585. X  char protokoll;
  586. X  char lf;
  587. X  char pubdir[STRING];
  588. X  char dummy[STRING];
  589. X  char username[STRING];
  590. X  char reply[STRING];
  591. X  char priority[STRING];
  592. X  char action[STRING];
  593. X  char cc[STRING];
  594. X  char bcc[STRING];
  595. X  char encrypted[STRING];
  596. X  char comments[STRING];
  597. X  char keywords[STRING];
  598. X  char fortune[STRING];
  599. X
  600. X  char YOUR_SITE[STRING];
  601. X
  602. X  int BINFILE;
  603. X  int news_reply = 0;
  604. X
  605. X  struct stat fst;
  606. X
  607. X
  608. X  i = 0;
  609. X  ok = 0;
  610. X
  611. X  mesg_id[0] = '\0';
  612. X
  613. X  if (arg[0] == '\0') {
  614. X    ansi("md");
  615. X    printf(" %s\n", MAL03_MSG);
  616. X    ansi("me");
  617. X    return -1;
  618. X  }
  619. X  EX_PM = 0;
  620. X
  621. X
  622. X  i = 0;
  623. X  strcpy(t, USER.name);
  624. X  while (t[i] != '\0') {
  625. X    if (t[i] == ' ') t[i] = '.';
  626. X    i++;
  627. X  }
  628. X  strcpy(username, t);
  629. X  action[0] = '\0';
  630. X  priority[0] = '\0';
  631. X  encrypted[0] = '\0';
  632. X  keywords[0] = '\0';
  633. X  comments[0] = '\0';
  634. X  cc[0] = '\0';
  635. X  bcc[0] = '\0';
  636. X  fortune[0] = '\0';
  637. X
  638. X  i = 0;
  639. X  while (arg[i] != '\0') {
  640. X    if ((arg[i] == '!') || (arg[i] == '@') || (arg[i] == '%')) EX_PM++;
  641. X    i++;
  642. X  }
  643. X
  644. X  if ((EX_PM > 0) && (USER.level < MAILOUT_LEV)) {
  645. X    ansi("md");
  646. X    printf("\n\n%s (%d) %s\n", MAL04_MSG, MAILOUT_LEV, MAL05_MSG);
  647. X    ansi("me");
  648. X    return -1;
  649. X  }
  650. X
  651. X  if(arg[length(arg) -1] == '?'){
  652. X    arg[length(arg) -1] = '$';
  653. X    HOLD++;
  654. X  }
  655. X
  656. X  if(arg[length(arg) -1] == '$'){
  657. X    WEITERLEITEN++;
  658. X    arg[length(arg) -1] = '\0';
  659. X    sprintf(TEP, "%s/usr/%d/.lastletter", HOME, USER.id);
  660. X    sprintf(t, "%s/usr/%d/.lastsubject", HOME, USER.id);
  661. X    fp = fopen( t, "r" );
  662. X    if(fp == NULL) {
  663. X        return -1; 
  664. X    }
  665. X    fgets(s, 80, fp);
  666. X    fclose(fp);
  667. X    if(HOLD == 0){
  668. X        sprintf(subject, "%s %s", MAL06_MSG, s);
  669. X        UMLEITUNG++;
  670. X    }else
  671. X        sprintf(subject, "%s", s);
  672. X  }
  673. X
  674. X  user[0] = '\0';
  675. X  strcat(user, arg);
  676. X
  677. X  if(WEITERLEITEN != 0) goto TRY_AGAIN;
  678. X
  679. X  if (strcomp("~REPLY~", arg) == 0) {
  680. X    REPLY++;
  681. X    sprintf(REP, "%s/%dRep", TMP, getpid());
  682. X    sprintf(TEP, "%s/%dTep", TMP, getpid());
  683. X    fp = fopen(REP, "r");
  684. X    if (fp == NULL) {
  685. X        nerror("mail.c", 278, "brief", "Datei-Lesefehler", REP);
  686. X    }
  687. X    fgets(s, 80, fp    );            /* HEADER: Autor */
  688. X
  689. X    sprintf(dummy, "%s %s", GBL01_MSG, X_MAIL_DEMON);
  690. X
  691. X    if ((strcomp(GBL01_MSG, s) == 0) && (strcomp(dummy, s) != 0)) {
  692. X        strcpy(user, (char *) strcopy(s, (1+strlen(GBL01_MSG)), 80));
  693. X
  694. X        fgets(s, 80, fp);        /* HEADER: Datum */
  695. X        fgets(s, 80, fp);        /* HEADER: Betreff */
  696. X
  697. X        strcpy(t, (char *) strcopy(s, (1+strlen(GBL03_MSG)), 80));
  698. X        subject[0]= '\0';
  699. X        if (strcomp("Re: ", t) != 0) {
  700. X            strcpy(subject, "Re: ");
  701. X        }
  702. X        strcat(subject, (char *) stripped(t));
  703. X
  704. X        fgets(s, 80, fp);    /* HEADER: Leer */
  705. X        fgets(s, 80, fp);    /* HEADER: Leer */
  706. X    }
  707. X    else {        /* UUCP-Header (!MBox) */
  708. X
  709. X        sprintf(subject, MAL07_MSG);
  710. X        refs[0] = '\0';
  711. X        mesg_id[0] = '\0';
  712. X
  713. X        ok = -1;
  714. X
  715. X        while ((ok < 1) && (fgets(s, 80, fp) != NULL)) {
  716. X            if (strcomp("Lines: ", s)      == 0) ok = 1;
  717. X            if (strcomp("Date: ",  s)      == 0) {
  718. X                strcpy(date, (char *) strcopy(s, 6, 80));
  719. X            }
  720. X            if (strcomp("Newsgroups: ", s) == 0) news_reply++;
  721. X            if (strcomp("Subject: ", s)    == 0) {
  722. X                subject[0] = '\0';
  723. X                strcpy(t, (char *) strcopy(s, 9, 80));
  724. X                if (strcomp("Re: ", t) != 0) {
  725. X                    sprintf(subject, "%s", "Re: ");
  726. X                }
  727. X                strcat(subject, (char *) stripped(t));
  728. X            }
  729. X            if (strcomp("Message-Id: ", s) == 0) {
  730. X                strcpy(mesg_id, (char *) strcopy(s, 12, 80));
  731. X            }
  732. X            if (strcomp("From: ", s) == 0) {
  733. X                strcpy(from, (char *) strcopy(s, 6, 80));
  734. X                ok = 0;
  735. X            }
  736. X            if (strcomp("From ", s) == 0) {
  737. X                strcpy(from, (char *) strcopy(s, 5, 80));
  738. X                ok = 0;
  739. X            }
  740. X            if (strcomp("References: ", s) == 0) {
  741. X                strcpy(refs, (char *) strcopy(s, 12, 80));
  742. X            }
  743. X            if (strcomp("Comments: ", s) == 0) {
  744. X                strcpy(comments, (char *) strcopy(s, 10, 80));
  745. X                strcpy(comments, (char *) stripped(comments));    
  746. X            }
  747. X            if (strcomp("Keywords: ", s) == 0) {
  748. X                strcpy(keywords, (char *) strcopy(s, 10, 80));
  749. X                strcpy(keywords, (char *) stripped(keywords));
  750. X            }
  751. X
  752. X            if ((strlen(s) < 5) && (ok == 0)) ok = 1;
  753. X        }
  754. X        /*
  755. X        fgets(s, 80, fp);
  756. X        */
  757. X    }
  758. X
  759. X    ff = fopen(TEP, "w");
  760. X    while (fgets(s, 80, fp) != NULL) {
  761. X        if(s[0] != '\n') fputs("> ", ff);
  762. X        fputs(s, ff);
  763. X    }
  764. X    fputs("", ff);
  765. X    fclose(ff);
  766. X    fclose(fp);
  767. X  }
  768. X
  769. X  TRY_AGAIN:
  770. X
  771. X  if((WEITERLEITEN != 0) && (EX_PM != 0)){
  772. X    sprintf(rec_char, "%s", user);
  773. X    if(checkdomaintype( rec_char ) != 0) return -1;
  774. X    goto ONCE_MORE;
  775. X  }
  776. X
  777. X  receiver = 0;
  778. X
  779. X  maybe_locked(UDBASE, "r"); lockf(UDBASE);
  780. X  fd = open(UDBASE, O_RDONLY);
  781. X  if (fd == -1) {
  782. X    nerror("mail.c", 216, "brief", "Datei-Lesefehler", UDBASE);
  783. X  }
  784. X  lseek(fd, 0L, SEEK_SET);
  785. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (receiver == 0)) {
  786. X    if ((strcomp(user, LOOSER.name) == 0) ||
  787. X        (strcomp(LOOSER.name, user) == 0) ||
  788. X        (strcomp(user, LOOSER.nick) == 0) ||
  789. X        (strcomp(user, LOOSER.sh_name) == 0)) {
  790. X        receiver = LOOSER.id;
  791. X        strcpy(rec_char, LOOSER.name);
  792. X    }
  793. X  }
  794. X  close(fd);
  795. X  unlockf(UDBASE);
  796. X
  797. X
  798. X  if ((receiver == 0) && (EX_PM == 0)) {
  799. X
  800. X    if (REPLY != 0) {
  801. X        strcpy(user, fetch_reciepy(REP));
  802. X        if (fetch_local == 1) goto TRY_AGAIN;
  803. X        strcpy(rec_char, (char *) stripped(user));
  804. X        if (strcomp(user, "OOPS") == 0) {
  805. X            ansi("md");
  806. X            printf("\n\n%s\n", MAL08_MSG);
  807. X            ansi("me ");
  808. X            unlink(TEP);
  809. X            unlink(REP); /* ??? */
  810. X            return -1;
  811. X        }
  812. X        EX_PM = 1;
  813. X        c = MAL13_MSG;
  814. X        goto REPLY_MARK;
  815. X    }
  816. X    else {
  817. X        ansi("md");
  818. X        strcpy(rec_char, (char *) stripped(user));
  819. X        printf("\n\n%s \"%s\" %s\n", MAL09_MSG, user, MAL10_MSG);
  820. X        ansi("me");
  821. X        if(WEITERLEITEN == 0) unlink(TEP);
  822. X        unlink(REP);
  823. X        return -1;
  824. X    }
  825. X  }
  826. X
  827. X  if(WEITERLEITEN != 0) goto ONCE_MORE;
  828. X
  829. X  unlink(REP);
  830. X
  831. X  if (EX_PM == 0) {
  832. X    ansi("md");
  833. X    sprintf(s, "%s/usr/%d/.hello", HOME, receiver);
  834. X    printf("\n\n");
  835. X    show(s, 22, 0);
  836. X    ansi("me");
  837. X  }
  838. X  else {
  839. X    strcpy(rec_char, arg);
  840. X  }
  841. X
  842. X  if(checkdomaintype( rec_char ) != 0) return -1;
  843. X
  844. X  if (REPLY != 0) {
  845. X    c = MAL13_MSG;
  846. X    goto REPLY_MARK;
  847. X  }
  848. X  printf("\n\n");
  849. X  ansi("mr");
  850. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL12_MSG);
  851. X  ansi("me");
  852. X  printf("%c%c", MAL13_MSG, BS);
  853. X
  854. X  do {
  855. X    c = getint();
  856. X    if (c >= 97) c -= 32;
  857. X    if (c == '?') {
  858. X        clearline();
  859. X        ansi("mr");
  860. X        printf("%c%s > ", CR, MAL16_MSG);
  861. X        ansi("me");
  862. X    }
  863. X    if (c == ENTER) c = MAL13_MSG;
  864. X    if ((c != MAL13_MSG) && (c != MAL14_MSG) && (c != MAL15_MSG)) c = 0;
  865. X  } while (c == 0);
  866. X
  867. X  printf("%c", c);
  868. X
  869. X  if (c == MAL15_MSG) {        /* VERWERFEN */
  870. X    unlink(REP);
  871. X    unlink(TEP);
  872. X    printf("\n");
  873. X    return -1;
  874. X  }
  875. X  sprintf(TEP, "%s/M%d", TMP, getpid());
  876. X  sprintf(pubdir, "%s/dir%d", TMP, getpid());
  877. X
  878. X  if (c == MAL14_MSG) {        /* UPLOAD */
  879. X    clearline();
  880. X    ansi("mr");
  881. X    printf("%c%s, ? > ", CR, MAL17_MSG);
  882. X    ansi("me");
  883. X
  884. X    do {
  885. X        protokoll = getint();
  886. X        if (protokoll >= 97) protokoll -= 32;
  887. X        if (protokoll == '?') {
  888. X            clearline();
  889. X            ansi("mr");
  890. X            printf("%c%s > ", CR, MAL17aMSG);
  891. X            ansi("me");
  892. X        }
  893. X        if ((protokoll != MAL18_MSG) && (protokoll != MAL18_MSG) &&
  894. X            (protokoll != MAL20_MSG) && (protokoll != MAL21_MSG))
  895. X            protokoll = 0;
  896. X    } while (protokoll == 0);
  897. X
  898. X    printf("%c", protokoll);
  899. X
  900. X  }
  901. X  printf("\n\n%c", CR);
  902. X  ansi("mr");
  903. X  printf("%s ", MAL22_MSG);
  904. X  ansi("me");
  905. X  printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
  906. X  ansi("mr");
  907. X  printf("%s ", MAL23_MSG);
  908. X  ansi("me");
  909. X  printf(" %s\n%c", rec_char, CR);
  910. X  ansi("mr");
  911. X  printf("%s ", MAL24_MSG);
  912. X  ansi("me");
  913. X  printf(" ");
  914. X  strcpy(subject, (char *) getline(50, 11, '.', ""));
  915. X  printf("\n");
  916. X  ansi("mr");
  917. X  printf("%s ", MAL23aMSG);
  918. X  ansi("me");
  919. X  printf(" ");
  920. X  strcpy(cc, (char *) getline(50, 11, '.', ""));
  921. X
  922. X
  923. X  REPLY_MARK:
  924. X
  925. X  if(checkdomaintype( rec_char ) != 0) return -1;
  926. X
  927. X  if (c == MAL13_MSG) {
  928. X    sprintf(s, "%s %s", EDDY, TEP);
  929. X    noctrlx();
  930. X    system(s);
  931. X    ctrlx();
  932. X    protokoll = '*';
  933. X  }
  934. X  else {            /* UPLOAD */
  935. X
  936. X    printf("\n\n");
  937. X    printf("%s\n\n", MAL25_MSG); 
  938. X    ansi("md");
  939. X    printf("%s", MAL26_MSG);
  940. X    ansi("me");
  941. X          
  942. X    unlink( TEP );
  943. X    
  944. X    switch (protokoll) {
  945. X        case MAL18_MSG:
  946. X            fp = fopen(TEP, "w");
  947. X            if (fp == NULL) {
  948. X                nerror("mail.c", 268, "brief", "DSF", TEP);
  949. X            }
  950. X            c = 0;
  951. X            lf = CR;
  952. X
  953. X            fputc(LF, fp);
  954. X
  955. X            while ((c != CTRL_X) && (c != CTRL_D)) {
  956. X                c = getint();
  957. X                if ((c == CR) && (lf == CR)) fputc(LF, fp);
  958. X                if (c == CR) lf = CR;
  959. X                if (c == LF) lf = LF;
  960. X                if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
  961. X                    fputc(c, fp);
  962. X                }
  963. X            }
  964. X            fclose(fp);
  965. X            break;
  966. X
  967. X        case MAL19_MSG:
  968. X            printf("\n");
  969. X            sprintf(s, "exec %s -bc TimeTravelAgency", RX);
  970. X            break;
  971. X        case MAL20_MSG:
  972. X            printf("\n");
  973. X            sprintf(s, "exec %s -b", RB);
  974. X            break;
  975. X        case MAL21_MSG:
  976. X            printf("\n");
  977. X            sprintf(s, "exec %s -b", RZ);
  978. X            break;
  979. X    }
  980. X    if (protokoll != MAL18_MSG){
  981. X        mkdir( pubdir, 0777 );
  982. X        chdir( pubdir );
  983. X
  984. X        system( s );
  985. X
  986. X        chdir( HOME );
  987. X        sprintf(s, "mv %s/* %s", pubdir, TEP);
  988. X        system( s );
  989. X        sprintf(s, "rm -r %s", pubdir);
  990. X        system( s );
  991. X    }
  992. X    sync();
  993. X    stat(TEP, &fst);
  994. X    if (fst.st_size < 3L) {
  995. X        printf("\n\n%s\n", MAL27_MSG);
  996. X        control(MAL28_MSG, 3);
  997. X        unlink(REP);    /* ??? */
  998. X        unlink(TEP);
  999. X        return -1;
  1000. X    }    
  1001. X    if (prf(TEP) == 1) {
  1002. X        printf("\n\n");
  1003. X        ansi( "md" );
  1004. X        printf("%s", MAL25_MSG);        
  1005. X        ansi( "me" );
  1006. X        unlink(REP);     /* ??? */
  1007. X        unlink(TEP);
  1008. X        return -1;
  1009. X        BINFILE++;
  1010. X    }
  1011. X    else{
  1012. X        mkix(TEP);
  1013. X    }
  1014. X  }
  1015. X
  1016. X  sprintf(reply, "%s <%s@%s>", USER.name, username, UUCPID);
  1017. X
  1018. X
  1019. X  ONCE_MORE:
  1020. X
  1021. X  if((HOLD != 0) || ((WEITERLEITEN != 0) && (IS_BUFFERED != 0))) goto HOLD_MARK;
  1022. X
  1023. X  printf("\n\n");
  1024. X  ansi("mr");
  1025. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL28aMSG);
  1026. X  ansi("me");
  1027. X  printf("%c%c", MAL29_MSG, BS);
  1028. X
  1029. X  do {
  1030. X    c = getint();
  1031. X    if (c >= 97) c -= 32;
  1032. X    if (c == '?') {
  1033. X        clearline();
  1034. X        ansi("mr");
  1035. X        printf("%c%s > ", CR, MAL32_MSG);
  1036. X        ansi("me");
  1037. X    }
  1038. X    if (c == ENTER) c = MAL29_MSG;
  1039. X    if ((c != MAL29_MSG) && (c != MAL30_MSG) && (c != MAL31_MSG) && (c != MAL31aMSG)) c = 0;
  1040. X  } while (c == 0);
  1041. X
  1042. X  printf("%c", c);
  1043. X
  1044. X  if (c == MAL31_MSG) {        /* WEITERSCHREIBEN */
  1045. X    sprintf(s, "%s %s", EDDY, TEP);
  1046. X    noctrlx();
  1047. X    system(s);
  1048. X    ctrlx();
  1049. X    goto ONCE_MORE;
  1050. X  }
  1051. X  if (c == MAL30_MSG) {        /* VERWERFEN */
  1052. X    printf("\n");
  1053. X    unlink(TEP);
  1054. X    unlink(REP);
  1055. X    return -1;
  1056. X  }
  1057. X  if (c == MAL31aMSG) {        /* HEADER */
  1058. X    headline( MAL32aMSG );
  1059. X    printf("\n");
  1060. X
  1061. X    time(&timer);
  1062. X
  1063. X    ansi( "md" );
  1064. X    printf("From: ");
  1065. X    ansi( "me" );
  1066. X    printf("%s <%s@%s>\n", USER.name, username, UUCPID);
  1067. X
  1068. X    ansi( "md" );
  1069. X    printf("Reply-To: ");
  1070. X    ansi( "me" );
  1071. X    if(USER.level > GUEST_LEV){
  1072. X        strcpy(reply, (char *) getline(80, 1001, 32, reply));
  1073. X        printf("\n");
  1074. X    }
  1075. X    else printf("%s\n", reply);
  1076. X
  1077. X
  1078. X    i = 0; j = 0;            /* Empfaenger: Realname */
  1079. X    while(from[i] != '\0'){
  1080. X        if(from[i] == '<'){
  1081. X            strcpy(s, (char *) strcopy(from, 0, (i-1)));
  1082. X            j = i;
  1083. X        }
  1084. X        if(from[i] == '(') j = i+1;
  1085. X        if(from[i] == ')') strcpy(s, (char *) strcopy(from, j, (i-1)));
  1086. X        i++;
  1087. X    }
  1088. X    if(j == 0) strcpy(s, from);
  1089. X        
  1090. X    if(mesg_id[0] != '\0'){
  1091. X        ansi( "md" );
  1092. X        printf("In-Reply-To: ");
  1093. X        ansi( "me" );
  1094. X        printf("%s; ", (char *) stripped(mesg_id)); 
  1095. X        printf("from \"%s\" at %s", (char *) stripped(s), date);
  1096. X
  1097. X        if(refs[0] != '\0') 
  1098. X            sprintf(s, "%s ", stripped(refs));
  1099. X        else
  1100. X            s[0] = '\0';
  1101. X        strcat(s, mesg_id);
  1102. X        ansi( "md" );
  1103. X        printf("References: ");
  1104. X        ansi( "me" );
  1105. X        printf("%s", s);
  1106. X    }
  1107. X
  1108. X    ansi( "md" );
  1109. X    printf("To: ");
  1110. X    ansi( "me" );
  1111. X    if(USER.level > GUEST_LEV){
  1112. X        strcpy(rec_char, (char *) getline(80, 1001, 32, rec_char));
  1113. X        printf("\n");
  1114. X    }
  1115. X    else printf("%s\n", rec_char);
  1116. X
  1117. X    ansi( "md" );
  1118. X    printf("Cc: ");
  1119. X    ansi( "me" );
  1120. X    if(USER.level > GUEST_LEV){
  1121. X        strcpy(cc, (char *) getline(80, 1001, 32, cc));
  1122. X        printf("\n");
  1123. X    }
  1124. X    else printf("%s\n", cc);
  1125. X
  1126. X    ansi( "md" );
  1127. X    printf("Bcc: ");
  1128. X    ansi( "me" );
  1129. X    if(USER.level > GUEST_LEV){
  1130. X        strcpy(bcc, (char *) getline(80, 1001, 32, bcc));
  1131. X        printf("\n");
  1132. X    }
  1133. X    else printf("%s\n", bcc);
  1134. X
  1135. X
  1136. X    ansi( "md" );
  1137. X    printf("Subject: ");
  1138. X    ansi( "me" );
  1139. X    if(USER.level > GUEST_LEV){
  1140. X        strcpy(subject, (char *) getline(80, 1001, 32, subject));
  1141. X        printf("\n");
  1142. X    }
  1143. X    else printf("%s\n", subject);
  1144. X
  1145. X    ansi( "md" );
  1146. X    printf("Keywords: ");
  1147. X    ansi( "me" );
  1148. X    if(USER.level > GUEST_LEV){
  1149. X        strcpy(keywords, (char *) getline(80, 1001, 32, keywords));
  1150. X        printf("\n");
  1151. X    }
  1152. X    else printf("%s\n", keywords);
  1153. X
  1154. X    ansi( "md" );
  1155. X    printf("Comments: ");
  1156. X    ansi( "me" );
  1157. X    if(USER.level > GUEST_LEV){
  1158. X        strcpy(comments, (char *) getline(80, 1001, 32, comments));
  1159. X        printf("\n");
  1160. X    }
  1161. X    else printf("%s\n", comments);
  1162. X    
  1163. X    ansi( "md" );
  1164. X    printf("Encrypted: ");
  1165. X    ansi( "me" );
  1166. X    if(USER.level > GUEST_LEV){
  1167. X        strcpy(encrypted, (char *) getline(80, 1001, 32, encrypted));
  1168. X        printf("\n");
  1169. X    }
  1170. X    else printf("%s\n", encrypted);
  1171. X
  1172. X    ansi( "md" );
  1173. X    printf("X-Mailer: ");
  1174. X    ansi( "me" );
  1175. X    printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  1176. X
  1177. X    ansi( "md" );
  1178. X    printf("Priority: ");
  1179. X    ansi( "me" );
  1180. X    if(USER.level > GUEST_LEV){
  1181. X        strcpy(priority, (char *) getline(80, 1001, 32, priority));
  1182. X        printf("\n");
  1183. X    }
  1184. X    else printf("%s\n", priority);
  1185. X
  1186. X    ansi( "md" );
  1187. X    printf("Action: ");
  1188. X    ansi( "me" );
  1189. X    if(USER.level > GUEST_LEV){
  1190. X        strcpy(action, (char *) getline(80, 1001, 32, action));
  1191. X        printf("\n");
  1192. X    }
  1193. X    else printf("%s\n", action);
  1194. X
  1195. X    ansi( "md" );
  1196. X    printf("X-Fortune: ");
  1197. X    ansi( "me" );
  1198. X    if(USER.level > GUEST_LEV){
  1199. X        strcpy(fortune, (char *) getline(80, 1001, 32, fortune));
  1200. X        printf("\n");
  1201. X    }
  1202. X    else printf("%s\n", fortune);
  1203. X
  1204. X
  1205. X    ansi( "md" );
  1206. X    printf("Message-Id: ");
  1207. X    ansi( "me" );
  1208. X       printf("<%x.%d@%s>\n", timer, USER.id, UUCPID);
  1209. X
  1210. X    goto ONCE_MORE;
  1211. X  }
  1212. X
  1213. X
  1214. X  HOLD_MARK:
  1215. X
  1216. X  if(UMLEITUNG == 0){
  1217. X    if(WEITERLEITEN == 0){
  1218. X        sprintf(s, "cp %s %s/usr/%d/.lastletter > /dev/null", TEP, HOME, USER.id);
  1219. X        system( s );     
  1220. X    }
  1221. X    sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
  1222. X    fp = fopen( s, "w" );
  1223. X    if(fp == NULL){
  1224. X        nerror("mail.c", 500, "brief", "Datei-Schreibfehler", s);
  1225. X    }
  1226. X    fprintf(fp, "%s", subject);
  1227. X    fclose(fp);
  1228. X  }
  1229. X
  1230. X
  1231. X  if (EX_PM == 0) {
  1232. X    sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  1233. X    maybe_locked(s, "r");
  1234. X    fp = fopen(s, "r");
  1235. X    if (fp == NULL) {
  1236. X        nerror("mail.c", 431, "brief", "Datei-Lesefehler", s);
  1237. X    }
  1238. X    fscanf(fp, "%d", &mail_id);
  1239. X    fclose(fp);
  1240. X    fp = fopen(s, "w");
  1241. X    fprintf(fp, "%d\n", (mail_id + 1));
  1242. X    fclose(fp);
  1243. X
  1244. X    sprintf(s, "%s/usr/%d/%d", HOME, receiver, mail_id);
  1245. X  }
  1246. X  else {
  1247. X    umask(0000);
  1248. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  1249. X  }
  1250. X
  1251. X
  1252. X  fp = fopen(s, "w");
  1253. X
  1254. X  if (EX_PM == 0) {
  1255. X    sprintf(s, "%s %s (%s)\n", GBL01_MSG, USER.name, USER.nick);
  1256. X    fputs(s, fp);
  1257. X
  1258. X    time(&timer);
  1259. X    timeptr = localtime(&timer);
  1260. X    strcpy(t, asctime(timeptr));
  1261. X
  1262. X    sprintf(s, "%s %s", GBL02_MSG, t);
  1263. X    fputs(s, fp);
  1264. X
  1265. X    sprintf(s, "%s %s\n\n\n", GBL03_MSG, subject);
  1266. X    fputs(s, fp);
  1267. X
  1268. X    lines = 5;
  1269. X  }
  1270. X   else {
  1271. X    lines = 4;
  1272. X  }
  1273. X
  1274. X
  1275. X  ff = fopen(TEP, "r");
  1276. X  if (ff == 0) {
  1277. X    printf("\n\n");
  1278. X    ansi("md");
  1279. X    printf("%s\n", MAL33_MSG);
  1280. X    ansi("me");
  1281. X    control(MAL34_MSG, 3);
  1282. X    return;
  1283. X  }
  1284. X  if(EX_PM != 0){
  1285. X
  1286. X    time(&timer);
  1287. X
  1288. X    i = 0; j = 0;            /* Empfaenger: Realname */
  1289. X    while(from[i] != '\0'){
  1290. X        if(from[i] == '<'){
  1291. X            strcpy(s, (char *) strcopy(from, 0, (i-1)));
  1292. X            j = i;
  1293. X        }
  1294. X        if(from[i] == '(') j = i+1;
  1295. X        if(from[i] == ')') strcpy(s, (char *) strcopy(from, j, (i-1)));
  1296. X        i++;
  1297. X    }
  1298. X    if(j == 0) strcpy(s, from);
  1299. X
  1300. X    fprintf(fp, "From: %s@%s (%s)\n", username, UUCPID, USER.name); 
  1301. X    if(reply[0] != '\0')
  1302. X        fprintf(fp, "Reply-To: %s\n", reply);
  1303. X    fprintf(fp, "Organization: %s\n", ORGANIZATION);
  1304. X    if(mesg_id[0] != '\0'){
  1305. X        fprintf(fp, "In-Reply-To: %s; ", (char *) stripped(mesg_id)); 
  1306. X        fprintf(fp, "from \"%s\" at %s", (char *) stripped(s), date);
  1307. X        if(refs[0] != '\0') 
  1308. X            sprintf(s, "%s ", stripped(refs));
  1309. X        else
  1310. X            s[0] = '\0';
  1311. X        strcat(s, mesg_id);
  1312. X        fprintf(fp, "References: %s", s);
  1313. X    }
  1314. X        fprintf(fp, "To: %s\n", rec_char);
  1315. X    if(cc[0] != '\0')
  1316. X        fprintf(fp, "Cc: %s\n", cc);
  1317. X    if(subject[0] != '\0')
  1318. X        fprintf(fp, "Subject: %s\n", subject);
  1319. X    if(keywords[0] != '\0')
  1320. X        fprintf(fp, "Keywords: %s\n", keywords);
  1321. X    if(comments[0] != '\0')
  1322. X        fprintf(fp, "Comments: %s\n", comments);
  1323. X    if(encrypted[0] != '\0')
  1324. X        fprintf(fp, "Encrypted: %s\n", encrypted);
  1325. X    fprintf(fp, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  1326. X    if(priority[0] != '\0')
  1327. X        fprintf(fp, "Priority: %s\n", priority);
  1328. X    if(action[0] != '\0')
  1329. X        fprintf(fp, "Action: %s\n", action);
  1330. X    if(fortune[0] != '\0')
  1331. X        fprintf(fp, "X-Fortune: %s\n", fortune);
  1332. X       fprintf(fp, "Message-Id: <%x.%d@%s>\n", timer, USER.id, UUCPID);
  1333. X     fputs("\n", fp);
  1334. X  }
  1335. X  while (fgets(s, 80, ff) != 0) {
  1336. X    fputs(s, fp);
  1337. X    lines++;
  1338. X  }
  1339. X  fclose(ff);
  1340. X
  1341. X  if(UMLEITUNG == 0){
  1342. X      sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
  1343. X      ff = fopen(s, "r");
  1344. X      if (ff != NULL) {
  1345. X        while (fgets(s, 80, ff) != 0) {
  1346. X            fputs(s, fp);
  1347. X            lines++;
  1348. X        }
  1349. X        fclose(ff);
  1350. X      }
  1351. X  }
  1352. X
  1353. X  if(WEITERLEITEN == 0) unlink(TEP);
  1354. X  fclose(fp);
  1355. X
  1356. X  if (EX_PM == 0) {
  1357. X    sprintf(s, "%s/usr/%d/INDEX", HOME, receiver);
  1358. X    maybe_locked(s, "r"); 
  1359. X    fp = fopen(s, "a");
  1360. X    if (fp == NULL) {
  1361. X        nerror("mail.c", 527, "brief", "Datei-Ergaenzungsfehler", s);
  1362. X    }
  1363. X    sprintf(s, "%d              ", mail_id);
  1364. X    s[6] = '\0';
  1365. X    if(HOLD != 0){
  1366. X        s[5] = '>';
  1367. X    }
  1368. X    fputs(s, fp);
  1369. X
  1370. X    sprintf(ex, "%s                                ", subject);
  1371. X    ex[26] = '\0';
  1372. X    fputs(ex, fp);
  1373. X
  1374. X    sprintf(ex, "  %s                                        ", USER.name);
  1375. X    ex[22] = '\0';
  1376. X    fputs(ex, fp);
  1377. X
  1378. X    strcpy(s, (char *) mydate(1));
  1379. X    strcpy(t, (char *) mytime(1));
  1380. X    sprintf(ex, "  %s  %s         ", s, t);
  1381. X    ex[19] = '\0';
  1382. X    fputs(ex, fp);
  1383. X
  1384. X    sprintf(s, "%-6.d\n", lines);
  1385. X    fputs(s, fp);
  1386. X
  1387. X    fclose(fp);
  1388. X
  1389. X  }
  1390. X  else {
  1391. X    sprintf(s, " X-Mail via UUCP (%s) ", rec_char);
  1392. X    headline(s);
  1393. X    printf("\n%s", MAL35_MSG);
  1394. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  1395. X    sprintf(t, "/bin/sh ./etc/rmail.sh %s %s", s, rec_char);
  1396. X    system(t);
  1397. X    unlink(s);
  1398. X    unlink(f);
  1399. X    umask(0007);
  1400. X    printf(" %s\n", MAL36_MSG);
  1401. X  }
  1402. X
  1403. X  unlink(REP);
  1404. X  if(UMLEITUNG == 0) unlink(TEP);
  1405. X
  1406. X  sprintf(s, "%s \"%s\" %s", MAL11_MSG, rec_char, MAL37_MSG);
  1407. X  control(s, 3);
  1408. X
  1409. X  printf("\n");
  1410. X
  1411. X  if((cc[0] != '\0') || (bcc[0] != '\0')){
  1412. X    carboncopy(cc, bcc);
  1413. X  }
  1414. X
  1415. X  return 0;
  1416. X}
  1417. X
  1418. X
  1419. X
  1420. X
  1421. END_OF_FILE
  1422.   if test 21793 -ne `wc -c <'src/mail.c'`; then
  1423.     echo shar: \"'src/mail.c'\" unpacked with wrong size!
  1424.   fi
  1425.   # end of 'src/mail.c'
  1426. fi
  1427. if test -f 'src/misc.c' -a "${1}" != "-c" ; then 
  1428.   echo shar: Will not clobber existing file \"'src/misc.c'\"
  1429. else
  1430.   echo shar: Extracting \"'src/misc.c'\" \(19838 characters\)
  1431.   sed "s/^X//" >'src/misc.c' <<'END_OF_FILE'
  1432. X/***************************************************************************/
  1433. X/*        PROGRAMM  ix/Mbox                           */
  1434. X/*             DATEI  misc.c                           */
  1435. X/*        FUNKTIONEN  scanner(), schreiben(), prf(), pruefe()           */
  1436. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1437. X/*  LETZTE AENDERUNG  17.02.1992                       */
  1438. X/***************************************************************************/
  1439. X
  1440. X#include <sys/types.h>
  1441. X#include <sys/stat.h>
  1442. X#include <unistd.h>
  1443. X#include <fcntl.h>
  1444. X#include <stdio.h>
  1445. X#include <utmp.h>
  1446. X#include <time.h>
  1447. X
  1448. X
  1449. X#include "mbox.h"
  1450. X
  1451. X
  1452. Xextern char headinfo[STRING];
  1453. X
  1454. X/***************************************************************************/
  1455. X/*      FUNKTION  scanner()                              */
  1456. X/*  BESCHREIBUNG  Wechselt BRETTER. Bei "B +" bzw. "B -" wird die Aktual-  */
  1457. X/*          litaet nicht beruecksichtigt. In den anderen Modi        */
  1458. X/*          werden nur aktuelle Bretter angesprungen.                */
  1459. X/*     PARAMETER  mode  =  '> 255'  =  nicht nur aktuelle Bretter       */
  1460. X/*               '+'      =  aufwaerts springen           */
  1461. X/*               '-'      =  abwaerts springen           */
  1462. X/*     RUECKGABE  keine                                                       */
  1463. X/***************************************************************************/
  1464. X
  1465. Xvoid scanner(mode)
  1466. Xint mode;
  1467. X{
  1468. X  FILE *fp;
  1469. X  char s[STRING];
  1470. X  char t[STRING];
  1471. X  char f[STRING];
  1472. X  int ok = 0, a, b;
  1473. X  int line = 0, l = 0;
  1474. X  int locmod = 0;
  1475. X  int max = 0;
  1476. X
  1477. X  if (mode >= 255) {
  1478. X    locmod = 255;
  1479. X    mode -= 255;
  1480. X  }
  1481. X  KEIN_ZUGRIFF:
  1482. X
  1483. X  if (locmod == 255) {
  1484. X    maybe_locked(NGROUPS, "r");
  1485. X    fp = fopen(NGROUPS, "r");
  1486. X    if (fp == NULL) {
  1487. X        nerror("misc.c", 26, "scanner", "Datei-Lesefehler", NGROUPS);
  1488. X    }
  1489. X }
  1490. X  else {
  1491. X    maybe_locked(UGROUPS, "r");
  1492. X    fp = fopen(UGROUPS, "r");
  1493. X    if (fp == NULL) {
  1494. X        nerror("misc.c", 34, "scanner", "Datei-Lesefehler", UGROUPS);
  1495. X    }
  1496. X  }
  1497. X
  1498. X  f[0] = '\0';
  1499. X  ok = 0;
  1500. X
  1501. X  while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &a, t) > 0)) {
  1502. X    l++;
  1503. X    if (strcomp(NG, s) == 0) {
  1504. X        ok = 1;
  1505. X    }
  1506. X    else {
  1507. X        strcpy(f, (char *) s);
  1508. X    }
  1509. X  }
  1510. X
  1511. X
  1512. X  if (mode == '+') {
  1513. X    if (fscanf(fp, "%s %d %d %s", f, &a, &a, t) < 1) {
  1514. X        if (ok == 0) {
  1515. X            rewind(fp);
  1516. X            fscanf(fp, "%s %d %d %s", f, &a, &a, t);
  1517. X        }
  1518. X          else {
  1519. X            line = -1;
  1520. X        }
  1521. X    }
  1522. X  }
  1523. X  if (mode == '-') {
  1524. X    if (f[0] == '\0') {
  1525. X        rewind(fp);
  1526. X        while (fscanf(fp, "%s %d %d %s", f, &a, &a, t) > 0);
  1527. X
  1528. X    }
  1529. X  }
  1530. X  fclose(fp);
  1531. X
  1532. X  if (max > 20) line = -1;
  1533. X
  1534. X  if (line == -1) {
  1535. X    strcpy(BRETT, (char *) "PM");
  1536. X    printf("\n");
  1537. X    sprintf(NG, "%s.PM", USER.name);
  1538. X    sprintf(INHALT, "%s/usr/%d/INDEX", HOME, USER.id);
  1539. X    return;
  1540. X  }
  1541. X  if (l == 0) {
  1542. X    ansi("md");
  1543. X    printf(" %s\n", MIS01_MSG);
  1544. X    ansi("me");
  1545. X    return;
  1546. X  }
  1547. X  if (chk_newsgrp(f) != 0) {
  1548. X    sprintf(NG, "%s", f);
  1549. X    max++;
  1550. X    goto KEIN_ZUGRIFF;
  1551. X  }
  1552. X  brett(f);
  1553. X}
  1554. X
  1555. X
  1556. X
  1557. X
  1558. X
  1559. X/***************************************************************************/
  1560. X/*      FUNKTION  schreiben()                           */
  1561. X/*  BESCHREIBUNG  Artikel fuer NEWS einlesen und verteilen. Die Distri-    */
  1562. X/*          bution ist abhaengig von der NG und vom Userlevel.       */
  1563. X/*     PARAMETER  arg = DUMMY (!)                                          */
  1564. X/*     RUECKGABE  keine                                                       */
  1565. X/***************************************************************************/
  1566. X
  1567. Xvoid schreiben(arg)
  1568. Xchar arg[];
  1569. X{
  1570. X  FILE *fp;
  1571. X  FILE *ff;
  1572. X  FILE *fl;
  1573. X  char s[STRING];
  1574. X  char t[STRING];
  1575. X  char f[STRING];
  1576. X  char g[LSTRING];
  1577. X  char ex[255];
  1578. X  char cmdl[STRING];
  1579. X  char rep[STRING];
  1580. X  char subj[STRING];
  1581. X  char keyw[STRING];
  1582. X  char summ[STRING];
  1583. X  char from[STRING];
  1584. X  char msid[STRING];
  1585. X  char refs[STRING];
  1586. X  char tmp[STRING];
  1587. X  char ng[STRING];
  1588. X  char reply[STRING];
  1589. X  char group[STRING];
  1590. X  char newsgroups[STRING];
  1591. X  char distribution[STRING];
  1592. X  char followup[STRING];
  1593. X  char expires[STRING];
  1594. X  char ctrl[STRING];
  1595. X  char sender[STRING];
  1596. X  char approved[STRING];
  1597. X  char iam[STRING];
  1598. X  char username[STRING];
  1599. X
  1600. X  int i, a, b, ok;
  1601. X  int app;
  1602. X
  1603. X  char protokoll = 0;
  1604. X  char c;
  1605. X  char lf;
  1606. X
  1607. X  int BINFILE;
  1608. X
  1609. X  struct stat fst;
  1610. X
  1611. X  char pubdir[STRING];
  1612. X  long tdummy;
  1613. X  long tn, ts;
  1614. X
  1615. X  if (strcomp(BRETT, "PM") == 0) {
  1616. X    ansi("md");
  1617. X    printf(" <- \"%s.PM\" %s\n\n", USER.name, MIS02_MSG);
  1618. X    ansi("me");
  1619. X    return;
  1620. X  }
  1621. X  BINFILE = 0;
  1622. X
  1623. X
  1624. X  i = 0;                /* Vorname.Name */
  1625. X  strcpy(ng, USER.name);
  1626. X  while (ng[i] != '\0') {
  1627. X    if (ng[i] == ' ') ng[i] = '.';
  1628. X    i++;
  1629. X  }
  1630. X  strcpy(username, ng);
  1631. X
  1632. X  strcpy(group, NG);
  1633. X
  1634. X
  1635. X  umask(0000);
  1636. X
  1637. X  if (arg[0] == '\0') {
  1638. X
  1639. X    subj[0] = '\0';
  1640. X    keyw[0] = '\0';
  1641. X    from[0] = '\0';
  1642. X    msid[0] = '\0';
  1643. X    summ[0] = '\0';
  1644. X    refs[0] = '\0';
  1645. X
  1646. X    sprintf(rep, "%s/%dRep", TMP, getpid());
  1647. X
  1648. X    fp = fopen(rep, "r");
  1649. X    if (fp != NULL) {        /* REPLY */
  1650. X        while ((fgets(s, 80, fp) != NULL) && (s[0] > 32)) {
  1651. X            if (strcomp("Subject:", s)   == 0) {
  1652. X                strcat(subj, strcopy(s, 8, 79));
  1653. X                strcpy(subj,  (char *) stripped(subj));                
  1654. X            }
  1655. X            if (strcomp("From:", s)      == 0) {
  1656. X                from[0] = '\0';
  1657. X                strcat(from, strcopy(s, 6, 79));
  1658. X                strcpy(from,  (char *) stripped(from));
  1659. X            }
  1660. X            if (strcomp("Reply-To:", s)  == 0) {
  1661. X                from[0] = '\0';
  1662. X                strcat(from, strcopy(s, 10, 79));
  1663. X                strcpy(from,  (char *) stripped(from));
  1664. X            }
  1665. X            if (strcomp("Keywords:", s)  == 0) {
  1666. X                strcat(keyw, strcopy(s, 10, 79));
  1667. X                strcpy(keyw,  (char *) stripped(keyw));
  1668. X            }
  1669. X            if (strcomp("Summary:", s)   == 0) {
  1670. X                strcat(summ, strcopy(s, 9, 79));
  1671. X                strcpy(summ,  (char *) stripped(summ));
  1672. X            }
  1673. X            if (strcomp("Message-ID:", s) == 0) {
  1674. X                strcat(msid, strcopy(s, 11, 79));
  1675. X                strcpy(msid,  (char *) stripped(msid));
  1676. X            }
  1677. X            if (strcomp("Article-I.D.:", s) == 0) {
  1678. X                strcat(msid, strcopy(s, 13, 79));
  1679. X                strcpy(msid,  (char *) stripped(msid));
  1680. X            }
  1681. X            if (strcomp("References:", s) == 0) {
  1682. X                strcat(refs, strcopy(s, 12, 79));
  1683. X                strcpy(refs,  (char *) stripped(refs));
  1684. X            } 
  1685. X            if (strcomp("Followup-To:", s) == 0) {
  1686. X                strcpy(group, strcopy(s, 13, 79));
  1687. X                strcpy(group, (char *) stripped(group));
  1688. X            }
  1689. X        }
  1690. X        
  1691. X        if(strcomp("Poster", group) == 0){
  1692. X            printf(" <- %s\n", MIS02aMSG);
  1693. X            return;
  1694. X        }
  1695. X
  1696. X
  1697. X        sprintf(t, "%s/A%d", TMP, getpid());
  1698. X        ff = fopen(t, "w");
  1699. X
  1700. X        a = 0;
  1701. X        b = 0;
  1702. X        i = 0;
  1703. X        while (from[i] != '\0') {
  1704. X            if (from[i] == '(') a = i + 1;
  1705. X            if (from[i] == ')') b = i - 1;
  1706. X            i++;
  1707. X        }
  1708. X        if (a < b) {
  1709. X            strcpy(s, (char *) strcopy(from, a, b));
  1710. X            strcpy(from, (char *) s);
  1711. X        }
  1712. X        sprintf(ex, "In article %s,\n            %s writes:\n\n", msid, from);
  1713. X        fputs(ex, ff);
  1714. X        while (fgets(s, 80, fp) != NULL) {
  1715. X            if(s[0] != '\n') fputs("> ", ff);
  1716. X            fputs(s, ff);
  1717. X        }
  1718. X        fclose(fp);
  1719. X        fclose(ff);
  1720. X
  1721. X        sprintf(cmdl, "%s %s", EDDY, t);
  1722. X        printf("\n\n");
  1723. X        system(cmdl);
  1724. X        if (strcomp("Re:", subj) != 0) {
  1725. X            sprintf(f, "Re: %s", stripped(subj));
  1726. X            strcpy(subj, (char *) f);
  1727. X        }
  1728. X        unlink(rep);
  1729. X    }
  1730. X    else {        /* Interactive MAIL */
  1731. X
  1732. X        printf("\n\n%c", CR);
  1733. X        ansi("mr");
  1734. X        printf("%s", MIS03_MSG);
  1735. X        ansi("me");
  1736. X        printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
  1737. X        ansi("mr");
  1738. X        printf("%s", MIS04_MSG);
  1739. X        ansi("me");
  1740. X        printf(" %s\n%c", NG, CR);
  1741. X        ansi("mr");
  1742. X        printf("%s", MIS05_MSG);
  1743. X        ansi("me");
  1744. X        printf(" ");
  1745. X        strcpy(subj, (char *) getline(57, 11, '.', ""));
  1746. X        printf("\n");
  1747. X        ansi("mr");
  1748. X        printf("%s", MIS06_MSG);
  1749. X        ansi("me");
  1750. X        printf(" ");
  1751. X        strcpy(keyw, (char *) getline(57, 11, '.', ""));
  1752. X        printf("\n");
  1753. X        ansi("mr");
  1754. X        printf("%s", MIS07_MSG);
  1755. X        ansi("me");
  1756. X        printf(" ");
  1757. X        strcpy(summ, (char *) getline(57, 11, '.', ""));
  1758. X
  1759. X        printf("\n\n");
  1760. X        ansi("mr");
  1761. X        printf("[%s] %s ? > ", NG, MIS08_MSG);
  1762. X        ansi("me");
  1763. X        printf("%c%c", MIS09_MSG, BS);
  1764. X
  1765. X        do {
  1766. X            c = getint();
  1767. X            if (c >= 97) c -= 32;
  1768. X            if (c == '?') {
  1769. X                clearline();
  1770. X                ansi("mr");
  1771. X                printf("%c%s > ", CR, MIS12_MSG);
  1772. X                ansi("me");
  1773. X            }
  1774. X            if (c == ENTER) c = MIS09_MSG;
  1775. X            if ((c != MIS09_MSG) && (c != MIS10_MSG) && (c != MIS11_MSG)) c = 0;
  1776. X        } while (c == 0);
  1777. X
  1778. X        printf("%c", c);
  1779. X
  1780. X        if (c == MIS11_MSG) {
  1781. X            printf("\n");
  1782. X            unlink(t);
  1783. X            return;
  1784. X        }
  1785. X        if (c == MIS10_MSG) {
  1786. X            printf("%c                                                                       ", CR);
  1787. X            ansi("mr");
  1788. X            printf("%c%s, ? > ", CR, MIS13_MSG);
  1789. X            ansi("me");
  1790. X
  1791. X            do {
  1792. X                protokoll = getint();
  1793. X                if (protokoll >= 97) protokoll -= 32;
  1794. X                if (protokoll == '?') {
  1795. X                    clearline();
  1796. X                    ansi("mr");
  1797. X                    printf("%c%s > ", CR, MIS14_MSG);
  1798. X                    ansi("me"); 
  1799. X                }
  1800. X                if ((protokoll != MIS15_MSG) && (protokoll != MIS15_MSG) &&
  1801. X                    (protokoll != MIS18_MSG) && (protokoll != MIS17_MSG ))
  1802. X                    protokoll = 0;
  1803. X            } while (protokoll == 0);
  1804. X
  1805. X            printf("%c", protokoll);
  1806. X
  1807. X        }
  1808. X        sprintf(tmp, "%s/A%d", TMP, getpid());
  1809. X        sprintf(cmdl, "%s %s", EDDY, tmp);
  1810. X        sprintf(pubdir, "%s/dir%d", TMP, getpid());
  1811. X
  1812. X        if (c == MIS09_MSG) {
  1813. X            noctrlx();
  1814. X            system(cmdl);
  1815. X            ctrlx();
  1816. X            protokoll = '*';
  1817. X        }
  1818. X        else {    /* UPLOAD */
  1819. X
  1820. X            printf("\n\n");
  1821. X            ansi("md");
  1822. X            printf("%s", MIS19_MSG);
  1823. X            ansi("me");
  1824. X
  1825. X            switch (protokoll) {
  1826. X                case MIS15_MSG:
  1827. X                    fp = fopen(tmp, "w");
  1828. X                    if (fp == NULL) {
  1829. X                        nerror("misc.c", 310, "schreiben", "DSF", tmp);
  1830. X                    }
  1831. X                    c = 0;
  1832. X                    lf = CR;
  1833. X                    fputc(LF, fp);
  1834. X
  1835. X                    while ((c != CTRL_X) && (c != CTRL_D)) {
  1836. X                        c = getint();
  1837. X                        if ((c == CR) && (lf == CR))
  1838. X                            fputc(LF, fp);
  1839. X                        if (c == CR) lf = CR;
  1840. X                        if (c == LF) lf = LF;
  1841. X                        if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
  1842. X                            fputc(c, fp);
  1843. X                        }
  1844. X                    }
  1845. X                    fclose(fp);
  1846. X                    break;
  1847. X                case MIS16_MSG:
  1848. X                    printf("\n");
  1849. X                    sprintf(s, "exec %s -bc TimeTravelAgency 2> /dev/null", RX);
  1850. X                    break;
  1851. X                case MIS17_MSG:
  1852. X                    printf("\n");
  1853. X                    sprintf(s, "exec %s -b 2> /dev/null", RB);
  1854. X                    break;
  1855. X                case MIS18_MSG:
  1856. X                    printf("\n");
  1857. X                    sprintf(s, "exec %s -b 2> /dev/null", RZ);
  1858. X                    break;
  1859. X            }
  1860. X            if (protokoll != MIS15_MSG){
  1861. X                mkdir( pubdir, 0777 );
  1862. X                chdir( pubdir );
  1863. X
  1864. X                time(&ts);
  1865. X                system( s );
  1866. X                time(&tn); tn = tn - ts;
  1867. X                tn -= 10;  /* 10 = "Toleranz" */
  1868. X    
  1869. X                chdir( HOME );
  1870. X                sprintf(s, "mv %s/* %s", pubdir, tmp);
  1871. X                system( s );
  1872. X                sprintf(s, "rm -r %s", pubdir);
  1873. X                system( s );
  1874. X            }
  1875. X            sync();
  1876. X            stat(tmp, &fst);
  1877. X            if (fst.st_size < 3L) {
  1878. X                printf("\n\n%s\n", MIS20_MSG);
  1879. X                control(MIS21_MSG, 3);
  1880. X                unlink(tmp);
  1881. X                return;
  1882. X            }
  1883. X            if (prf(tmp) == 1) {
  1884. X                if (strcomp(PDNG, NG) == 0) {
  1885. X                    USER.upratio += ((long) fst.st_size / 1024);
  1886. X                }
  1887. X                BINFILE++;
  1888. X                sprintf(s, MIS22_MSG);
  1889. X            }
  1890. X            else{
  1891. X                mkix(tmp);
  1892. X                sprintf(s, MIS23_MSG);
  1893. X            }
  1894. X            ansi( "md" );
  1895. X            printf("\n\n%ld %s %s %s.\n", fst.st_size, MIS24_MSG, s, MIS25_MSG);
  1896. X            ansi( "me" );
  1897. X            if(tn < 1) tn = 1L;
  1898. X            printf("%s %d cps (ca. %d bps).", MIS26_MSG,
  1899. X                (fst.st_size / tn), ((fst.st_size / tn) * 11));                
  1900. X        }
  1901. X    }
  1902. X
  1903. X    sprintf(iam, "%s <%s@%s>", USER.name, username, UUCPID);
  1904. X    sprintf(reply, "%s@%s (%s)", username, UUCPID, USER.name);
  1905. X    strcpy(newsgroups, group);
  1906. X    if (USER.level < WRITE_EX_LEV) {
  1907. X        strcpy(distribution, "local");
  1908. X    }
  1909. X    else {
  1910. X        /*
  1911. X        strcpy(ng, NG);
  1912. X        i = 0;
  1913. X        while ((ng[i] != '.') && (ng[i] != '\0')) i++;
  1914. X        ng[i] = '\0';
  1915. X        strcpy(distribution, ng);
  1916. X        */
  1917. X        strcpy(distribution, "world");
  1918. X    }
  1919. X    if(refs[0] != '\0') strcat(refs, " ");
  1920. X    strcat(refs, msid);    
  1921. X    followup[0] = '\0';
  1922. X    sender[0] = '\0';
  1923. X    ctrl[0] = '\0';
  1924. X    expires[0] = '\0';
  1925. X    approved[0] = '\0';
  1926. X    app = 0;
  1927. X    
  1928. X
  1929. X    ONCE_MORE:
  1930. X
  1931. X    printf("\n\n");
  1932. X    ansi("mr");
  1933. X    if(BINFILE == 0){
  1934. X        printf("[%s] %s, ? > ", NG, MIS27_MSG);
  1935. X    }
  1936. X    else{
  1937. X        printf("[%s] %s, ? > ", NG, MIS28_MSG);
  1938. X    }
  1939. X    ansi("me");
  1940. X    printf("%c%c", MIS29_MSG, BS);
  1941. X
  1942. X    do {
  1943. X        c = getint();
  1944. X        if (c >= 97) c -= 32;
  1945. X        if (c == '?') {
  1946. X            clearline();
  1947. X            ansi("mr");
  1948. X            if(BINFILE == 0){
  1949. X                printf("%c%s > ", CR, MIS32_MSG);
  1950. X            }
  1951. X            else{
  1952. X                printf("%c%s > ", CR, MIS33_MSG);
  1953. X            }
  1954. X            ansi("me");
  1955. X        }
  1956. X        if (c == ENTER) c = MIS29_MSG;
  1957. X        if ((c != MIS29_MSG) && (c != MIS30_MSG) && (c != MIS31_MSG) && (c != MIS31aMSG)) c = 0;
  1958. X    } while (c == 0);
  1959. X
  1960. X    printf("%c", c);
  1961. X    if (c == MIS30_MSG) {
  1962. X        unlink(f);
  1963. X        unlink(s);
  1964. X        unlink(t);
  1965. X        unlink(tmp); /* ??? */
  1966. X        unlink(rep);
  1967. X        printf("\n");
  1968. X        return;
  1969. X    }
  1970. X    if ((c == MIS31_MSG) && (BINFILE == 0)) {
  1971. X        noctrlx();
  1972. X        system(cmdl);
  1973. X        ctrlx();
  1974. X        goto ONCE_MORE;
  1975. X    }
  1976. X    if (c == MIS31aMSG) { /* HEADER */
  1977. X        headline( MIS38aMSG );
  1978. X        printf("\n");
  1979. X        time(&tdummy);
  1980. X
  1981. X        ansi( "md" );
  1982. X        printf("From: ");
  1983. X        ansi( "me" );
  1984. X        if(USER.level > ADMIN_LEV){
  1985. X            strcpy(s, (char *) getline(80, 1001, 32, iam));
  1986. X            if(strcomp(s, iam) != 0) app++;            
  1987. X            if(s[0] != '\0') strcpy(iam, s);
  1988. X            printf("\n");
  1989. X        }
  1990. X        else printf("%s\n", iam);
  1991. X
  1992. X        ansi( "md" );
  1993. X        printf("Reply-To: ");
  1994. X        ansi( "me" );
  1995. X        if(USER.level > GUEST_LEV){
  1996. X            strcpy(reply, (char *) getline(80, 1001, 32, reply));
  1997. X            printf("\n");
  1998. X        }
  1999. X        else printf("%s\n", reply);
  2000. X
  2001. X        ansi( "md" );
  2002. X        printf("Sender: ");
  2003. X        ansi( "me" );
  2004. X        if(USER.level >= ADMIN_LEV){
  2005. X            strcpy(sender, (char *) getline(80, 1001, 32, sender));
  2006. X            printf("\n");
  2007. X        }
  2008. X        else printf("%s\n", sender);    
  2009. X        
  2010. X        ansi( "md" );
  2011. X        printf("Control: ");
  2012. X        ansi( "me" );
  2013. X        if(USER.level >= ADMIN_LEV){
  2014. X            strcpy(ctrl, (char *) getline(80, 1001, 32, ctrl));
  2015. X            printf("\n");
  2016. X        }
  2017. X        else printf("%s\n", ctrl);    
  2018. X        
  2019. X        ansi( "md" );
  2020. X        printf("Approved: ");
  2021. X        ansi( "me" );
  2022. X        if(app != 0) sprintf(approved, "%s <%s@%s>", USER.name, username, UUCPID);
  2023. X        if(USER.level >= EXE_LEV){
  2024. X            strcpy(approved, (char *) getline(80, 1001, 32, approved));
  2025. X            printf("\n");
  2026. X        }
  2027. X        else printf("%s\n", approved);    
  2028. X    
  2029. X        ansi( "md" );
  2030. X        printf("Newsgroups: ");
  2031. X        ansi( "me" );
  2032. X        if(USER.level >= WRITE_EX_LEV){
  2033. X            strcpy(newsgroups, (char *) getline(80, 1001, 32, newsgroups));
  2034. X            printf("\n");
  2035. X        }
  2036. X        else printf("%s\n", newsgroups);    
  2037. X        
  2038. X        ansi( "md" );
  2039. X        printf("Distribution: ");
  2040. X        ansi( "me" );
  2041. X        if(USER.level >= WRITE_INTERNAT){
  2042. X            strcpy(distribution, (char *) getline(80, 1001, 32, distribution));
  2043. X            printf("\n");
  2044. X        }
  2045. X        else printf("%s\n", distribution);    
  2046. X        
  2047. X        ansi( "md" );
  2048. X        printf("Followup-To: ");
  2049. X        ansi( "me" );
  2050. X        if(USER.level >= WRITE_EX_LEV){
  2051. X            strcpy(followup, (char *) getline(80, 1001, 32, followup));
  2052. X            printf("\n");
  2053. X        }
  2054. X        else printf("%s\n", followup);    
  2055. X        
  2056. X        ansi( "md" );
  2057. X        printf("Subject: ");
  2058. X        ansi( "me" );
  2059. X        strcpy(subj, (char *) getline(80, 1001, 32, subj));
  2060. X
  2061. X        ansi( "md" );
  2062. X        printf("\nKeywords: ");
  2063. X        ansi( "me" );
  2064. X        strcpy(keyw, (char *) getline(80, 1001, 32, keyw));
  2065. X            
  2066. X        ansi( "md" );
  2067. X        printf("\nSummary: ");
  2068. X        ansi( "me" );
  2069. X        strcpy(summ, (char *) getline(80, 1001, 32, summ));
  2070. X    
  2071. X        ansi( "md" );
  2072. X        printf("\nX-News-Reader: ");
  2073. X        ansi( "me" );
  2074. X            printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  2075. X
  2076. X        ansi( "md" );
  2077. X        printf("References: ");
  2078. X        ansi( "me" );
  2079. X        printf("%s\n", refs);
  2080. X        
  2081. X        ansi( "md" );
  2082. X        printf("Message-ID: ");
  2083. X        ansi( "me" );
  2084. X        printf("<%x.%d@%s>\n", tdummy, USER.id, UUCPID);
  2085. X        
  2086. X        ansi( "md" );
  2087. X        printf("Expires: ");
  2088. X        ansi( "me" );
  2089. X        if(USER.level >= WRITE_INTERNAT){
  2090. X            strcpy(expires, (char *) getline(80, 1001, 32, expires));
  2091. X            printf("\n");
  2092. X        }
  2093. X        else printf("%s\n", expires);    
  2094. X
  2095. X        goto ONCE_MORE;        
  2096. X    }
  2097. X
  2098. X    ansi( "md" );
  2099. X    printf("\n\n%s\n", MIS34_MSG);
  2100. X    ansi( "me" );
  2101. X
  2102. X    sprintf(f, "%s/A%d", TMP, getpid());
  2103. X    sprintf(t, "%s/B%d", TMP, getpid());
  2104. X
  2105. X    fp = fopen(f, "r");
  2106. X    if (fp == NULL) {
  2107. X        printf("\n");
  2108. X        ansi("md");
  2109. X        printf("%s ...\n", MIS35_MSG);
  2110. X        ansi("me");
  2111. X        control(MIS36_MSG, 3);
  2112. X        unlink(rep);
  2113. X        return;
  2114. X    }
  2115. X
  2116. X    ff = fopen(t, "w");
  2117. X
  2118. X    time(&tdummy);
  2119. X
  2120. X    fprintf(ff, "From: %s\n", iam);
  2121. X    if(reply[0] != '\0')
  2122. X        fprintf(ff, "Reply-To: %s\n", reply);
  2123. X    if(sender[0] != '\0')
  2124. X        fprintf(ff, "Sender: %s\n", sender);
  2125. X    if(approved[0] != '\0')
  2126. X        fprintf(ff, "Approved: %s\n", approved);
  2127. X    if(newsgroups[0] != '\0')
  2128. X        fprintf(ff, "Newsgroups: %s\n", newsgroups);
  2129. X    if(distribution[0] != '\0')
  2130. X        fprintf(ff, "Distribution: %s\n", distribution);
  2131. X    if(ctrl[0] != '\0')
  2132. X        fprintf(ff, "Control: %s\n", ctrl);
  2133. X    if(followup[0] != '\0')
  2134. X        fprintf(ff, "Followup-To: %s\n", followup);
  2135. X    if(subj[0] != '\0')
  2136. X        fprintf(ff, "Subject: %s\n", subj);
  2137. X    if(keyw[0] != '\0')
  2138. X        fprintf(ff, "Keywords: %s\n", keyw);
  2139. X    if(summ[0] != '\0')
  2140. X        fprintf(ff, "Summary: %s\n", summ);
  2141. X    fprintf(ff, "X-News-Reader: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  2142. X    fprintf(ff, "Message-ID: <%x.%d@%s>\n", tdummy, USER.id, UUCPID);
  2143. X    if(expires[0] != '\0')
  2144. X        fprintf(ff, "Expires: %s\n", expires);
  2145. X    if(refs[0] != '\0')
  2146. X        fprintf(ff, "References: %s\n", refs);    
  2147. X    fputs("\n", ff);    
  2148. X    
  2149. X    if (BINFILE == 0) {
  2150. X        while (fgets(s, 80, fp) != 0) {
  2151. X            fputs(s, ff);
  2152. X        }
  2153. X    }
  2154. X    else {
  2155. X        time(&tdummy);
  2156. X        fputs("BINFILE\n", ff);
  2157. X        sprintf(s, "%s/PD.%d", BRETT, tdummy);
  2158. X        fputs(s, ff);
  2159. X        sprintf(f, "cp %s %s &", tmp, s);
  2160. X        system(f);
  2161. X        sprintf(s, "\n/public/pd/%s\n", subj);
  2162. X        fputs(s, ff);
  2163. X        fl = fopen( PDSCRIPT, "a" );
  2164. X        fprintf(fl, "mv %s/PD.%d /public/pd/%s\n", BRETT, tdummy, subj);
  2165. X        fclose(fl);
  2166. X    }
  2167. X    fclose(fp);
  2168. X    unlink(f);
  2169. X
  2170. X    unlink(rep);
  2171. X
  2172. X    if ((USER.level > WRITE_IN_LEV) && (BINFILE == 0)) {
  2173. X        sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
  2174. X        fp = fopen(s, "r");
  2175. X        if (fp != NULL) {
  2176. X            while (fgets(s, 80, fp) != 0) {
  2177. X                fputs(s, ff);
  2178. X            }
  2179. X            fclose(fp);
  2180. X        }
  2181. X    }
  2182. X    fclose(ff);
  2183. X
  2184. X    sprintf(ex, "/bin/sh ./etc/inews.sh %s %s", NG, t);
  2185. X    system(ex);
  2186. X
  2187. X    unlink(t);
  2188. X
  2189. X    sprintf(s, "%s \"%s\" %s", MIS37_MSG, NG, MIS38_MSG);
  2190. X    control(s, 3);
  2191. X
  2192. X    
  2193. X    if(BINFILE != 0){
  2194. X        maybe_locked(NGROUPS, "r");
  2195. X        fp = fopen(NGROUPS, "r");
  2196. X        if (fp == NULL) {
  2197. X            nerror("misc.c", 895, "schreiben", "Datei-Lesefehler", NGROUPS);
  2198. X        }
  2199. X
  2200. X        ok = 0;
  2201. X
  2202. X            while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &b, f) > 0)) {
  2203. X            if(strcomp(NG, s) == 0){
  2204. X                i = a;
  2205. X                ok = 1;
  2206. X            }
  2207. X         }
  2208. X        fclose(fp);
  2209. X
  2210. X        fl = fopen( PDSCRIPT, "a" );
  2211. X        fprintf(fl, "mined %s/%d\n", BRETT, i); 
  2212. X        fprintf(fl, "#%s   %s\n\n", NG, USER.name);
  2213. X        fclose(fl);
  2214. X    }
  2215. X
  2216. X    printf("%s", MIS39_MSG);
  2217. X
  2218. X#ifndef _SYS7
  2219. X    sleep(30);    /* Scheinbar laeuft INEWS bei SYSV im Hintergrund */
  2220. X#endif
  2221. X
  2222. X    sprintf(s, "%s %s", MB_DAEMON, group);
  2223. X    system(s);
  2224. X    unlink(tmp);
  2225. X    printf("\n");
  2226. X  }
  2227. X  else {
  2228. X    ansi("md");
  2229. X    printf(" %s\n\n", MIS40_MSG);
  2230. X    ansi("me");
  2231. X  }
  2232. X  umask(0007);
  2233. X}
  2234. X
  2235. X
  2236. X
  2237. X
  2238. X
  2239. X/***************************************************************************/
  2240. X/*      FUNKTION  prf()                               */
  2241. X/*  BESCHREIBUNG  Stellt fest, ob eine Datei (die per UPLOAD empfangen     */
  2242. X/*          wurde) einen Text oder ein ausfuehrbares Programm ent-   */
  2243. X/*          haelt.                                                   */
  2244. X/*     PARAMETER  arg  =  Dateiname                                        */
  2245. X/*     RUECKGABE  0    =  Text-Datei                                       */
  2246. X/*          1    =  Ausfuehrbares Programm               */
  2247. X/***************************************************************************/
  2248. X
  2249. Xint prf(arg)
  2250. Xchar arg[];
  2251. X{
  2252. X  FILE *fp;
  2253. X  char ex[255];
  2254. X  int i, a;
  2255. X
  2256. X  fp = fopen(arg, "r");
  2257. X  if (fp == NULL) return -1;
  2258. X  while ((fgets(ex, 250, fp) != NULL) && (strlen(ex) < 30));
  2259. X  fclose(fp);
  2260. X
  2261. X  i = 0;
  2262. X  a = 0;
  2263. X  while (ex[i] != '\0') {
  2264. X    if ((ex[i] < 32) || (ex[i] > 127)) a++;
  2265. X    i++;
  2266. X  }
  2267. X  if (a > 3) return 1;        /* BINFILE */
  2268. X
  2269. X  return 0;            /* TEXTFILE */
  2270. X}
  2271. X
  2272. X
  2273. X
  2274. X
  2275. X/***************************************************************************/
  2276. X/*      FUNKTION  pruefe()                            */
  2277. X/*  BESCHREIBUNG  Stellt fest, ob eine Datei aus den News-Artikeln die     */
  2278. X/*          Kennung "BINFILE" enthaelt. Faellt die Antwort positiv   */
  2279. X/*          aus, wird die Routine "pd()" aufgerufen.           */
  2280. X/*     PARAMETER  arg  =  Nummer des Artikels                              */
  2281. X/*     RUECKGABE  0    =  Text-Datei                                       */
  2282. X/*                1    =  BINFILE                       */
  2283. X/***************************************************************************/
  2284. X
  2285. Xint pruefe(arg)
  2286. Xchar arg[];
  2287. X{
  2288. X  FILE *fp;
  2289. X  char ex[255];
  2290. X  char s[STRING];
  2291. X  char entry[STRING];
  2292. X  char keywds[STRING];
  2293. X
  2294. X  if ((arg[0] == '\0') || (arg[0] == '*')) return -1;
  2295. X
  2296. X  if (strcomp(BRETT, "PM") != 0) {
  2297. X    sprintf(entry, "%s/%s", BRETT, arg);
  2298. X  }
  2299. X  else {
  2300. X    sprintf(entry, "%s/usr/%d/%s", HOME, USER.id, arg);
  2301. X  }
  2302. X
  2303. X  keywds[0] = '\0';
  2304. X
  2305. X  fp = fopen(entry, "r");
  2306. X  if (fp == NULL) return -1;
  2307. X
  2308. X  while ((fgets(ex, 250, fp) != NULL) && (ex[0] > 32)){
  2309. X    if(strcomp("Keywords: ", ex) == 0){
  2310. X        ex[80] = '\0';
  2311. X        strcpy(keywds, strcopy(ex, 10, 80));
  2312. X    }
  2313. X  }
  2314. X
  2315. X  while ((fgets(ex, 250, fp) != NULL) && (ex[0] < 32));
  2316. X
  2317. X  if (strcomp("BINFILE", ex) == 0) {
  2318. X    fgets(s, 80, fp);
  2319. X    fclose(fp);
  2320. X    pd(s, keywds);
  2321. X    return 1;
  2322. X  }
  2323. X  fclose(fp);
  2324. X
  2325. X  return 0;
  2326. X}
  2327. X
  2328. X
  2329. X
  2330. X
  2331. X
  2332. X
  2333. END_OF_FILE
  2334.   if test 19838 -ne `wc -c <'src/misc.c'`; then
  2335.     echo shar: \"'src/misc.c'\" unpacked with wrong size!
  2336.   fi
  2337.   # end of 'src/misc.c'
  2338. fi
  2339. echo shar: End of archive 4 \(of 10\).
  2340. cp /dev/null ark4isdone
  2341. MISSING=""
  2342. for I in 1 2 3 4 5 6 7 8 9 10 ; do
  2343.     if test ! -f ark${I}isdone ; then
  2344.     MISSING="${MISSING} ${I}"
  2345.     fi
  2346. done
  2347. if test "${MISSING}" = "" ; then
  2348.     echo You have unpacked all 10 archives.
  2349.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2350. else
  2351.     echo You still must unpack the following archives:
  2352.     echo "        " ${MISSING}
  2353. fi
  2354. exit 0
  2355. exit 0 # Just in case...
  2356.