home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume35 / mbox / part07 < prev    next >
Text File  |  1993-02-05  |  56KB  |  2,389 lines

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de (Volker Schuermann)
  3. Subject: v35i042:  mbox - ix/Mbox, A BBS for UNIX and MINIX v1.6 PL10j7, Part07/15
  4. Message-ID: <1993Feb5.185734.10323@sparky.imd.sterling.com>
  5. X-Md4-Signature: d63f2d7d680fc06f2914f870bf1dee18
  6. Date: Fri, 5 Feb 1993 18:57:34 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Volker.Schuermann@unnet.w.open.de (Volker Schuermann)
  10. Posting-number: Volume 35, Issue 42
  11. Archive-name: mbox/part07
  12. Environment: MINIX, ISC, ESIX, SVR3
  13. Supersedes: mbox: Volume 31, Issue 16-27
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # Contents:  src/loop.c src/mail.c src/makro.c wendy/fast
  20. # Wrapped by kent@sparky on Fri Feb  5 12:18:09 1993
  21. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  22. echo If this archive is complete, you will see the following message:
  23. echo '          "shar: End of archive 7 (of 15)."'
  24. if test -f 'src/loop.c' -a "${1}" != "-c" ; then 
  25.   echo shar: Will not clobber existing file \"'src/loop.c'\"
  26. else
  27.   echo shar: Extracting \"'src/loop.c'\" \(22323 characters\)
  28.   sed "s/^X//" >'src/loop.c' <<'END_OF_FILE'
  29. X/***************************************************************************/
  30. X/*        PROGRAMM  ix/Mbox                           */
  31. X/*             DATEI  loop.c                           */
  32. X/*        FUNKTIONEN  sigcatch(), cut_bef(), cut_arg(), rates(), loop()       */
  33. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  34. X/*  LETZTE AENDERUNG  18.12.1992                       */
  35. X/***************************************************************************/
  36. X   
  37. X#include <stdio.h>
  38. X#include <sys/types.h>
  39. X#include <sys/wait.h>
  40. X#include <time.h>
  41. X#include <setjmp.h>
  42. X#include <signal.h>
  43. X#include <sys/stat.h>
  44. X
  45. X#include "mbox.h"
  46. X
  47. Xextern time_t time_start, time_now;
  48. X
  49. Xjmp_buf jmpenv;
  50. X
  51. X/***************************************************************************/
  52. X/*      FUNKTION  sigcatch()                           */
  53. X/*  BESCHREIBUNG  Wird aufgerufen, wenn eines der abgefangen Signale       */
  54. X/*          eintrifft. Je nach Signal wird entweder ein CTRL-X       */
  55. X/*          simuliert, oder das Programm ordnungsgemaesst beendet.   */
  56. X/*     PARAMETER  sig  =  Nummer des ausloesenden Signals                  */
  57. X/*     RUECKGABE  keine                                                    */
  58. X/***************************************************************************/
  59. X
  60. Xvoid sigcatch(sig)
  61. Xint sig;
  62. X{
  63. X  unsigned char tmp[80];  
  64. X
  65. X  signal(SIGINT,   SIG_IGN);
  66. X  signal(SIGQUIT,  SIG_IGN);
  67. X  signal(SIGHUP,   SIG_IGN);
  68. X  signal(SIGABRT,  SIG_IGN);
  69. X  signal(SIGTERM,  SIG_IGN);
  70. X
  71. X  chdir( HOME );
  72. X  switch (sig) {
  73. X    case SIGINT:
  74. X    case SIGQUIT:
  75. X        sprintf(tmp, "%s/I.%d", TMP, getpid());
  76. X        unlink(tmp);
  77. X        sprintf(tmp, "%s/show%d", TMP, getpid());
  78. X        unlink(tmp);
  79. X        mbunlock( UDBASE );
  80. X        printf("\n");
  81. X        ansi("mr");
  82. X        printf("%s", LOP01_MSG);
  83. X        ansi("me");
  84. X        printf("\n\n");
  85. X        longjmp(jmpenv, 1);
  86. X        break;
  87. X      case SIGHUP:
  88. X      case SIGABRT:
  89. X      case SIGTERM:
  90. X        printf("\n\n");
  91. X        ansi("mr");
  92. X        printf("%s", LOP02_MSG);
  93. X        ansi("me");
  94. X        printf("");
  95. X        logout();
  96. X        exit(-1);
  97. X        break;
  98. X  }
  99. X}
  100. X
  101. X
  102. X
  103. X
  104. X/***************************************************************************/
  105. X/*      FUNKTION  cut_bef()                           */
  106. X/*  BESCHREIBUNG  Filtert den Befehl aus der Eingabe eines Users.          */
  107. X/*     PARAMETER  Eingabezeile                                             */
  108. X/*     RUECKGABE  Der isolierte Befehl                                     */
  109. X/***************************************************************************/
  110. X
  111. Xunsigned char *cut_bef(s)
  112. Xunsigned char s[];
  113. X{
  114. X  static unsigned char bef[STRING];
  115. X  int i = 0;
  116. X
  117. X  while (s[i] > 32) {
  118. X    bef[i] = s[i];
  119. X    i++;
  120. X  }
  121. X  bef[i] = '\0';
  122. X  return (unsigned char *) bef;
  123. X}
  124. X
  125. X
  126. X
  127. X/***************************************************************************/
  128. X/*      FUNKTION  cut_arg()                           */
  129. X/*  BESCHREIBUNG  Filtert das Argument aus der Eingabe des Users.          */
  130. X/*     PARAMETER  Eingabezeile                                                */
  131. X/*     RUECKGABE  Das isolierte Argument                                   */
  132. X/***************************************************************************/
  133. X
  134. Xunsigned char *cut_arg(s)
  135. Xunsigned char s[];
  136. X{
  137. X  static unsigned char arg[STRING];
  138. X  int i = 0, a = 0;
  139. X
  140. X  while (s[i] > 32) i++;
  141. X  if (s[i] == '\0') return (unsigned char *) "";
  142. X
  143. X  while (s[i] == 32) i++;
  144. X
  145. X  while (s[i] != '\0') {
  146. X    arg[a] = s[i];
  147. X    i++;
  148. X    a++;
  149. X  }
  150. X  arg[a] = '\0';
  151. X
  152. X  while((arg[(a-1)] < 33) && (a > 1)){
  153. X    a--;
  154. X    arg[a] = '\0';
  155. X  }
  156. X
  157. X  return (unsigned char *) arg;
  158. X}
  159. X
  160. X
  161. X
  162. X
  163. X/***************************************************************************/
  164. X/*      FUNKTION  rates()                           */
  165. X/*  BESCHREIBUNG  Ermittelt die Telefongebuehren des laufenden Anrufs und  */
  166. X/*          bereitet sie als PROMPT auf.                             */
  167. X/*     PARAMETER  keine                                                       */
  168. X/*     RUECKGABE  PROMPT-Zeile fuer Gebuehren                              */
  169. X/***************************************************************************/
  170. X
  171. Xunsigned char *rates()
  172. X{
  173. X  static unsigned char s[STRING];
  174. X  unsigned char t[STRING];
  175. X  int nz, rz, wz;
  176. X  int dif;
  177. X  int n1, n2, r1, r2, w1, w2;
  178. X  struct tm *timeptr;
  179. X
  180. X  time(&time_now);
  181. X  dif = time_now - time_start;
  182. X
  183. X  n1 = dif / NZNT;
  184. X  n1++;
  185. X  n1 *= TARIF;
  186. X  n2 = dif / NZBT;
  187. X  n2++;
  188. X  n2 *= TARIF;
  189. X  r1 = dif / RZNT;
  190. X  r1++;
  191. X  r1 *= TARIF;
  192. X  r2 = dif / RZBT;
  193. X  r2++;
  194. X  r2 *= TARIF;
  195. X  w1 = dif / WZNT;
  196. X  w1++;
  197. X  w1 *= TARIF;
  198. X  w2 = dif / WZBT;
  199. X  w2++;
  200. X  w2 *= TARIF;
  201. X
  202. X  timeptr = localtime(&time_now);
  203. X  sprintf(t, "%s", asctime(timeptr));
  204. X
  205. X  if ((t[0] == 'S') || (timeptr->tm_hour > 18) || (timeptr->tm_hour < 8)) {
  206. X    sprintf(s, "(%ds) NZ %d.%02.2d, RZ %d.%02.2d, WZ %d.%02.2d",
  207. X     dif, fix(n2), flt(n2), fix(r2), flt(r2), fix(w2), flt(w2));
  208. X  }
  209. X  else {
  210. X    sprintf(s, "(%ds) NZ %d.%02.2d, RZ %d.%02.2d, WZ %d.%02.2d",
  211. X     dif, fix(n1), flt(n1), fix(r1), flt(r1), fix(w1), flt(w1));
  212. X  }
  213. X
  214. X  return (unsigned char *) s;
  215. X}
  216. X
  217. X
  218. X
  219. X
  220. X/***************************************************************************/
  221. X/*      FUNKTION  loop.c                           */
  222. X/*  BESCHREIBUNG  Die Eingaben des Users werden entgegengenommen und die   */
  223. X/*          entsprechenden Routinen aufgerufen und ausgefuehrt.      */
  224. X/*     PARAMETER  keine                                                       */
  225. X/*     RUECKGABE  keine                                                    */
  226. X/***************************************************************************/
  227. X
  228. Xvoid loop()
  229. X{
  230. X  unsigned char s[STRING];
  231. X  unsigned char t[STRING];
  232. X  unsigned char l[LONGSTRING];
  233. X  unsigned char befehl[STRING];
  234. X  unsigned char argument[STRING];
  235. X  unsigned char prompt[STRING];
  236. X
  237. X  unsigned char prev_befehl[10][STRING];
  238. X  int wasok;
  239. X
  240. X  int c;
  241. X
  242. X  unsigned char bef_buff[(STRING * 2)];
  243. X  int bef_rec;
  244. X
  245. X  int ende = 0, ok, dummy, i;
  246. X  int pp;
  247. X  int to_del;
  248. X  int fpid;
  249. X
  250. X  struct stat fst;
  251. X
  252. X
  253. X  sprintf(prev_befehl[1], "%s ", BEF[BB1].befehl);
  254. X  sprintf(prev_befehl[2], "%s ", BEF[BB2].befehl); 
  255. X  sprintf(prev_befehl[3], "%s ", BEF[BB3].befehl);
  256. X  sprintf(prev_befehl[4], "%s ", BEF[BB4].befehl);
  257. X  sprintf(prev_befehl[5], "%s ", BEF[BB5].befehl);
  258. X  sprintf(prev_befehl[6], "%s ", BEF[BB6].befehl);
  259. X  sprintf(prev_befehl[7], "%s ", BEF[BB7].befehl);
  260. X  sprintf(prev_befehl[8], "%s ", BEF[BB8].befehl);
  261. X  sprintf(prev_befehl[9], "%s ", BEF[BB9].befehl);
  262. X
  263. X  wasok = 1;
  264. X
  265. X  bef_buff[0] = '\0';
  266. X
  267. X  DISKUSSION = 0;
  268. X
  269. X  do {
  270. X
  271. X    if(setjmp(jmpenv) == 1){
  272. X        bef_buff[0] = '\0';
  273. X    }
  274. X
  275. X    FASTER:
  276. X    
  277. X    signal(SIGINT,  sigcatch);
  278. X    signal(SIGQUIT, sigcatch);
  279. X
  280. X    signal(SIGHUP,  sigcatch);
  281. X    signal(SIGABRT, sigcatch);
  282. X    signal(SIGTERM, sigcatch);
  283. X
  284. X    sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  285. X    stat(s, &fst);
  286. X    if(fst.st_size > IDX_SIZE){
  287. X        printf("%c\n\n%s\n", BELL, LOP03_MSG); 
  288. X    }
  289. X        IDX_SIZE = (long) fst.st_size;
  290. X
  291. X    if(bef_buff[0] != '\0'){
  292. X        sprintf(s, "%s", bef_buff);        
  293. X        IS_BUFFERED = 1;
  294. X        bef_rec++;
  295. X        goto BUFFERING;
  296. X    }
  297. X        else 
  298. X        IS_BUFFERED = 0;
  299. X
  300. X
  301. X    bef_rec = 0;
  302. X
  303. X    ansi("md");
  304. X    prompt[0] = '\0';
  305. X
  306. X    switch (USER.prompt) {
  307. X        case 1:
  308. X            strcat(prompt, (unsigned char *) mytime(0));
  309. X            break;
  310. X        case 2:    
  311. X            strcat(prompt, NG);
  312. X            break;
  313. X        case 3:    
  314. X            strcat(prompt, (unsigned char *) rates());
  315. X            break;
  316. X    }
  317. X    printf("\n[%s] %s > ", prompt, LOP06_MSG);
  318. X    ansi("me");
  319. X    if (USER.bell == 1) printf("%c", BELL);
  320. X
  321. X    befehl[0] = '\0';
  322. X
  323. X#ifdef _CORELEFT
  324. X    if(coreleft() < _CORELEFT){
  325. X        sprintf(s, "%d", _CORELEFT);
  326. X        nerror( "loop.c", 288, "loop", "Speicherplatz kleiner ", s );
  327. X    }
  328. X#endif
  329. X
  330. X
  331. X    do {
  332. X        strcpy(s, (unsigned char *) getline(60, 11001, 32, befehl));
  333. X        to_del = length(befehl);
  334. X
  335. X        if (s[0] == 48) {
  336. X            headline( LOP05_MSG );
  337. X            printf("\n");
  338. X            for (i = 9; i > 0; i--) {
  339. X                printf(" %d: %s\n", i, prev_befehl[i]);
  340. X            }
  341. X            goto FASTER;
  342. X        }
  343. X        if ((s[0] > 48) && (s[0] < 58)) {
  344. X            sprintf(befehl, "%s", prev_befehl[(s[0] - 48)]);
  345. X            printf("%c", CR);
  346. X            if (ansi("ce") == 1) {
  347. X                printf("                                                               ");
  348. X            }
  349. X            ansi("md");
  350. X            printf("%c[%s] %s > ", CR, prompt, LOP06_MSG);
  351. X            ansi("me");
  352. X        }
  353. X    } while ((s[0] > 47) && (s[0] < 58));
  354. X
  355. X    
  356. X        if(makro_definition(s) != 0) goto FASTER;
  357. X
  358. X
  359. X    BUFFERING:
  360. X
  361. X    if((bef_rec > MAKRO_MAX_REK) && (USER.level < (ADMIN_LEV+1))){
  362. X        bef_buff[0] = '\0';
  363. X        goto FASTER;
  364. X    }
  365. X
  366. X        
  367. X    strcpy(t, (unsigned char *) makro(s));
  368. X    strcpy(s, t); 
  369. X        
  370. X    while ((s[0] == 32) || (s[0] == '.')) {
  371. X        sprintf(befehl, "%s", (unsigned char *) strcopy(s, 1, length(s)));
  372. X        sprintf(s, "%s", befehl);
  373. X    }
  374. X
  375. X    i = 0; ok = 0;
  376. X    while((ok == 0) && (s[i] != '\0')){
  377. X        if(s[i] == ','){ 
  378. X            strcpy(bef_buff, (unsigned char *) strcopy(s, (i+1), length(s)));
  379. X            s[i] = '\0';
  380. X            ok++;
  381. X        }            
  382. X        i++;
  383. X    }
  384. X    if(ok == 0) bef_buff[0] = '\0';
  385. X    
  386. X    strcpy(befehl, (unsigned char *) cut_bef(s));
  387. X    strcpy(argument, (unsigned char *) cut_arg(s));
  388. X    strcpy(s, (unsigned char *) upcased(befehl));
  389. X    strcpy(befehl, s);
  390. X
  391. X    sprintf(s, "%s %s", befehl, argument);
  392. X
  393. X    if (wasok == 1) {
  394. X        ok = 0;
  395. X        for (i = 9; i > 0; i--) {
  396. X            if ((strcomp(s, prev_befehl[i]) == 0) && (strcomp(prev_befehl[i], s) == 0))
  397. X                ok++;
  398. X        }
  399. X        if ((ok == 0) && (befehl[0] > 32)) {
  400. X            for (i = 9; i > 1; i--) {
  401. X                sprintf(prev_befehl[i], "%s", prev_befehl[(i - 1)]);
  402. X            }
  403. X            sprintf(prev_befehl[1], "%s %s", befehl, argument);
  404. X        }
  405. X    }
  406. X    else {
  407. X        sprintf(prev_befehl[1], "%s %s", befehl, argument);
  408. X    }
  409. X
  410. X    sprintf(s, "[%s] %s %s", LOP04_MSG, befehl, argument);
  411. X    control(s, 3);
  412. X
  413. X    sprintf(s, "%s %s", befehl, argument);
  414. X    whodo(s);
  415. X
  416. X
  417. X    wasok = 0;
  418. X
  419. X    if (befehl[0] == '"') {
  420. X        ansi("md");
  421. X        /*
  422. X        printf(" <- Nein, so daemlich kann kein User sein !\n");
  423. X        */
  424. X        printf(" %s\n", LOP07_MSG);
  425. X        ansi("me");
  426. X        goto FASTER;
  427. X    }
  428. X    if (befehl[0] == '\0') goto FASTER;
  429. X
  430. X
  431. X    if(argument[0] == '?') {
  432. X        strcpy(argument, befehl);
  433. X        strcpy(befehl, BEF[BB7].befehl);
  434. X     }
  435. X
  436. X/*  ?  */
  437. X
  438. X    if (befehl[0] == '?') {
  439. X        if (argument[0] != '*') {
  440. X            sprintf(s, " %s %d) ", LOP08_MSG, USER.level);
  441. X        } else {
  442. X            sprintf(s, " %s ", LOP09_MSG, USER.level);
  443. X        }
  444. X        headline(s);
  445. X        printf("\n");
  446. X        bef("?", argument);
  447. X        goto FASTER;
  448. X    }
  449. X
  450. X/* <BREAK> */
  451. X
  452. X    if (strcomp(befehl, "<BREAK>") == 0) {
  453. X        printf("!@#?");
  454. X        ansi("md");
  455. X        printf(" %s", LOP10_MSG);
  456. X        ansi("me");
  457. X        printf("\n");
  458. X        goto FASTER;
  459. X    }
  460. X    wasok = 1;
  461. X
  462. X
  463. X    switch (bef(befehl, argument)) {
  464. X
  465. X        case 275:        /* RELOGIN */
  466. X
  467. X        logout();
  468. X        intro();
  469. X        break;
  470. X
  471. X
  472. X        case 240:        /* MINIX */
  473. X
  474. X        if (argument[0] == '\0') {
  475. X            ansi("md");
  476. X            printf(" %s\n", LOP11_MSG);
  477. X            ansi("me");
  478. X        }
  479. X        else {
  480. X            printf("\n\n");
  481. X            sprintf(s, "exec %s %s %d %d", RSH, argument, OLDUID, OLDGID);
  482. X            system(s);
  483. X        }
  484. X        break;
  485. X
  486. X
  487. X        case 110:
  488. X        case 120:        /* + -  */
  489. X
  490. X        scanner(befehl[0]);
  491. X        break;
  492. X
  493. X
  494. X        case 190:        /* HILFE */
  495. X
  496. X        printf("\n\n");
  497. X        if (argument[0] < 33)
  498. X            help("=");
  499. X        else {
  500. X            if(argument[0] == '*'){    
  501. X                help("*");
  502. X            }
  503. X            else{
  504. X                strcpy(s, "#");
  505. X                strcat(s, upcased(argument));
  506. X                if (help(s) < 1) {
  507. X                    ansi("md");
  508. X                    printf("%s \"%s\" %s\n", LOP12_MSG, argument, LOP13_MSG);
  509. X                    ansi("me");
  510. X                }
  511. X            }
  512. X        }
  513. X        break;
  514. X
  515. X
  516. X        case 150:        /* BRETT */
  517. X
  518. X        if(strcomp("**", argument) == NULL) strcpy(argument, "^");
  519. X        brett(argument);
  520. X        break;
  521. X
  522. X
  523. X        case 130:        /* ANRUFER */
  524. X
  525. X        if(argument[0] == '#'){
  526. X            statistik();
  527. X            break;
  528. X        }
  529. X
  530. X        if(argument[0] == '%'){
  531. X            headline( LOP34_MSG );
  532. X            printf("%s\n", LOP35_MSG);
  533. X            printf("===============================================================================\n");
  534. X            printf("%s ..", LOP29_MSG);
  535. X    
  536. X            switch( (fpid = fork()) ){
  537. X                case -1 :
  538. X                    break;
  539. X                case  0 : 
  540. X                    while(1){
  541. X                        printf(".");
  542. X                        sleep(2);
  543. X                    }    
  544. X                    break;
  545. X            }
  546. X            sprintf(t, "%s/%d.srt", TMP, getpid());
  547. X            sprintf(l, SECONDCUT, CALLS, t);
  548. X            system(l);             
  549. X            kill( fpid, SIGKILL );
  550. X            (void) wait( &fpid );
  551. X            printf("%c", CR);
  552. X            show(t, 9999, USER.more + 100);
  553. X            unlink(t);
  554. X            break;
  555. X        }
  556. X
  557. X        headline( LOP14_MSG );
  558. X        printf("%s\n", LOP15_MSG);
  559. X        printf("===============================================================================\n");
  560. X
  561. X        if (argument[0] != '*') {
  562. X            show(CALLS, 19, USER.more);
  563. X        }
  564. X        else {
  565. X            show(CALLS, 9999, USER.more + 100);
  566. X        }
  567. X        break;
  568. X
  569. X
  570. X        case 200:        /* INHALT */
  571. X
  572. X        inhalt2(argument, 'I');
  573. X        break;
  574. X
  575. X
  576. X        case 210:        /* LESEN */
  577. X
  578. X        dummy = (pruefe(argument));
  579. X        if (dummy == 0) lesen(argument);
  580. X        if (dummy == -1) lesen2(argument, 'L');
  581. X        break;
  582. X
  583. X
  584. X
  585. X        case 230:        /* SCHREIBEN */
  586. X
  587. X        if (USER.level < WRITE_IN_LEV) {
  588. X            ansi("md");
  589. X            printf(" %s\n", LOP16_MSG);
  590. X            ansi("me");
  591. X        }
  592. X        else
  593. X            schreiben(argument);
  594. X        break;
  595. X
  596. X
  597. X        case 220:        /* LOESCHEN */
  598. X
  599. X        dummy = (pruefe(argument));
  600. X        if (dummy == 0) loeschen(argument);
  601. X        if (dummy == -1) loeschen2(argument, 'D');
  602. X        break;
  603. X
  604. X
  605. X        case 160:        /* BRIEF */
  606. X
  607. X        if (USER.level < WRITE_IN_LEV) {
  608. X            ansi("md");
  609. X            printf(" %s\n", LOP16_MSG);
  610. X            ansi("me");
  611. X        }
  612. X        else
  613. X            if((brief(argument) == 0) && (strcomp(GUEST, USER.name) != 0)){
  614. X                sprintf(s, "%s?", USER.name);
  615. X                brief(s);
  616. X                sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  617. X                stat(s, &fst);
  618. X                    IDX_SIZE = (int) fst.st_size;
  619. X            }
  620. X            else bef_buff[0] = '\0';
  621. X        break;
  622. X
  623. X
  624. X        case 170:        /* CHAT */
  625. X
  626. X        sprintf(s, "exec %s %s \"%s\" %d %d", RSH, CHAT, USER.nick, OLDUID, OLDGID);
  627. X        system(s);
  628. X        break;
  629. X
  630. X
  631. X        case 250:        /* PM */
  632. X
  633. X        strcpy(BRETT, "PM");
  634. X        printf("\n");
  635. X        sprintf(NG, "%s.PM", USER.name);
  636. X        sprintf(INHALT, "%s/usr/%d/INDEX", HOME, USER.id);
  637. X        break;
  638. X
  639. X
  640. X        case 260:        /* POSTFACH */
  641. X
  642. X        postfach("*");
  643. X        break;
  644. X
  645. X
  646. X        case 300:        /* USER */
  647. X
  648. X        userliste(argument);
  649. X        break;
  650. X
  651. X
  652. X        case 140:        /* ANSAGE */
  653. X
  654. X        ansage();
  655. X        break;
  656. X
  657. X
  658. X        case 310:        /* UNTERSCHRIFT */
  659. X
  660. X        unterschrift();
  661. X        break;
  662. X
  663. X
  664. X        case 320:        /* VERSION */
  665. X
  666. X        printf("\n\n");
  667. X        ansi("md");
  668. X        printf("Version: ");
  669. X        ansi("me");
  670. X        printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  671. X
  672. X        if(argument[0] == '#'){
  673. X            ansi("md");
  674. X            printf("\nMein spezieller Dank gilt folgenden Mitarbeitern, Beta-Testern und Ratgebern: \n\n");
  675. X            ansi("me");
  676. X            
  677. X            printf("andreas@xenox.ruhr.de       - fuer den \"NewsFeed\" und seine Geduld\n");
  678. X            printf("                              bei unseren \"Sonderwuenschen\"\n\n");
  679. X
  680. X            printf("az@unnet.w.open.de          - fuer seinen Einsatz beim \"Einrichten\"\n");
  681. X            printf("                              der Mailbox und der PD-Portierung\n\n");
  682. X
  683. X            printf("joergg@unnet.ruhr.sub.org   - fuer seine Ideen, Tips, konstruktive\n");
  684. X            printf("                              Kritik und gruendliche Tests\n\n");        
  685. X
  686. X            printf("klausr@skylink.ruhr.sub.org - fuer viele Vorschlaege, und vor allem\n");            
  687. X            printf("                              fuer seine praesizen Fehlerbeschreibungen\n\n");            
  688. X
  689. X            printf("stefans@coduck.ruhr.sub.org - fuer seine Hilfe bei der Installation\n");
  690. X            printf("                              der 386er Patches und der PD-Beschaffung\n\n");
  691. X
  692. X            printf("walterb@weller.ruhr.sub.org - fuer seine Unterstuetzung bei der Portierung auf\n");
  693. X            printf("                              UNIX SVR3 und bei der Installation\n\n");
  694. X
  695. X            printf("hergo@ivcmd.boerde.de       - fuer seine Hilfe bei der Bildung einer Referenz-\n");
  696. X            printf("                              Version zur Verwendung von CDIFFs\n\n");
  697. X            
  698. X        }
  699. X        
  700. X        if(argument[0] == '*'){
  701. X            ansi("md");
  702. X            printf("\n%s ", LOP17_MSG);
  703. X            ansi("me");
  704. X#ifdef _SYS7
  705. X            printf("-D_SYS7 ");
  706. X#endif
  707. X#ifdef _MBOX
  708. X            printf("-D_MBOX ");
  709. X#endif
  710. X#ifdef _MINIX
  711. X            printf("-D_MINIX ");
  712. X#endif
  713. X#ifdef _ESTDIO
  714. X            printf("-D_ESTDIO ");
  715. X#endif
  716. X#ifdef _CORELEFT
  717. X            printf("-D_CORELEFT ");
  718. X#endif
  719. X#ifdef _DATESTAMP
  720. X            printf("-D_DATESTAMP ");
  721. X#endif
  722. X#ifdef _BAUDRATE
  723. X            printf("-D_BAUDRATE ");
  724. X#endif
  725. X#ifdef _MULTIMEDIA
  726. X            printf("-D_MULTIMEDIA ");
  727. X#endif
  728. X#ifdef _METAMAIL
  729. X            printf("-D_METAMAIL ");
  730. X#endif
  731. X#ifdef _UMLAUT
  732. X            printf("-D_UMLAUT ");
  733. X#endif
  734. X
  735. X            printf("\n");
  736. X        }
  737. X
  738. X        break;
  739. X
  740. X
  741. X        case 270:        /* PORTINFO */
  742. X
  743. X        port( argument );
  744. X        break;
  745. X
  746. X
  747. X        case 280:        /* SETUP */
  748. X
  749. X        sprintf(s, "%s", NG);
  750. X        sprintf(t, "%s", BRETT);
  751. X        setup();
  752. X        if (strcomp("PM", t) != 0) brett(s);
  753. X        break;
  754. X
  755. X
  756. X        case 125:        /* ADMIN */
  757. X
  758. X        sprintf(s, "%s", NG);
  759. X        sprintf(t, "%s", BRETT);
  760. X        admin();
  761. X        if (strcomp("PM", t) != 0) brett(s);
  762. X        break;
  763. X
  764. X
  765. X        case 205:        /* ID */
  766. X
  767. X        if(strcomp("-c", argument) == 0){ /* Memory fault - core dumped */
  768. X            printf("\n\nDebug-Modus: ");
  769. X            fclose(0);   
  770. X            break;
  771. X        }
  772. X
  773. X        if(strcomp("*", argument) == 0){
  774. X            BAUDRATE = baudrate( MAX_BPS );
  775. X            printf("\n\n>>> Baudrate %d\n", BAUDRATE);
  776. X            break;
  777. X        }
  778. X
  779. X        if(strcomp("#", argument) == 0){
  780. X            printf("\n\n>>> Coreleft %d\n", coreleft());
  781. X            break;
  782. X        }
  783. X
  784. X        printf("\n\n>>> %s (UID %d|%d|%d) (GID %d|%d|%d)\n", MYNAME,
  785. X               getuid(), geteuid(), OLDUID,
  786. X               getgid(), getegid(), OLDGID);
  787. X        break;
  788. X
  789. X
  790. X        case 215:        /* LEVEL */
  791. X
  792. X        show_level();
  793. X        break;
  794. X
  795. X
  796. X        case 290:        /* STATUS */
  797. X
  798. X        status();
  799. X        break;
  800. X
  801. X
  802. X        case 330:         /* MAKRO */
  803. X
  804. X        set_makros();
  805. X        break;
  806. X
  807. X
  808. X        case 340:        /* WEITERLEITEN */
  809. X
  810. X        weiterleiten( argument );
  811. X        break;
  812. X
  813. X
  814. X        case 350:           /* SLEEP */
  815. X
  816. X        dummy = atoi( argument );
  817. X        if(dummy < 1) dummy = 1;
  818. X        printf("\n");
  819. X        ansi( "mr" );
  820. X        printf(" %s ... ", LOP29_MSG);
  821. X        ansi( "me" );    
  822. X        sleep( dummy );
  823. X        break;        
  824. X
  825. X
  826. X        case 360:        /* KEYPRESSED */
  827. X
  828. X        printf("\n");
  829. X        ansi("mr");
  830. X        printf(" Taste ! ");
  831. X        ansi("me");
  832. X        dummy = getint();
  833. X        if((dummy == CTRL_X) || (dummy == 'x') || (dummy == 'q')){
  834. X            bef_buff[0] = '\0';
  835. X            printf("\n");
  836. X        }
  837. X        break;
  838. X
  839. X
  840. X        case 370:        /* DATUM */
  841. X        
  842. X        ansi("md");
  843. X        printf("\n\n%s ", LOP18_MSG);
  844. X        ansi("me"); 
  845. X        printf("%s, ", (unsigned char *) mydate( 2 ));
  846. X        printf("%s\n",  (unsigned char *) mydate( 0 ));
  847. X        break;
  848. X    
  849. X
  850. X        case 380:        /* ZEIT */
  851. X
  852. X        ansi("md");
  853. X        printf("\n\n%s ", LOP19_MSG);
  854. X        ansi("me");
  855. X        printf("%s\n", (unsigned char *) mytime( 0 ));
  856. X        ansi("md");
  857. X        printf("Online: ");
  858. X        ansi("me");
  859. X        time(&time_now);
  860. X        printf("%d %s\n",  (int) time_now - time_start, LOP20_MSG);
  861. X        break;
  862. X
  863. X
  864. X       case 390:        /* SPIELE */
  865. X
  866. X        games();
  867. X        break;
  868. X    
  869. X
  870. X        case 400:        /* RICHTUNG */
  871. X
  872. X        ansi("md");
  873. X        printf("\n\n%s ", LOP21_MSG);
  874. X        ansi("me");
  875. X
  876. X        if (USER.leserichtung == 1) {
  877. X            USER.leserichtung = 2;
  878. X            printf("%s\n", LOP22_MSG);
  879. X        }
  880. X        else {
  881. X            USER.leserichtung = 1;
  882. X            printf("%s\n", LOP22aMSG);
  883. X        }
  884. X        break;
  885. X
  886. X
  887. X        case 410:           /* STATISTIK */
  888. X
  889. X        if ((argument[0] != '#') && (argument[0] != '$') && (argument[0] != '%') && (argument[0] != '!') && (argument[0] != '>')) {
  890. X            headline( LOP23_MSG );
  891. X            printf("%s\n", LOP24_MSG);
  892. X            printf("===============================================================================\n");
  893. X
  894. X            if (argument[0] != '*') {
  895. X                show(MB_DLOG, 19, USER.more);
  896. X            }
  897. X            else {
  898. X                show(MB_DLOG, 9999, USER.more + 100);
  899. X            }
  900. X        }
  901. X        if(argument[0] == '$') {
  902. X            headline( LOP25_MSG );
  903. X            show(UUCPCOSTS, 9999, USER.more);
  904. X        }
  905. X           if(argument[0] == '#') {
  906. X            headline( LOP26_MSG );
  907. X            printf("%s\n", LOP27_MSG);
  908. X            printf("===============================================================================\n");
  909. X
  910. X            show(PDLOG, 9999, USER.more + 100);
  911. X        }
  912. X        if(argument[0] == '>') {
  913. X            headline( LOP27aMSG );
  914. X            printf("%s\n", LOP27bMSG);
  915. X            printf("===============================================================================\n");
  916. X
  917. X            show(XMDLOG, 9999, USER.more + 100);
  918. X        }
  919. X        if(argument[0] == '%') {
  920. X            headline( LOP32_MSG );
  921. X            printf("%s\n", LOP33_MSG);
  922. X            printf("===============================================================================\n");
  923. X            printf("%s ..", LOP29_MSG);
  924. X    
  925. X            switch( (fpid = fork()) ){
  926. X                case -1 :
  927. X                    break;
  928. X                case  0 : 
  929. X                    while(1){
  930. X                        printf(".");
  931. X                        sleep(2);
  932. X                    }    
  933. X                    break;
  934. X            }
  935. X            sprintf(t, "%s/%d.srt", TMP, getpid());
  936. X            sprintf(l, SORTEDCUT, PDLOG, t);
  937. X            system(l);             
  938. X            kill( fpid, SIGKILL );
  939. X            (void) wait( &fpid );
  940. X            printf("%c", CR);
  941. X            show(t, 9999, USER.more + 100);
  942. X            unlink(t);
  943. X        }
  944. X        if(argument[0] == '!') {
  945. X            headline( " OUTDIAL " );
  946. X            show("/local/mbox/etc/outdial.log", 9999, USER.more);
  947. X        }
  948. X
  949. X        break;
  950. X
  951. X        case 430:        /* SUCHEN */
  952. X
  953. X        suchen( argument );
  954. X        break;    
  955. X
  956. X                    
  957. X        case 420:        /* RING */
  958. X
  959. X        ende = 1;
  960. X        break;
  961. X
  962. X
  963. X        case 440:        /* DOWNLOAD */
  964. X
  965. X        download( argument );
  966. X        break;
  967. X
  968. X         case 450:        /* OUTDIAL */
  969. X
  970. X        outdial();
  971. X        break;
  972. X
  973. X        case 460:        /* AREA */
  974. X
  975. X        if((strcomp("++", argument) == 0) || (strcomp("--", argument) == 0)){
  976. X            scanner( argument[0] + 1500 );
  977. X        }
  978. X        else{
  979. X            scanner( argument[0] + 500 );
  980. X        }    
  981. X        break;
  982. X
  983. X
  984. X        case 470:        /* SYSINFO */
  985. X
  986. X        headline( " SYSiNFO " );
  987. X        show(SYSINFO, 9999, USER.more);
  988. X        break;
  989. X
  990. X        case 480:        /* EDIT */
  991. X
  992. X        edit( argument );
  993. X        break;
  994. X
  995. X        case 490:        /* DIS */
  996. X
  997. X        dis( argument );
  998. X        break;
  999. X
  1000. X        case 500:        /* UMLAUT */
  1001. X
  1002. X        ansi("md");
  1003. X        printf("\n\n%s ", LOP33aMSG);
  1004. X        ansi("me");
  1005. X
  1006. X        if (UMLAUT_MODUS == 4) {
  1007. X            UMLAUT_MODUS = USER.schluessel[2];
  1008. X            switch(UMLAUT_MODUS){
  1009. X                case 1 : printf("%s\n", ADM70dMSG);
  1010. X                     break;
  1011. X                case 2 : printf("%s\n", ADM70eMSG);
  1012. X                     break;
  1013. X                case 3 : printf("%s\n", ADM70fMSG);
  1014. X                     break;
  1015. X                case 4 : printf("%s\n", ADM70gMSG);
  1016. X                     break;
  1017. X            }
  1018. X        }
  1019. X        else {
  1020. X            UMLAUT_MODUS = 4;
  1021. X            printf("%s\n", LOP33bMSG);
  1022. X        }
  1023. X        break;
  1024. X
  1025. X        case 510:        /* MONITOR */
  1026. X
  1027. X        i = atoi( argument );
  1028. X         if(i < 1) i = 15;
  1029. X
  1030. X        switch( (fpid = fork()) ){
  1031. X            case -1 :
  1032. X                break;
  1033. X            case  0 : 
  1034. X                while(1){
  1035. X                    headline( LOP14_MSG );
  1036. X                    printf("%s\n", LOP15_MSG);
  1037. X                    printf("===============================================================================\n");
  1038. X                    show(CALLS, 19, USER.more);
  1039. X                    sleep( i ); 
  1040. X                    statistik();
  1041. X                    sleep( i ); 
  1042. X                    port( "" );
  1043. X                    sleep( i ); 
  1044. X                    headline( LOP23_MSG );
  1045. X                    printf("%s\n", LOP24_MSG);
  1046. X                    printf("===============================================================================\n");
  1047. X                    show(MB_DLOG, 19, USER.more);
  1048. X                    sleep( i ); 
  1049. X                }    
  1050. X        }
  1051. X        c = getch();
  1052. X        kill( fpid, SIGKILL );
  1053. X        (void) wait( &fpid );        
  1054. X        break;
  1055. X
  1056. X        case 1000:        /* User Defined Command */
  1057. X
  1058. X        /* See 'befehl.c' how that works ;-) */
  1059. X        break;
  1060. X
  1061. X        case 180:        /* ENDE */
  1062. X
  1063. X#ifdef _MINIX
  1064. X        if (tty() >= FIRST_EX_TTY) {
  1065. X            printf("\n\n");
  1066. X            ansi("mr");
  1067. X            printf("%c%s [%c, %c] > ", CR, LOP28_MSG, GBL06_MSG, GBL07_MSG);
  1068. X            ansi("me");
  1069. X            
  1070. X            c = yesno();
  1071. X        } else
  1072. X#endif
  1073. X            c = GBL06_MSG;
  1074. X
  1075. X
  1076. X        if (c == GBL06_MSG)
  1077. X            ende = 1;
  1078. X        else
  1079. X            printf("\n");
  1080. X
  1081. X        if(argument[0] == '*'){
  1082. X            USER.lasttime = LASTTIME;
  1083. X            strcpy(USER.lastlog, (unsigned char *) datereconv( LASTLOG ));
  1084. X        }
  1085. X        else{
  1086. X            strcpy(s, (unsigned char *) mydate(0));
  1087. X            s[10] = '\0';
  1088. X            strcpy(USER.lastlog, s);
  1089. X            strcpy(s, (unsigned char *) mytime(1));
  1090. X            USER.lasttime = timeconv(s);
  1091. X        }
  1092. X
  1093. X        break;
  1094. X
  1095. X        case -1:        /* LEVEL ??? */
  1096. X
  1097. X        wasok = 0;
  1098. X        ansi("md");
  1099. X        printf(" %s %d ...\n", LOP30_MSG, USER.level);
  1100. X        ansi("me");
  1101. X        break;
  1102. X
  1103. X        default:
  1104. X
  1105. X        wasok = 0;
  1106. X        ansi("md");
  1107. X        printf(" %s\n", LOP31_MSG);
  1108. X        ansi("me");
  1109. X    }
  1110. X
  1111. X  } while (ende == 0);
  1112. X}
  1113. END_OF_FILE
  1114.   if test 22323 -ne `wc -c <'src/loop.c'`; then
  1115.     echo shar: \"'src/loop.c'\" unpacked with wrong size!
  1116.   fi
  1117.   # end of 'src/loop.c'
  1118. fi
  1119. if test -f 'src/mail.c' -a "${1}" != "-c" ; then 
  1120.   echo shar: Will not clobber existing file \"'src/mail.c'\"
  1121. else
  1122.   echo shar: Extracting \"'src/mail.c'\" \(22275 characters\)
  1123.   sed "s/^X//" >'src/mail.c' <<'END_OF_FILE'
  1124. X/***************************************************************************/
  1125. X/*        PROGRAMM  ix/Mbox                           */
  1126. X/*             DATEI  mail.c                           */
  1127. X/*        FUNKTIONEN  brief()                           */
  1128. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1129. X/*  LETZTE AENDERUNG  16.11.1992                       */
  1130. X/***************************************************************************/
  1131. X
  1132. X#include <sys/types.h>
  1133. X#include <sys/stat.h>
  1134. X#include <unistd.h>
  1135. X#include <stdio.h>
  1136. X#include <fcntl.h>
  1137. X#include <time.h>
  1138. X
  1139. X#include "mbox.h"
  1140. X
  1141. X
  1142. X
  1143. X/***************************************************************************/
  1144. X/*      FUNKTION  brief()                           */
  1145. X/*  BESCHREIBUNG  Eine persoenliche Nachricht wird verschickt. Je nach     */
  1146. X/*          Empfaenger-Adresse und Parameter wird die Post ins       */
  1147. X/*          MBox-interne Mailsystem geschickt, oder an MAIL          */
  1148. X/*          weitergleitet. Die Adresse des Empfaengers wird ent-     */
  1149. X/*          weder als Parameter uebergeben, oder aus einer Datei     */
  1150. X/*          gefiltert, auf die geantwortet werden soll (REPLY-Mode). */
  1151. X/*     PARAMETER  arg  =  "~REPLY~"    =  REPLY-Modus aktivieren           */
  1152. X/*          arg  =  "Empfaenger" =  verwertbare Adresse fuer das     */
  1153. X/*              interen Mail-System oder MAIL.                   */
  1154. X/*     RUECKGABE   -1  =  Abbruch                                          */
  1155. X/***************************************************************************/
  1156. X
  1157. Xint brief(arg)
  1158. Xunsigned char arg[];
  1159. X{
  1160. X  FILE *fp;
  1161. X  FILE *ff;
  1162. X  FILE *ft;
  1163. X  int fd;
  1164. X  int i, j;
  1165. X  int ok;
  1166. X  struct userdaten LOOSER;
  1167. X
  1168. X  time_t timer;
  1169. X  struct tm *timeptr;
  1170. X
  1171. X  int receiver;
  1172. X  int mail_id;
  1173. X  int EX_PM = 0;
  1174. X  int REPLY = 0;
  1175. X  int lines = 0;
  1176. X  int WEITERLEITEN = 0;
  1177. X  int HOLD = 0;
  1178. X  int UMLEITUNG = 0;
  1179. X  int KOPIE = 0;
  1180. X
  1181. X  unsigned char s[STRING];
  1182. X  unsigned char t[STRING];
  1183. X  unsigned char TEP[STRING];
  1184. X  unsigned char REP[STRING];
  1185. X  unsigned char f[STRING];
  1186. X  unsigned char subject[STRING];
  1187. X  unsigned char from[STRING];
  1188. X  unsigned char rec_char[STRING];
  1189. X  unsigned char ex[LONGSTRING];
  1190. X  unsigned char user[STRING];
  1191. X  unsigned char mesg_id[STRING];
  1192. X  unsigned char refs[STRING];
  1193. X  unsigned char date[STRING];
  1194. X  unsigned char c;
  1195. X  unsigned char protokoll;
  1196. X  unsigned char lf;
  1197. X  unsigned char pubdir[STRING];
  1198. X  unsigned char dummy[STRING];
  1199. X  unsigned char username[STRING];
  1200. X  unsigned char reply[STRING];
  1201. X  unsigned char priority[STRING];
  1202. X  unsigned char action[STRING];
  1203. X  unsigned char cc[STRING];
  1204. X  unsigned char bcc[STRING];
  1205. X  unsigned char encrypted[STRING];
  1206. X  unsigned char comments[STRING];
  1207. X  unsigned char keywords[STRING];
  1208. X  unsigned char fortune[STRING];
  1209. X  unsigned char content[STRING];
  1210. X  unsigned char receipt[STRING];
  1211. X
  1212. X  long cont_length = 0;
  1213. X
  1214. X  unsigned char YOUR_SITE[STRING];
  1215. X
  1216. X  int BINFILE;
  1217. X  int news_reply = 0;
  1218. X
  1219. X  struct stat fst;
  1220. X
  1221. X
  1222. X  i = 0;
  1223. X  ok = 0;
  1224. X
  1225. X  mesg_id[0] = '\0';
  1226. X
  1227. X  if (arg[0] == '\0') {
  1228. X    ansi("md");
  1229. X    printf(" %s\n", MAL03_MSG);
  1230. X    ansi("me");
  1231. X    return -1;
  1232. X  }
  1233. X  EX_PM = 0;
  1234. X
  1235. X  i = 0;
  1236. X  strcpy(t, USER.name);
  1237. X  while (t[i] != '\0') {
  1238. X    if (t[i] == ' ') t[i] = '.';
  1239. X    i++;
  1240. X  }
  1241. X  strcpy(username, t);
  1242. X  action[0] = '\0';
  1243. X  priority[0] = '\0';
  1244. X  encrypted[0] = '\0';
  1245. X  keywords[0] = '\0';
  1246. X  comments[0] = '\0';
  1247. X  cc[0] = '\0';
  1248. X  bcc[0] = '\0';
  1249. X  fortune[0] = '\0';
  1250. X  content[0] = '\0';
  1251. X  receipt[0] = '\0';
  1252. X
  1253. X#ifdef _UMLAUT
  1254. X  if(UMLAUT_MODUS < 3) strcpy(content, (unsigned char *) "text/plain; charset=iso-8859-1");
  1255. X#endif
  1256. X
  1257. X  i = 0;
  1258. X  while (arg[i] != '\0') {
  1259. X    if ((arg[i] == '!') || (arg[i] == '@') || (arg[i] == '%')) EX_PM++;
  1260. X    i++;
  1261. X  }
  1262. X
  1263. X  if ((EX_PM > 0) && (USER.level < MAILOUT_LEV)) {
  1264. X    ansi("md");
  1265. X    printf("\n\n%s (%d) %s\n", MAL04_MSG, MAILOUT_LEV, MAL05_MSG);
  1266. X    ansi("me");
  1267. X    return -1;
  1268. X  }
  1269. X
  1270. X  if(arg[length(arg) -1] == '?'){
  1271. X    arg[length(arg) -1] = '$';
  1272. X    HOLD++;
  1273. X    KOPIE++;
  1274. X  }
  1275. X
  1276. X  if(arg[length(arg) -1] == '$'){
  1277. X    WEITERLEITEN++;
  1278. X    arg[length(arg) -1] = '\0';
  1279. X    sprintf(TEP, "%s/usr/%d/.lastletter", HOME, USER.id);
  1280. X    sprintf(t, "%s/usr/%d/.lastsubject", HOME, USER.id);
  1281. X    fp = fopen( t, "r" );
  1282. X    if(fp == NULL) {
  1283. X        return -1; 
  1284. X    }
  1285. X    fgets(s, 80, fp);
  1286. X    fclose(fp);
  1287. X    if(HOLD == 0){
  1288. X        sprintf(subject, "%s %s", MAL06_MSG, s);
  1289. X        UMLEITUNG++;
  1290. X    }else
  1291. X        sprintf(subject, "%s", s);
  1292. X  }
  1293. X
  1294. X  user[0] = '\0';
  1295. X  strcat(user, arg);
  1296. X
  1297. X  if(WEITERLEITEN != 0) goto TRY_AGAIN;
  1298. X
  1299. X  if (strcomp("~REPLY~", arg) == 0) {
  1300. X    REPLY++;
  1301. X    sprintf(REP, "%s/%dRep", TMP, getpid());
  1302. X    sprintf(TEP, "%s/%dTep", TMP, getpid());
  1303. X    fp = fopen(REP, "r");
  1304. X    if (fp == NULL) {
  1305. X        nerror("mail.c", 278, "brief", "Datei-Lesefehler", REP);
  1306. X    }
  1307. X    fgets(s, 80, fp    );            /* HEADER: Autor */
  1308. X
  1309. X    sprintf(dummy, "%s %s", GBL01_MSG, X_MAIL_DEMON);
  1310. X
  1311. X    if ((strcomp(GBL01_MSG, s) == 0) && (strcomp(dummy, s) != 0)) {
  1312. X        strcpy(user, (unsigned char *) strcopy(s, (1+strlen(GBL01_MSG)), 80));
  1313. X
  1314. X        fgets(s, 80, fp);        /* HEADER: Datum */
  1315. X        fgets(s, 80, fp);        /* HEADER: Betreff */
  1316. X
  1317. X        strcpy(t, (unsigned char *) strcopy(s, (1+strlen(GBL03_MSG)), 80));
  1318. X        subject[0]= '\0';
  1319. X        if (strcomp("Re: ", t) != 0) {
  1320. X            strcpy(subject, "Re: ");
  1321. X        }
  1322. X        strcat(subject, (unsigned char *) stripped(t));
  1323. X
  1324. X        fgets(s, 80, fp);    /* HEADER: Leer */
  1325. X        fgets(s, 80, fp);    /* HEADER: Leer */
  1326. X    }
  1327. X    else {        /* UUCP-Header (!MBox) */
  1328. X
  1329. X        sprintf(subject, MAL07_MSG);
  1330. X        refs[0] = '\0';
  1331. X        mesg_id[0] = '\0';
  1332. X
  1333. X        ok = -1;
  1334. X
  1335. X        while ((ok < 1) && (fgets(s, 80, fp) != NULL)) {
  1336. X            if (strcomp("Lines: ", s)      == 0) ok = 1;
  1337. X            if (strcomp("Date: ",  s)      == 0) {
  1338. X                strcpy(date, (unsigned char *) strcopy(s, 6, 80));
  1339. X            }
  1340. X            if (strcomp("Newsgroups: ", s) == 0) news_reply++;
  1341. X            if (strcomp("Subject: ", s)    == 0) {
  1342. X                subject[0] = '\0';
  1343. X                strcpy(t, (unsigned char *) strcopy(s, 9, 80));
  1344. X                if (strcomp("Re: ", t) != 0) {
  1345. X                    sprintf(subject, "%s", "Re: ");
  1346. X                }
  1347. X                strcat(subject, (unsigned char *) stripped(t));
  1348. X            }
  1349. X            if (strcomp("Message-Id: ", s) == 0) {
  1350. X                strcpy(mesg_id, (unsigned char *) strcopy(s, 12, 80));
  1351. X            }
  1352. X            if (strcomp("From: ", s) == 0) {
  1353. X                strcpy(from, (unsigned char *) strcopy(s, 6, 80));
  1354. X                ok = 0;
  1355. X            }
  1356. X            if (strcomp("From ", s) == 0) {
  1357. X                strcpy(from, (unsigned char *) strcopy(s, 5, 80));
  1358. X                ok = 0;
  1359. X            }
  1360. X            if (strcomp("References: ", s) == 0) {
  1361. X                strcpy(refs, (unsigned char *) strcopy(s, 12, 80));
  1362. X            }
  1363. X            if (strcomp("Comments: ", s) == 0) {
  1364. X                strcpy(comments, (unsigned char *) strcopy(s, 10, 80));
  1365. X                strcpy(comments, (unsigned char *) stripped(comments));    
  1366. X            }
  1367. X            if (strcomp("Keywords: ", s) == 0) {
  1368. X                strcpy(keywords, (unsigned char *) strcopy(s, 10, 80));
  1369. X                strcpy(keywords, (unsigned char *) stripped(keywords));
  1370. X            }
  1371. X            if (strcomp("Content-Type: ", s) == 0) {
  1372. X                strcpy(content, (unsigned char *) strcopy(s, 14, 80));
  1373. X                strcpy(content, (unsigned char *) stripped(content));
  1374. X            }
  1375. X
  1376. X            if ((strlen(s) < 5) && (ok == 0)) ok = 1;
  1377. X        }
  1378. X    }
  1379. X
  1380. X    ff = fopen(TEP, "w");
  1381. X    while (fgets(s, 80, fp) != NULL) {
  1382. X        if(s[0] != '\n') fputs("> ", ff);
  1383. X        fputs((unsigned char *) iso_line(s), ff);
  1384. X    }
  1385. X    fputs("", ff);
  1386. X    fclose(ff);
  1387. X    fclose(fp);
  1388. X  }
  1389. X
  1390. X  TRY_AGAIN:
  1391. X
  1392. X  if((WEITERLEITEN != 0) && (EX_PM != 0)){
  1393. X    sprintf(rec_char, "%s", user);
  1394. X    if(checkdomaintype( rec_char ) != 0) return -1;
  1395. X    goto ONCE_MORE;
  1396. X  }
  1397. X
  1398. X  receiver = 0;
  1399. X
  1400. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  1401. X  fd = open(UDBASE, O_RDONLY);
  1402. X  if (fd == -1) {
  1403. X    nerror("mail.c", 216, "brief", "Datei-Lesefehler", UDBASE);
  1404. X  }
  1405. X  lseek(fd, 0L, SEEK_SET);
  1406. X  while ((receiver == 0) && (read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER))) {
  1407. X    if ((strcomp(user, LOOSER.name) == 0) ||
  1408. X        (strcomp(LOOSER.name, user) == 0) ||
  1409. X        (strcomp(user, LOOSER.nick) == 0) ||
  1410. X        (strcomp(user, LOOSER.sh_name) == 0)) {
  1411. X        receiver = LOOSER.id;
  1412. X        strcpy(rec_char, LOOSER.name);
  1413. X    }
  1414. X  }
  1415. X  close(fd);
  1416. X  mbunlock(UDBASE);
  1417. X
  1418. X  if ((receiver == 0) && (EX_PM == 0)) {
  1419. X
  1420. X    if (REPLY != 0) {
  1421. X        strcpy(user, fetch_reciepy(REP));
  1422. X        if (fetch_local == 1) goto TRY_AGAIN;
  1423. X        strcpy(rec_char, (unsigned char *) stripped(user));
  1424. X        if (strcomp(user, "OOPS") == 0) {
  1425. X            ansi("md");
  1426. X            printf("\n\n%s\n", MAL08_MSG);
  1427. X            ansi("me ");
  1428. X            unlink(TEP);
  1429. X            unlink(REP); /* ??? */
  1430. X            return -1;
  1431. X        }
  1432. X        EX_PM = 1;
  1433. X        c = MAL13_MSG;
  1434. X        goto REPLY_MARK;
  1435. X    }
  1436. X    else {
  1437. X        ansi("md");
  1438. X        strcpy(rec_char, (unsigned char *) stripped(user));
  1439. X        printf("\n\n%s \"%s\" %s\n", MAL09_MSG, user, MAL10_MSG);
  1440. X        ansi("me");
  1441. X        if(WEITERLEITEN == 0) unlink(TEP);
  1442. X        unlink(REP);
  1443. X        return -1;
  1444. X    }
  1445. X  }
  1446. X
  1447. X  if(WEITERLEITEN != 0) goto ONCE_MORE;
  1448. X
  1449. X  unlink(REP);
  1450. X
  1451. X  if (EX_PM == 0) {
  1452. X    ansi("md");
  1453. X    sprintf(s, "%s/usr/%d/.hello", HOME, receiver);
  1454. X    printf("\n\n");
  1455. X    show(s, 22, 0);
  1456. X    ansi("me");
  1457. X  }
  1458. X  else {
  1459. X    strcpy(rec_char, arg);
  1460. X  }
  1461. X
  1462. X  if(checkdomaintype( rec_char ) != 0) return -1;
  1463. X
  1464. X  if (REPLY != 0) {
  1465. X    c = MAL13_MSG;
  1466. X    goto REPLY_MARK;
  1467. X  }
  1468. X  printf("\n\n");
  1469. X  ansi("mr");
  1470. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL12_MSG);
  1471. X  ansi("me");
  1472. X  printf("%c%c", MAL13_MSG, BS);
  1473. X
  1474. X  do {
  1475. X    c = getint();
  1476. X    if (c >= 97) c -= 32;
  1477. X    if (c == '?') {
  1478. X        clearline();
  1479. X        ansi("mr");
  1480. X        printf("%c%s > ", CR, MAL16_MSG);
  1481. X        ansi("me");
  1482. X    }
  1483. X    if (c == ENTER) c = MAL13_MSG;
  1484. X    if ((c != MAL13_MSG) && (c != MAL14_MSG) && (c != MAL15_MSG)) c = 0;
  1485. X  } while (c == 0);
  1486. X
  1487. X  printf("%c", c);
  1488. X
  1489. X  if (c == MAL15_MSG) {        /* VERWERFEN */
  1490. X    unlink(REP);
  1491. X    unlink(TEP);
  1492. X    printf("\n");
  1493. X    return -1;
  1494. X  }
  1495. X  sprintf(TEP, "%s/M%d", TMP, getpid());
  1496. X  sprintf(pubdir, "%s/dir%d", TMP, getpid());
  1497. X
  1498. X  if (c == MAL14_MSG) {        /* UPLOAD */
  1499. X    clearline();
  1500. X    ansi("mr");
  1501. X    printf("%c%s, ? > ", CR, MAL17_MSG);
  1502. X    ansi("me");
  1503. X
  1504. X    do {
  1505. X        protokoll = getint();
  1506. X        if (protokoll >= 97) protokoll -= 32;
  1507. X        if (protokoll == '?') {
  1508. X            clearline();
  1509. X            ansi("mr");
  1510. X            printf("%c%s > ", CR, MAL17aMSG);
  1511. X            ansi("me");
  1512. X        }
  1513. X        if ((protokoll != MAL18_MSG) && (protokoll != MAL18_MSG) &&
  1514. X            (protokoll != MAL20_MSG) && (protokoll != MAL21_MSG))
  1515. X            protokoll = 0;
  1516. X    } while (protokoll == 0);
  1517. X
  1518. X    printf("%c", protokoll);
  1519. X
  1520. X  }
  1521. X  printf("\n\n%c", CR);
  1522. X  ansi("mr");
  1523. X  printf("%s ", MAL22_MSG);
  1524. X  ansi("me");
  1525. X  printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
  1526. X  ansi("mr");
  1527. X  printf("%s ", MAL23_MSG);
  1528. X  ansi("me");
  1529. X  printf(" %s\n%c", rec_char, CR);
  1530. X  ansi("mr");
  1531. X  printf("%s ", MAL24_MSG);
  1532. X  ansi("me");
  1533. X  printf(" ");
  1534. X  strcpy(subject, (unsigned char *) getline(50, -11, '.', ""));
  1535. X  printf("\n");
  1536. X  ansi("mr");
  1537. X  printf("%s ", MAL23aMSG);
  1538. X  ansi("me");
  1539. X  printf(" ");
  1540. X  strcpy(cc, (unsigned char *) getline(50, -11, '.', ""));
  1541. X
  1542. X  REPLY_MARK:
  1543. X
  1544. X  if(checkdomaintype( rec_char ) != 0) return -1;
  1545. X
  1546. X  if (c == MAL13_MSG) {
  1547. X    sprintf(s, "%s %s", EDDY, TEP);
  1548. X    noctrlx();
  1549. X    system(s);
  1550. X    ctrlx();
  1551. X    protokoll = '*';
  1552. X  }
  1553. X  else {            /* UPLOAD */
  1554. X
  1555. X    printf("\n\n");
  1556. X    printf("%s\n\n", MAL25_MSG); 
  1557. X    ansi("md");
  1558. X    printf("%s", MAL26_MSG);
  1559. X    ansi("me");
  1560. X          
  1561. X    unlink( TEP );
  1562. X    
  1563. X    switch (protokoll) {
  1564. X        case MAL18_MSG:
  1565. X            fp = fopen(TEP, "w");
  1566. X            if (fp == NULL) {
  1567. X                nerror("mail.c", 268, "brief", "DSF", TEP);
  1568. X            }
  1569. X            c = 0;
  1570. X            lf = CR;
  1571. X
  1572. X            fputc(LF, fp);
  1573. X
  1574. X            while ((c != CTRL_X) && (c != CTRL_D)) {
  1575. X                c = getint();
  1576. X                if ((c == CR) && (lf == CR)) fputc(LF, fp);
  1577. X                if (c == CR) lf = CR;
  1578. X                if (c == LF) lf = LF;
  1579. X                if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
  1580. X                    fputc(c, fp);
  1581. X                }
  1582. X            }
  1583. X            fclose(fp);
  1584. X            break;
  1585. X
  1586. X        case MAL19_MSG:
  1587. X            printf("\n");
  1588. X            sprintf(s, "exec %s -bc TimeTravelAgency", RX);
  1589. X            break;
  1590. X        case MAL20_MSG:
  1591. X            printf("\n");
  1592. X            sprintf(s, "exec %s -b", RB);
  1593. X            break;
  1594. X        case MAL21_MSG:
  1595. X            printf("\n");
  1596. X            sprintf(s, "exec %s -b", RZ);
  1597. X            break;
  1598. X    }
  1599. X    if (protokoll != MAL18_MSG){
  1600. X        mkdir( pubdir, 0777 );
  1601. X        chdir( pubdir );
  1602. X
  1603. X        system( s );
  1604. X
  1605. X        chdir( HOME );
  1606. X        sprintf(s, "mv %s/* %s", pubdir, TEP);
  1607. X        system( s );
  1608. X        sprintf(s, "rm -r %s", pubdir);
  1609. X        system( s );
  1610. X    }
  1611. X    sync();
  1612. X    stat(TEP, &fst);
  1613. X    if (fst.st_size < 3L) {
  1614. X        printf("\n\n%s\n", MAL27_MSG);
  1615. X        control(MAL28_MSG, 3);
  1616. X        unlink(REP);    /* ??? */
  1617. X        unlink(TEP);
  1618. X        return -1;
  1619. X    }    
  1620. X    if (prf(TEP) == 1) {
  1621. X        printf("\n\n");
  1622. X        ansi( "md" );
  1623. X        printf("%s", MAL25_MSG);        
  1624. X        ansi( "me" );
  1625. X        unlink(REP);     /* ??? */
  1626. X        unlink(TEP);
  1627. X        return -1;
  1628. X        BINFILE++;
  1629. X    }
  1630. X    else{
  1631. X        mkix(TEP);
  1632. X    }
  1633. X  }
  1634. X
  1635. X  sprintf(reply, "%s <%s@%s>", USER.name, username, UUCPID);
  1636. X
  1637. X  ONCE_MORE:
  1638. X
  1639. X    
  1640. X  if((HOLD != 0) || ((WEITERLEITEN != 0) && (IS_BUFFERED != 0))) goto HOLD_MARK;
  1641. X
  1642. X  printf("\n\n");
  1643. X  ansi("mr");
  1644. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL28aMSG);
  1645. X  ansi("me");
  1646. X  printf("%c%c", MAL29_MSG, BS);
  1647. X
  1648. X  do {
  1649. X    c = getint();
  1650. X    if (c >= 97) c -= 32;
  1651. X    if (c == '?') {
  1652. X        clearline();
  1653. X        ansi("mr");
  1654. X        printf("%c%s > ", CR, MAL32_MSG);
  1655. X        ansi("me");
  1656. X    }
  1657. X    if (c == ENTER) c = MAL29_MSG;
  1658. X    if ((c != MAL29_MSG) && (c != MAL30_MSG) && (c != MAL30aMSG) &&  (c != MAL31_MSG) && (c != MAL31aMSG)) c = 0;
  1659. X  } while (c == 0);
  1660. X
  1661. X  printf("%c", c);
  1662. X
  1663. X  if (c == MAL31_MSG) {        /* WEITERSCHREIBEN */
  1664. X    sprintf(s, "%s %s", EDDY, TEP);
  1665. X    noctrlx();
  1666. X    system(s);
  1667. X    ctrlx();
  1668. X    goto ONCE_MORE;
  1669. X  }
  1670. X  if (c == MAL30_MSG) {        /* VERWERFEN */
  1671. X    printf("\n");
  1672. X    unlink(TEP);
  1673. X    unlink(REP);
  1674. X    return -1;
  1675. X  }
  1676. X  if (c == MAL31aMSG) {        /* HEADER */
  1677. X    headline( MAL32aMSG );
  1678. X    printf("\n");
  1679. X
  1680. X    time(&timer);
  1681. X
  1682. X    ansi( "md" );
  1683. X    printf("From: ");
  1684. X    ansi( "me" );
  1685. X    printf("%s <%s@%s>\n", USER.name, username, UUCPID);
  1686. X
  1687. X    ansi( "md" );
  1688. X    printf("Reply-To: ");
  1689. X    ansi( "me" );
  1690. X    if(USER.level > GUEST_LEV){
  1691. X        strcpy(reply, (unsigned char *) getline(80, -1001, 32, reply));
  1692. X        printf("\n");
  1693. X    }
  1694. X    else printf("%s\n", reply);
  1695. X
  1696. X    ansi( "md" );
  1697. X    printf("Return-Receipt-To: ");
  1698. X    ansi( "me" );
  1699. X    if(USER.level > GUEST_LEV){
  1700. X        /*
  1701. X        if(receipt[0] == '\0') sprintf(receipt, (unsigned char *) "%s@%s",  username, UUCPID);
  1702. X        */
  1703. X        strcpy(receipt, (unsigned char *) getline(80, -1001, 32, receipt));
  1704. X        printf("\n");
  1705. X    }
  1706. X
  1707. X    i = 0; j = 0;            /* Empfaenger: Realname */
  1708. X    while(from[i] != '\0'){
  1709. X        if(from[i] == '<'){
  1710. X            strcpy(s, (unsigned char *) strcopy(from, 0, (i-1)));
  1711. X            j = i;
  1712. X        }
  1713. X        if(from[i] == '(') j = i+1;
  1714. X        if(from[i] == ')') strcpy(s, (unsigned char *) strcopy(from, j, (i-1)));
  1715. X        i++;
  1716. X    }
  1717. X    if(j == 0) strcpy(s, from);
  1718. X        
  1719. X    if(mesg_id[0] != '\0'){
  1720. X        ansi( "md" );
  1721. X        printf("In-Reply-To: ");
  1722. X        ansi( "me" );
  1723. X        printf("%s; ", (unsigned char *) stripped(mesg_id)); 
  1724. X        printf("from \"%s\" at %s", (unsigned char *) stripped(s), date);
  1725. X
  1726. X        if(refs[0] != '\0') 
  1727. X            sprintf(s, "%s ", stripped(refs));
  1728. X        else
  1729. X            s[0] = '\0';
  1730. X        strcat(s, mesg_id);
  1731. X        ansi( "md" );
  1732. X        printf("References: ");
  1733. X        ansi( "me" );
  1734. X        printf("%s", s);
  1735. X    }
  1736. X
  1737. X    ansi( "md" );
  1738. X    printf("To: ");
  1739. X    ansi( "me" );
  1740. X    if(USER.level > GUEST_LEV){
  1741. X        strcpy(rec_char, (unsigned char *) getline(80, -1001, 32, rec_char));
  1742. X        printf("\n");
  1743. X    }
  1744. X    else printf("%s\n", rec_char);
  1745. X
  1746. X    ansi( "md" );
  1747. X    printf("Cc: ");
  1748. X    ansi( "me" );
  1749. X    if(USER.level > GUEST_LEV){
  1750. X        strcpy(cc, (unsigned char *) getline(80, -1001, 32, cc));
  1751. X        printf("\n");
  1752. X    }
  1753. X    else printf("%s\n", cc);
  1754. X
  1755. X    ansi( "md" );
  1756. X    printf("Bcc: ");
  1757. X    ansi( "me" );
  1758. X    if(USER.level > GUEST_LEV){
  1759. X        strcpy(bcc, (unsigned char *) getline(80, -1001, 32, bcc));
  1760. X        printf("\n");
  1761. X    }
  1762. X    else printf("%s\n", bcc);
  1763. X
  1764. X
  1765. X    ansi( "md" );
  1766. X    printf("Subject: ");
  1767. X    ansi( "me" );
  1768. X    if(USER.level > GUEST_LEV){
  1769. X        strcpy(subject, (unsigned char *) getline(80, -1001, 32, subject));
  1770. X        printf("\n");
  1771. X    }
  1772. X    else printf("%s\n", subject);
  1773. X
  1774. X    ansi( "md" );
  1775. X    printf("Keywords: ");
  1776. X    ansi( "me" );
  1777. X    if(USER.level > GUEST_LEV){
  1778. X        strcpy(keywords, (unsigned char *) getline(80, -1001, 32, keywords));
  1779. X        printf("\n");
  1780. X    }
  1781. X    else printf("%s\n", keywords);
  1782. X
  1783. X    ansi( "md" );
  1784. X    printf("Comments: ");
  1785. X    ansi( "me" );
  1786. X    if(USER.level > GUEST_LEV){
  1787. X        strcpy(comments, (unsigned char *) getline(80, -1001, 32, comments));
  1788. X        printf("\n");
  1789. X    }
  1790. X    else printf("%s\n", comments);
  1791. X
  1792. X    ansi( "md" );
  1793. X    printf("Encrypted: ");
  1794. X    ansi( "me" );
  1795. X    if(USER.level > GUEST_LEV){
  1796. X        strcpy(encrypted, (unsigned char *) getline(80, -1001, 32, encrypted));
  1797. X        printf("\n");
  1798. X    }
  1799. X    else printf("%s\n", encrypted);
  1800. X
  1801. X#ifdef _MULTIMEDIA
  1802. X    ansi( "md" );
  1803. X    printf("MIME-Version: ");
  1804. X    ansi( "me" );
  1805. X    printf("%s\n", MIME_VERSION);
  1806. X
  1807. X    if(USER.level >= WRITE_INTERNAT){
  1808. X        if(content[0] == '\0')
  1809. X            strcpy(content, (unsigned char *) "text/plain; charset=us-ascii");
  1810. X        ansi( "md" ); 
  1811. X        printf("Content-Type: ");
  1812. X        ansi( "me" );
  1813. X        strcpy(content, (unsigned char *) getline(80, -1001, 32, content));
  1814. X        printf("\n");
  1815. X    }
  1816. X#endif
  1817. X
  1818. X    ansi( "md" );
  1819. X    printf("X-Mailer: ");
  1820. X    ansi( "me" );
  1821. X    printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  1822. X
  1823. X    ansi( "md" );
  1824. X    printf("Priority: ");
  1825. X    ansi( "me" );
  1826. X    if(USER.level > GUEST_LEV){
  1827. X        strcpy(priority, (unsigned char *) getline(80, -1001, 32, priority));
  1828. X        printf("\n");
  1829. X    }
  1830. X    else printf("%s\n", priority);
  1831. X
  1832. X    ansi( "md" );
  1833. X    printf("Action: ");
  1834. X    ansi( "me" );
  1835. X    if(USER.level > GUEST_LEV){
  1836. X        strcpy(action, (unsigned char *) getline(80, -1001, 32, action));
  1837. X        printf("\n");
  1838. X    }
  1839. X    else printf("%s\n", action);
  1840. X
  1841. X    ansi( "md" );
  1842. X    printf("X-Fortune: ");
  1843. X    ansi( "me" );
  1844. X    if(USER.level > GUEST_LEV){
  1845. X        strcpy(fortune, (unsigned char *) getline(80, -1001, 32, fortune));
  1846. X        printf("\n");
  1847. X    }
  1848. X    else printf("%s\n", fortune);
  1849. X
  1850. X
  1851. X    ansi( "md" );
  1852. X    printf("Message-Id: ");
  1853. X    ansi( "me" );
  1854. X       printf("<%x.%d@%s>\n", timer, USER.id, UUCPID);
  1855. X
  1856. X    goto ONCE_MORE;
  1857. X  }
  1858. X
  1859. X
  1860. X  HOLD_MARK:
  1861. X
  1862. X  if((UMLEITUNG == 0) && (WEITERLEITEN == 0) && (strcomp(TMP, TEP) == 0)){
  1863. X    sprintf(s, "cp %s %s/usr/%d/.lastletter > /dev/null", TEP, HOME, USER.id);
  1864. X    system( s );     
  1865. X    sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
  1866. X    fp = fopen( s, "w" );
  1867. X    if(fp == NULL){
  1868. X        nerror("mail.c", 500, "brief", "Datei-Schreibfehler", s);
  1869. X    }
  1870. X    fprintf(fp, "%s", subject);
  1871. X    fclose(fp);
  1872. X  }
  1873. X
  1874. X
  1875. X  if (EX_PM == 0) {
  1876. X    sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  1877. X    maybe_locked(s, "r");
  1878. X    fp = fopen(s, "r");
  1879. X    if (fp == NULL) {
  1880. X        nerror("mail.c", 431, "brief", "Datei-Lesefehler", s);
  1881. X    }
  1882. X    fscanf(fp, "%d", &mail_id);
  1883. X    fclose(fp);
  1884. X    fp = fopen(s, "w");
  1885. X    fprintf(fp, "%d\n", (mail_id + 1));
  1886. X    fclose(fp);
  1887. X
  1888. X    sprintf(s, "%s/usr/%d/%d", HOME, receiver, mail_id);
  1889. X  }
  1890. X  else {
  1891. X    umask(0000);
  1892. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  1893. X  }
  1894. X
  1895. X
  1896. X  fp = fopen(s, "w");
  1897. X
  1898. X  if (EX_PM == 0) {
  1899. X    sprintf(s, "%s %s (%s)\n", GBL01_MSG, USER.name, USER.nick);
  1900. X    fputs(s, fp);
  1901. X
  1902. X    time(&timer);
  1903. X    timeptr = localtime(&timer);
  1904. X    strcpy(t, asctime(timeptr));
  1905. X
  1906. X    sprintf(s, "%s %s", GBL02_MSG, t);
  1907. X    fputs(s, fp);
  1908. X
  1909. X    sprintf(s, "%s %s\n\n", GBL03_MSG, subject);
  1910. X    fputs(s, fp);
  1911. X
  1912. X    fputs("Content-Type: text/richtext;\n", fp);
  1913. X
  1914. X    lines = 5;
  1915. X   }
  1916. X   else {
  1917. X    lines = 4;
  1918. X  }
  1919. X
  1920. X  ff = fopen(TEP, "r");
  1921. X  if (ff == 0) {
  1922. X    printf("\n\n");
  1923. X    ansi("md");
  1924. X    printf("%s\n", MAL33_MSG);
  1925. X    ansi("me");
  1926. X    control(MAL34_MSG, 3);
  1927. X    return;
  1928. X  }
  1929. X  stat(TEP, &fst);
  1930. X  cont_length = fst.st_size;
  1931. X
  1932. X  if(EX_PM != 0){
  1933. X
  1934. X    time(&timer);
  1935. X
  1936. X    i = 0; j = 0;            /* Empfaenger: Realname */
  1937. X    while(from[i] != '\0'){
  1938. X        if(from[i] == '<'){
  1939. X            strcpy(s, (unsigned char *) strcopy(from, 0, (i-1)));
  1940. X            j = i;
  1941. X        }
  1942. X        if(from[i] == '(') j = i+1;
  1943. X        if(from[i] == ')') strcpy(s, (unsigned char *) strcopy(from, j, (i-1)));
  1944. X        i++;
  1945. X    }
  1946. X    if(j == 0) strcpy(s, from);
  1947. X
  1948. X    fprintf(fp, "From: %s@%s (%s)\n", username, UUCPID, USER.name); 
  1949. X    if(reply[0] != '\0')
  1950. X        fprintf(fp, "Reply-To: %s\n", reply);
  1951. X    if(receipt[0] != '\0')
  1952. X        fprintf(fp, "Return-Receipt-To: %s\n", receipt);
  1953. X    fprintf(fp, "Organization: %s\n", ORGANIZATION);
  1954. X    if(mesg_id[0] != '\0'){
  1955. X        fprintf(fp, "In-Reply-To: %s; ", (unsigned char *) stripped(mesg_id)); 
  1956. X        fprintf(fp, "from \"%s\" at %s", (unsigned char *) stripped(s), date);
  1957. X        if(refs[0] != '\0') 
  1958. X            sprintf(s, "%s ", stripped(refs));
  1959. X        else
  1960. X            s[0] = '\0';
  1961. X        strcat(s, mesg_id);
  1962. X        fprintf(fp, "References: %s", s);
  1963. X    }
  1964. X        fprintf(fp, "To: %s\n", rec_char);
  1965. X    if(cc[0] != '\0')
  1966. X        fprintf(fp, "Cc: %s\n", cc);
  1967. X
  1968. X    sprintf(s, "%s/usr/%d/.face", HOME, USER.id); /* X-Face ??? */
  1969. X    ft = fopen( s, "r" );
  1970. X    if(ft != NULL){
  1971. X        while(fgets(s, 70, ft) != NULL){
  1972. X            fprintf(fp, "X-Face: %s\n", (unsigned char *) stripped(s));
  1973. X        }
  1974. X        fclose(ft);
  1975. X    }
  1976. X
  1977. X    if(subject[0] != '\0')
  1978. X        fprintf(fp, "Subject: %s\n", subject);
  1979. X    if(keywords[0] != '\0')
  1980. X        fprintf(fp, "Keywords: %s\n", keywords);
  1981. X    if(comments[0] != '\0')
  1982. X        fprintf(fp, "Comments: %s\n", comments);
  1983. X    if(encrypted[0] != '\0')
  1984. X        fprintf(fp, "Encrypted: %s\n", encrypted);
  1985. X
  1986. X#ifdef _MULTIMEDIA
  1987. X    fprintf(fp, "MIME-Version: %s\n", MIME_VERSION);
  1988. X    if(content[0] != '\0'){
  1989. X        fprintf(fp, "Content-Type: %s\n", content);
  1990. X        if(UMLAUT_MODUS < 3) fprintf(fp, "Content-Transfer-Encoding: 8bit\n");
  1991. X        fprintf(fp, "Content-Length: %ld\n", cont_length);
  1992. X    }
  1993. X#endif
  1994. X    fprintf(fp, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  1995. X    if(priority[0] != '\0')
  1996. X        fprintf(fp, "Priority: %s\n", priority);
  1997. X    if(action[0] != '\0')
  1998. X        fprintf(fp, "Action: %s\n", action);
  1999. X    if(fortune[0] != '\0')
  2000. X        fprintf(fp, "X-Fortune: %s\n", fortune);
  2001. X       fprintf(fp, "Message-Id: <%x.%d@%s>\n", timer, USER.id, UUCPID);
  2002. X     fputs("\n", fp);
  2003. X  }
  2004. X
  2005. X  UMLAUT_MODUS = 1;
  2006. X  while (fgets(s, 80, ff) != 0) {
  2007. X    fputs((unsigned char *) iso_line(s), fp);
  2008. X    lines++;
  2009. X  }
  2010. X  fclose(ff);
  2011. X
  2012. X  if(UMLEITUNG == 0){
  2013. X      sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
  2014. X      ff = fopen(s, "r");
  2015. X      if (ff != NULL) {
  2016. X        while (fgets(s, 80, ff) != 0) {
  2017. X            fputs((unsigned char *) iso_line(s), fp);
  2018. X            lines++;
  2019. X        }
  2020. X        fclose(ff);
  2021. X      }
  2022. X  }
  2023. X
  2024. X  UMLAUT_MODUS = USER.schluessel[2];
  2025. X
  2026. X  if(WEITERLEITEN == 0) unlink(TEP);
  2027. X  fclose(fp);
  2028. X
  2029. X  if (EX_PM == 0) {
  2030. X    sprintf(s, "%s/usr/%d/INDEX", HOME, receiver);
  2031. X    maybe_locked(s, "r"); 
  2032. X    fp = fopen(s, "a");
  2033. X    if (fp == NULL) {
  2034. X        nerror("mail.c", 527, "brief", "Datei-Ergaenzungsfehler", s);
  2035. X    }
  2036. X    sprintf(s, "%d              ", mail_id);
  2037. X    s[6] = '\0';
  2038. X    if(HOLD != 0){
  2039. X        s[5] = '>';
  2040. X    }
  2041. X    fputs(s, fp);
  2042. X
  2043. X    sprintf(ex, "%s                                ", subject);
  2044. X    ex[26] = '\0';
  2045. X    fputs(ex, fp);
  2046. X
  2047. X    sprintf(ex, "  %s                                        ", USER.name);
  2048. X    ex[22] = '\0';
  2049. X    fputs(ex, fp);
  2050. X
  2051. X    strcpy(s, (unsigned char *) mydate(1));
  2052. X    strcpy(t, (unsigned char *) mytime(1));
  2053. X    sprintf(ex, "  %s  %s         ", s, t);
  2054. X    ex[19] = '\0';
  2055. X    fputs(ex, fp);
  2056. X
  2057. X    sprintf(s, "%-6.d\n", lines);
  2058. X    fputs(s, fp);
  2059. X
  2060. X    fclose(fp);
  2061. X  }
  2062. X  else {
  2063. X    sprintf(s, " X-Mail via UUCP (%s) ", rec_char);
  2064. X    headline(s);
  2065. X    printf("\n%s", MAL35_MSG);
  2066. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  2067. X    sprintf(t, "/bin/sh ./etc/rmail.sh %s %s 2>&1 /dev/null", s, rec_char);
  2068. X    system(t);
  2069. X    unlink(s);
  2070. X    unlink(f);
  2071. X    umask(0007);
  2072. X    printf(" %s\n", MAL36_MSG);
  2073. X  }
  2074. X
  2075. X  unlink(REP);
  2076. X  if((UMLEITUNG == 0) && (WEITERLEITEN == 0)) unlink(TEP);
  2077. X
  2078. X  sprintf(s, "%s \"%s\" %s", MAL11_MSG, rec_char, MAL37_MSG);
  2079. X  control(s, 3);
  2080. X
  2081. X  printf("\n");
  2082. X
  2083. X
  2084. X#ifdef _PMCOPY
  2085. X
  2086. X  IS_BUFFERED = 0;
  2087. X
  2088. X  if(WEITERLEITEN == 0){
  2089. X      if((strcomp(POSTMASTER, LOOSER.sh_name) == 0) || (strcomp(POSTMASTER, LOOSER.nick) == 0)){
  2090. X        if(bcc[0] != '\0') strcat(bcc, ", ");
  2091. X        sprintf(s, "%s!root", UUCPSITE);
  2092. X        strcat(bcc, (unsigned char *) s);
  2093. X        IS_BUFFERED = 1;
  2094. X      }
  2095. X  }
  2096. X#endif
  2097. X
  2098. X  if((cc[0] != '\0') || (bcc[0] != '\0')){
  2099. X    carboncopy(cc, bcc);
  2100. X  }
  2101. X
  2102. X  return 0;
  2103. X}
  2104. END_OF_FILE
  2105.   if test 22275 -ne `wc -c <'src/mail.c'`; then
  2106.     echo shar: \"'src/mail.c'\" unpacked with wrong size!
  2107.   fi
  2108.   # end of 'src/mail.c'
  2109. fi
  2110. if test -f 'src/makro.c' -a "${1}" != "-c" ; then 
  2111.   echo shar: Will not clobber existing file \"'src/makro.c'\"
  2112. else
  2113.   echo shar: Extracting \"'src/makro.c'\" \(5585 characters\)
  2114.   sed "s/^X//" >'src/makro.c' <<'END_OF_FILE'
  2115. X/***************************************************************************/
  2116. X/*        PROGRAMM  ix/Mbox                           */
  2117. X/*             DATEI  makro.c                           */
  2118. X/*        FUNKTIONEN  makro()                           */
  2119. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  2120. X/*  LETZTE AENDERUNG  16.11.1991                       */
  2121. X/***************************************************************************/
  2122. X
  2123. X#include <stdio.h>
  2124. X
  2125. X#include "mbox.h"
  2126. X
  2127. X
  2128. Xvoid get_makros();
  2129. X
  2130. X/***************************************************************************/
  2131. X/*      FUNKTION  makro()                           */
  2132. X/*  BESCHREIBUNG  Makros auswerten                       */
  2133. X/*     PARAMETER  s  =  Eingabezeile                                       */
  2134. X/*     RUECKGABE  Eingabezeile mit Gegenwerten der Makros               */
  2135. X/***************************************************************************/
  2136. X
  2137. Xunsigned char *makro( s )
  2138. Xunsigned char s[];
  2139. X{
  2140. X  static unsigned char t[STRING];
  2141. X  unsigned char f[STRING];
  2142. X  int a = 0, b = 0, i = 0;
  2143. X  int m = 0, ok = 0;
  2144. X  int subcom = 0;
  2145. X
  2146. X  t[0] = '\0';
  2147. X
  2148. X  strcat(s, " ");
  2149. X
  2150. X  while(s[0] == ' ') *s++;
  2151. X
  2152. X  while(s[i] != '\0'){
  2153. X
  2154. X    if(s[i] == ' '){
  2155. X        b = i -1;
  2156. X        f[0] = '\0';
  2157. X        strcat(f, strcopy(s, a, b));
  2158. X        a = i +1;
  2159. X        ok = 0; 
  2160. X        m = 0;
  2161. X
  2162. X        while(MAK[m].makname[0] != '\0'){
  2163. X            if((strcomp(f, MAK[m].makname) == 0) && (strcomp(MAK[m].makname, f) == 0) && (subcom == 0)){
  2164. X                ok = 1; 
  2165. X                strcat(t, MAK[m].makwert);
  2166. X            }
  2167. X            m++;
  2168. X        }
  2169. X        if(ok == 0) strcat(t, stripped(f));
  2170. X        strcat(t, " ");
  2171. X    
  2172. X        subcom++;
  2173. X    }
  2174. X    i++;
  2175. X  }
  2176. X  return (unsigned char *) t;
  2177. X}
  2178. X
  2179. X
  2180. X
  2181. X/***************************************************************************/
  2182. X/*      FUNKTION  set_makros                           */
  2183. X/*  BESCHREIBUNG  Die Makro-Datei wird angezeigt und kann geandert werden. */
  2184. X/*     PARAMETER  keine                                                       */
  2185. X/*     RUECKGABE  keine                                                       */
  2186. X/***************************************************************************/
  2187. X
  2188. Xvoid set_makros()
  2189. X{
  2190. X  FILE *ff;
  2191. X  unsigned char s[STRING];
  2192. X  unsigned char t[STRING];
  2193. X  unsigned char tmp[STRING];
  2194. X  unsigned char c;
  2195. X  int b;
  2196. X
  2197. X
  2198. X  printf("\n\n%s\n\n", MAK01_MSG);
  2199. X
  2200. X  ansi("md");
  2201. X  b = 4;
  2202. X  while(MAK[b].makname[0] != '\0'){
  2203. X    printf("%s%c=%c%s\n", MAK[b].makname, TAB, TAB, MAK[b].makwert);
  2204. X    b++;
  2205. X  }  
  2206. X  printf("\n");  
  2207. X  ansi("mr");
  2208. X  printf("%c%s [%c, %c] > ", CR, MAK02_MSG, GBL06_MSG, GBL07_MSG);
  2209. X  ansi("me");
  2210. X
  2211. X  c = yesno();
  2212. X
  2213. X  if (c == GBL06_MSG) {
  2214. X    sprintf(t, "%s %s", EDDY, MAKRO);
  2215. X    system(t);
  2216. X  }
  2217. X
  2218. X  get_makros();
  2219. X
  2220. X  printf("\n");
  2221. X}
  2222. X
  2223. X
  2224. X
  2225. X
  2226. X/***************************************************************************/
  2227. X/*      FUNKTION  get_makros()                           */
  2228. X/*  BESCHREIBUNG  Liest die userabhaengigen Makro-Vereinbarungen in die    */
  2229. X/*          Stuktur ein                                   */
  2230. X/*     PARAMETER  keine                                                       */
  2231. X/*     RUECKGABE  keine                               */
  2232. X/***************************************************************************/
  2233. X
  2234. Xvoid get_makros()
  2235. X{
  2236. X  FILE *fp;
  2237. X  unsigned char s[STRING];
  2238. X  unsigned char t[STRING];
  2239. X  int b = 0, i = 0;
  2240. X
  2241. X
  2242. X  sprintf(MAK[0].makname, "demo");
  2243. X  sprintf(MAK[0].makwert, "?, sl 3, PM, sl 3, i, sl 3, anr, sl 3, dem1");
  2244. X  sprintf(MAK[1].makname, "dem1");
  2245. X  sprintf(MAK[1].makwert, "b, sl 3, +, +, +, +, +, +, i, sl 3, +, dem2");
  2246. X  sprintf(MAK[2].makname, "dem2");
  2247. X  sprintf(MAK[2].makwert, "i, sl 3, +, i, sl 3, b, +, i, sl 3, ?, dem3");
  2248. X  sprintf(MAK[3].makname, "dem3");
  2249. X  sprintf(MAK[3].makwert, "sl 3, v, sl 3, h hilf, sl 3, st, sl 3, pm, i");
  2250. X
  2251. X  fp = fopen(MAKRO, "r");
  2252. X  if (fp == NULL) {
  2253. X    MAK[4].makname[0] = '\0';
  2254. X    return;
  2255. X  }
  2256. X
  2257. X
  2258. X  b = 4;
  2259. X
  2260. X  while(fgets(s, 80, fp) != NULL){
  2261. X
  2262. X    MAK[b].makname[0] = '\0';
  2263. X    MAK[b].makwert[0] = '\0';
  2264. X    
  2265. X    i = 0;
  2266. X
  2267. X    while((s[i] != '=') && (s[i] != '\0')) i++;
  2268. X
  2269. X    t[0] = '\0'; strcat(t, strcopy(s, 0, (i-1)));
  2270. X    strcat(MAK[b].makname, stripped(t));
  2271. X
  2272. X    t[0] = '\0'; strcat(t, strcopy(s, (i+1), length(s)));
  2273. X     strcat(MAK[b].makwert, stripped(t));
  2274. X
  2275. X    b++;
  2276. X    if (b >= (MAX_MAK -1)) {
  2277. X        nerror("makro.c", 108, "get_makro", "MAX_MAK ueberschritten !!", "???");
  2278. X    }
  2279. X  }
  2280. X  MAK[b].makname[0] = '\0';
  2281. X
  2282. X  fclose(fp);
  2283. X
  2284. X}
  2285. X
  2286. X/***************************************************************************/
  2287. X/*      FUNKTION  add_makros()                           */
  2288. X/*  BESCHREIBUNG  Haengt Makro-Definition aus einer Prompt-Eingabe an die  */
  2289. X/*          Makro-Datei an                               */
  2290. X/*     PARAMETER  s  =  Makro-Definition                                   */
  2291. X/*     RUECKGABE  keine                               */
  2292. X/***************************************************************************/
  2293. X
  2294. Xvoid add_makro( s )
  2295. Xunsigned char s[];
  2296. X{
  2297. X  FILE *fp;
  2298. X
  2299. X  fp = fopen( MAKRO, "a" );
  2300. X  if(fp == NULL){
  2301. X    nerror("makro.c", 189, "add_makro", "Datei-Erweiterungsfehler", MAKRO);
  2302. X  }
  2303. X  fputs((unsigned char *) stripped(s), fp);
  2304. X  fputs("\n", fp);
  2305. X  fclose(fp);
  2306. X
  2307. X  get_makros();
  2308. X
  2309. X  printf("\n\n%s\n", MAK03_MSG);
  2310. X  
  2311. X}
  2312. X
  2313. X
  2314. X/***************************************************************************/
  2315. X/*      FUNKTION  makro_definition()                       */
  2316. X/*  BESCHREIBUNG  Prueft ob die Prompt-Eingabe eine Makro-Definition ent-  */
  2317. X/*          haelt.                                       */
  2318. X/*     PARAMETER  s  =  Prompt-Eingabe                                     */
  2319. X/*     RUECKGABE  0  =  Keine Definition                   */
  2320. X/*                1  =  Makro-Definition                   */
  2321. X/***************************************************************************/
  2322. X
  2323. Xint makro_definition( s )
  2324. Xunsigned char s[];
  2325. X{
  2326. X  int i = 0;
  2327. X  int ok = 0;
  2328. X
  2329. X  while(s[i] != '\0'){
  2330. X    if(s[i] == '=') ok++;
  2331. X    i++;
  2332. X  }
  2333. X
  2334. X  if(ok == 1){
  2335. X    add_makro( s );
  2336. X  }
  2337. X  if(ok > 1){
  2338. X    ansi("md");
  2339. X    printf(" %s\n", MAK04_MSG);
  2340. X    ansi("me");
  2341. X  }
  2342. X  return ok;
  2343. X}
  2344. X
  2345. END_OF_FILE
  2346.   if test 5585 -ne `wc -c <'src/makro.c'`; then
  2347.     echo shar: \"'src/makro.c'\" unpacked with wrong size!
  2348.   fi
  2349.   # end of 'src/makro.c'
  2350. fi
  2351. if test -f 'wendy/fast' -a "${1}" != "-c" ; then 
  2352.   echo shar: Will not clobber existing file \"'wendy/fast'\"
  2353. else
  2354.   echo shar: Extracting \"'wendy/fast'\" \(99 characters\)
  2355.   sed "s/^X//" >'wendy/fast' <<'END_OF_FILE'
  2356. Xmake clean
  2357. X/etc/mount /dev/PS1 /user
  2358. Xcpdir -mvs /local/mbox/wendy /user
  2359. Xsync
  2360. X/etc/umount /dev/PS1
  2361. X
  2362. END_OF_FILE
  2363.   if test 99 -ne `wc -c <'wendy/fast'`; then
  2364.     echo shar: \"'wendy/fast'\" unpacked with wrong size!
  2365.   fi
  2366.   chmod +x 'wendy/fast'
  2367.   # end of 'wendy/fast'
  2368. fi
  2369. echo shar: End of archive 7 \(of 15\).
  2370. cp /dev/null ark7isdone
  2371. MISSING=""
  2372. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2373.     if test ! -f ark${I}isdone ; then
  2374.     MISSING="${MISSING} ${I}"
  2375.     fi
  2376. done
  2377. if test "${MISSING}" = "" ; then
  2378.     echo You have unpacked all 15 archives.
  2379.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2380. else
  2381.     echo You still must unpack the following archives:
  2382.     echo "        " ${MISSING}
  2383. fi
  2384. exit 0
  2385. exit 0 # Just in case...
  2386.