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

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  3. Subject:  v29i070:  mbox - A Bulletin Board System for UNIX and MINIX, Part08/10
  4. Message-ID: <1992Apr5.183649.29961@sparky.imd.sterling.com>
  5. X-Md4-Signature: 83210b20f62e245384f604f2c277beee
  6. Date: Sun, 5 Apr 1992 18:36:49 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 70
  11. Archive-name: mbox/part08
  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/getline.c src/lesen.c src/main.c src/postfach.c
  21. #   src/show.c src/weiterl.c src/xmd.c
  22. # Wrapped by kent@sparky on Sun Apr  5 11:57:46 1992
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 8 (of 10)."'
  26. if test -f 'src/getline.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'src/getline.c'\"
  28. else
  29.   echo shar: Extracting \"'src/getline.c'\" \(6790 characters\)
  30.   sed "s/^X//" >'src/getline.c' <<'END_OF_FILE'
  31. X/***************************************************************************/
  32. X/*        PROGRAMM  ix/Mbox                           */
  33. X/*             DATEI  getline.c                           */
  34. X/*        FUNKTIONEN  getline(), getint(), yesno()               */
  35. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  36. X/*  LETZTE AENDERUNG   09.02.1992                       */
  37. X/***************************************************************************/
  38. X
  39. X#include <stdio.h>
  40. X
  41. X#ifdef _MBOX
  42. X#include "mbox.h"
  43. X#else
  44. X#define BS        8
  45. X#define CR        13
  46. X#define LF        10
  47. X#define CTRL_X        24
  48. X#define CTRL_D        4
  49. X#define BELL        7
  50. X#define ESC        27
  51. X#define DEL        127
  52. X#define GBL06_MSG    'J'     
  53. X#define GBL07_MSG    'N'    
  54. X#ifdef _SYS7
  55. X#define ENTER        13
  56. X#else
  57. X#define ENTER         10
  58. X#endif
  59. X#endif
  60. X
  61. X#ifndef STRING
  62. X#define STRING 85
  63. X#endif
  64. X
  65. X/***************************************************************************/
  66. X/*      FUNKTION  getline()                           */
  67. X/*  BESCHREIBUNG  Eine Zeile (STRING) einlesen. Beendet wird mit ENTER,       */
  68. X/*          oder wenn die max. zulaessige Anzahl von Zeichen er-     */
  69. X/*          reicht ist.                                               */
  70. X/*     PARAMETER  siehe unten                                              */
  71. X/*     RUECKGABE  Eingelesene Zeile (STRING)                   */
  72. X/*  ---------------------------------------------------------------------  */
  73. X/*  len     -> Anzahl der max. einzulesenden Zeichen                */
  74. X/*                                       */
  75. X/*  mode    ->       0 = Kein Echo                       */
  76. X/*                1 = Mit Echo                           */
  77. X/*                2 = '*' als Echo                           */
  78. X/*             3 = ':' als drittes & sechstes Zeichen (Uhrzeit)      */
  79. X/*                 4 = '.' als drittes & sechstes Zeichen (Datum)        */
  80. X/*              5 = Ausschliesslich BUCHSTABEN               */
  81. X/*            10 = "bsc" vor der Eingabe "len"-mal ausgeben          */
  82. X/*           100 = nur Zahlen (und '.', ':')                         */
  83. X/*           1000 = String "deftext" + "bsc" ausgeben                 */
  84. X/*         10000 = bei "0-9" als erstes Zeichen -> sofort zurueck    */
  85. X/*                                           */
  86. X/*  bsc     -> Mit diesem Zeichen wird geloescht               */
  87. X/*                                           */
  88. X/*  deftext -> Text-Vorgabe                                                */
  89. X/*                                                               */
  90. X/***************************************************************************/
  91. X
  92. Xstatic int endless;
  93. X
  94. Xchar *getline(len, mode, bsc, deftext)
  95. Xint len, mode;
  96. Xchar bsc;
  97. Xchar deftext[];
  98. X{
  99. X  static char gls[STRING];
  100. X  char c;
  101. X  int gli, gll;
  102. X  char delim = '\0';
  103. X  int matrix = 0;
  104. X  int echo = 1, numerics = 0, defmode = 0, letters = 0;
  105. X  int escape = 0;
  106. X  int lenmem = len;
  107. X  int lastwasblank = 0;
  108. X
  109. X
  110. X  if (mode > 10000) {
  111. X    escape++;
  112. X    mode -= 10000;
  113. X  }
  114. X  if (mode > 1000) {
  115. X    mode -= 1000;
  116. X    defmode++;
  117. X  }
  118. X  if (mode > 100) {
  119. X    mode -= 100;
  120. X    numerics++;
  121. X  }
  122. X  if (mode > 10) {
  123. X    mode -= 10;
  124. X    matrix++;
  125. X  }
  126. X  if (mode > 2) {
  127. X    switch(mode){
  128. X        case 3    : delim = ':';
  129. X              break;
  130. X        case 4  : delim = '.';        
  131. X              break;
  132. X         case 5  : letters++;
  133. X              break;
  134. X    }
  135. X    mode = 1;
  136. X  }
  137. X  echo = mode;
  138. X
  139. X  if (defmode != 0) {
  140. X    if((deftext[0] < 32) || (deftext[0] > 126)) deftext[0] = '\0';
  141. X    gll = length(deftext);
  142. X    lenmem = len - gll;
  143. X    if(deftext[0] != '\0'){
  144. X        sprintf(gls, "%s", deftext);
  145. X        printf("%s", deftext);
  146. X    }
  147. X    else gls[0] = '\0';
  148. X  }
  149. X  else {
  150. X    gll = 0;
  151. X    gls[gll] = '\0';
  152. X    strcat(gls, "OOPS");
  153. X  }
  154. X
  155. X  if (matrix != 0) {
  156. X    for (gli = 0; gli < lenmem; gli++) {
  157. X        if (((gli == 2) || (gli == 5)) && (delim != '\0') && (gli != len)) {
  158. X            printf("%c", delim);
  159. X        }
  160. X        else {
  161. X            printf("%c", bsc);
  162. X        }
  163. X    }
  164. X    for (gli = 0; gli < lenmem; gli++) printf("%c", BS);
  165. X  }
  166. X
  167. X  do {
  168. X
  169. X    if (delim != '\0') {
  170. X        if (((gll == 2) || (gll == 5)) && (gll < len)){
  171. X            c = delim;
  172. X        }
  173. X        else {
  174. X            c = getint();  
  175. X        }
  176. X    }
  177. X    else {
  178. X        c = getint();  
  179. X    }        
  180. X    if (c > 127) c -= 128;    /* 7 BIT !! */
  181. X
  182. X    if (c == ESC) {
  183. X        c = getint();  
  184. X        c = getint();  
  185. X        if ((c == 'A') || (c == 'B')) {
  186. X            if (c == 'A') endless++;
  187. X            if (c == 'B') endless--;
  188. X            if (endless < 1) endless = 9;
  189. X            if (endless > 9) endless = 1;
  190. X            sprintf(gls, "%d", endless);
  191. X            return (char *) gls;
  192. X        }
  193. X        if (c == 'D') c = BS;
  194. X        if (c == 'C') c = ENTER;
  195. X    }
  196. X    if ((c == CTRL_X) || (c == CTRL_D) || (c == DEL)) {
  197. X        return("<BREAK>");
  198. X    }
  199. X    if (c != ENTER) {
  200. X        if ((c == BS) && (gll > 0)) {
  201. X            if (((gll == 3) || (gll == 6)) && (delim != '\0')) {
  202. X                gll -= 2;
  203. X                printf("%c%c%c%c", BS, BS, bsc, BS);
  204. X            } else {
  205. X                gll--;
  206. X                printf("%c%c%c", BS, bsc, BS);
  207. X            }
  208. X        }
  209. X        if (numerics == 0) {
  210. X            if (c >= 32) {
  211. X                if(letters != 0){
  212. X                    if((c < 'A') && (c != ' ')) c = 0;
  213. X                    if(c > 'z') c = 0;
  214. X                    if((c > 'Z') && (c < 'a')) c = 0;
  215. X
  216. X                    if(c == ' '){
  217. X                        if(lastwasblank != 0) c = 0;
  218. X                        lastwasblank++;
  219. X                    }
  220. X                    else{
  221. X                        if(c != 0) lastwasblank = 0;
  222. X                    }                
  223. X
  224. X                    /*
  225. X                    if((c == 0) && (USER.bell == 1))
  226. X                        printf("%c", BELL);
  227. X                    */
  228. X                    if(c == 0)
  229. X                        printf("%c", BELL);
  230. X                }
  231. X                if(c != 0){
  232. X                    gls[gll] = c;
  233. X                    gll++;
  234. X                }
  235. X            }
  236. X            else {
  237. X                c = 0;
  238. X            }
  239. X        }
  240. X        else {
  241. X            if ((c == '.') || (c == ':') || ((c >= '0') && (c <= '9'))) {
  242. X                if (((delim != '\0') && ((c == '.') || (c == ':'))) &&
  243. X                    ((gll != 2) && (gll != 5))) {
  244. X                    printf("%c", BELL);
  245. X                    c = 0;
  246. X                }
  247. X                else {
  248. X                    gls[gll] = c;
  249. X                    gll++;
  250. X                    gls[gll] = '\0';
  251. X                }
  252. X            }
  253. X            else {
  254. X                if (c != BS) printf("%c", BELL);
  255. X                c = 0;
  256. X            }
  257. X        }
  258. X        if (c != 0) {
  259. X            if (echo == 1) printf("%c", c);
  260. X            if (echo == 2) printf("*");
  261. X        }
  262. X    }
  263. X    if (gll == 1) {
  264. X        if ((escape != 0) && ((c > 47) && (c < 58))) {
  265. X            gls[gll] = '\0';
  266. X            return (char *) gls;
  267. X        }
  268. X    }
  269. X
  270. X  } while ((c != ENTER) && (gll < len));
  271. X
  272. X  gls[gll] = '\0';
  273. X
  274. X  return (char *) gls;
  275. X}
  276. X
  277. X
  278. X
  279. X
  280. X
  281. X/***************************************************************************/
  282. X/*      FUNKTION  getint()                            */
  283. X/*  BESCHREIBUNG  Ein Zeichen wird mit Hilfe der "getch"-Funktion einge-   */
  284. X/*          lesen. Es wird gewartet bis ein Zeichen erfasst ist.     */
  285. X/*     PARAMETER  keine                                                    */
  286. X/*     RUECKGABE  Eingelesenes Zeichen (INT)                   */
  287. X/***************************************************************************/
  288. X
  289. Xint getint()
  290. X{
  291. X  int c;
  292. X
  293. X  do{
  294. X    c = (int)getch();
  295. X  }while((c == 0) || (c > 127));
  296. X
  297. X  return (int) c;
  298. X}
  299. X
  300. X
  301. X
  302. X
  303. X/***************************************************************************/
  304. X/*      FUNKTION  yesno()                           */
  305. X/*  BESCHREIBUNG  Die Zeichen "j", "J", "n" oder "N" werden ausschliess-   */
  306. X/*          lich eingelesen und zurueckgegeben.                       */
  307. X/*     PARAMETER  keine                                                       */
  308. X/*     RUECKGABE  Eines der Zeichen (siehe oben) (INT)               */
  309. X/***************************************************************************/
  310. X
  311. Xint yesno()
  312. X{
  313. X  int c;
  314. X
  315. X  do {
  316. X    c = getint();
  317. X    if (c >= 97) c -= 32;
  318. X    if ((c != GBL06_MSG) && (c != GBL07_MSG)) c = 0;
  319. X  } while (c == 0);
  320. X
  321. X  printf("%c", c);
  322. X
  323. X  return (int) c;
  324. X}
  325. X
  326. X
  327. END_OF_FILE
  328.   if test 6790 -ne `wc -c <'src/getline.c'`; then
  329.     echo shar: \"'src/getline.c'\" unpacked with wrong size!
  330.   fi
  331.   # end of 'src/getline.c'
  332. fi
  333. if test -f 'src/lesen.c' -a "${1}" != "-c" ; then 
  334.   echo shar: Will not clobber existing file \"'src/lesen.c'\"
  335. else
  336.   echo shar: Extracting \"'src/lesen.c'\" \(9399 characters\)
  337.   sed "s/^X//" >'src/lesen.c' <<'END_OF_FILE'
  338. X/***************************************************************************/
  339. X/*        PROGRAMM  ix/Mbox                           */
  340. X/*             DATEI  lesen.c                           */
  341. X/*        FUNKTIONEN  lesen(), ansage(), unterschrift()               */
  342. X/*              getsite(), checkdomaintype()               */
  343. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  344. X/*  LETZTE AENDERUNG  04.01.1992                       */
  345. X/***************************************************************************/
  346. X
  347. X#include <sys/types.h>
  348. X#include <sys/stat.h>
  349. X#include <unistd.h>
  350. X#include <fcntl.h>
  351. X#include <stdio.h>
  352. X#include <utmp.h>
  353. X#include <time.h>
  354. X
  355. X
  356. X#include "mbox.h"
  357. X
  358. X
  359. Xextern char headinfo[STRING];
  360. X
  361. X
  362. X/***************************************************************************/
  363. X/*      FUNKTION  lesen()                           */
  364. X/*  BESCHREIBUNG  Zeigt einen Artikel o. eine persoenliche Mail an. Bietet */
  365. X/*          dann versch. Optionen zum Weiterlesen o. Beantworten an. */
  366. X/*     PARAMETER  arg  =  Nummer des Artikels/der Mail                     */
  367. X/*     RUECKGABE  keine                                                       */
  368. X/***************************************************************************/
  369. X
  370. Xvoid lesen(arg)
  371. Xchar arg[];
  372. X{
  373. X  FILE *fp;
  374. X  char s[LSTRING];
  375. X  char entry[STRING];
  376. X  char no[10];
  377. X  char c;
  378. X  int i;
  379. X  int ok;
  380. X  int MIN, MAX;
  381. X  int pr;
  382. X
  383. X  struct stat fst;
  384. X
  385. X  sprintf(no, "%s", arg);
  386. X
  387. X  maybe_locked(INHALT, "r");
  388. X  fp = fopen(INHALT, "r");
  389. X  if (fp == NULL) {
  390. X    nerror("misc.c", 558, "lesen", "Datei-Lesefehler", INHALT);
  391. X  }
  392. X  while ((fgets(s, LSTRING, fp) != NULL) && (s[2] != '='));
  393. X  fgets(s, LSTRING, fp);
  394. X  MIN = atoi(s);
  395. X  while (fgets(s, LSTRING, fp) != NULL) {
  396. X    MAX = atoi(s);
  397. X  }
  398. X  fclose(fp);
  399. X
  400. X  if (MAX < MIN) {
  401. X    i = MIN;
  402. X    MIN = MAX;
  403. X    MAX = i;
  404. X  }
  405. X  NEXT_MSG:
  406. X
  407. X  if ((no[0] < '1') || (no[0] > '9')) {
  408. X    ansi("md");
  409. X    printf(" %s\n", MIS41_MSG);
  410. X    ansi("me");
  411. X    return;
  412. X  }
  413. X  if (pruefe(no) != 0) goto NEXT_NEXT;
  414. X
  415. X  printf("\n\n");
  416. X  ansi("cl");
  417. X
  418. X  if (strcomp(BRETT, "PM") != 0) {
  419. X        sprintf(entry, "%s/%s", BRETT, no); 
  420. X    if(USER.terminal == 4){
  421. X        ansi("md");
  422. X        printf("%s %s\n", MIS42_MSG, no);
  423. X        ansi("me");
  424. X    }
  425. X    else{
  426. X        sprintf(headinfo, " %s %s (%s) ", MIS43_MSG, no, NG);
  427. X        headline( headinfo );
  428. X    }
  429. X    ok = show(entry, 9999, USER.more);
  430. X  }
  431. X  else {
  432. X    sprintf(entry, "%s/usr/%d/%s", HOME, USER.id, no);
  433. X    if(USER.terminal == 4){
  434. X        ansi("md");
  435. X        printf("%s %s\n", MIS44_MSG, no);
  436. X        ansi("me");
  437. X    }
  438. X    else{
  439. X        sprintf(headinfo, " %s (%s) ", MIS45_MSG, no);
  440. X        headline( headinfo );
  441. X    }
  442. X    ok = show(entry, 9999, USER.more);
  443. X  }
  444. X
  445. X  if(ok == -1) return;
  446. X
  447. X  c = LF;
  448. X
  449. X  NEXT_NEXT:
  450. X
  451. X  printf("\n");
  452. X  ansi("mr");
  453. X  printf("[Mesg. %s] %s, ? > ", no, MIS46_MSG);
  454. X  ansi("me");
  455. X  printf("%c%c", MIS51_MSG, BS);
  456. X
  457. X  do {
  458. X    c = getint();
  459. X    if (c == MIS50_MSG) c = '*';
  460. X    if (c >= 97) c -= 32;
  461. X    if (c == ENTER) c = MIS51_MSG;
  462. X    if (c == '?') {
  463. X        clearline();
  464. X        ansi("mr");
  465. X        printf("%c%s > ", CR, MIS53_MSG);
  466. X        ansi("me");
  467. X    }
  468. X    if ((c != MIS47_MSG) && (c != MIS48_MSG) && (c != MIS49_MSG) && (c != MIS50_MSG) && (c != MIS51_MSG) && (c != MIS52_MSG) && (c != '*'))
  469. X        c = 0;
  470. X  } while (c == 0);
  471. X
  472. X  printf("%c", c);
  473. X
  474. X  if (c == MIS50_MSG) {        /* LOESCHEN */
  475. X    clearline();
  476. X    ansi("mr");
  477. X    printf("%s [%c, %c] > ", MIS54_MSG, GBL06_MSG, GBL07_MSG);
  478. X    ansi("me");
  479. X    if (yesno() == GBL06_MSG) {
  480. X        loeschen(no);
  481. X    }
  482. X    printf("\n");
  483. X    c = MIS51_MSG;
  484. X  }
  485. X  if (c == '*') {        /* LOESCHEN (sofort) */
  486. X    loeschen(no);
  487. X    printf("\n");
  488. X    c = MIS51_MSG;
  489. X  }
  490. X  if (c == MIS51_MSG) {        /* NAECHSTE */
  491. X    ok = 0;
  492. X    do {
  493. X        i = atoi(no);
  494. X        i++;
  495. X        sprintf(no, "%d", i);
  496. X        pr = pruefe(no);
  497. X        if (pr == 0) ok = 1;
  498. X        if (pr == 1) goto NEXT_NEXT;
  499. X        if (i > MAX) {
  500. X            printf("\n\n%s\n", MIS55_MSG);
  501. X            return;
  502. X        }
  503. X    } while (ok == 0);
  504. X    if (ok == 1) goto NEXT_MSG;
  505. X    goto NEXT_NEXT;
  506. X  }
  507. X  if (c == MIS52_MSG) {        /* VORHERIGE */
  508. X    ok = 0;
  509. X    do {
  510. X        i = atoi(no);
  511. X        i--;
  512. X        sprintf(no, "%d", i);
  513. X        pr = pruefe(no);
  514. X        if (pr == 0) ok = 1;
  515. X        if (pr == 1) goto NEXT_NEXT;
  516. X        if (i < MIN) {
  517. X            printf("\n\n%s\n", MIS56_MSG);
  518. X            return;
  519. X        }
  520. X    } while (ok == 0);
  521. X    if (ok == 1) goto NEXT_MSG;
  522. X    goto NEXT_NEXT;
  523. X  }
  524. X  if (c == MIS49_MSG) goto NEXT_MSG;    /* WIEDERHOLEN */
  525. X
  526. X
  527. X  if (c == MIS48_MSG) {            /* BEANTWORTEN */
  528. X    headline( MIS57_MSG );
  529. X    printf("\n%s", MIS58_MSG);
  530. X    sprintf(s, "cp %s %s/%dRep > /dev/null", entry, TMP, getpid());
  531. X    system(s);
  532. X
  533. X    if (strcomp(BRETT, "PM") == 0) {
  534. X        brief("~REPLY~");
  535. X        sprintf(s, "%s?", USER.name);
  536. X        brief(s);
  537. X        sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  538. X        stat(s, &fst);
  539. X        IDX_SIZE = (int) fst.st_size;
  540. X    }
  541. X    else {
  542. X        printf("\n\n");
  543. X        ansi("mr");
  544. X        printf("%s, ? > ", MIS59_MSG);
  545. X        ansi("me");
  546. X
  547. X        do {
  548. X            c = getint();
  549. X            if (c >= 97) c -= 32;
  550. X            if (c == '?') {
  551. X                clearline();
  552. X                ansi("mr");
  553. X                printf("%c%s > ", CR, MIS60_MSG);
  554. X                ansi("me");
  555. X            }
  556. X            if ((c != MIS61_MSG) && (c != MIS62_MSG)) c = 0;
  557. X        } while (c == 0);
  558. X
  559. X        printf("%c", c);
  560. X
  561. X        if (c == MIS62_MSG) {
  562. X            schreiben("");
  563. X        }
  564. X        if (c == MIS61_MSG) {
  565. X            brief("~REPLY~");
  566. X            if(strcomp(GUEST, USER.name) != 0){
  567. X                sprintf(s, "%s?", USER.name);
  568. X                brief(s);
  569. X                sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  570. X                stat(s, &fst);
  571. X                    IDX_SIZE = (long) fst.st_size;
  572. X            }
  573. X        }
  574. X    }
  575. X    goto NEXT_NEXT;
  576. X  }
  577. X  printf("\n");
  578. X  return;
  579. X}
  580. X
  581. X
  582. X
  583. X/***************************************************************************/
  584. X/*      FUNKTION  ansage()                           */
  585. X/*  BESCHREIBUNG  Der Ansage-Text wird angezeigt und kann geandert werden. */
  586. X/*     PARAMETER  keine                                                       */
  587. X/*     RUECKGABE  keine                                                       */
  588. X/***************************************************************************/
  589. X
  590. Xvoid ansage()
  591. X{
  592. X  FILE *ff;
  593. X  char s[STRING];
  594. X  char t[STRING];
  595. X  char TEP[STRING];
  596. X  char c;
  597. X
  598. X
  599. X  printf("\n\n%s\n\n", MAL38_MSG);
  600. X
  601. X  sprintf(TEP, "%s/usr/%d/.hello", HOME, USER.id);
  602. X  ff = fopen(TEP, "r");
  603. X  if (ff != NULL) {
  604. X    ansi("md");
  605. X    while (fgets(s, 80, ff) != NULL) {
  606. X        printf("%s", s);
  607. X    }
  608. X    fclose(ff);
  609. X    ansi("me");
  610. X    printf("\n\n");
  611. X  }
  612. X  ansi("mr");
  613. X  printf("%c%s [%c, %c] > ", CR, MAL39_MSG, GBL06_MSG, GBL07_MSG);
  614. X  ansi("me");
  615. X
  616. X  c = yesno();
  617. X
  618. X  if (c == GBL06_MSG) {
  619. X    sprintf(t, "%s %s", EDDY, TEP);
  620. X    system(t);
  621. X  }
  622. X  printf("\n");
  623. X}
  624. X
  625. X
  626. X
  627. X
  628. X/***************************************************************************/
  629. X/*      FUNKTION  unterschrift                           */
  630. X/*  BESCHREIBUNG  Die Unterschrift (.signature) wird angezeigt und kann    */
  631. X/*          geandert werden.                                         */
  632. X/*     PARAMETER  keine                                                       */
  633. X/*     RUECKGABE  keine                                                       */
  634. X/***************************************************************************/
  635. X
  636. Xvoid unterschrift()
  637. X{
  638. X  FILE *ff;
  639. X  char s[STRING];
  640. X  char t[STRING];
  641. X  char TEP[STRING];
  642. X  char c;
  643. X
  644. X
  645. X  printf("\n\n%s\n\n", MAL40_MSG);
  646. X
  647. X  sprintf(TEP, "%s/usr/%d/.signature", HOME, USER.id);
  648. X  ff = fopen(TEP, "r");
  649. X  if (ff != NULL) {
  650. X    ansi("md");
  651. X    while (fgets(s, 80, ff) != NULL) {
  652. X        printf("%s", s);
  653. X    }
  654. X    fclose(ff);
  655. X    ansi("me");
  656. X    printf("\n\n");
  657. X  }
  658. X  ansi("mr");
  659. X  printf("%c%s [%c, %c] > ", CR, MAL41_MSG, GBL06_MSG, GBL07_MSG);
  660. X  ansi("me");
  661. X
  662. X  c = yesno();
  663. X
  664. X  if (c == GBL06_MSG) {
  665. X    sprintf(t, "%s %s", EDDY, TEP);
  666. X    system(t);
  667. X  }
  668. X  printf("\n");
  669. X}
  670. X
  671. X
  672. X
  673. X
  674. X/***************************************************************************/
  675. X/*      FUNKTION  getsite()                           */
  676. X/*  BESCHREIBUNG  Findet den Empfaenger SITE in der Adresse           */
  677. X/*     PARAMETER  Adresse                                                  */
  678. X/*     RUECKGABE  Empfaenger SITE                                          */
  679. X/***************************************************************************/
  680. X
  681. Xchar *getsite(arg)
  682. Xchar arg[];
  683. X{
  684. X  int i = 0, a = 0, b = 0, c = 0;
  685. X  char s[STRING];
  686. X
  687. X  while(arg[i] != '\0'){
  688. X    if(arg[i] == '!') a = i - 1;
  689. X    if(arg[i] == '@') b = i + 1;
  690. X    if(arg[i] == '.'){
  691. X        if((b != 0) && (c == 0)) c = i -1;
  692. X    }
  693. X    i++;
  694. X  }
  695. X
  696. X  if((a == 0) && (b == 0)) strcat(s, UUCPSITE);
  697. X  if(a != 0) strcpy(s, (char *) strcopy(arg, 0, a));
  698. X  if(b != 0) strcpy(s, (char *) strcopy(arg, b, c));
  699. X
  700. X  return (char *) s;
  701. X}
  702. X
  703. X
  704. X
  705. X
  706. X/***************************************************************************/
  707. X/*      FUNKTION  checkdomaintype()                       */
  708. X/*  BESCHREIBUNG  Internationale MAIL ???                    */
  709. X/*     PARAMETER  Adresse                                                  */
  710. X/*     RUECKGABE   0 = ok                                                  */
  711. X/*                -1 = Level zu gering                       */
  712. X/***************************************************************************/
  713. X
  714. Xint checkdomaintype(arg)
  715. Xchar arg[];
  716. X{
  717. X  int i = 0, l, a, e = 0, f = 0, g = 0, international = 0;
  718. X  char s[STRING];
  719. X
  720. X  if(USER.level >= WRITE_INTERNAT) return 0;
  721. X
  722. X  while(arg[i] != '\0'){
  723. X    if(arg[i] == '!') e++;
  724. X    if(arg[i] == '@') g++;
  725. X    i++;
  726. X  }
  727. X  s[0] = '\0';
  728. X
  729. X  if((e == 0) && (g == 0)) return 0;
  730. X
  731. X  if(e > 1) international++;
  732. X
  733. X  if(e == 0){
  734. X
  735. X    l = strlen( (char *) arg);
  736. X
  737. X    a = strlen( (char *) NAT_DOMAIN1 );
  738. X    strcpy(s, (char *) strcopy(arg, (l-a), l));
  739. X    if(strcomp(s, NAT_DOMAIN1) == 0) f++;
  740. X
  741. X    a = strlen( (char *) NAT_DOMAIN2 );
  742. X    strcpy(s, (char *) strcopy(arg, (l-a), l));
  743. X    if(strcomp(s, NAT_DOMAIN2) == 0) f++;
  744. X
  745. X    a = strlen( (char *) NAT_DOMAIN3 );
  746. X    strcpy(s, (char *) strcopy(arg, (l-a), l));
  747. X    if(strcomp(s, NAT_DOMAIN3) == 0) f++;      
  748. X
  749. X    if(f == 0) international++;
  750. X  }  
  751. X
  752. X  if(international != 0){
  753. X    ansi("md");
  754. X    printf("\n\n%s (%d) %s\n", MAL01_MSG, WRITE_INTERNAT, MAL02_MSG);
  755. X    ansi("me");
  756. X    return -1;    
  757. X  }
  758. X
  759. X  return 0;
  760. X}
  761. X
  762. X
  763. X
  764. X
  765. END_OF_FILE
  766.   if test 9399 -ne `wc -c <'src/lesen.c'`; then
  767.     echo shar: \"'src/lesen.c'\" unpacked with wrong size!
  768.   fi
  769.   # end of 'src/lesen.c'
  770. fi
  771. if test -f 'src/main.c' -a "${1}" != "-c" ; then 
  772.   echo shar: Will not clobber existing file \"'src/main.c'\"
  773. else
  774.   echo shar: Extracting \"'src/main.c'\" \(6010 characters\)
  775.   sed "s/^X//" >'src/main.c' <<'END_OF_FILE'
  776. X/***************************************************************************/
  777. X/*        PROGRAMM  ix/Mbox                           */
  778. X/*             DATEI  main.c                           */
  779. X/*        FUNKTIONEN  logout(), init(), fixoutput(), main()           */
  780. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  781. X/*  LETZTE AENDERUNG  16.02.1992                       */
  782. X/***************************************************************************/
  783. X   
  784. X#include <sys/types.h>
  785. X#include <unistd.h>
  786. X#include <stdio.h>
  787. X#include <time.h>
  788. X#include <fcntl.h>
  789. X
  790. X#include "mbox.h"
  791. X
  792. Xextern time_t time_start, time_now;
  793. X
  794. X
  795. X
  796. X/***************************************************************************/
  797. X/*      FUNKTION  logout()                           */
  798. X/*  BESCHREIBUNG  Entfernt den User aus "WHO" und reorganisiert seine      */
  799. X/*          Teilnehmerdaten.                                         */
  800. X/*     PARAMETER  keine                                                       */
  801. X/*     RUECKGABE  keine                               */
  802. X/***************************************************************************/
  803. X
  804. Xvoid logout()
  805. X{
  806. X  FILE *fp;
  807. X  FILE *ff;
  808. X  char s[STRING];
  809. X  char t[STRING];
  810. X  char u[STRING];
  811. X  char f[STRING];
  812. X  long ll;
  813. X  int a, b;
  814. X  int fd;
  815. X  struct tm *timeptr;
  816. X  struct userdaten DUMMY;
  817. X  int dummy = sizeof(DUMMY);
  818. X
  819. X  printf("\n");
  820. X
  821. X
  822. X  time(&time_now);
  823. X  USER.elapsed += (long) (time_now - time_start);
  824. X
  825. X  sprintf(f, "%s/who%d", TMP, getpid());
  826. X  maybe_locked(WHO, "r"); lockf(WHO);
  827. X  fp = fopen(WHO, "r");
  828. X  if (fp == NULL) {
  829. X    nerror("main.c", 34, "logout", "Datei-Lesefehler", WHO);
  830. X  }
  831. X  t[0] = '\0'; strcat(t, ttyna());
  832. X
  833. X  ff = fopen(f, "w");
  834. X  if (ff == NULL) {
  835. X    nerror("main.c", 38, "logout", "Datei-Schreibfehler", f);
  836. X  }
  837. X  while (fgets(s, 80, fp) != NULL) {
  838. X    if(strcomp(t, s) != 0) fputs(s, ff);
  839. X  }
  840. X  fclose(ff);
  841. X  fclose(fp);
  842. X  sprintf(s, "cp %s %s", f, WHO);
  843. X  system(s);
  844. X  unlink(f);
  845. X  unlockf(WHO);
  846. X
  847. X  strcpy(s, HOME); strcat(s, "/etc/");
  848. X  strcat(s, (char *) ttyna()); strcat(s, ".");
  849. X  unlink( s );
  850. X
  851. X  sprintf(USER.abused, "%ld", IDX_SIZE);
  852. X
  853. X  USER.seq--;        
  854. X  printf("\n");
  855. X  init_user( MAI01_MSG );
  856. X
  857. X#ifdef _NOINDEX
  858. X  sprintf(s, "%s/inhalt.%d", TMP, getpid());
  859. X  unlink(s);
  860. X#endif
  861. X
  862. X  control(MAI02_MSG, 3);
  863. X}
  864. X
  865. X
  866. X
  867. X/***************************************************************************/
  868. X/*      FUNKTION  init()                           */
  869. X/*  BESCHREIBUNG  Liest die Befehle aus "BEFEHLE", fuellt die Befehl-      */
  870. X/*          Stuktur und verteilt die Level-Vorgaben.                 */
  871. X/*     PARAMETER  keine                                                       */
  872. X/*     RUECKGABE  keine                               */
  873. X/***************************************************************************/
  874. X
  875. Xvoid init()
  876. X{
  877. X  FILE *fp;
  878. X  char s[STRING];
  879. X  int b = 0;
  880. X
  881. X  maybe_locked(BEFEHLE, "r");
  882. X  fp = fopen(BEFEHLE, "r");
  883. X  if (fp == NULL) {
  884. X    nerror("main.c", 68, "init", "Datei-Lesefehler", BEFEHLE);
  885. X  }
  886. X
  887. X  while((fgets(s, 80, fp) != NULL) && (s[0] == '/'));
  888. X  
  889. X  fgets(s, 80, fp); /* 3 Zeilen nach dem Kommentar (exakt 3 Zeilen !!!) */
  890. X  fgets(s, 80, fp);
  891. X
  892. X  while (fscanf(fp, "%d %d %d %d %s", &BEF[b].id, &BEF[b].in, &BEF[b].ex, &BEF[b].prototyp, BEF[b].befehl) > 0) {
  893. X
  894. X    if (BEF[b].id == 160) MAILOUT_LEV = BEF[b].ex;
  895. X    if (BEF[b].id == 125) ADMIN_LEV = BEF[b].ex;
  896. X    if (BEF[b].id == 230) WRITE_EX_LEV = BEF[b].ex;
  897. X    if (BEF[b].id == 230) WRITE_IN_LEV = BEF[b].in;
  898. X    if (BEF[b].id == 998) WRITE_INTERNAT = BEF[b].in;
  899. X    if (BEF[b].id == 195) PD_D_LEV = BEF[b].in;
  900. X    if (BEF[b].id == 195) PD_U_LEV = BEF[b].ex;
  901. X    if (BEF[b].id == 240) EXE_LEV = BEF[b].ex;
  902. X    if (BEF[b].id == 320) GUEST_LEV = BEF[b].in;
  903. X    if (BEF[b].id == 130) BB1 = b;
  904. X    if (BEF[b].id == 150) BB2 = b;
  905. X    if (BEF[b].id == 160) BB3 = b;
  906. X    if (BEF[b].id == 170) BB4 = b;
  907. X    if (BEF[b].id == 210) BB5 = b;
  908. X    if (BEF[b].id == 180) BB6 = b;
  909. X    if (BEF[b].id == 190) BB7 = b;
  910. X    if (BEF[b].id == 200) BB8 = b;
  911. X    if (BEF[b].id == 270) BB9 = b;
  912. X
  913. X    b++;
  914. X    if (b >= MAX_BEF) {
  915. X        nerror("main.c", 85, "init", "MAX_BEF ueberschritten !!", "???");
  916. X    }
  917. X  }
  918. X  BEF[b].id = -1;
  919. X
  920. X  fclose(fp);
  921. X}
  922. X
  923. X
  924. X
  925. X/***************************************************************************/
  926. X/*      FUNKTION  fixoutput()                           */
  927. X/*  BESCHREIBUNG  Legt fest an welches Geraet, oder in welche Datei, die   */
  928. X/*          Logbuch-Eintraege geschickt werden.               */
  929. X/*     PARAMETER  keine                                                       */
  930. X/*     RUECKGABE  keine                               */
  931. X/***************************************************************************/
  932. X
  933. Xvoid fixoutput()
  934. X{
  935. X  char s[STRING];
  936. X
  937. X  FILE *fp;
  938. X
  939. X  strcpy(s, CONSOLE); CONSOLE_REDIRECT[0] = '\0';
  940. X
  941. X  if(strcomp("REDIRECT", CONSOLE) == 0){
  942. X    fp = fopen( CDIRECTFL, "r" );
  943. X    if(fp != NULL){
  944. X        fgets(s, STRING, fp);
  945. X        fclose(fp);
  946. X        
  947. X    }
  948. X   }
  949. X   strcat(CONSOLE_REDIRECT, (char *) stripped(s));
  950. X}
  951. X
  952. X
  953. X
  954. X
  955. X/***************************************************************************/
  956. X/*      FUNKTION  main()                           */
  957. X/*  BESCHREIBUNG  Hauptfunktion. Rettet UID/GID, initialisiert, startet    */
  958. X/*          die MBox-Funktionen und terminiert.                      */
  959. X/*     PARAMETER  keine                                                       */
  960. X/*     RUECKGABE  "Exit-Status"                           */
  961. X/***************************************************************************/
  962. X
  963. Xint main(argc, argv)
  964. Xint argc;
  965. Xchar *argv[];
  966. X{
  967. X  FILE *fp;
  968. X  int i;
  969. X
  970. X#if defined(_ESTDIO) || !defined(_SYS7)
  971. X  setbuf(stdout, NULL);
  972. X#endif
  973. X
  974. X
  975. X  chdir(HOME);
  976. X
  977. X  OLDUID = getuid();
  978. X  OLDGID = getgid();
  979. X
  980. X  sprintf(MYNAME, "%s", "J. Random Looser");
  981. X
  982. X  fp = fopen( UDBASE, "r" );
  983. X  if(fp == NULL){
  984. X    strcpy(TERMINAL, "ansi");
  985. X    ansi("INIT");
  986. X
  987. X    headline( MAI03_MSG );
  988. X    ansi("md");
  989. X    printf("\n%s", MAI04_MSG);
  990. X    printf("\n%s", MAI05_MSG);
  991. X    printf("\n%s", MAI06_MSG);
  992. X    printf("\n");
  993. X    printf("\n%s", MAI07_MSG);
  994. X    printf("\n%s", MAI08_MSG);
  995. X    printf("\n%s\n\n", MAI09_MSG);
  996. X    ansi("me");
  997. X
  998. X    postfach( "#1" );
  999. X    postfach( "#2" );
  1000. X
  1001. X    ansi("md");
  1002. X    printf("\n%s\n\n", MAI10_MSG);
  1003. X    ansi("me");
  1004. X    return 0;
  1005. X  }
  1006. X  fclose(fp);
  1007. X
  1008. X  fixoutput();
  1009. X  init();  
  1010. X  intro();
  1011. X  get_makros();
  1012. X  ctrlx();
  1013. X
  1014. X  loop();
  1015. X
  1016. X  logout();
  1017. X  noctrlx();
  1018. X  ansi("md");
  1019. X  printf("\n\n%s\n\n", MAI11_MSG);
  1020. X  ansi("me");
  1021. X
  1022. X  return 0;
  1023. X}
  1024. END_OF_FILE
  1025.   if test 6010 -ne `wc -c <'src/main.c'`; then
  1026.     echo shar: \"'src/main.c'\" unpacked with wrong size!
  1027.   fi
  1028.   # end of 'src/main.c'
  1029. fi
  1030. if test -f 'src/postfach.c' -a "${1}" != "-c" ; then 
  1031.   echo shar: Will not clobber existing file \"'src/postfach.c'\"
  1032. else
  1033.   echo shar: Extracting \"'src/postfach.c'\" \(8509 characters\)
  1034.   sed "s/^X//" >'src/postfach.c' <<'END_OF_FILE'
  1035. X/***************************************************************************/
  1036. X/*        PROGRAMM  ix/Mbox                           */
  1037. X/*             DATEI  postfach.c                       */
  1038. X/*        FUNKTIONEN  postfach()                       */
  1039. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1040. X/*  LETZTE AENDERUNG  18.03.1991                       */
  1041. X/***************************************************************************/
  1042. X  
  1043. X#include <stdio.h>
  1044. X#include <sys/types.h>
  1045. X#include <fcntl.h>
  1046. X#include <unistd.h>
  1047. X#include <ctype.h>
  1048. X
  1049. X#include "mbox.h"
  1050. X
  1051. X
  1052. X
  1053. X/***************************************************************************/
  1054. X/*      FUNKTION  postfach()                           */
  1055. X/*  BESCHREIBUNG  Postfach und versch. Dateien fuer einen neuen Teil-      */
  1056. X/*          nehmer einrichten.                                       */
  1057. X/*     PARAMETER  arg  =  '*'  =  normaler Aufruf, wird geprueft       */
  1058. X/*                   =  Aufruf von ADMIN                         */
  1059. X/*               =  '#'  =  Neuinstallation der UDBASE           */
  1060. X/*     RUECKGABE  keine                                                       */
  1061. X/***************************************************************************/
  1062. X
  1063. Xvoid postfach(arg)
  1064. Xchar arg[];
  1065. X{
  1066. X  int fd;
  1067. X  FILE *fp;
  1068. X  char s[STRING*2];
  1069. X  char t[STRING*2];
  1070. X  struct userdaten LOOSER;
  1071. X  struct userdaten POSTER;
  1072. X  int ok, i, j, c;
  1073. X  long ll;
  1074. X
  1075. X
  1076. X  if (arg[0] == '*') {
  1077. X    if ((strcomp(GUEST, USER.name) != 0) &&
  1078. X        (strcomp(POSTMASTER, USER.sh_name) != 0)) {
  1079. X        ansi("md");
  1080. X        printf(" %s\n", POS01_MSG);
  1081. X        ansi("me");
  1082. X        return;
  1083. X    }
  1084. X  }
  1085. X  
  1086. X  if (arg[0] == '#') {
  1087. X
  1088. X    if (arg[1] == '1') { /* ADMINISTRATION */
  1089. X
  1090. X        strcpy(USER.name, "Administration");
  1091. X        strcpy(USER.sh_name, POSTMASTER);
  1092. X        strcpy(USER.nick, "Sysop");
  1093. X
  1094. X        USER.id = 1;
  1095. X        USER.level = 10;
  1096. X
  1097. X        printf("%s - %s (%s)\n", POS04_MSG, USER.name, USER.sh_name);
  1098. X
  1099. X        fp = fopen(UDSEQ, "w");
  1100. X        if (fp == NULL) {
  1101. X            nerror("postfach.c", 63, "postfach", "Datei-Schreibfehler", UDSEQ);
  1102. X        }
  1103. X        fputs("1", fp);
  1104. X        fclose(fp);
  1105. X        
  1106. X        fp = fopen(UDBASE, "w");
  1107. X        fclose(fp);
  1108. X    }     
  1109. X    if (arg[1] == '2') { /* GUEST */
  1110. X    
  1111. X        strcpy(USER.name, GUEST);
  1112. X        strcpy(USER.sh_name, GBL10_MSG);
  1113. X        strcpy(USER.nick, POS03_MSG);
  1114. X
  1115. X        USER.id = 2;
  1116. X        USER.level = 0;
  1117. X    
  1118. X        printf("%s - %s (%s)\n", POS05_MSG, USER.name, USER.sh_name);
  1119. X    }
  1120. X
  1121. X    strcpy(USER.passwort, "*****");
  1122. X    strcpy(USER.wohnort, "");
  1123. X    strcpy(USER.strasse, "???");
  1124. X    strcpy(USER.telefon1, "???");
  1125. X    strcpy(USER.telefon2, "???");
  1126. X    strcpy(USER.geburtsdatum, "00.00.0000");
  1127. X    strcpy(USER.account, "00.00.0000 000.00");
  1128. X
  1129. X    goto INIT_UDBASE;
  1130. X  }
  1131. X
  1132. X  maybe_locked(UDBASE, "r"); 
  1133. X  fd = open(UDBASE, O_RDONLY);
  1134. X  if (fd == -1) {
  1135. X    nerror("postfach.c", 51, "postfach", "Datei-Lesefehler", UDBASE);
  1136. X  }
  1137. X  headline( POS06_MSG );
  1138. X  ansi("md");
  1139. X  printf("\n%s\n%s\n%s\n\n", POS07_MSG, POS08_MSG, POS09_MSG);
  1140. X  ansi("me");
  1141. X
  1142. X  RETRY_1:
  1143. X
  1144. X  printf("\n%s ", POS10_MSG);
  1145. X  strcpy(s, POSTER.name);
  1146. X  strcpy(POSTER.name, (char *) getline(30, 15, '.', ""));
  1147. X  if ((strcomp("<BREAK>", POSTER.name) == 0) || (POSTER.name[0] < 64) || (POSTER.name[1] < 64)) {
  1148. X    strcpy(POSTER.name, s);
  1149. X    printf("\n\n");
  1150. X    ansi("md");
  1151. X    printf("%s", POS11_MSG);
  1152. X    ansi("me");
  1153. X    printf("\n");
  1154. X    return;
  1155. X  }
  1156. X  ansi("md");
  1157. X  printf("\n%s", POS12_MSG);
  1158. X  ok = 0;
  1159. X  strcpy(POSTER.name, (char *) stripped(POSTER.name));
  1160. X  lseek(fd, 0L, SEEK_SET);
  1161. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (ok == 0)) {
  1162. X    if (strcomp(POSTER.name, LOOSER.name)    == 0) ok = 1;
  1163. X    if (strcomp(POSTER.name, LOOSER.nick)    == 0) ok = 1;
  1164. X    if (strcomp(POSTER.name, LOOSER.sh_name) == 0) ok = 1;
  1165. X  }
  1166. X
  1167. X  if (USER.level < ADMIN_LEV){
  1168. X      if ((strcomp("SYSOP", POSTER.name) == 0) ||
  1169. X          (strcomp("POST",  POSTER.name) == 0) ||
  1170. X          (strcomp("GAST",  POSTER.name) == 0) ||
  1171. X          (strcomp("ADMIN", POSTER.name) == 0) ||
  1172. X          (strcomp("COSYS", POSTER.name) == 0)) ok = 1;
  1173. X  }
  1174. X
  1175. X  if (ok == 1) {
  1176. X    printf(" %s\n", POS13_MSG);
  1177. X    ansi("me");
  1178. X    sprintf(POSTER.name, "%s", s);
  1179. X    goto RETRY_1;
  1180. X  }
  1181. X  ansi("me");
  1182. X
  1183. X  do {
  1184. X    printf("%c%s ", CR, POS14_MSG);
  1185. X    strcpy(s, (char *) getline(10, 11, '.', ""));
  1186. X    if (strcomp("<BREAK>", s) == 0) s[0] = '\0';
  1187. X    strcpy(POSTER.passwort, (char *) crypted(s));
  1188. X    if (length(POSTER.passwort) < 5) {
  1189. X        ansi("md");
  1190. X        printf("\n%s", POS15_MSG);        
  1191. X        ansi("me");
  1192. X    }
  1193. X  } while (length(POSTER.passwort) < 5);
  1194. X
  1195. XRETRY_2:
  1196. X
  1197. X  printf("\n%s ", POS16_MSG);
  1198. X  strcpy(s, getline(30, 15, '.', ""));
  1199. X  if (strcomp("<BREAK>", s) == 0) {
  1200. X    strcpy(s, "John Doe");
  1201. X  }
  1202. X  strcpy(POSTER.nick, (char *) stripped(s));
  1203. X
  1204. X  ansi("md");
  1205. X  printf("\n%s", POS12_MSG);
  1206. X  ok = 0;
  1207. X  lseek(fd, 0L, SEEK_SET);
  1208. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (ok == 0)) {
  1209. X    if (strcomp(POSTER.nick, LOOSER.nick)    == 0) ok = 1;
  1210. X    if (strcomp(POSTER.nick, LOOSER.name)    == 0) ok = 1;
  1211. X    if (strcomp(POSTER.nick, LOOSER.sh_name) == 0) ok = 1;
  1212. X  }
  1213. X
  1214. X  if (USER.level < ADMIN_LEV){
  1215. X      if ((strcomp("SYSOP", POSTER.nick) == 0) ||
  1216. X          (strcomp("POST",  POSTER.nick) == 0) ||
  1217. X          (strcomp("GAST",  POSTER.nick) == 0) ||
  1218. X          (strcomp("ADMIN", POSTER.nick) == 0) ||
  1219. X          (strcomp("COSYS", POSTER.nick) == 0)) ok = 1;
  1220. X  }
  1221. X
  1222. X  if (ok == 1) {
  1223. X    printf(" %s\n", POS13_MSG);
  1224. X    ansi("me");
  1225. X    goto RETRY_2;
  1226. X  }
  1227. X  ansi("me");
  1228. X
  1229. X
  1230. X  printf("%c%s ", CR, POS17_MSG);
  1231. X  strcpy(POSTER.wohnort, (char *) getline(30, 11, '.', ""));
  1232. X
  1233. X  printf("\n%s ", POS18_MSG);
  1234. X  strcpy(POSTER.strasse, (char *) getline(30, 11, '.', ""));
  1235. X
  1236. X  printf("\n%s ", POS19_MSG);
  1237. X  strcpy(POSTER.telefon1, (char *) getline(20, 11, '.', ""));
  1238. X
  1239. X  printf("\n%s ", POS20_MSG);
  1240. X  strcpy(POSTER.telefon2, (char *) getline(20, 11, '.', ""));
  1241. X
  1242. X  printf("\n%s ", POS21_MSG);
  1243. X  strcpy(POSTER.geburtsdatum, (char *) getline(10, 114, '?', ""));
  1244. X
  1245. X  close(fd);
  1246. X
  1247. X  ansi("md");
  1248. X  printf("\n\n%s\n%s\n\n", POS22_MSG, POS23_MSG);
  1249. X  ansi("me");
  1250. X
  1251. X  USER.level = 0;
  1252. X  if(USER.id == 1) USER.level = 10; /* POSTMASTER-Account */
  1253. X
  1254. X  if (arg[0] != '*') {
  1255. X    sprintf(s, "%s", arg);
  1256. X    s[14] = '\0';
  1257. X    strcpy(USER.sh_name, s);
  1258. X    USER.level = WRITE_EX_LEV;
  1259. X  }
  1260. X  else USER.sh_name[0] = '\0';
  1261. X
  1262. X  sprintf(USER.name, "%s", POSTER.name);
  1263. X  sprintf(USER.passwort, "%s", POSTER.passwort);
  1264. X  sprintf(USER.nick, "%s", POSTER.nick);
  1265. X  sprintf(USER.wohnort, "%s", POSTER.wohnort);
  1266. X  sprintf(USER.strasse, "%s", POSTER.strasse);
  1267. X  sprintf(USER.telefon1, "%s", POSTER.telefon1);
  1268. X  sprintf(USER.telefon2, "%s", POSTER.telefon2);
  1269. X  sprintf(USER.geburtsdatum, "%s", POSTER.geburtsdatum);   
  1270. X
  1271. X
  1272. X  INIT_UDBASE:
  1273. X
  1274. X  
  1275. X  USER.terminal = 1;
  1276. X  USER.editor = 1;
  1277. X  USER.prompt = 2;
  1278. X  USER.bell = 0;
  1279. X  USER.more = 1;
  1280. X  USER.seq = 0;
  1281. X  USER.intro = 3;
  1282. X  strcpy(USER.lastlog, (char *) "01.01.1970");
  1283. X  USER.lasttime = 0;
  1284. X  USER.lastmode = 2;
  1285. X  USER.leserichtung = 1;
  1286. X  USER.upratio = 0L;
  1287. X  USER.downratio = 0L;
  1288. X  USER.elapsed = 0L;
  1289. X  sprintf(USER.newsgrps, "%s", NEWS_MINIMUM);
  1290. X  strcpy(USER.account, "00.00.0000 000.00");
  1291. X
  1292. X  maybe_locked(UDSEQ, "r"); lockf(UDSEQ);
  1293. X  fp = fopen(UDSEQ, "r");
  1294. X  if (fp == NULL) {
  1295. X    nerror("postfach.c", 188, "postfach", "Datei-Lesefehler", UDSEQ);
  1296. X  }
  1297. X  fscanf(fp, "%d", &USER.id);
  1298. X  fclose(fp);
  1299. X  unlockf(UDSEQ);
  1300. X
  1301. X  if(USER.id < 1) USER.id = 1;
  1302. X
  1303. X  maybe_locked(UDSEQ, "r"); lockf(UDSEQ);
  1304. X  fp = fopen(UDSEQ, "w");
  1305. X  if (fp == NULL) {
  1306. X    nerror("postfach.c", 196 , "postfach", "Datei-Schreibfehler", UDSEQ);
  1307. X  }
  1308. X  fprintf(fp, "%d\n", (USER.id + 1));
  1309. X  fclose(fp);
  1310. X  unlockf(UDSEQ);
  1311. X
  1312. X  maybe_locked(UDBASE, "r"); lockf(UDBASE);
  1313. X  fd = open(UDBASE, O_RDWR);
  1314. X  if (fd == -1) {
  1315. X    nerror("postfach.c", 204, "postfach", "Datei-Lesefehler", UDBASE);
  1316. X  }
  1317. X  ll = lseek(fd, 0L, SEEK_END);
  1318. X  write(fd, &USER, sizeof(USER));
  1319. X  close(fd);
  1320. X  unlockf(UDBASE);
  1321. X
  1322. X  sprintf(s, "%s/usr/%d", HOME, USER.id);
  1323. X  mkdir(s, 0777);
  1324. X
  1325. X  sprintf(s, "%s/usr/%d/seq", HOME, USER.id);
  1326. X  fp = fopen(s, "w");
  1327. X  fputs("1\n", fp);
  1328. X  fclose(fp);
  1329. X
  1330. X  sprintf(s, "%s/usr/%d/.hello", HOME, USER.id);
  1331. X  fp = fopen(s, "w");
  1332. X  fputs("\n", fp);
  1333. X  fclose(fp);
  1334. X
  1335. X  sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
  1336. X  fp = fopen(s, "w");
  1337. X  fputs("\n", fp);
  1338. X  fclose(fp);
  1339. X
  1340. X  if (arg[0] != '*') {
  1341. X    sprintf(s, "cp /usr/%s/%s %s/usr/%d/.signature &", USER.sh_name, SIGNATURE,
  1342. X        HOME, USER.id);
  1343. X    system(s);
  1344. X  }
  1345. X  sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  1346. X  fp = fopen(s, "w");
  1347. X  fprintf(fp, "%s\n", GBL05_MSG);
  1348. X  fputs("===============================================================================\n", fp);
  1349. X  fclose(fp);
  1350. X
  1351. X  if (arg[0] == '#') {
  1352. X    return; /* UDBASE installiert */
  1353. X  }
  1354. X
  1355. X  i = 0;
  1356. X  strcpy(t, USER.name);
  1357. X  while(t[i] != '\0'){
  1358. X    if(t[i] == ' ') t[i] = '.';
  1359. X    i++;
  1360. X  }
  1361. X
  1362. X  sprintf(s, "/bin/sh ./etc/alias.sh \"%s\"", t);
  1363. X  system( s );
  1364. X
  1365. X
  1366. X  sprintf(s, "%s \"%s\" (%d)", POS24_MSG, USER.name, USER.id);
  1367. X  control(s, 3);
  1368. X
  1369. X  printf("\n");
  1370. X  init_user( POS25_MSG );
  1371. X  
  1372. X}
  1373. X
  1374. END_OF_FILE
  1375.   if test 8509 -ne `wc -c <'src/postfach.c'`; then
  1376.     echo shar: \"'src/postfach.c'\" unpacked with wrong size!
  1377.   fi
  1378.   # end of 'src/postfach.c'
  1379. fi
  1380. if test -f 'src/show.c' -a "${1}" != "-c" ; then 
  1381.   echo shar: Will not clobber existing file \"'src/show.c'\"
  1382. else
  1383.   echo shar: Extracting \"'src/show.c'\" \(5757 characters\)
  1384.   sed "s/^X//" >'src/show.c' <<'END_OF_FILE'
  1385. X/***************************************************************************/
  1386. X/*        PROGRAMM  ix/Mbox                           */
  1387. X/*             DATEI  show.c                           */
  1388. X/*        FUNKTIONEN  show(), more()                       */
  1389. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1390. X/*  LETZTE AENDERUNG  18.11.1991                       */
  1391. X/***************************************************************************/
  1392. X
  1393. X#include <stdio.h>
  1394. X#include <string.h>
  1395. X
  1396. X#include "mbox.h"
  1397. X
  1398. X
  1399. Xstatic int show_more;
  1400. Xstatic FILE *page;
  1401. Xstatic char show_tmp[STRING];
  1402. Xstatic int seite;
  1403. X
  1404. X
  1405. Xextern char headinfo[STRING];
  1406. X
  1407. X
  1408. X/***************************************************************************/
  1409. X/*      FUNKTION  show()                               */
  1410. X/*  BESCHREIBUNG  Zeigt den Inhalt einer Datei an.                */
  1411. X/*     PARAMETER  fname    = Dateiname                                     */
  1412. X/*          maxlines = mehr Zeilen auf keinen Fall ausgeben          */
  1413. X/*          mode     = '> 99'  Ueberschrift einrechnen               */
  1414. X/*                   '= 99'  Reset (alle Parameter von "show")   */
  1415. X/*                   '=  0'  Kontinuierlich ausgeben             */
  1416. X/*     RUECKGABE  -1  =  Datei nicht gefunden                              */
  1417. X/***************************************************************************/
  1418. X
  1419. X#define LLL 80
  1420. X
  1421. Xint show(fname, maxlines, mode)
  1422. Xchar fname[];
  1423. Xint maxlines;
  1424. Xint mode;
  1425. X{
  1426. X  FILE *fp;
  1427. X
  1428. X  char s[LONGSTRING];
  1429. X  char o[LONGSTRING];
  1430. X  char t[STRING];
  1431. X  int c;
  1432. X  int ml;
  1433. X  int morechen;
  1434. X  int ret_status = 0;
  1435. X  int maxi = MAX_SCR_LINES;
  1436. X  int swing = 0;
  1437. X  int sl, ok;
  1438. X  int HEADER_lines = 0;
  1439. X  int HEADER_path = 0;
  1440. X
  1441. X
  1442. X  if (mode > 99) {        /* HEADLINE */
  1443. X    mode -= 100;
  1444. X    maxi -= 2;
  1445. X    swing = 2;
  1446. X    morechen = 1;
  1447. X    seite = 1;
  1448. X  }
  1449. X  if (mode == 99) {        /* RESET */
  1450. X    show_more = 0;
  1451. X    seite = 1;
  1452. X    return 0;
  1453. X  }
  1454. X  fp = fopen(fname, "r");
  1455. X  if (fp == NULL) {
  1456. X    return -1;
  1457. X  }
  1458. X  ml = 0;
  1459. X  morechen = 0;
  1460. X
  1461. X
  1462. X  sprintf(show_tmp, "%s/show%d", TMP, getpid());
  1463. X  page = fopen(show_tmp, "w");
  1464. X
  1465. X  if (mode != 2)
  1466. X    show_more = 0;
  1467. X  else
  1468. X    morechen = show_more;
  1469. X
  1470. X  if (show_more > maxi) show_more = 0;
  1471. X
  1472. X
  1473. X  while ((ml < maxlines) && (fgets(s, 250, fp) != NULL)) {
  1474. X
  1475. X    if(SHORT_HEADER){
  1476. X        if(strcomp("Path: ", s) == 0){
  1477. X            HEADER_path++;
  1478. X            continue;
  1479. X        }
  1480. X
  1481. X        if((HEADER_path != 0) && (HEADER_lines == 0)){
  1482. X
  1483. X            if(strcomp("From: ", s) == 0){
  1484. X                printf("%s %s", GBL01_MSG, strcopy(s, 6, strlen(s)));
  1485. X                fprintf(fp, "%s %s", GBL01_MSG, strcopy(s, 6, strlen(s)));
  1486. X                morechen++;
  1487. X            }
  1488. X            if(strcomp("Subject: ", s) == 0){
  1489. X                printf("%s %s", GBL03_MSG, strcopy(s, 9, strlen(s)));
  1490. X                fprintf(fp, "%s %s", GBL03_MSG, strcopy(s, 9, strlen(s)));
  1491. X                morechen++;
  1492. X            }        
  1493. X            if(strcomp("Date: ", s) == 0){
  1494. X                printf("%s %s\n", GBL02_MSG, strcopy(s, 6, strlen(s)));
  1495. X                fprintf(fp, "%s %s\n", GBL02_MSG, strcopy(s, 6, strlen(s)));
  1496. X                morechen++;
  1497. X            }
  1498. X            if(strlen(s) < 3){
  1499. X                HEADER_lines++;
  1500. X                morechen++;
  1501. X            }
  1502. X            continue;
  1503. X         }    
  1504. X    }
  1505. X    else{
  1506. X        if(HEADER_lines == 0){
  1507. X            sprintf(t, "%s %s", GBL01_MSG, X_MAIL_DEMON);
  1508. X            if(strcomp(t, s) == 0){
  1509. X                do{
  1510. X                    fgets(s, 250, fp);
  1511. X                }while(strcomp("From", s) != 0);
  1512. X                ansi("md");
  1513. X            }
  1514. X            if((strcomp("Path:", s) == 0) || (strcomp(GBL01_MSG, s) == 0)){
  1515. X                ansi("md");
  1516. X            }    
  1517. X            if(strlen(s) < 3){
  1518. X                HEADER_lines++;
  1519. X                ansi("me");
  1520. X            }            
  1521. X        }
  1522. X    }
  1523. X
  1524. X    sl = length(s);
  1525. X    while(sl > LLL){
  1526. X        o[0] = '\0'; strcat(o, s);
  1527. X        sl = LLL; ok = 0;
  1528. X        while((sl > 0) && (ok == 0)){
  1529. X            if(s[sl] < 48){
  1530. X                ok = sl;
  1531. X            }
  1532. X            sl--;
  1533. X        }
  1534. X        s[ok] = '\0';
  1535. X        morechen++;
  1536. X        printf("%s\n", s);
  1537. X        fprintf(page, "%s\n", s);
  1538. X        s[0] = '\0'; strcat(s, (char *)bigcopy(o, ok, length(o)));
  1539. X        sl = length(s);
  1540. X        if(ok == 0){
  1541. X            sl = LLL;
  1542. X            printf("[SysBug \"show.c\"]");
  1543. X        }
  1544. X        if(s[0] == '\n') s[0] = '\0';
  1545. X    }
  1546. X    if(s[strlen(s)] == '\n') s[strlen(s)] == '\0'; 
  1547. X    printf("%s", s);
  1548. X    fputs(s, page);
  1549. X    ml++;
  1550. X    morechen++;
  1551. X    if ((morechen >= maxi) && (mode > 0)) {
  1552. X        morechen = 0;
  1553. X        maxi += swing;
  1554. X        swing = 0;
  1555. X        fclose(page);
  1556. X        ret_status = more();
  1557. X        if (ret_status != 0) {
  1558. X            ml = maxlines + 9999;
  1559. X        }
  1560. X        else {
  1561. X            page = fopen(show_tmp, "w");
  1562. X        }
  1563. X    }
  1564. X  }
  1565. X  fclose(fp);
  1566. X
  1567. X  show_more = morechen;
  1568. X
  1569. X  if (page != NULL) fclose(page);
  1570. X  unlink(show_tmp);
  1571. X
  1572. X  return (int) ret_status;
  1573. X}
  1574. X
  1575. X
  1576. X
  1577. X/***************************************************************************/
  1578. X/*      FUNKTION  more()                           */
  1579. X/*  BESCHREIBUNG  Erfragen ob weitergelesen werden soll, oder nicht.       */
  1580. X/*     PARAMETER  keine                                                 */
  1581. X/*     RUECKGABE  0  =  weiterlesen                                        */
  1582. X/*         -1  =  abbrechen                           */
  1583. X/***************************************************************************/
  1584. X
  1585. Xint more()
  1586. X{
  1587. X  char s[255];
  1588. X  char c;
  1589. X  int ok = 0;
  1590. X
  1591. XFIRST_TRY:
  1592. X
  1593. X  ansi("mr");
  1594. X  printf("                                                                               ");
  1595. X  printf("%c[%s] (?) > ", CR, SHO04_MSG);
  1596. X  ansi("me");
  1597. X
  1598. XSECOND_TRY:
  1599. X
  1600. X  c = getint();
  1601. X
  1602. X  if (c == '?') {
  1603. X    ansi("mr");
  1604. X    clearline();
  1605. X    printf("%c%s > ", CR, SHO05_MSG);
  1606. X    ansi("me");
  1607. X    goto SECOND_TRY;
  1608. X  }
  1609. X  if (c > 96) c -= 32;
  1610. X
  1611. X  if ((c == DEL) ||
  1612. X      (c == CTRL_D) ||
  1613. X      (c == CTRL_X) ||
  1614. X      (c == SHO06_MSG) ||
  1615. X      (c == SHO07_MSG))
  1616. X    ok = -1;
  1617. X
  1618. X  if ((c == SHO08_MSG) || (c == SHO09_MSG)) ok = 1;
  1619. X
  1620. X  if (c == SHO10_MSG) {
  1621. X    ansi("cl");
  1622. X    ansi("mr");
  1623. X    printf("                                                                               ");
  1624. X    printf("%c%s\n", CR, SHO11_MSG);
  1625. X    ansi("me");    
  1626. X    page = fopen(show_tmp, "r");
  1627. X    if (page != NULL) {
  1628. X        while (fgets(s, 250, page) != NULL) {
  1629. X            printf("%s", s);
  1630. X        }
  1631. X        fclose(page);
  1632. X    }
  1633. X    goto FIRST_TRY;
  1634. X  }
  1635. X  if(ok != 1){    
  1636. X      if (USER.more == 3) {
  1637. X        clearline();
  1638. X      }
  1639. X      else {
  1640. X        if(USER.more != 0){
  1641. X            ansi("cl");
  1642. X            seite++;
  1643. X            sprintf(s, "%s'-  [%s %d]", headinfo, SHO12_MSG, seite);
  1644. X            headline(s);
  1645. X        }
  1646. X        else printf("\n\n");
  1647. X      }
  1648. X  }
  1649. X  else{    
  1650. X    clearline();
  1651. X  }
  1652. X
  1653. X  return (int) ok;
  1654. X}
  1655. X
  1656. END_OF_FILE
  1657.   if test 5757 -ne `wc -c <'src/show.c'`; then
  1658.     echo shar: \"'src/show.c'\" unpacked with wrong size!
  1659.   fi
  1660.   # end of 'src/show.c'
  1661. fi
  1662. if test -f 'src/weiterl.c' -a "${1}" != "-c" ; then 
  1663.   echo shar: Will not clobber existing file \"'src/weiterl.c'\"
  1664. else
  1665.   echo shar: Extracting \"'src/weiterl.c'\" \(3587 characters\)
  1666.   sed "s/^X//" >'src/weiterl.c' <<'END_OF_FILE'
  1667. X/***************************************************************************/
  1668. X/*        PROGRAMM  ix/Mbox                           */
  1669. X/*             DATEI  weiterleiten.c                       */
  1670. X/*        FUNKTIONEN  weiterleiten(), carboncopy()               */
  1671. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1672. X/*  LETZTE AENDERUNG  05.01.1992                       */
  1673. X/***************************************************************************/
  1674. X
  1675. X#include <stdio.h>
  1676. X
  1677. X#include "mbox.h"
  1678. X
  1679. X
  1680. X/***************************************************************************/
  1681. X/*      FUNKTION  weiterleiten()                       */
  1682. X/*  BESCHREIBUNG  Je nach Parameter wird entweder ein Artikel an einen     */
  1683. X/*          User weitergeleitet, oder aber die letzte PM nochmal     */
  1684. X/*          mit einer anderen Adresse verschickt.                    */
  1685. X/*     PARAMETER  arg = Nummer des Artikel, Empfaenger, etc.               */
  1686. X/*     RUECKGABE  keine                                                    */
  1687. X/***************************************************************************/
  1688. X
  1689. Xvoid weiterleiten( arg )
  1690. Xchar arg[];
  1691. X{
  1692. X  FILE *fp;
  1693. X  char s[STRING];
  1694. X  char t[STRING];
  1695. X  char subject[STRING];
  1696. X  int i, a, num;
  1697. X  char empf[STRING];
  1698. X
  1699. X  subject[0] = '\0';
  1700. X
  1701. X  sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
  1702. X  fp = fopen( s, "r" );
  1703. X  if(fp != NULL){
  1704. X    fgets(subject, 80, fp);
  1705. X    fclose(fp);
  1706. X  }
  1707. X
  1708. X  if((subject[0] == '\0') && ((arg[0] > 64) || (arg[0] == '?'))){
  1709. X    ansi("md");
  1710. X    printf(" %s\n", WEI01_MSG);
  1711. X    ansi("me");
  1712. X    return;
  1713. X  }
  1714. X
  1715. X  if(arg[0] == '\0'){
  1716. X    printf("\n\n%s\n\n", WEI02_MSG);
  1717. X    ansi("md");
  1718. X    printf("%s %s\n\n", WEI03_MSG, subject);
  1719. X    ansi("me");
  1720. X    return;
  1721. X  }
  1722. X
  1723. X  num = 0;
  1724. X
  1725. X  if(arg[0] < 65){
  1726. X    i = 0;
  1727. X    while((arg[i] > 32) && (arg[i] != '\0')) i++;
  1728. X    strcpy(s, (char *) strcopy(arg, 0, (i-1)));
  1729. X    num = atoi(s);
  1730. X    strcpy(empf, (char *) strcopy(arg, (i+1), length(arg)));
  1731. X    strcat(empf, "$");
  1732. X  }
  1733. X  else{
  1734. X    sprintf(empf, "%s$", arg);
  1735. X  }  
  1736. X
  1737. X  if(num != 0){
  1738. X    if(strcomp(BRETT, "PM") != 0){
  1739. X        sprintf(t, "%s/%d", BRETT, num);
  1740. X        sprintf(s, "cp %s/%d %s/usr/%d/.lastletter", BRETT, num, HOME, USER.id);
  1741. X    }
  1742. X    else{
  1743. X        sprintf(t, "%s/usr/%d/%d", HOME, USER.id, num);
  1744. X        sprintf(s, "cp %s/usr/%d/%d %s/usr/%d/.lastletter", HOME, USER.id, num, HOME, USER.id);
  1745. X    }
  1746. X    fp = fopen( t, "r" );
  1747. X    if(fp == NULL){
  1748. X        ansi("md");
  1749. X        printf(" %s\n", WEI04_MSG);
  1750. X        ansi("me");
  1751. X    return;
  1752. X    }
  1753. X    fclose(fp);
  1754. X    system(s);
  1755. X    sprintf(s, "%s/usr/%d/.lastletter", HOME, USER.id);
  1756. X
  1757. X    sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
  1758. X    fp = fopen( s, "w" );
  1759. X    if(fp == NULL){
  1760. X        nerror("weiterl.c", 76, "weiterleiten", "Datei_Schreibfehler", s);
  1761. X    }
  1762. X    fprintf(fp, "%d <%s>", num, NG);
  1763. X    fclose(fp);
  1764. X  }
  1765. X
  1766. X  brief(empf);
  1767. X}
  1768. X
  1769. X
  1770. X/***************************************************************************/
  1771. X/*      FUNKTION  carboncopy()                           */
  1772. X/*  BESCHREIBUNG  Kopien einer MAIL an mehrer Empfaenger versenden       */
  1773. X/*     PARAMETER  cc  = Empfaenger einer Kopie (im Header sichtbar)       */
  1774. X/*          bcc = Empfaenger einer Kopie (im Header unsichtbar)       */
  1775. X/*     RUECKGABE  keine                                                    */
  1776. X/***************************************************************************/
  1777. X
  1778. Xvoid carboncopy( cc, bcc )
  1779. Xchar cc[], bcc[];
  1780. X{
  1781. X  char ex[LONGSTRING];
  1782. X  char ef[LONGSTRING];
  1783. X  char s[STRING];
  1784. X
  1785. X  int a = 0, i = 0;
  1786. X  int ok = 0;
  1787. X
  1788. X  printf("\n");
  1789. X
  1790. X  sprintf(ex, "%s,%s ", (char *) stripped(cc), bcc);
  1791. X
  1792. X  if(ex[0] == '\0') return;
  1793. X
  1794. X  while(ok == 0){
  1795. X    while((ex[i] != ',') && (ex[i] != '\0')) i++;
  1796. X
  1797. X    if(ex[i] == '\0') ok++;
  1798. X
  1799. X    strcpy(ef, (char *) bigcopy(ex, a, (i-1)));
  1800. X    strcpy(s, (char *) stripped(ef));
  1801. X
  1802. X    if(strlen(s) > 1){
  1803. X        weiterleiten( s );
  1804. X    }
  1805. X    a = i + 1;
  1806. X    i++;
  1807. X  }
  1808. X  
  1809. X}
  1810. END_OF_FILE
  1811.   if test 3587 -ne `wc -c <'src/weiterl.c'`; then
  1812.     echo shar: \"'src/weiterl.c'\" unpacked with wrong size!
  1813.   fi
  1814.   # end of 'src/weiterl.c'
  1815. fi
  1816. if test -f 'src/xmd.c' -a "${1}" != "-c" ; then 
  1817.   echo shar: Will not clobber existing file \"'src/xmd.c'\"
  1818. else
  1819.   echo shar: Extracting \"'src/xmd.c'\" \(8750 characters\)
  1820.   sed "s/^X//" >'src/xmd.c' <<'END_OF_FILE'
  1821. X/***************************************************************************/
  1822. X/*        PROGRAMM  ix/Mbox                           */
  1823. X/*             DATEI  xmd.c                           */
  1824. X/*        FUNKTIONEN  brief(), mailing(), main()               */
  1825. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1826. X/*  LETZTE AENDERUNG  15.02.1992                       */
  1827. X/***************************************************************************/
  1828. X
  1829. X#include <sys/types.h>
  1830. X#include <sys/stat.h>
  1831. X#include <unistd.h>
  1832. X#include <stdio.h>
  1833. X#include <fcntl.h>
  1834. X#include <time.h>
  1835. X
  1836. X#include "mbox.h"
  1837. X
  1838. X
  1839. Xchar tmp[STRING];
  1840. Xchar alias[MAX_XMD_ALIAS][2][STRING];
  1841. Xint INTERACT;
  1842. X
  1843. X
  1844. X
  1845. X/***************************************************************************/
  1846. X/*      FUNKTION  brief()                           */
  1847. X/*  BESCHREIBUNG  Leitet einen Brief weiter an einen MBox-Account.       */
  1848. X/*          Auf diese Weise ist der Mbox-User auch unter der         */
  1849. X/*          Adresse 'Real.Name@UUCPID' erreichbar.           */
  1850. X/*     PARAMETER  arg  =  Mbox-User-Name                                   */
  1851. X/*     RUECKGABE  keine                                                    */
  1852. X/***************************************************************************/
  1853. X
  1854. Xbrief(arg)
  1855. Xchar arg[];
  1856. X{
  1857. X  FILE *fp;
  1858. X  FILE *ff;
  1859. X  int fd;
  1860. X  int i;
  1861. X  int ok;
  1862. X  struct userdaten LOOSER;
  1863. X
  1864. X  struct tm *timeptr;
  1865. X  time_t timer;
  1866. X
  1867. X  int receiver;
  1868. X  static int mail_id;
  1869. X  int EX_PM = 0;
  1870. X  int REPLY = 0;
  1871. X  int lines = 0;
  1872. X  int local = 0;
  1873. X
  1874. X
  1875. X  char s[STRING];
  1876. X  char t[STRING];
  1877. X  char top[STRING];
  1878. X  char subject[STRING];
  1879. X  char autor[STRING];
  1880. X  char rec_char[STRING];
  1881. X  char ex[255];
  1882. X  char user[STRING];
  1883. X  char c;
  1884. X  char protokoll;
  1885. X  char destination[STRING];
  1886. X
  1887. X  i = 0;
  1888. X  ok = 0;
  1889. X
  1890. X  strcpy(user, (char *) stripped(arg));
  1891. X  strcpy(subject, XMD01_MSG);
  1892. X
  1893. X  JUNK:    receiver = 0;
  1894. X
  1895. X  fd = open(UDBASE, O_RDONLY);
  1896. X  if (fd == -1) {
  1897. X    printf("\nSHIT!\n");
  1898. X    exit(-1);
  1899. X  }
  1900. X  lseek(fd, 0L, SEEK_SET);
  1901. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (receiver == 0)) {
  1902. X    if ((strcomp(user, LOOSER.name) == 0) ||
  1903. X        (strcomp(LOOSER.name, user) == 0) ||
  1904. X        (strcomp(user, LOOSER.nick) == 0) ||
  1905. X        (strcomp(user, LOOSER.sh_name) == 0)) {
  1906. X        receiver = LOOSER.id;
  1907. X        strcpy(rec_char, LOOSER.name);
  1908. X    }
  1909. X  }
  1910. X  close(fd);
  1911. X
  1912. X  if (receiver == 0) {
  1913. X    sprintf(subject, "[xmd:] '%s' ???   ", user);
  1914. X    strcpy(user, POSTMASTER);
  1915. X    goto JUNK;
  1916. X  }
  1917. X  sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  1918. X  fp = fopen(s, "r");
  1919. X  fgets(s, 80, fp);
  1920. X  mail_id = atoi( s );
  1921. X  fclose(fp);
  1922. X
  1923. X  sprintf(destination, "%s/usr/%d/%d", HOME, receiver, mail_id);
  1924. X  fp = fopen(destination, "w");
  1925. X
  1926. X  sprintf(s, "%s %s (%s)\n", GBL01_MSG, X_MAIL_DEMON, "xmd");
  1927. X  fputs(s, fp);
  1928. X
  1929. X  time(&timer);
  1930. X  timeptr = localtime(&timer);
  1931. X  strcpy(t, (char *) asctime(timeptr));
  1932. X
  1933. X  sprintf(s, "%s %s", GBL02_MSG, t);
  1934. X  fputs(s, fp);
  1935. X
  1936. X  sprintf(s, "%s %s\n\n", GBL03_MSG, subject);
  1937. X  fputs(s, fp);
  1938. X
  1939. X  fprintf(fp, "%s\n\n", XMD02_MSG);
  1940. X
  1941. X  lines = 7;
  1942. X
  1943. X  autor[0] = '\0';
  1944. X  subject[0] = '\0';
  1945. X
  1946. X  ff = fopen(tmp, "r");
  1947. X  if (ff == NULL) {
  1948. X    return;
  1949. X  }
  1950. X  while (fgets(s, 80, ff) != NULL) {
  1951. X    i = 0;
  1952. X    while(s[i] != '\0'){
  1953. X        if(s[i] > 127){
  1954. X            s[i] = '?';
  1955. X        }
  1956. X        i++;
  1957. X    }
  1958. X    fputs(s, fp);
  1959. X    lines++;
  1960. X    if((strcomp("Subject: ", s) == 0) && (subject[0] == '\0')){
  1961. X        strcpy(subject, (char *) stripped(strcopy(s, 9, 80)));
  1962. X    }
  1963. X    if((strcomp("From: ", s) == 0) && ((autor[0] == '\0') || (local = 1))){
  1964. X        strcpy(autor, (char *) stripped(strcopy(s, 6, 80)));
  1965. X        local = 0;
  1966. X    }
  1967. X    if(strcomp("From ", s) == 0){
  1968. X        strcpy(autor, (char *) stripped(strcopy(s, 5, 80)));
  1969. X        local = 1;
  1970. X    }
  1971. X  }
  1972. X  fclose(ff);
  1973. X  fclose(fp);
  1974. X
  1975. X  i = 0; 
  1976. X  while(autor[i] != '\0'){
  1977. X    if(autor[i] == '(') autor[(i-1)] = '\0';
  1978. X    i++;
  1979. X  }
  1980. X
  1981. X  if((local == 1) && (strcomp("postmaster", autor) == 0)){
  1982. X    fclose(fp);
  1983. X    unlink(destination);
  1984. X    if(INTERACT == 0) printf("[%s]\n", arg);
  1985. X    fp = fopen( XMDLOG, "a" );
  1986. X    fprintf(fp, "-%-30.30s%s\n", (char *) stripped(arg), subject);
  1987. X    fclose(fp);
  1988. X    return;
  1989. X  }
  1990. X
  1991. X  sprintf(s, "%s/usr/%d/INDEX", HOME, receiver);
  1992. X  fp = fopen(s, "a");
  1993. X
  1994. X  sprintf(s, "%d              ", mail_id);
  1995. X  s[6] = '\0';
  1996. X  fputs(s, fp);
  1997. X
  1998. X  sprintf(ex, "%s                                  ", subject);
  1999. X  ex[26] = '\0';
  2000. X  fputs(ex, fp);
  2001. X
  2002. X  sprintf(ex, "  %s                                        ", autor);
  2003. X  ex[22] = '\0';
  2004. X  fputs(ex, fp);
  2005. X
  2006. X
  2007. X  strcpy(s, (char *) mydate(1));
  2008. X  strcpy(t, (char *) mytime(1));
  2009. X  sprintf(ex, "  %s  %s         ", s, t);
  2010. X  ex[19] = '\0';
  2011. X  fputs(ex, fp);
  2012. X
  2013. X  sprintf(s, "%-5.d\n", lines);
  2014. X  fputs(s, fp);
  2015. X
  2016. X  fclose(fp);
  2017. X
  2018. X  sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  2019. X  fp = fopen(s, "w");
  2020. X  rewind(fp);
  2021. X  fprintf(fp, "%d\n", (int) (mail_id + 1));
  2022. X  fclose(fp);
  2023. X
  2024. X  if(INTERACT == 0) printf("%s\n", arg);
  2025. X
  2026. X  ff = fopen( XMDLOG, "a" );
  2027. X  fprintf(ff, " %-30.30s%s\n", (char *) stripped(arg), subject);
  2028. X  fclose(ff);
  2029. X}
  2030. X
  2031. X
  2032. X
  2033. X
  2034. X
  2035. X/***************************************************************************/
  2036. X/*      FUNKTION  mailing()                           */
  2037. X/*  BESCHREIBUNG  Isoliert den Mbox-User-Namen aus der UUCP-Adresse und       */
  2038. X/*                ruft mit diesem Namen die Routine "brief()" auf.       */
  2039. X/*     PARAMETER  keine                                                       */
  2040. X/*     RUECKGABE  keine                                                    */
  2041. X/***************************************************************************/
  2042. X
  2043. Xmailing()
  2044. X{
  2045. X  FILE *fp;
  2046. X  char s[255];
  2047. X  char t[STRING];
  2048. X  int i, j;
  2049. X
  2050. X  fp = fopen(tmp, "r");
  2051. X  if (fp == NULL) {
  2052. X    printf("\nPuhhh???\n");
  2053. X    exit(-1);
  2054. X  }
  2055. X  while (fgets(s, 80, fp) != NULL) {
  2056. X    if (strcomp("To:", s) == 0) {
  2057. X
  2058. X        i = 1;
  2059. X        while(strcomp("EOL", alias[i][1]) != 0){    
  2060. X            if(strcomp(alias[i][1], s) == 0) strcpy(s, alias[i][2]);
  2061. X            i++;
  2062. X        }
  2063. X
  2064. X        i = 0;
  2065. X        j = 0;
  2066. X        while ((s[i] != '\0') && (s[i] != '@')) {
  2067. X            if (s[i] == '!') j = i;
  2068. X            if ((s[i] == '.') || (s[i] == '%')) s[i] = ' ';
  2069. X            i++;
  2070. X        }
  2071. X        i--;
  2072. X        if (j == 0) {
  2073. X            strcpy(t, (char *) strcopy(s, 4, i));
  2074. X        } else {
  2075. X            strcpy(t, (char *) strcopy(s, (j + 1), length(s)));
  2076. X        }
  2077. X        brief(t);
  2078. X    }
  2079. X  }
  2080. X
  2081. X  fclose(fp);
  2082. X
  2083. X
  2084. X  unlink(tmp);
  2085. X
  2086. X}
  2087. X
  2088. X
  2089. X
  2090. X
  2091. X/***************************************************************************/
  2092. X/*      FUNKTION  main() (xmd)                           */
  2093. X/*  BESCHREIBUNG  Der Briefkasten des ERRORUSERS (POSTMASTER) wird ge-       */
  2094. X/*          scannt. Alle Eintraege fuer Mbox-User, deren Adresse     */
  2095. X/*          im Format 'Real.Name@UUCPID' vorliegen, werden zuge-       */
  2096. X/*          stellt.                                                  */
  2097. X/*     PARAMETER  keine                                                       */
  2098. X/*     RUECKGABE  keine                                                    */
  2099. X/***************************************************************************/
  2100. X
  2101. Xmain(argc, argv)
  2102. Xint argc;
  2103. Xchar *argv[];
  2104. X{
  2105. X  FILE *fp;
  2106. X  FILE *ff;
  2107. X  char s[255];
  2108. X  char t[255];
  2109. X  char dump[STRING];
  2110. X  char maildrop[STRING];
  2111. X  int toggle = 0;
  2112. X  int l;
  2113. X  int c;
  2114. X
  2115. X  setuid(0);
  2116. X  setgid(0);
  2117. X  umask(0000);
  2118. X
  2119. X  chdir(HOME);
  2120. X
  2121. X  ff = fopen( XMDLOG, "a" );
  2122. X  fprintf(ff, "\n\n========================== %s - %s ==============================\n\n", (char *) mydate( 1 ), (char *) mytime( 0 ));
  2123. X  fclose(ff);
  2124. X
  2125. X  if(argc < 2){
  2126. X    fp = fopen(ERRMBOX, "r");
  2127. X    INTERACT = 0;
  2128. X  }
  2129. X  else{
  2130. X    if(argv[2][0] == '-'){
  2131. X        sprintf(maildrop, "%s/%dPIP", TMP, getpid());
  2132. X        fp = fopen(maildrop, "w");
  2133. X        c = 0;
  2134. X        do{
  2135. X            c = fgetc(stdin);
  2136. X            if((c != EOF) && (c != 4)){
  2137. X                fputc(c, fp);
  2138. X                printf("%c", c);
  2139. X            }
  2140. X        }while((c != EOF) && (c != 4));
  2141. X        fclose(fp);
  2142. X        fp = fopen(maildrop, "r");
  2143. X        INTERACT = 1;    
  2144. X    }
  2145. X    else{
  2146. X        sprintf(maildrop, "%s/%s", MAILDROP, argv[1]);
  2147. X        fp = fopen(maildrop, "r");
  2148. X        INTERACT = 1;
  2149. X    }
  2150. X  }
  2151. X  if(INTERACT == 0) printf("\n");
  2152. X
  2153. X  if (fp == NULL) {
  2154. X    if(INTERACT == 0) printf("\nNo mail.\n");
  2155. X    return;
  2156. X  }
  2157. X
  2158. X  l = 1; 
  2159. X  ff = fopen( XMD_ALIAS, "r" );
  2160. X  if(ff != 0){
  2161. X    while(fgets(s, 80, ff) != 0){
  2162. X        if((s[0] > 64) && (l < MAX_XMD_ALIAS)){
  2163. X            strcpy(alias[l][1], (char *) stripped(s));
  2164. X            fgets(s, 80, ff);
  2165. X            strcpy(alias[l][2], (char *) stripped(s));
  2166. X            l++;
  2167. X        }
  2168. X    }
  2169. X    fclose(ff);
  2170. X  }
  2171. X  strcpy(alias[l][1], "EOL");
  2172. X
  2173. X  sprintf(dump, "%s/%d.DUMP", TMP, getpid());
  2174. X  ff = fopen(dump, "w");
  2175. X
  2176. X  while (fgets(s, 80, fp) != NULL) {
  2177. X    l = 2;
  2178. X    if (s[0] == '>') {
  2179. X        if(s[1] != ' ') l = 1;
  2180. X        strcpy(t, (char *) strcopy(s, l, length(s)));
  2181. X        strcpy(s, t);
  2182. X        if (strcomp("OOPS", s) != 0) {
  2183. X            fputs(s, ff);
  2184. X        }
  2185. X    }
  2186. X    else{
  2187. X        fputs(s, ff);
  2188. X    }
  2189. X  }
  2190. X  fclose(ff);
  2191. X  fclose(fp);
  2192. X
  2193. X  fp = fopen(dump, "r");
  2194. X
  2195. X  sprintf(tmp, "%s/%d.XMD", TMP, getpid());
  2196. X
  2197. X  ff = fopen(tmp, "w");
  2198. X
  2199. X  while (fgets(s, 80, fp) != NULL) {
  2200. X    if (strcomp("From ", s) == 0) {
  2201. X        if (toggle == 1) {
  2202. X            if (ff != 0) fclose(ff);
  2203. X            mailing();
  2204. X            ff = fopen(tmp, "w");
  2205. X        }
  2206. X        toggle = 1;
  2207. X    }
  2208. X    if (toggle == 1) fputs(s, ff);
  2209. X  }
  2210. X  if (ff != 0) fclose(ff);
  2211. X  if (toggle == 1) mailing();
  2212. X  fclose(fp);
  2213. X
  2214. X  unlink(tmp);
  2215. X  unlink(dump);
  2216. X
  2217. X  if(INTERACT == 0)
  2218. X     sprintf(s, "> %s", ERRMBOX);
  2219. X  else{
  2220. X    if(getgid() == GUEST_GID){
  2221. X         sprintf(s, "> %s", maildrop);
  2222. X    }
  2223. X  }
  2224. X  system(s);
  2225. X}
  2226. END_OF_FILE
  2227.   if test 8750 -ne `wc -c <'src/xmd.c'`; then
  2228.     echo shar: \"'src/xmd.c'\" unpacked with wrong size!
  2229.   fi
  2230.   # end of 'src/xmd.c'
  2231. fi
  2232. echo shar: End of archive 8 \(of 10\).
  2233. cp /dev/null ark8isdone
  2234. MISSING=""
  2235. for I in 1 2 3 4 5 6 7 8 9 10 ; do
  2236.     if test ! -f ark${I}isdone ; then
  2237.     MISSING="${MISSING} ${I}"
  2238.     fi
  2239. done
  2240. if test "${MISSING}" = "" ; then
  2241.     echo You have unpacked all 10 archives.
  2242.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2243. else
  2244.     echo You still must unpack the following archives:
  2245.     echo "        " ${MISSING}
  2246. fi
  2247. exit 0
  2248. exit 0 # Just in case...
  2249.