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

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  3. Subject:  v31i019:  mbox - A BBS for UNIX and MINIX v1.6 PL10, Part03/11
  4. Message-ID: <1992Jul10.050229.27341@sparky.imd.sterling.com>
  5. X-Md4-Signature: 54c65f002eec9a60af77e0e634e9c624
  6. Date: Fri, 10 Jul 1992 05:02:29 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  10. Posting-number: Volume 31, Issue 19
  11. Archive-name: mbox/part03
  12. Environment: MINIX, ISC, ESIX, SVR3
  13. Supersedes: mbox: Volume 29, Issue 63-72
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # Contents:  src/admin.c src/lesen.c src/mail.c
  22. # Wrapped by kent@sparky on Thu Jul  9 23:26:00 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 3 (of 11)."'
  26. if test -f 'src/admin.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'src/admin.c'\"
  28. else
  29.   echo shar: Extracting \"'src/admin.c'\" \(24570 characters\)
  30.   sed "s/^X//" >'src/admin.c' <<'END_OF_FILE'
  31. X/***************************************************************************/
  32. X/*        PROGRAMM  ix/Mbox                           */
  33. X/*             DATEI  admin.c                           */
  34. X/*        FUNKTIONEN  user_aendern(), user_anzeigen(), user_loeschen(),    */
  35. X/*              setup_get(), wait_until_keypressed(), admin(),       */
  36. X/*              setup()                               */
  37. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  38. X/*  LETZTE AENDERUNG  18.03.1992                       */
  39. X/***************************************************************************/
  40. X
  41. X#include <sys/types.h>
  42. X#include <sys/stat.h>
  43. X#include <unistd.h>
  44. X#include <stdio.h>
  45. X#include <fcntl.h>
  46. X
  47. X#include "mbox.h"
  48. X
  49. X
  50. Xvoid wait_until_keypressed();
  51. X
  52. X
  53. X
  54. X/***************************************************************************/
  55. X/*      FUNKTION  user_aendern                           */
  56. X/*  BESCHREIBUNG  Aendern ALLER Teilnehmerparameter (von ADMIN aus)        */
  57. X/*     PARAMETER  keine                                                       */
  58. X/*     RUECKGABE  keine                                                       */
  59. X/***************************************************************************/
  60. X
  61. Xvoid user_aendern()
  62. X{
  63. X  int fd;
  64. X  struct userdaten DUMMY, LOOSER;
  65. X  char s[STRING];
  66. X  char t[STRING];
  67. X  long ll = -1L;
  68. X  size_t dummy = sizeof(DUMMY);
  69. X  char c;
  70. X  int i;
  71. X  int uid = -1;
  72. X
  73. X  headline( ADM01_MSG );
  74. X
  75. X  printf("%s ", ADM02_MSG);
  76. X  strcpy(s, (char *) getline(30, 11, '.', ""));
  77. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  78. X
  79. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  80. X  fd = open(UDBASE, O_RDONLY);
  81. X  if(fd == -1){
  82. X    nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  83. X  }
  84. X  while(read(fd, &DUMMY, dummy) == dummy){
  85. X    if(uid == DUMMY.id){
  86. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  87. X    }
  88. X    else{
  89. X        if((strcomp(s, DUMMY.name) == 0) ||
  90. X           (strcomp(s, DUMMY.nick) == 0) ||
  91. X           (strcomp(s, DUMMY.sh_name) == 0)){
  92. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  93. X        }
  94. X    }
  95. X  }
  96. X  lseek(fd, ll, SEEK_SET);
  97. X  read(fd, &LOOSER, sizeof(LOOSER));
  98. X  close(fd);
  99. X  mbunlock(UDBASE);
  100. X
  101. X  if(ll == -1L) return;
  102. X
  103. X  printf("%c%s %d                                               ", CR, ADM03_MSG, LOOSER.id);
  104. X
  105. X  printf("\n%s ", ADM04_MSG);
  106. X  strcpy(s, (char *) getline(30, 1011, '.', LOOSER.name));
  107. X  if (s[0] > 32) sprintf(LOOSER.name, s);
  108. X  if (s[0] == 32) LOOSER.name[0] = '\0';
  109. X
  110. X  printf("\n%s ", ADM05_MSG);
  111. X  strcpy(s, (char *) getline(10, 1011, '.', LOOSER.passwort));
  112. X  if (s[0] > 32) sprintf(LOOSER.passwort, s);
  113. X  if (s[0] == 32) LOOSER.passwort[0] = '\0';
  114. X
  115. X  printf("\n%s ", ADM06_MSG);
  116. X  strcpy(s, (char *) getline(14, 1011, '.', LOOSER.sh_name));
  117. X  if (s[0] > 32) sprintf(LOOSER.sh_name, s);
  118. X  if (s[0] == 32) LOOSER.sh_name[0] = '\0';
  119. X
  120. X  printf("\n%s ", ADM07_MSG);
  121. X  strcpy(s, (char *) getline(30, 1011, '.', LOOSER.nick));
  122. X  if (s[0] > 32) sprintf(LOOSER.nick, s);
  123. X  if (s[0] == 32) LOOSER.nick[0] = '\0';
  124. X
  125. X  printf("\n%s ", ADM08_MSG);
  126. X  strcpy(s, (char *) getline(30, 1011, '.', LOOSER.wohnort));
  127. X  if (s[0] > 31) sprintf(LOOSER.wohnort, s);
  128. X
  129. X  printf("\n%s ", ADM09_MSG);
  130. X  strcpy(s, (char *) getline(30, 1011, '.', LOOSER.strasse));
  131. X  if (s[0] > 31) sprintf(LOOSER.strasse, s);
  132. X
  133. X  printf("\n%s ", ADM10_MSG);
  134. X  strcpy(s, (char *) getline(20, 1011, '.', LOOSER.telefon1));
  135. X  if (s[0] > 31) sprintf(LOOSER.telefon1, s);
  136. X
  137. X  printf("\n%s ", ADM11_MSG);
  138. X  strcpy(s, (char *) getline(20, 1011, '.', LOOSER.telefon2));
  139. X  if (s[0] > 31) sprintf(LOOSER.telefon2, s);
  140. X
  141. X  printf("\n%s ", ADM12_MSG);
  142. X  strcpy(s, (char *) getline(10, 1114, '?', LOOSER.geburtsdatum));
  143. X  if (s[0] > 31) sprintf(LOOSER.geburtsdatum, s);
  144. X
  145. X  printf("\n%s ", ADM13_MSG);
  146. X  sprintf(t, "%d", LOOSER.terminal);
  147. X  strcpy(s, (char *) getline(5, 1111, '.', t));
  148. X  if (s[0] > 31) LOOSER.terminal = atoi(s);
  149. X  if ((LOOSER.terminal < 1) || (LOOSER.terminal > 4)) LOOSER.terminal = 1;
  150. X
  151. X  printf("\n%s ", ADM14_MSG);
  152. X  sprintf(t, "%d", LOOSER.editor);
  153. X  strcpy(s, (char *) getline(5, 1111, '.', t));
  154. X  if (s[0] > 31) LOOSER.editor = atoi(s);
  155. X  if ((LOOSER.editor < 1) || (LOOSER.editor > 3)) LOOSER.editor = 1;
  156. X
  157. X  printf("\n%s ", ADM15_MSG);
  158. X  sprintf(t, "%d", LOOSER.level);
  159. X  strcpy(s, (char *) getline(5, 1111, '.', t));
  160. X  if (s[0] > 31) LOOSER.level = atoi(s);
  161. X
  162. X  printf("\n%s ", ADM16_MSG);
  163. X  sprintf(t, "%d", LOOSER.more);
  164. X  strcpy(s, (char *) getline(5, 1111, '.', t));
  165. X  if (s[0] > 31) LOOSER.more = atoi(s);
  166. X  if ((LOOSER.more < 0) || (LOOSER.more > 3)) LOOSER.more = 1;
  167. X
  168. X  printf("\n%s ", ADM17_MSG);
  169. X  sprintf(t, "%d", LOOSER.bell);
  170. X  strcpy(s, (char *) getline(5, 1111, '.', t));
  171. X  if (s[0] > 31) LOOSER.bell = atoi(s);
  172. X  if ((LOOSER.bell < -1) || (LOOSER.bell > 1)) LOOSER.bell = 0;
  173. X
  174. X  printf("\n%s ", ADM18_MSG);
  175. X  sprintf(t, "%d", LOOSER.prompt);
  176. X  strcpy(s, (char *) getline(5, 1111, '.', t));
  177. X  if (s[0] > 31) LOOSER.prompt = atoi(s);
  178. X  if ((LOOSER.prompt < 1) || (LOOSER.prompt > 3)) LOOSER.prompt = 2;
  179. X
  180. X  printf("\n%s ", ADM19_MSG);
  181. X  LOOSER.tlines += 2;
  182. X  sprintf(t, "%d", LOOSER.tlines);
  183. X  strcpy(s, (char *) getline(5, 1111, '.', t));
  184. X  if (s[0] > 31) LOOSER.tlines = atoi(s);
  185. X  LOOSER.tlines -= 2;
  186. X  if ((LOOSER.tlines < 22) || (LOOSER.tlines > 23)) LOOSER.tlines = DEF_MAX_SCR_LINES;
  187. X  
  188. X  printf("\n%s ", ADM20_MSG);
  189. X  strcpy(s, (char *) getline(10, 1114, '?', LOOSER.lastlog));
  190. X  if (s[0] > 31) sprintf(LOOSER.lastlog, s);
  191. X
  192. X  printf("\n%s ", ADM21_MSG);
  193. X  strcpy(t, (char *) timereconv((long) LOOSER.lasttime));
  194. X  t[5] = '\0';
  195. X  strcpy(s, (char *) getline(5, 1113, '?', t));
  196. X  LOOSER.lasttime = timeconv(s);
  197. X
  198. X  printf("\n%s ", ADM21aMSG);
  199. X  strcpy(s, (char *) ttyname(0));
  200. X  if(strcomp(PMS_TTY, s) == 0){
  201. X    strcpy(s, (char *) getline(17, 1011, '.', LOOSER.account));
  202. X    if (s[0] > 31) sprintf(LOOSER.account, s);
  203. X  }
  204. X  else{
  205. X    printf("%s", LOOSER.account);
  206. X  }
  207. X
  208. X  printf("\n%s ", ADM22_MSG);
  209. X  strcpy(s, (char *) getline(58, 1011, '.', LOOSER.newsgrps));
  210. X  if (s[0] > 31) sprintf(LOOSER.newsgrps, s);
  211. X
  212. X  printf("\n%s ", ADM23_MSG);
  213. X  sprintf(t, "%d", LOOSER.seq);
  214. X  strcpy(s, (char *) getline(10, 1111, '.', t));
  215. X  if (s[0] > 31) LOOSER.seq = atoi(s);
  216. X
  217. X  wait_until_keypressed();
  218. X
  219. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  220. X  fd = open(UDBASE, O_WRONLY);
  221. X  if (fd == -1) {
  222. X    nerror("admin.c", 428, "aendern", "Datei-Schreibfehler", UDBASE);
  223. X  }
  224. X  if (lseek(fd, ll, SEEK_SET) == -1) {
  225. X    nerror("admin.c", 431, "aendern", "Positionierungsfehler", UDBASE);
  226. X  }
  227. X  write(fd, &LOOSER, sizeof(LOOSER));
  228. X  close(fd);
  229. X  mbunlock(UDBASE);
  230. X
  231. X  if (LOOSER.id == USER.id) {    /* Ich bin's !!! */
  232. X
  233. X    maybe_locked(UDBASE, "r");
  234. X    mblock(UDBASE);
  235. X    fd = open(UDBASE, O_RDONLY);
  236. X    if (fd == -1) {
  237. X        nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  238. X    }
  239. X    lseek(fd, ll, SEEK_SET);
  240. X    read(fd, &USER, sizeof(USER));
  241. X    close(fd);
  242. X    mbunlock(UDBASE);
  243. X  }
  244. X}
  245. X
  246. X
  247. X
  248. X/***************************************************************************/
  249. X/*      FUNKTION  user_anzeigen()                       */
  250. X/*  BESCHREIBUNG  ALLE Teilnehmerdaten anzeigen (von ADMIN aus)           */
  251. X/*     PARAMETER  keine                                                       */
  252. X/*     RUECKGABE  keine                                                       */
  253. X/***************************************************************************/
  254. X
  255. Xvoid user_anzeigen()
  256. X{
  257. X  int fd;
  258. X  struct userdaten DUMMY, LOOSER;
  259. X  char s[STRING];
  260. X  char t[STRING];
  261. X  long ll = -1L;
  262. X  size_t dummy = sizeof(DUMMY);
  263. X  char c;
  264. X  int i;
  265. X  int uid = -1;
  266. X
  267. X
  268. X  headline( ADM01_MSG );
  269. X
  270. X  printf("%s ", ADM02_MSG);
  271. X  strcpy(s, (char *) getline(30, 11, '.', ""));
  272. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  273. X
  274. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  275. X  fd = open(UDBASE, O_RDONLY);
  276. X  if (fd == -1) {
  277. X    nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  278. X  }
  279. X  while (read(fd, &DUMMY, dummy) == dummy) {
  280. X    if (uid == DUMMY.id) {
  281. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  282. X    } 
  283. X    else{
  284. X        if ((strcomp(s, DUMMY.name) == 0) ||
  285. X            (strcomp(s, DUMMY.nick) == 0) ||
  286. X            (strcomp(s, DUMMY.sh_name) == 0)) {
  287. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  288. X        }
  289. X    }
  290. X  }
  291. X  lseek(fd, ll, SEEK_SET);
  292. X  read(fd, &LOOSER, sizeof(LOOSER));
  293. X  close(fd);
  294. X  mbunlock(UDBASE);
  295. X
  296. X  if (ll == -1L) return;
  297. X
  298. X  printf("%c  %s %d                                               ", CR, ADM03_MSG, LOOSER.id);
  299. X  printf("\n  %s %s",   ADM04_MSG, LOOSER.name);
  300. X  printf("\n  %s %s",   ADM05_MSG, LOOSER.passwort);
  301. X  printf("\n  %s %s",   ADM06_MSG, LOOSER.sh_name);
  302. X  printf("\n  %s %s",   ADM07_MSG, LOOSER.nick);
  303. X  printf("\n  %s %s",   ADM08_MSG, LOOSER.wohnort);
  304. X  printf("\n  %s %s",   ADM09_MSG, LOOSER.strasse);
  305. X  printf("\n  %s %s",   ADM10_MSG, LOOSER.telefon1);
  306. X  printf("\n  %s %s",   ADM11_MSG, LOOSER.telefon2);
  307. X  printf("\n  %s %s",   ADM12_MSG, LOOSER.geburtsdatum);
  308. X  printf("\n  %s %d",   ADM13_MSG, LOOSER.terminal);
  309. X  printf("\n  %s %d",   ADM14_MSG, LOOSER.editor);
  310. X  printf("\n  %s %d",   ADM15_MSG, LOOSER.level);
  311. X  printf("\n  %s %d",   ADM16_MSG, LOOSER.more);
  312. X  printf("\n  %s %d",   ADM17_MSG, LOOSER.bell);
  313. X  printf("\n  %s %d",   ADM18_MSG, LOOSER.prompt);
  314. X  printf("\n  %s %d",   ADM19_MSG, LOOSER.tlines += 2);
  315. X  printf("\n  %s %s",   ADM20_MSG, LOOSER.lastlog);
  316. X  printf("\n  %s %.5s", ADM21_MSG, (char *) timereconv((long) LOOSER.lasttime));
  317. X  printf("\n  %s %s",   ADM21aMSG, LOOSER.account);
  318. X  printf("\n  %s %s",   ADM22_MSG, LOOSER.newsgrps);
  319. X  printf("\n  %s %d",   ADM23_MSG, LOOSER.seq);
  320. X
  321. X  wait_until_keypressed();
  322. X}
  323. X
  324. X
  325. X
  326. X/***************************************************************************/
  327. X/*      FUNKTION  user_loeschen()                       */
  328. X/*  BESCHREIBUNG  Einen Teilnehmer einsch. persoenlicher Post etc. aus       */
  329. X/*          dem System entfernen.                                    */
  330. X/*     PARAMETER  keine                                                       */
  331. X/*     RUECKGABE  keine                                                       */
  332. X/***************************************************************************/
  333. X
  334. Xvoid user_loeschen()
  335. X{
  336. X  int fd;
  337. X  int gd;
  338. X  struct userdaten DUMMY, LOOSER;
  339. X  char s[STRING];
  340. X  char t[STRING];
  341. X  long ll = -1L;
  342. X  size_t dummy = sizeof(DUMMY);
  343. X  char c;
  344. X  int i;
  345. X  int uid = -1;
  346. X
  347. X
  348. X  headline( ADM25_MSG );
  349. X    
  350. X  printf("\n%s ", ADM02_MSG);
  351. X  strcpy(s, (char *) getline(30, 11, '.', ""));
  352. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  353. X
  354. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  355. X  fd = open(UDBASE, O_RDONLY);
  356. X  if (fd == -1) {
  357. X    nerror("admin.c", 459, "loeschen", "Datei-Lesefehler", UDBASE);
  358. X  }
  359. X  while (read(fd, &DUMMY, dummy) == dummy) {
  360. X    if (uid == DUMMY.id) {
  361. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  362. X    }
  363. X    else{
  364. X        if ((strcomp(s, DUMMY.name) == 0) ||
  365. X            (strcomp(s, DUMMY.nick) == 0) ||
  366. X            (strcomp(s, DUMMY.sh_name) == 0)) {
  367. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  368. X        }
  369. X    }
  370. X  }
  371. X  lseek(fd, ll, SEEK_SET);
  372. X  read(fd, &LOOSER, sizeof(LOOSER));
  373. X  close(fd);
  374. X  mbunlock(UDBASE);
  375. X
  376. X  if (ll == -1L) return;
  377. X
  378. X  printf("%c%s (%d)                                     ", CR, ADM26_MSG, LOOSER.id);
  379. X  printf("\n%s (%s) ", ADM27_MSG, LOOSER.name);
  380. X
  381. X  ansi("md");
  382. X  printf("\n\n%s [%c, %c] ? > ", ADM28_MSG, GBL06_MSG, GBL07_MSG);
  383. X  ansi("me");
  384. X
  385. X  c = yesno();
  386. X
  387. X  if (c != GBL06_MSG) return;
  388. X
  389. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  390. X  fd = open(UDBASE, O_RDONLY);
  391. X  if (fd == -1) {
  392. X    nerror("admin.c", 490, "loeschen", "Datei-Lesefehler", UDBASE);
  393. X  }
  394. X  sprintf(s, "%s/%dbase", TMP, getpid());
  395. X
  396. X  gd = open(s, O_WRONLY | O_CREAT);
  397. X  if (gd == -1) {
  398. X    nerror("admin.c", 497, "loeschen", "Datei-Erstellungsfehler", s);
  399. X  }
  400. X  while (read(fd, &DUMMY, dummy) == dummy) {
  401. X    if (DUMMY.id != LOOSER.id) {
  402. X        write(gd, &DUMMY, dummy);
  403. X    }
  404. X  }
  405. X  close(gd);
  406. X  close(fd);
  407. X  mbunlock(UDBASE);
  408. X
  409. X  sprintf(t, "cp %s %s", s, UDBASE);
  410. X  system(t);
  411. X
  412. X  unlink(s);
  413. X
  414. X  sprintf(s, "rm -r %s/usr/%d", HOME, LOOSER.id);
  415. X  system(s);
  416. X}
  417. X
  418. X
  419. X
  420. X
  421. X/***************************************************************************/
  422. X/*      FUNKTION  setup_get()                           */
  423. X/*  BESCHREIBUNG  Die Ziffern 1-max einlesen und zurueckgeben.           */
  424. X/*     PARAMETER  max  =  groesste, zulaessige Ziffer                   */
  425. X/*     RUECKGABE  erfasste Ziffer (CHAR !!!)                   */
  426. X/***************************************************************************/
  427. X
  428. Xint setup_get(max)
  429. Xchar max;
  430. X{
  431. X  char c;
  432. X
  433. X  ansi("md");
  434. X  printf("\n[1-%c] %s > ", max, ADM29_MSG);
  435. X  ansi("me");
  436. X
  437. X  do {
  438. X    c = getint();
  439. X    if ((c < '0') || (c > max)) c = 0;
  440. X  } while (c == 0);
  441. X  printf("%c", c);
  442. X
  443. X  return c;
  444. X}
  445. X
  446. X
  447. X
  448. X
  449. X/***************************************************************************/
  450. X/*      FUNKTION  wait_until_keypressed                       */
  451. X/*  BESCHREIBUNG  siehe FUNKTION                       */
  452. X/*     PARAMETER  keine                                                       */
  453. X/*     RUECKGABE  keine                                                       */
  454. X/***************************************************************************/
  455. X
  456. Xvoid wait_until_keypressed()
  457. X{
  458. X  char c;
  459. X
  460. X  ansi("md");
  461. X  printf("\n\n%s > ", ADM30_MSG);
  462. X  ansi("me");
  463. X  c = getint();
  464. X}
  465. X
  466. X
  467. X
  468. X
  469. X/***************************************************************************/
  470. X/*      FUNKTION  admin()                           */
  471. X/*  BESCHREIBUNG  Teilnehmerverwaltung fuer den Administrator/Sysop.       */
  472. X/*     PARAMETER  keine                                                       */
  473. X/*     RUECKGABE  keine                                                       */
  474. X/***************************************************************************/
  475. X
  476. Xvoid admin()
  477. X{
  478. X  char c;
  479. X
  480. XAGAIN:
  481. X
  482. X  headline( ADM31_MSG );
  483. X
  484. X  printf(  "\n  1 - %s", ADM32_MSG);
  485. X  printf("\n\n  2 - %s", ADM33_MSG);
  486. X  printf("\n\n  3 - %s", ADM34_MSG);
  487. X  printf("\n\n  4 - %s", ADM35_MSG);
  488. X  printf("\n\n  5 - %s", ADM36_MSG);
  489. X
  490. X  printf("\n");
  491. X  printf("\n\n  8 - %s", ADM37_MSG);
  492. X
  493. X  MEDIUM: printf("\n");
  494. X
  495. X  c = setup_get('8');
  496. X
  497. X  switch (c) {
  498. X      case '1':    
  499. X        postfach("*");
  500. X        logout();
  501. X        intro();
  502. X        break;
  503. X
  504. X      case '2':    
  505. X        user_aendern();
  506. X        break;
  507. X
  508. X      case '3':    
  509. X        user_loeschen();
  510. X        break;
  511. X
  512. X      case '4':    
  513. X        user_anzeigen();
  514. X        break;
  515. X
  516. X      case '5':
  517. X        userliste("");
  518. X        wait_until_keypressed();
  519. X        break;
  520. X
  521. X       default:
  522. X        printf("\n");
  523. X        return;
  524. X  }
  525. X  goto AGAIN;
  526. X
  527. X}
  528. X
  529. X
  530. X
  531. X
  532. X/***************************************************************************/
  533. X/*      FUNKTION  setup()                           */
  534. X/*  BESCHREIBUNG  Teilnehmerdaten/Parameter aendern (fuer die User)        */
  535. X/*     PARAMETER  keine                                                       */
  536. X/*     RUECKGABE  keine                                                       */
  537. X/***************************************************************************/
  538. X
  539. Xvoid setup()
  540. X{
  541. X  FILE *fp;
  542. X  int fd;
  543. X  char s[STRING];
  544. X  char t[STRING];
  545. X  char c;
  546. X  int i;
  547. X  int ok = 0;
  548. X  long ll;
  549. X  struct userdaten DUMMY;
  550. X  int dummy = sizeof(DUMMY);
  551. X  char *BLANKS = "                                               ";
  552. X
  553. X
  554. X  AGAIN:
  555. X
  556. X  headline( ADM38_MSG );
  557. X  printf("\n");
  558. X
  559. X  printf("  1 - %s\n\n", ADM39_MSG);
  560. X  printf("  2 - %s\n\n", ADM40_MSG);
  561. X  printf("  3 - %s\n\n", ADM41_MSG);
  562. X  printf("  4 - %s\n\n", ADM42_MSG);
  563. X  printf("  5 - %s\n\n", ADM43_MSG);
  564. X  printf("  6 - %s\n\n", ADM44_MSG);
  565. X  printf("  7 - %s\n\n", ADM45_MSG);
  566. X  printf("  8 - %s\n\n", ADM46_MSG);
  567. X  printf("\n");
  568. X  printf("  9 - %s\n\n", ADM47_MSG);
  569. X
  570. X  c = setup_get('9');
  571. X
  572. X  switch (c) {
  573. X      case '1':
  574. X        headline( ADM48_MSG );
  575. X        printf("\n");
  576. X        if (USER.terminal == 1)
  577. X            printf("*");
  578. X        else
  579. X            printf(" ");
  580. X        printf(" 1 - ANSI (X3.64 ... PC-BBS-ANSI)\n\n");
  581. X        if (USER.terminal == 2)
  582. X            printf("*");
  583. X        else
  584. X            printf(" ");
  585. X        printf(" 2 - VT100\n\n");
  586. X        if (USER.terminal == 3)
  587. X            printf("*");
  588. X        else
  589. X            printf(" ");
  590. X        printf(" 3 - VT52\n\n");
  591. X        if (USER.terminal == 4)
  592. X            printf("*");
  593. X        else
  594. X            printf(" ");
  595. X        printf(" 4 - Dump (%s)\n\n", ADM49_MSG);
  596. X        USER.terminal = setup_get('4') - 48;
  597. X        break;
  598. X
  599. X      case '2':
  600. X        headline( ADM50_MSG );
  601. X        printf("\n");
  602. X        fp = fopen(EDITORS, "r");
  603. X        if (fp == NULL) {
  604. X            nerror("admin.c", 563, "setup", "Datei-Lesefehler", EDITORS);
  605. X        }
  606. X        i = 0;
  607. X        while((fgets(s, 80, fp) != NULL) && (s[0] == '/'));
  608. X        while (fscanf(fp, "%s %s", s, t) > 0) {
  609. X            i++;
  610. X            if (USER.editor == i)
  611. X                printf("*");
  612. X            else
  613. X                printf(" ");
  614. X            printf(" %d - %s\n\n", i, s);
  615. X        }
  616. X        fclose(fp);
  617. X        USER.editor = setup_get((i + 48)) - 48;
  618. X    
  619. X        if (USER.level < WRITE_INTERNAT) USER.editor = 1;
  620. X        break;
  621. X
  622. X      case '3':
  623. X        headline( ADM51_MSG );
  624. X        printf("\n");
  625. X        strcpy(s, (char *) mytime(0));
  626. X        if ((USER.prompt == 1) && (USER.bell == 1))
  627. X            printf("*");
  628. X        else
  629. X            printf(" ");
  630. X        printf(" 1 - %s->     \"[%s] %s > \"\n\n", ADM52_MSG, s, LOP06_MSG);
  631. X        if ((USER.prompt == 1) && (USER.bell == 0))
  632. X            printf("*");             
  633. X        else
  634. X            printf(" ");
  635. X        printf(" 2 - %s->     \"[%s] %s > \"\n\n", ADM53_MSG, s, LOP06_MSG);
  636. X        if ((USER.prompt == 2) && (USER.bell == 1))
  637. X            printf("*");
  638. X        else
  639. X            printf(" ");
  640. X        printf(" 3 - %s->     \"[%s] %s > \"\n\n", ADM54_MSG, NG, LOP06_MSG);
  641. X        if ((USER.prompt == 2) && (USER.bell == 0))
  642. X            printf("*");
  643. X        else
  644. X            printf(" ");
  645. X        printf(" 4 - %s->     \"[%s] %s > \"\n\n", ADM55_MSG, NG, LOP06_MSG);
  646. X        if ((USER.prompt == 3) && (USER.bell == 1))
  647. X            printf("*");
  648. X        else
  649. X            printf(" ");
  650. X        printf(" 5 - %s->     \"[(Sec.) NZ, RZ, WZ] %s > \"\n\n", ADM56_MSG, LOP06_MSG);
  651. X        if ((USER.prompt == 3) && (USER.bell == 0))
  652. X            printf("*");
  653. X        else
  654. X            printf(" ");
  655. X        printf(" 6 - %s->     \"[(Sec.) NZ, RZ, WZ] %s > \"\n\n", ADM57_MSG, LOP06_MSG);
  656. X    
  657. X        c = setup_get('6');
  658. X        switch (c) {
  659. X                case '1':
  660. X                    USER.prompt = 1;
  661. X                    USER.bell = 1;
  662. X                    break;
  663. X                case '2':
  664. X                    USER.prompt = 1;
  665. X                    USER.bell = 0;
  666. X                    break;
  667. X                case '3':
  668. X                    USER.prompt = 2;
  669. X                    USER.bell = 1;
  670. X                    break;
  671. X                case '4':
  672. X                    USER.prompt = 2;
  673. X                    USER.bell = 0;
  674. X                    break;
  675. X                case '5':
  676. X                    USER.prompt = 3;
  677. X                    USER.bell = 1;
  678. X                    break;
  679. X                case '6':
  680. X                    USER.prompt = 3;
  681. X                    USER.bell = 0;
  682. X                    break;
  683. X        }
  684. X        break;
  685. X
  686. X      case '4':
  687. X        headline( ADM58_MSG );
  688. X        printf("\n");
  689. X        if (USER.more == 0)
  690. X            printf("*");
  691. X        else
  692. X            printf(" ");
  693. X        printf(" 1 - %s\n\n", ADM59_MSG);
  694. X        if (USER.more == 1)
  695. X            printf("*");
  696. X        else
  697. X            printf(" ");
  698. X        printf(" 2 - %s\n\n", ADM60_MSG);
  699. X        if (USER.more == 3)
  700. X            printf("*");
  701. X        else
  702. X            printf(" ");
  703. X        printf(" 3 - %s\n\n", ADM61_MSG);
  704. X        printf("\n");
  705. X        printf("  4 - %s\n\n", ADM62_MSG);
  706. X        printf("  5 - %s\n\n", ADM63_MSG);
  707. X        printf("  6 - %s\n\n", ADM64_MSG);        
  708. X        printf("  7 - %s\n\n", ADM64aMSG);
  709. X
  710. X        i = setup_get('7') - 49;
  711. X
  712. X        if (i < 3) {
  713. X            USER.more = i;
  714. X            if (USER.more == 2) USER.more++;
  715. X        }
  716. X        else {
  717. X            headline( ADM58_MSG );
  718. X            printf("\n");
  719. X            
  720. X            if (i == 3) {
  721. X                if (USER.leserichtung == 1)
  722. X                    printf("*");
  723. X                else
  724. X                    printf(" ");
  725. X                printf(" 1 - %s\n\n", ADM65_MSG);
  726. X                if (USER.leserichtung == 2)
  727. X                    printf("*");
  728. X                else
  729. X                    printf(" ");
  730. X                printf(" 2 - %s\n\n", ADM66_MSG);
  731. X        
  732. X                USER.leserichtung = setup_get('2') - 48;
  733. X            }
  734. X            if (i == 4) {
  735. X                if (USER.tlines != 23)
  736. X                    printf("*");
  737. X                else
  738. X                    printf(" ");
  739. X                printf(" 1 - %s\n\n", ADM67_MSG);
  740. X                if (USER.tlines == 23)
  741. X                    printf("*");
  742. X                else
  743. X                    printf(" ");
  744. X                printf(" 2 - %s\n\n", ADM68_MSG);
  745. X        
  746. X                USER.tlines = setup_get('2') - 48 + 21;
  747. X            }
  748. X            if (i == 5) {
  749. X                if (USER.schluessel[0] != 32)
  750. X                    printf("*");
  751. X                else
  752. X                    printf(" ");
  753. X                printf(" 1 - %s\n\n", ADM69_MSG);
  754. X                if (USER.schluessel[0] == 32)
  755. X                    printf("*");
  756. X                else
  757. X                    printf(" ");
  758. X                printf(" 2 - %s\n\n", ADM70_MSG);
  759. X        
  760. X                i = setup_get('2') - 48;
  761. X                if (i == 2){
  762. X                    USER.schluessel[0] = 32;
  763. X                }                
  764. X                else{
  765. X                    USER.schluessel[0] = 1;
  766. X                }
  767. X            }
  768. X            if (i == 6) {
  769. X                if (USER.schluessel[1] == 2)
  770. X                    printf("*");
  771. X                else
  772. X                    printf(" ");
  773. X                printf(" 1 - %s\n\n", ADM70aMSG);
  774. X                if (USER.schluessel[1] == 3)
  775. X                    printf("*");
  776. X                else
  777. X                    printf(" ");
  778. X                printf(" 2 - %s\n\n", ADM70bMSG);
  779. X        
  780. X                if (USER.schluessel[1] == 4)
  781. X                    printf("*");
  782. X                else
  783. X                    printf(" ");
  784. X                printf(" 3 - %s\n\n", ADM70cMSG);
  785. X    
  786. X                i = setup_get('3') - 48;
  787. X                USER.schluessel[1] = i + 1;
  788. X            }
  789. X        }
  790. X        break;
  791. X
  792. X    case '5':
  793. X        if (strcomp(GUEST, USER.name) == 0) break;
  794. X
  795. X        headline( ADM71_MSG );
  796. X        printf("\n");
  797. X
  798. X        ansi("md");
  799. X        printf("%s\n", ADM72_MSG);
  800. X        printf("%s\n", ADM73_MSG);
  801. X        printf("%s\n", ADM74_MSG);
  802. X        printf("\n");
  803. X        printf("%s\n", ADM75_MSG);
  804. X        printf("%s\n", ADM76_MSG);
  805. X        ansi("me");
  806. X
  807. X        maybe_locked(UDBASE, "r"); 
  808. X            fd = open(UDBASE, O_RDONLY);
  809. X        if (fd == -1) {
  810. X            nerror("admin.c", 747, "setup", "Datei-Lesefehler", UDBASE);
  811. X        }    
  812. X
  813. X        printf("\n%s ", ADM04_MSG);
  814. X        strcpy(s, (char *) getline(30, 1015, '.', USER.name));
  815. X        if(strcomp(GUEST, s) != 0){
  816. X            if (s[0] > 31){
  817. X                ok = 0;
  818. X                lseek(fd, 0L, SEEK_SET);
  819. X                while ((read(fd, &DUMMY, sizeof(DUMMY)) == sizeof(DUMMY)) && (ok == 0)) {
  820. X                    if (strcomp(s, DUMMY.name)    == 0) ok = 1;
  821. X                    if (strcomp(s, DUMMY.nick)    == 0) ok = 1;
  822. X                    if (strcomp(s, DUMMY.sh_name) == 0) ok = 1;
  823. X                }
  824. X                if(USER.level < ADMIN_LEV){
  825. X                    if ((strcomp("SYSOP", s) == 0) ||
  826. X                        (strcomp("POST",  s) == 0) ||
  827. X                        (strcomp("GAST",  s) == 0) ||
  828. X                        (strcomp("ADMIN", s) == 0) ||
  829. X                        (strcomp("COSYS", s) == 0)) ok++;
  830. X                }
  831. X
  832. X                if(ok == 0) sprintf(USER.name, s);
  833. X            }
  834. X        }
  835. X
  836. X        printf("\n%s ", ADM07_MSG);
  837. X        strcpy(s, (char *) getline(30, 1015, '.', USER.nick));
  838. X        if (s[0] > 31){    
  839. X            ok = 0;
  840. X            lseek(fd, 0L, SEEK_SET);
  841. X            while ((read(fd, &DUMMY, sizeof(DUMMY)) == sizeof(DUMMY)) && (ok == 0)) {
  842. X                if (strcomp(s, DUMMY.name)    == 0) ok = 1;
  843. X                if (strcomp(s, DUMMY.nick)    == 0) ok = 1;
  844. X                if (strcomp(s, DUMMY.sh_name) == 0) ok = 1;
  845. X            }
  846. X            if (USER.level < ADMIN_LEV){
  847. X                if ((strcomp("SYSOP", s) == 0) ||
  848. X                    (strcomp("POST",  s) == 0) ||
  849. X                    (strcomp("GAST",  s) == 0) ||
  850. X                    (strcomp("ADMIN", s) == 0) ||
  851. X                    (strcomp("COSYS", s) == 0)) ok++;
  852. X            }
  853. X
  854. X            if(ok == 0) sprintf(USER.nick, s);
  855. X        }
  856. X
  857. X        close(fd);
  858. X        mbunlock(UDBASE);
  859. X
  860. X        printf("\n%s ", ADM08_MSG);
  861. X        strcpy(s, (char *) getline(30, 1011, '.', USER.wohnort));
  862. X        if (s[0] > 31) sprintf(USER.wohnort, s);
  863. X
  864. X        printf("\n%s ", ADM09_MSG);
  865. X        strcpy(s, (char *) getline(30, 1011, '.', USER.strasse));
  866. X        if (s[0] > 31) sprintf(USER.strasse, s);
  867. X
  868. X        printf("\n%s ", ADM10_MSG);
  869. X        strcpy(s, (char *) getline(20, 1011, '.', USER.telefon1));
  870. X        if (s[0] > 31) sprintf(USER.telefon1, s);
  871. X
  872. X        printf("\n%s ", ADM11_MSG);
  873. X        strcpy(s, (char *) getline(20, 1011, '.', USER.telefon2));
  874. X        if (s[0] > 31) sprintf(USER.telefon2, s);
  875. X
  876. X        printf("\n%s ", ADM12_MSG);
  877. X        strcpy(s, (char *) getline(10, 1114, '?', USER.geburtsdatum));
  878. X        if (s[0] > 31) sprintf(USER.geburtsdatum, s);
  879. X
  880. X        break;
  881. X
  882. X
  883. X      case '6':
  884. X        if (strcomp(GUEST, USER.name) == 0) break;
  885. X
  886. X        headline( ADM77_MSG );
  887. X        
  888. X        NIX: printf("\n%s ", ADM78_MSG);
  889. X    
  890. X        strcpy(s, (char *) getline(10, 12, '.', ""));
  891. X        if (s[0] != '\0') {
  892. X            strcpy(USER.passwort, (char *) crypted(s));
  893. X            printf(" (%s)", USER.passwort);
  894. X        }
  895. X        if (length(USER.passwort) < 5) {
  896. X            ansi("md");
  897. X            printf("\n\n%s\n", ADM79_MSG);
  898. X            ansi("me");
  899. X            goto NIX;
  900. X        }
  901. X        printf("\n\n%s ", ADM80_MSG);
  902. X        strcpy(s, (char *) getline(10, 12, '.', ""));
  903. X        strcpy(t, (char *) crypted(s));
  904. X        printf(" (%s)", t);
  905. X        if ((strcomp(t, USER.passwort) != 0) || (strcomp(USER.passwort, t) != 0)) {
  906. X            ansi("md");
  907. X            printf(" %s         \n", ADM81_MSG);
  908. X            ansi("me");
  909. X            goto NIX;
  910. X        }
  911. X        break;
  912. X
  913. X    case '7':
  914. X        headline( ADM82_MSG );
  915. X        printf("\n");
  916. X        strcpy(s, (char *) mytime(0));
  917. X        if (USER.intro == 1)
  918. X            printf("*");
  919. X        else
  920. X            printf(" ");
  921. X        printf(" 1 - %s\n\n", ADM83_MSG);
  922. X        if (USER.intro == 2)
  923. X            printf("*");
  924. X        else
  925. X            printf(" ");
  926. X        printf(" 2 - %s\n\n", ADM84_MSG);
  927. X        if (USER.intro == 3)
  928. X            printf("*");
  929. X        else
  930. X            printf(" ");
  931. X        printf(" 3 - %s\n\n", ADM85_MSG);
  932. X        if (USER.intro == 4)
  933. X            printf("*");
  934. X        else
  935. X            printf(" ");
  936. X        printf(" 4 - %s\n\n", ADM86_MSG);
  937. X
  938. X        USER.intro = setup_get('4') - 48;
  939. X        break;
  940. X
  941. X      case '8':
  942. X        headline( ADM87_MSG );
  943. X        printf("\n");
  944. X        if (USER.lastmode == 1)
  945. X            printf("*");
  946. X        else
  947. X            printf(" ");
  948. X        printf(" 1 - %s\n\n", ADM88_MSG);
  949. X        if (USER.lastmode == 2)
  950. X            printf("*");
  951. X        else
  952. X            printf(" ");
  953. X        printf(" 2 - %s\n\n", ADM89_MSG);
  954. X        printf("\n");
  955. X        printf("  3 - %s\n\n", ADM90_MSG);
  956. X    
  957. X        i = setup_get('3') - 48;
  958. X
  959. X        switch (i) {
  960. X            case 1:
  961. X                USER.lastmode = 1;
  962. X                LASTTIME = USER.lasttime;
  963. X                break;
  964. X            case 2:
  965. X                USER.lastmode = 2;
  966. X                LASTTIME = (int) 0;
  967. X                break;
  968. X            case 3:
  969. X                headline( ADM87_MSG );
  970. X                ansi("md");
  971. X                printf("\n%s\n", ADM91_MSG);
  972. X                printf("%s\n", ADM92_MSG);
  973. X                printf("%s\n", ADM93_MSG);
  974. X                printf("%s\n", ADM94_MSG);
  975. X                ansi("me");
  976. X
  977. X                printf("\n%s ", ADM95_MSG);
  978. X                strcpy(t, (char *) datereconv(LASTLOG));
  979. X                strcpy(s, (char *) getline(10, 1114, '?', t));
  980. X                LASTLOG = (long) dateconv(s);
  981. X
  982. X                printf("\n%s ", ADM96_MSG);
  983. X                strcpy(t, (char *) timereconv(LASTTIME));
  984. X                strcpy(s, (char *) getline(8, 1113, '?', t));
  985. X                LASTTIME = timeconv(s);
  986. X
  987. X                break;
  988. X        }
  989. X        break;
  990. X
  991. X      case '9':    
  992. X        goto ENDE;
  993. X        break;
  994. X  }
  995. X  printf("\n\n");
  996. X  init_user( ADM97_MSG );
  997. X  goto AGAIN;
  998. X
  999. X  ENDE:
  1000. X
  1001. X  printf("\n");
  1002. X  return;
  1003. X}
  1004. END_OF_FILE
  1005.   if test 24570 -ne `wc -c <'src/admin.c'`; then
  1006.     echo shar: \"'src/admin.c'\" unpacked with wrong size!
  1007.   fi
  1008.   # end of 'src/admin.c'
  1009. fi
  1010. if test -f 'src/lesen.c' -a "${1}" != "-c" ; then 
  1011.   echo shar: Will not clobber existing file \"'src/lesen.c'\"
  1012. else
  1013.   echo shar: Extracting \"'src/lesen.c'\" \(9399 characters\)
  1014.   sed "s/^X//" >'src/lesen.c' <<'END_OF_FILE'
  1015. X/***************************************************************************/
  1016. X/*        PROGRAMM  ix/Mbox                           */
  1017. X/*             DATEI  lesen.c                           */
  1018. X/*        FUNKTIONEN  lesen(), ansage(), unterschrift()               */
  1019. X/*              getsite(), checkdomaintype()               */
  1020. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1021. X/*  LETZTE AENDERUNG  04.01.1992                       */
  1022. X/***************************************************************************/
  1023. X
  1024. X#include <sys/types.h>
  1025. X#include <sys/stat.h>
  1026. X#include <unistd.h>
  1027. X#include <fcntl.h>
  1028. X#include <stdio.h>
  1029. X#include <utmp.h>
  1030. X#include <time.h>
  1031. X
  1032. X
  1033. X#include "mbox.h"
  1034. X
  1035. X
  1036. Xextern char headinfo[STRING];
  1037. X
  1038. X
  1039. X/***************************************************************************/
  1040. X/*      FUNKTION  lesen()                           */
  1041. X/*  BESCHREIBUNG  Zeigt einen Artikel o. eine persoenliche Mail an. Bietet */
  1042. X/*          dann versch. Optionen zum Weiterlesen o. Beantworten an. */
  1043. X/*     PARAMETER  arg  =  Nummer des Artikels/der Mail                     */
  1044. X/*     RUECKGABE  keine                                                       */
  1045. X/***************************************************************************/
  1046. X
  1047. Xvoid lesen(arg)
  1048. Xchar arg[];
  1049. X{
  1050. X  FILE *fp;
  1051. X  char s[LSTRING];
  1052. X  char entry[STRING];
  1053. X  char no[10];
  1054. X  char c;
  1055. X  int i;
  1056. X  int ok;
  1057. X  int MIN, MAX;
  1058. X  int pr;
  1059. X
  1060. X  struct stat fst;
  1061. X
  1062. X  sprintf(no, "%s", arg);
  1063. X
  1064. X  maybe_locked(INHALT, "r");
  1065. X  fp = fopen(INHALT, "r");
  1066. X  if (fp == NULL) {
  1067. X    nerror("misc.c", 558, "lesen", "Datei-Lesefehler", INHALT);
  1068. X  }
  1069. X  while ((fgets(s, LSTRING, fp) != NULL) && (s[2] != '='));
  1070. X  fgets(s, LSTRING, fp);
  1071. X  MIN = atoi(s);
  1072. X  while (fgets(s, LSTRING, fp) != NULL) {
  1073. X    MAX = atoi(s);
  1074. X  }
  1075. X  fclose(fp);
  1076. X
  1077. X  if (MAX < MIN) {
  1078. X    i = MIN;
  1079. X    MIN = MAX;
  1080. X    MAX = i;
  1081. X  }
  1082. X  NEXT_MSG:
  1083. X
  1084. X  if ((no[0] < '1') || (no[0] > '9')) {
  1085. X    ansi("md");
  1086. X    printf(" %s\n", MIS41_MSG);
  1087. X    ansi("me");
  1088. X    return;
  1089. X  }
  1090. X  if (pruefe(no) != 0) goto NEXT_NEXT;
  1091. X
  1092. X  printf("\n\n");
  1093. X  ansi("cl");
  1094. X
  1095. X  if (strcomp(BRETT, "PM") != 0) {
  1096. X        sprintf(entry, "%s/%s", BRETT, no); 
  1097. X    if(USER.terminal == 4){
  1098. X        ansi("md");
  1099. X        printf("%s %s\n", MIS42_MSG, no);
  1100. X        ansi("me");
  1101. X    }
  1102. X    else{
  1103. X        sprintf(headinfo, " %s %s (%s) ", MIS43_MSG, no, NG);
  1104. X        headline( headinfo );
  1105. X    }
  1106. X    ok = show(entry, 9999, USER.more);
  1107. X  }
  1108. X  else {
  1109. X    sprintf(entry, "%s/usr/%d/%s", HOME, USER.id, no);
  1110. X    if(USER.terminal == 4){
  1111. X        ansi("md");
  1112. X        printf("%s %s\n", MIS44_MSG, no);
  1113. X        ansi("me");
  1114. X    }
  1115. X    else{
  1116. X        sprintf(headinfo, " %s (%s) ", MIS45_MSG, no);
  1117. X        headline( headinfo );
  1118. X    }
  1119. X    ok = show(entry, 9999, USER.more);
  1120. X  }
  1121. X
  1122. X  if(ok == -1) return;
  1123. X
  1124. X  c = LF;
  1125. X
  1126. X  NEXT_NEXT:
  1127. X
  1128. X  printf("\n");
  1129. X  ansi("mr");
  1130. X  printf("[Mesg. %s] %s, ? > ", no, MIS46_MSG);
  1131. X  ansi("me");
  1132. X  printf("%c%c", MIS51_MSG, BS);
  1133. X
  1134. X  do {
  1135. X    c = getint();
  1136. X    if (c == MIS50_MSG) c = '*';
  1137. X    if (c >= 97) c -= 32;
  1138. X    if (c == ENTER) c = MIS51_MSG;
  1139. X    if (c == '?') {
  1140. X        clearline();
  1141. X        ansi("mr");
  1142. X        printf("%c%s > ", CR, MIS53_MSG);
  1143. X        ansi("me");
  1144. X    }
  1145. X    if ((c != MIS47_MSG) && (c != MIS48_MSG) && (c != MIS49_MSG) && (c != MIS50_MSG) && (c != MIS51_MSG) && (c != MIS52_MSG) && (c != '*'))
  1146. X        c = 0;
  1147. X  } while (c == 0);
  1148. X
  1149. X  printf("%c", c);
  1150. X
  1151. X  if (c == MIS50_MSG) {        /* LOESCHEN */
  1152. X    clearline();
  1153. X    ansi("mr");
  1154. X    printf("%s [%c, %c] > ", MIS54_MSG, GBL06_MSG, GBL07_MSG);
  1155. X    ansi("me");
  1156. X    if (yesno() == GBL06_MSG) {
  1157. X        loeschen(no);
  1158. X    }
  1159. X    printf("\n");
  1160. X    c = MIS51_MSG;
  1161. X  }
  1162. X  if (c == '*') {        /* LOESCHEN (sofort) */
  1163. X    loeschen(no);
  1164. X    printf("\n");
  1165. X    c = MIS51_MSG;
  1166. X  }
  1167. X  if (c == MIS51_MSG) {        /* NAECHSTE */
  1168. X    ok = 0;
  1169. X    do {
  1170. X        i = atoi(no);
  1171. X        i++;
  1172. X        sprintf(no, "%d", i);
  1173. X        pr = pruefe(no);
  1174. X        if (pr == 0) ok = 1;
  1175. X        if (pr == 1) goto NEXT_NEXT;
  1176. X        if (i > MAX) {
  1177. X            printf("\n\n%s\n", MIS55_MSG);
  1178. X            return;
  1179. X        }
  1180. X    } while (ok == 0);
  1181. X    if (ok == 1) goto NEXT_MSG;
  1182. X    goto NEXT_NEXT;
  1183. X  }
  1184. X  if (c == MIS52_MSG) {        /* VORHERIGE */
  1185. X    ok = 0;
  1186. X    do {
  1187. X        i = atoi(no);
  1188. X        i--;
  1189. X        sprintf(no, "%d", i);
  1190. X        pr = pruefe(no);
  1191. X        if (pr == 0) ok = 1;
  1192. X        if (pr == 1) goto NEXT_NEXT;
  1193. X        if (i < MIN) {
  1194. X            printf("\n\n%s\n", MIS56_MSG);
  1195. X            return;
  1196. X        }
  1197. X    } while (ok == 0);
  1198. X    if (ok == 1) goto NEXT_MSG;
  1199. X    goto NEXT_NEXT;
  1200. X  }
  1201. X  if (c == MIS49_MSG) goto NEXT_MSG;    /* WIEDERHOLEN */
  1202. X
  1203. X
  1204. X  if (c == MIS48_MSG) {            /* BEANTWORTEN */
  1205. X    headline( MIS57_MSG );
  1206. X    printf("\n%s", MIS58_MSG);
  1207. X    sprintf(s, "cp %s %s/%dRep > /dev/null", entry, TMP, getpid());
  1208. X    system(s);
  1209. X
  1210. X    if (strcomp(BRETT, "PM") == 0) {
  1211. X        brief("~REPLY~");
  1212. X        sprintf(s, "%s?", USER.name);
  1213. X        brief(s);
  1214. X        sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  1215. X        stat(s, &fst);
  1216. X        IDX_SIZE = (int) fst.st_size;
  1217. X    }
  1218. X    else {
  1219. X        printf("\n\n");
  1220. X        ansi("mr");
  1221. X        printf("%s, ? > ", MIS59_MSG);
  1222. X        ansi("me");
  1223. X
  1224. X        do {
  1225. X            c = getint();
  1226. X            if (c >= 97) c -= 32;
  1227. X            if (c == '?') {
  1228. X                clearline();
  1229. X                ansi("mr");
  1230. X                printf("%c%s > ", CR, MIS60_MSG);
  1231. X                ansi("me");
  1232. X            }
  1233. X            if ((c != MIS61_MSG) && (c != MIS62_MSG)) c = 0;
  1234. X        } while (c == 0);
  1235. X
  1236. X        printf("%c", c);
  1237. X
  1238. X        if (c == MIS62_MSG) {
  1239. X            schreiben("");
  1240. X        }
  1241. X        if (c == MIS61_MSG) {
  1242. X            brief("~REPLY~");
  1243. X            if(strcomp(GUEST, USER.name) != 0){
  1244. X                sprintf(s, "%s?", USER.name);
  1245. X                brief(s);
  1246. X                sprintf(s, "%s/usr/%d/INDEX", HOME, USER.id);
  1247. X                stat(s, &fst);
  1248. X                    IDX_SIZE = (long) fst.st_size;
  1249. X            }
  1250. X        }
  1251. X    }
  1252. X    goto NEXT_NEXT;
  1253. X  }
  1254. X  printf("\n");
  1255. X  return;
  1256. X}
  1257. X
  1258. X
  1259. X
  1260. X/***************************************************************************/
  1261. X/*      FUNKTION  ansage()                           */
  1262. X/*  BESCHREIBUNG  Der Ansage-Text wird angezeigt und kann geandert werden. */
  1263. X/*     PARAMETER  keine                                                       */
  1264. X/*     RUECKGABE  keine                                                       */
  1265. X/***************************************************************************/
  1266. X
  1267. Xvoid ansage()
  1268. X{
  1269. X  FILE *ff;
  1270. X  char s[STRING];
  1271. X  char t[STRING];
  1272. X  char TEP[STRING];
  1273. X  char c;
  1274. X
  1275. X
  1276. X  printf("\n\n%s\n\n", MAL38_MSG);
  1277. X
  1278. X  sprintf(TEP, "%s/usr/%d/.hello", HOME, USER.id);
  1279. X  ff = fopen(TEP, "r");
  1280. X  if (ff != NULL) {
  1281. X    ansi("md");
  1282. X    while (fgets(s, 80, ff) != NULL) {
  1283. X        printf("%s", s);
  1284. X    }
  1285. X    fclose(ff);
  1286. X    ansi("me");
  1287. X    printf("\n\n");
  1288. X  }
  1289. X  ansi("mr");
  1290. X  printf("%c%s [%c, %c] > ", CR, MAL39_MSG, GBL06_MSG, GBL07_MSG);
  1291. X  ansi("me");
  1292. X
  1293. X  c = yesno();
  1294. X
  1295. X  if (c == GBL06_MSG) {
  1296. X    sprintf(t, "%s %s", EDDY, TEP);
  1297. X    system(t);
  1298. X  }
  1299. X  printf("\n");
  1300. X}
  1301. X
  1302. X
  1303. X
  1304. X
  1305. X/***************************************************************************/
  1306. X/*      FUNKTION  unterschrift                           */
  1307. X/*  BESCHREIBUNG  Die Unterschrift (.signature) wird angezeigt und kann    */
  1308. X/*          geandert werden.                                         */
  1309. X/*     PARAMETER  keine                                                       */
  1310. X/*     RUECKGABE  keine                                                       */
  1311. X/***************************************************************************/
  1312. X
  1313. Xvoid unterschrift()
  1314. X{
  1315. X  FILE *ff;
  1316. X  char s[STRING];
  1317. X  char t[STRING];
  1318. X  char TEP[STRING];
  1319. X  char c;
  1320. X
  1321. X
  1322. X  printf("\n\n%s\n\n", MAL40_MSG);
  1323. X
  1324. X  sprintf(TEP, "%s/usr/%d/.signature", HOME, USER.id);
  1325. X  ff = fopen(TEP, "r");
  1326. X  if (ff != NULL) {
  1327. X    ansi("md");
  1328. X    while (fgets(s, 80, ff) != NULL) {
  1329. X        printf("%s", s);
  1330. X    }
  1331. X    fclose(ff);
  1332. X    ansi("me");
  1333. X    printf("\n\n");
  1334. X  }
  1335. X  ansi("mr");
  1336. X  printf("%c%s [%c, %c] > ", CR, MAL41_MSG, GBL06_MSG, GBL07_MSG);
  1337. X  ansi("me");
  1338. X
  1339. X  c = yesno();
  1340. X
  1341. X  if (c == GBL06_MSG) {
  1342. X    sprintf(t, "%s %s", EDDY, TEP);
  1343. X    system(t);
  1344. X  }
  1345. X  printf("\n");
  1346. X}
  1347. X
  1348. X
  1349. X
  1350. X
  1351. X/***************************************************************************/
  1352. X/*      FUNKTION  getsite()                           */
  1353. X/*  BESCHREIBUNG  Findet den Empfaenger SITE in der Adresse           */
  1354. X/*     PARAMETER  Adresse                                                  */
  1355. X/*     RUECKGABE  Empfaenger SITE                                          */
  1356. X/***************************************************************************/
  1357. X
  1358. Xchar *getsite(arg)
  1359. Xchar arg[];
  1360. X{
  1361. X  int i = 0, a = 0, b = 0, c = 0;
  1362. X  char s[STRING];
  1363. X
  1364. X  while(arg[i] != '\0'){
  1365. X    if(arg[i] == '!') a = i - 1;
  1366. X    if(arg[i] == '@') b = i + 1;
  1367. X    if(arg[i] == '.'){
  1368. X        if((b != 0) && (c == 0)) c = i -1;
  1369. X    }
  1370. X    i++;
  1371. X  }
  1372. X
  1373. X  if((a == 0) && (b == 0)) strcat(s, UUCPSITE);
  1374. X  if(a != 0) strcpy(s, (char *) strcopy(arg, 0, a));
  1375. X  if(b != 0) strcpy(s, (char *) strcopy(arg, b, c));
  1376. X
  1377. X  return (char *) s;
  1378. X}
  1379. X
  1380. X
  1381. X
  1382. X
  1383. X/***************************************************************************/
  1384. X/*      FUNKTION  checkdomaintype()                       */
  1385. X/*  BESCHREIBUNG  Internationale MAIL ???                    */
  1386. X/*     PARAMETER  Adresse                                                  */
  1387. X/*     RUECKGABE   0 = ok                                                  */
  1388. X/*                -1 = Level zu gering                       */
  1389. X/***************************************************************************/
  1390. X
  1391. Xint checkdomaintype(arg)
  1392. Xchar arg[];
  1393. X{
  1394. X  int i = 0, l, a, e = 0, f = 0, g = 0, international = 0;
  1395. X  char s[STRING];
  1396. X
  1397. X  if(USER.level >= WRITE_INTERNAT) return 0;
  1398. X
  1399. X  while(arg[i] != '\0'){
  1400. X    if(arg[i] == '!') e++;
  1401. X    if(arg[i] == '@') g++;
  1402. X    i++;
  1403. X  }
  1404. X  s[0] = '\0';
  1405. X
  1406. X  if((e == 0) && (g == 0)) return 0;
  1407. X
  1408. X  if(e > 1) international++;
  1409. X
  1410. X  if(e == 0){
  1411. X
  1412. X    l = strlen( (char *) arg);
  1413. X
  1414. X    a = strlen( (char *) NAT_DOMAIN1 );
  1415. X    strcpy(s, (char *) strcopy(arg, (l-a), l));
  1416. X    if(strcomp(s, NAT_DOMAIN1) == 0) f++;
  1417. X
  1418. X    a = strlen( (char *) NAT_DOMAIN2 );
  1419. X    strcpy(s, (char *) strcopy(arg, (l-a), l));
  1420. X    if(strcomp(s, NAT_DOMAIN2) == 0) f++;
  1421. X
  1422. X    a = strlen( (char *) NAT_DOMAIN3 );
  1423. X    strcpy(s, (char *) strcopy(arg, (l-a), l));
  1424. X    if(strcomp(s, NAT_DOMAIN3) == 0) f++;      
  1425. X
  1426. X    if(f == 0) international++;
  1427. X  }  
  1428. X
  1429. X  if(international != 0){
  1430. X    ansi("md");
  1431. X    printf("\n\n%s (%d) %s\n", MAL01_MSG, WRITE_INTERNAT, MAL02_MSG);
  1432. X    ansi("me");
  1433. X    return -1;    
  1434. X  }
  1435. X
  1436. X  return 0;
  1437. X}
  1438. X
  1439. X
  1440. X
  1441. X
  1442. END_OF_FILE
  1443.   if test 9399 -ne `wc -c <'src/lesen.c'`; then
  1444.     echo shar: \"'src/lesen.c'\" unpacked with wrong size!
  1445.   fi
  1446.   # end of 'src/lesen.c'
  1447. fi
  1448. if test -f 'src/mail.c' -a "${1}" != "-c" ; then 
  1449.   echo shar: Will not clobber existing file \"'src/mail.c'\"
  1450. else
  1451.   echo shar: Extracting \"'src/mail.c'\" \(22692 characters\)
  1452.   sed "s/^X//" >'src/mail.c' <<'END_OF_FILE'
  1453. X/***************************************************************************/
  1454. X/*        PROGRAMM  ix/Mbox                           */
  1455. X/*             DATEI  mail.c                           */
  1456. X/*        FUNKTIONEN  fetch_receipy(), brief()                   */
  1457. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1458. X/*  LETZTE AENDERUNG  03.06.1992                       */
  1459. X/***************************************************************************/
  1460. X
  1461. X#include <sys/types.h>
  1462. X#include <sys/stat.h>
  1463. X#include <unistd.h>
  1464. X#include <stdio.h>
  1465. X#include <fcntl.h>
  1466. X#include <time.h>
  1467. X
  1468. X#include "mbox.h"
  1469. X
  1470. Xstatic int fetch_local;
  1471. Xstatic char fetch_subj[STRING];
  1472. X
  1473. X
  1474. X/***************************************************************************/
  1475. X/*      FUNKTION  fetch_receipy()                       */
  1476. X/*  BESCHREIBUNG  Im REPLY-Modus wird die Adresse des Empfaengers aus      */
  1477. X/*              dessen Mail gefiltert.                                   */
  1478. X/*     PARAMETER  REP  =  Datei mit der Mail des zukuenftigen Empfaengers  */
  1479. X/*     RUECKGABE  Adresse des Empfaengers                                  */
  1480. X/***************************************************************************/
  1481. X
  1482. Xchar *fetch_reciepy(REP)
  1483. Xchar REP[];
  1484. X{
  1485. X  FILE *fp;
  1486. X  char s[STRING];
  1487. X  char t[STRING];
  1488. X  char f[STRING];
  1489. X  int ok = 0, i;
  1490. X  int beg = 0;
  1491. X  int bang = 0, at = 0, strange = 0, stranger = 0;
  1492. X
  1493. X  fetch_local = 0;
  1494. X  fetch_subj[0] = '\0';
  1495. X
  1496. X  fp = fopen(REP, "r");
  1497. X  if (fp == NULL) {
  1498. X    nerror("mail.c", 31, "fetch_reciepy", "Datei_Lesefehler", REP);
  1499. X  }
  1500. X  while (fgets(f, 80, fp) != NULL) {
  1501. X    if (strcomp("From: ", f) == 0) {
  1502. X        beg = 6;
  1503. X        ok = 1;
  1504. X        strcpy(s, f);
  1505. X    }
  1506. X    if (strcomp("From ", f) == 0) { /* local mail */
  1507. X        beg = 5; 
  1508. X        ok = 1;
  1509. X        strcpy(s, f);
  1510. X    }
  1511. X    if (strcomp("Reply-To: ", f) == 0) {
  1512. X        beg = 10;
  1513. X        ok = 1;
  1514. X        strcpy(s, f);
  1515. X    }
  1516. X    if (strcomp("Subject: ", s) == 0) {
  1517. X        strcpy(fetch_subj, (char *) strcopy(s, 9, 79));
  1518. X    }
  1519. X  }
  1520. X  fclose(fp);
  1521. X
  1522. X  if (ok == 0) {
  1523. X    return (char *) "OOPS";
  1524. X  }
  1525. X  i = beg;
  1526. X  ok = 0;
  1527. X
  1528. X  while (s[i] != '\0') {
  1529. X    if (s[i] == '(') ok = i - 2;
  1530. X    if (s[i] == '<') strange = i + 1;
  1531. X    if (s[i] == '>') stranger = i - 1;
  1532. X    i++;
  1533. X  }
  1534. X  if (ok == 0) ok = i;
  1535. X  strcpy(t, (char *) strcopy(s, beg, ok));
  1536. X
  1537. X  if ((strange != 0) && (stranger != 0)) {
  1538. X    strcpy(t, (char *) strcopy(s, strange, stranger));
  1539. X    return (char *) t;
  1540. X  }
  1541. X  i = 0;
  1542. X  while (t[i] != '\0') {
  1543. X    if (t[i] == '@') at = i;
  1544. X    if (t[i] == '!') bang = i;
  1545. X    i++;
  1546. X  }
  1547. X
  1548. X  if (at != 0) {
  1549. X    strcpy(s, (char *) strcopy(t, (at + 1), length(t)));
  1550. X    if (strcomp(UUCPSITE, s) == 0) {    /* local user */
  1551. X        fetch_local = 1;
  1552. X        strcpy(s, (char *) strcopy(t, 0, (at - 1)));
  1553. X        i = 0;
  1554. X        while (s[i] != '\0') {
  1555. X            if (s[i] == '.') s[i] = ' ';
  1556. X            i++;
  1557. X        }
  1558. X        return (char *) s;
  1559. X    }
  1560. X  }
  1561. X
  1562. X  if (beg == 5) {  /* local mail */
  1563. X    i = 0;
  1564. X    while((t[i] != '\0') && (t[i] != ' ')) i++;
  1565. X    t[i] = '\0';
  1566. X  }
  1567. X
  1568. X  return (char *) t;
  1569. X}
  1570. X
  1571. X
  1572. X
  1573. X
  1574. X
  1575. X
  1576. X/***************************************************************************/
  1577. X/*      FUNKTION  brief()                           */
  1578. X/*  BESCHREIBUNG  Eine persoenliche Nachricht wird verschickt. Je nach     */
  1579. X/*          Empfaenger-Adresse und Parameter wird die Post ins       */
  1580. X/*          MBox-interne Mailsystem geschickt, oder an MAIL          */
  1581. X/*          weitergleitet. Die Adresse des Empfaengers wird ent-     */
  1582. X/*          weder als Parameter uebergeben, oder aus einer Datei     */
  1583. X/*          gefiltert, auf die geantwortet werden soll (REPLY-Mode). */
  1584. X/*     PARAMETER  arg  =  "~REPLY~"    =  REPLY-Modus aktivieren           */
  1585. X/*              Es wird nicht unterschieden zwischen REPLY auf   */
  1586. X/*              pers. Mail oder REPLY auf einen NEWS-Artikel.    */
  1587. X/*              Die Datei mit der zu beantwortenden MSG liefert  */
  1588. X/*              die Routine "lesen()".                           */
  1589. X/*          arg  =  "Empfaenger" =  verwertbare Adresse fuer das     */
  1590. X/*              interen Mail-System oder MAIL.                   */
  1591. X/*     RUECKGABE   -1  =  Abbruch                                          */
  1592. X/***************************************************************************/
  1593. X
  1594. Xint brief(arg)
  1595. Xchar arg[];
  1596. X{
  1597. X  FILE *fp;
  1598. X  FILE *ff;
  1599. X  FILE *ft;
  1600. X  int fd;
  1601. X  int i, j;
  1602. X  int ok;
  1603. X  struct userdaten LOOSER;
  1604. X
  1605. X  struct tm *timeptr;
  1606. X  time_t timer;
  1607. X
  1608. X  int receiver;
  1609. X  int mail_id;
  1610. X  int EX_PM = 0;
  1611. X  int REPLY = 0;
  1612. X  int lines = 0;
  1613. X  int WEITERLEITEN = 0;
  1614. X  int HOLD = 0;
  1615. X  int UMLEITUNG = 0;
  1616. X
  1617. X  char s[STRING];
  1618. X  char t[STRING];
  1619. X  char TEP[STRING];
  1620. X  char REP[STRING];
  1621. X  char f[STRING];
  1622. X  char subject[STRING];
  1623. X  char from[STRING];
  1624. X  char rec_char[STRING];
  1625. X  char ex[LONGSTRING];
  1626. X  char user[STRING];
  1627. X  char mesg_id[STRING];
  1628. X  char refs[STRING];
  1629. X  char date[STRING];
  1630. X  char c;
  1631. X  char protokoll;
  1632. X  char lf;
  1633. X  char pubdir[STRING];
  1634. X  char dummy[STRING];
  1635. X  char username[STRING];
  1636. X  char reply[STRING];
  1637. X  char priority[STRING];
  1638. X  char action[STRING];
  1639. X  char cc[STRING];
  1640. X  char bcc[STRING];
  1641. X  char encrypted[STRING];
  1642. X  char comments[STRING];
  1643. X  char keywords[STRING];
  1644. X  char fortune[STRING];
  1645. X  char content[STRING];
  1646. X
  1647. X  char YOUR_SITE[STRING];
  1648. X
  1649. X  int BINFILE;
  1650. X  int news_reply = 0;
  1651. X
  1652. X  struct stat fst;
  1653. X
  1654. X
  1655. X  i = 0;
  1656. X  ok = 0;
  1657. X
  1658. X  mesg_id[0] = '\0';
  1659. X
  1660. X  if (arg[0] == '\0') {
  1661. X    ansi("md");
  1662. X    printf(" %s\n", MAL03_MSG);
  1663. X    ansi("me");
  1664. X    return -1;
  1665. X  }
  1666. X  EX_PM = 0;
  1667. X
  1668. X
  1669. X  i = 0;
  1670. X  strcpy(t, USER.name);
  1671. X  while (t[i] != '\0') {
  1672. X    if (t[i] == ' ') t[i] = '.';
  1673. X    i++;
  1674. X  }
  1675. X  strcpy(username, t);
  1676. X  action[0] = '\0';
  1677. X  priority[0] = '\0';
  1678. X  encrypted[0] = '\0';
  1679. X  keywords[0] = '\0';
  1680. X  comments[0] = '\0';
  1681. X  cc[0] = '\0';
  1682. X  bcc[0] = '\0';
  1683. X  fortune[0] = '\0';
  1684. X  content[0] = '\0';
  1685. X
  1686. X  i = 0;
  1687. X  while (arg[i] != '\0') {
  1688. X    if ((arg[i] == '!') || (arg[i] == '@') || (arg[i] == '%')) EX_PM++;
  1689. X    i++;
  1690. X  }
  1691. X
  1692. X  if ((EX_PM > 0) && (USER.level < MAILOUT_LEV)) {
  1693. X    ansi("md");
  1694. X    printf("\n\n%s (%d) %s\n", MAL04_MSG, MAILOUT_LEV, MAL05_MSG);
  1695. X    ansi("me");
  1696. X    return -1;
  1697. X  }
  1698. X
  1699. X  if(arg[length(arg) -1] == '?'){
  1700. X    arg[length(arg) -1] = '$';
  1701. X    HOLD++;
  1702. X  }
  1703. X
  1704. X  if(arg[length(arg) -1] == '$'){
  1705. X    WEITERLEITEN++;
  1706. X    arg[length(arg) -1] = '\0';
  1707. X    sprintf(TEP, "%s/usr/%d/.lastletter", HOME, USER.id);
  1708. X    sprintf(t, "%s/usr/%d/.lastsubject", HOME, USER.id);
  1709. X    fp = fopen( t, "r" );
  1710. X    if(fp == NULL) {
  1711. X        return -1; 
  1712. X    }
  1713. X    fgets(s, 80, fp);
  1714. X    fclose(fp);
  1715. X    if(HOLD == 0){
  1716. X        sprintf(subject, "%s %s", MAL06_MSG, s);
  1717. X        UMLEITUNG++;
  1718. X    }else
  1719. X        sprintf(subject, "%s", s);
  1720. X  }
  1721. X
  1722. X  user[0] = '\0';
  1723. X  strcat(user, arg);
  1724. X
  1725. X  if(WEITERLEITEN != 0) goto TRY_AGAIN;
  1726. X
  1727. X  if (strcomp("~REPLY~", arg) == 0) {
  1728. X    REPLY++;
  1729. X    sprintf(REP, "%s/%dRep", TMP, getpid());
  1730. X    sprintf(TEP, "%s/%dTep", TMP, getpid());
  1731. X    fp = fopen(REP, "r");
  1732. X    if (fp == NULL) {
  1733. X        nerror("mail.c", 278, "brief", "Datei-Lesefehler", REP);
  1734. X    }
  1735. X    fgets(s, 80, fp    );            /* HEADER: Autor */
  1736. X
  1737. X    sprintf(dummy, "%s %s", GBL01_MSG, X_MAIL_DEMON);
  1738. X
  1739. X    if ((strcomp(GBL01_MSG, s) == 0) && (strcomp(dummy, s) != 0)) {
  1740. X        strcpy(user, (char *) strcopy(s, (1+strlen(GBL01_MSG)), 80));
  1741. X
  1742. X        fgets(s, 80, fp);        /* HEADER: Datum */
  1743. X        fgets(s, 80, fp);        /* HEADER: Betreff */
  1744. X
  1745. X        strcpy(t, (char *) strcopy(s, (1+strlen(GBL03_MSG)), 80));
  1746. X        subject[0]= '\0';
  1747. X        if (strcomp("Re: ", t) != 0) {
  1748. X            strcpy(subject, "Re: ");
  1749. X        }
  1750. X        strcat(subject, (char *) stripped(t));
  1751. X
  1752. X        fgets(s, 80, fp);    /* HEADER: Leer */
  1753. X        fgets(s, 80, fp);    /* HEADER: Leer */
  1754. X    }
  1755. X    else {        /* UUCP-Header (!MBox) */
  1756. X
  1757. X        sprintf(subject, MAL07_MSG);
  1758. X        refs[0] = '\0';
  1759. X        mesg_id[0] = '\0';
  1760. X
  1761. X        ok = -1;
  1762. X
  1763. X        while ((ok < 1) && (fgets(s, 80, fp) != NULL)) {
  1764. X            if (strcomp("Lines: ", s)      == 0) ok = 1;
  1765. X            if (strcomp("Date: ",  s)      == 0) {
  1766. X                strcpy(date, (char *) strcopy(s, 6, 80));
  1767. X            }
  1768. X            if (strcomp("Newsgroups: ", s) == 0) news_reply++;
  1769. X            if (strcomp("Subject: ", s)    == 0) {
  1770. X                subject[0] = '\0';
  1771. X                strcpy(t, (char *) strcopy(s, 9, 80));
  1772. X                if (strcomp("Re: ", t) != 0) {
  1773. X                    sprintf(subject, "%s", "Re: ");
  1774. X                }
  1775. X                strcat(subject, (char *) stripped(t));
  1776. X            }
  1777. X            if (strcomp("Message-Id: ", s) == 0) {
  1778. X                strcpy(mesg_id, (char *) strcopy(s, 12, 80));
  1779. X            }
  1780. X            if (strcomp("From: ", s) == 0) {
  1781. X                strcpy(from, (char *) strcopy(s, 6, 80));
  1782. X                ok = 0;
  1783. X            }
  1784. X            if (strcomp("From ", s) == 0) {
  1785. X                strcpy(from, (char *) strcopy(s, 5, 80));
  1786. X                ok = 0;
  1787. X            }
  1788. X            if (strcomp("References: ", s) == 0) {
  1789. X                strcpy(refs, (char *) strcopy(s, 12, 80));
  1790. X            }
  1791. X            if (strcomp("Comments: ", s) == 0) {
  1792. X                strcpy(comments, (char *) strcopy(s, 10, 80));
  1793. X                strcpy(comments, (char *) stripped(comments));    
  1794. X            }
  1795. X            if (strcomp("Keywords: ", s) == 0) {
  1796. X                strcpy(keywords, (char *) strcopy(s, 10, 80));
  1797. X                strcpy(keywords, (char *) stripped(keywords));
  1798. X            }
  1799. X            if (strcomp("Content-Type: ", s) == 0) {
  1800. X                strcpy(content, (char *) strcopy(s, 14, 80));
  1801. X                strcpy(content, (char *) stripped(content));
  1802. X            }
  1803. X
  1804. X            if ((strlen(s) < 5) && (ok == 0)) ok = 1;
  1805. X        }
  1806. X    }
  1807. X
  1808. X    ff = fopen(TEP, "w");
  1809. X    while (fgets(s, 80, fp) != NULL) {
  1810. X        if(s[0] != '\n') fputs("> ", ff);
  1811. X        fputs(s, ff);
  1812. X    }
  1813. X    fputs("", ff);
  1814. X    fclose(ff);
  1815. X    fclose(fp);
  1816. X  }
  1817. X
  1818. X  TRY_AGAIN:
  1819. X
  1820. X  if((WEITERLEITEN != 0) && (EX_PM != 0)){
  1821. X    sprintf(rec_char, "%s", user);
  1822. X    if(checkdomaintype( rec_char ) != 0) return -1;
  1823. X    goto ONCE_MORE;
  1824. X  }
  1825. X
  1826. X  receiver = 0;
  1827. X
  1828. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  1829. X  fd = open(UDBASE, O_RDONLY);
  1830. X  if (fd == -1) {
  1831. X    nerror("mail.c", 216, "brief", "Datei-Lesefehler", UDBASE);
  1832. X  }
  1833. X  lseek(fd, 0L, SEEK_SET);
  1834. X  while ((read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (receiver == 0)) {
  1835. X    if ((strcomp(user, LOOSER.name) == 0) ||
  1836. X        (strcomp(LOOSER.name, user) == 0) ||
  1837. X        (strcomp(user, LOOSER.nick) == 0) ||
  1838. X        (strcomp(user, LOOSER.sh_name) == 0)) {
  1839. X        receiver = LOOSER.id;
  1840. X        strcpy(rec_char, LOOSER.name);
  1841. X    }
  1842. X  }
  1843. X  close(fd);
  1844. X  mbunlock(UDBASE);
  1845. X
  1846. X
  1847. X  if ((receiver == 0) && (EX_PM == 0)) {
  1848. X
  1849. X    if (REPLY != 0) {
  1850. X        strcpy(user, fetch_reciepy(REP));
  1851. X        if (fetch_local == 1) goto TRY_AGAIN;
  1852. X        strcpy(rec_char, (char *) stripped(user));
  1853. X        if (strcomp(user, "OOPS") == 0) {
  1854. X            ansi("md");
  1855. X            printf("\n\n%s\n", MAL08_MSG);
  1856. X            ansi("me ");
  1857. X            unlink(TEP);
  1858. X            unlink(REP); /* ??? */
  1859. X            return -1;
  1860. X        }
  1861. X        EX_PM = 1;
  1862. X        c = MAL13_MSG;
  1863. X        goto REPLY_MARK;
  1864. X    }
  1865. X    else {
  1866. X        ansi("md");
  1867. X        strcpy(rec_char, (char *) stripped(user));
  1868. X        printf("\n\n%s \"%s\" %s\n", MAL09_MSG, user, MAL10_MSG);
  1869. X        ansi("me");
  1870. X        if(WEITERLEITEN == 0) unlink(TEP);
  1871. X        unlink(REP);
  1872. X        return -1;
  1873. X    }
  1874. X  }
  1875. X
  1876. X  if(WEITERLEITEN != 0) goto ONCE_MORE;
  1877. X
  1878. X  unlink(REP);
  1879. X
  1880. X  if (EX_PM == 0) {
  1881. X    ansi("md");
  1882. X    sprintf(s, "%s/usr/%d/.hello", HOME, receiver);
  1883. X    printf("\n\n");
  1884. X    show(s, 22, 0);
  1885. X    ansi("me");
  1886. X  }
  1887. X  else {
  1888. X    strcpy(rec_char, arg);
  1889. X  }
  1890. X
  1891. X  if(checkdomaintype( rec_char ) != 0) return -1;
  1892. X
  1893. X  if (REPLY != 0) {
  1894. X    c = MAL13_MSG;
  1895. X    goto REPLY_MARK;
  1896. X  }
  1897. X  printf("\n\n");
  1898. X  ansi("mr");
  1899. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL12_MSG);
  1900. X  ansi("me");
  1901. X  printf("%c%c", MAL13_MSG, BS);
  1902. X
  1903. X  do {
  1904. X    c = getint();
  1905. X    if (c >= 97) c -= 32;
  1906. X    if (c == '?') {
  1907. X        clearline();
  1908. X        ansi("mr");
  1909. X        printf("%c%s > ", CR, MAL16_MSG);
  1910. X        ansi("me");
  1911. X    }
  1912. X    if (c == ENTER) c = MAL13_MSG;
  1913. X    if ((c != MAL13_MSG) && (c != MAL14_MSG) && (c != MAL15_MSG)) c = 0;
  1914. X  } while (c == 0);
  1915. X
  1916. X  printf("%c", c);
  1917. X
  1918. X  if (c == MAL15_MSG) {        /* VERWERFEN */
  1919. X    unlink(REP);
  1920. X    unlink(TEP);
  1921. X    printf("\n");
  1922. X    return -1;
  1923. X  }
  1924. X  sprintf(TEP, "%s/M%d", TMP, getpid());
  1925. X  sprintf(pubdir, "%s/dir%d", TMP, getpid());
  1926. X
  1927. X  if (c == MAL14_MSG) {        /* UPLOAD */
  1928. X    clearline();
  1929. X    ansi("mr");
  1930. X    printf("%c%s, ? > ", CR, MAL17_MSG);
  1931. X    ansi("me");
  1932. X
  1933. X    do {
  1934. X        protokoll = getint();
  1935. X        if (protokoll >= 97) protokoll -= 32;
  1936. X        if (protokoll == '?') {
  1937. X            clearline();
  1938. X            ansi("mr");
  1939. X            printf("%c%s > ", CR, MAL17aMSG);
  1940. X            ansi("me");
  1941. X        }
  1942. X        if ((protokoll != MAL18_MSG) && (protokoll != MAL18_MSG) &&
  1943. X            (protokoll != MAL20_MSG) && (protokoll != MAL21_MSG))
  1944. X            protokoll = 0;
  1945. X    } while (protokoll == 0);
  1946. X
  1947. X    printf("%c", protokoll);
  1948. X
  1949. X  }
  1950. X  printf("\n\n%c", CR);
  1951. X  ansi("mr");
  1952. X  printf("%s ", MAL22_MSG);
  1953. X  ansi("me");
  1954. X  printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
  1955. X  ansi("mr");
  1956. X  printf("%s ", MAL23_MSG);
  1957. X  ansi("me");
  1958. X  printf(" %s\n%c", rec_char, CR);
  1959. X  ansi("mr");
  1960. X  printf("%s ", MAL24_MSG);
  1961. X  ansi("me");
  1962. X  printf(" ");
  1963. X  strcpy(subject, (char *) getline(50, 11, '.', ""));
  1964. X  printf("\n");
  1965. X  ansi("mr");
  1966. X  printf("%s ", MAL23aMSG);
  1967. X  ansi("me");
  1968. X  printf(" ");
  1969. X  strcpy(cc, (char *) getline(50, 11, '.', ""));
  1970. X
  1971. X
  1972. X  REPLY_MARK:
  1973. X
  1974. X  if(checkdomaintype( rec_char ) != 0) return -1;
  1975. X
  1976. X  if (c == MAL13_MSG) {
  1977. X    sprintf(s, "%s %s", EDDY, TEP);
  1978. X    noctrlx();
  1979. X    system(s);
  1980. X    ctrlx();
  1981. X    protokoll = '*';
  1982. X  }
  1983. X  else {            /* UPLOAD */
  1984. X
  1985. X    printf("\n\n");
  1986. X    printf("%s\n\n", MAL25_MSG); 
  1987. X    ansi("md");
  1988. X    printf("%s", MAL26_MSG);
  1989. X    ansi("me");
  1990. X          
  1991. X    unlink( TEP );
  1992. X    
  1993. X    switch (protokoll) {
  1994. X        case MAL18_MSG:
  1995. X            fp = fopen(TEP, "w");
  1996. X            if (fp == NULL) {
  1997. X                nerror("mail.c", 268, "brief", "DSF", TEP);
  1998. X            }
  1999. X            c = 0;
  2000. X            lf = CR;
  2001. X
  2002. X            fputc(LF, fp);
  2003. X
  2004. X            while ((c != CTRL_X) && (c != CTRL_D)) {
  2005. X                c = getint();
  2006. X                if ((c == CR) && (lf == CR)) fputc(LF, fp);
  2007. X                if (c == CR) lf = CR;
  2008. X                if (c == LF) lf = LF;
  2009. X                if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
  2010. X                    fputc(c, fp);
  2011. X                }
  2012. X            }
  2013. X            fclose(fp);
  2014. X            break;
  2015. X
  2016. X        case MAL19_MSG:
  2017. X            printf("\n");
  2018. X            sprintf(s, "exec %s -bc TimeTravelAgency", RX);
  2019. X            break;
  2020. X        case MAL20_MSG:
  2021. X            printf("\n");
  2022. X            sprintf(s, "exec %s -b", RB);
  2023. X            break;
  2024. X        case MAL21_MSG:
  2025. X            printf("\n");
  2026. X            sprintf(s, "exec %s -b", RZ);
  2027. X            break;
  2028. X    }
  2029. X    if (protokoll != MAL18_MSG){
  2030. X        mkdir( pubdir, 0777 );
  2031. X        chdir( pubdir );
  2032. X
  2033. X        system( s );
  2034. X
  2035. X        chdir( HOME );
  2036. X        sprintf(s, "mv %s/* %s", pubdir, TEP);
  2037. X        system( s );
  2038. X        sprintf(s, "rm -r %s", pubdir);
  2039. X        system( s );
  2040. X    }
  2041. X    sync();
  2042. X    stat(TEP, &fst);
  2043. X    if (fst.st_size < 3L) {
  2044. X        printf("\n\n%s\n", MAL27_MSG);
  2045. X        control(MAL28_MSG, 3);
  2046. X        unlink(REP);    /* ??? */
  2047. X        unlink(TEP);
  2048. X        return -1;
  2049. X    }    
  2050. X    if (prf(TEP) == 1) {
  2051. X        printf("\n\n");
  2052. X        ansi( "md" );
  2053. X        printf("%s", MAL25_MSG);        
  2054. X        ansi( "me" );
  2055. X        unlink(REP);     /* ??? */
  2056. X        unlink(TEP);
  2057. X        return -1;
  2058. X        BINFILE++;
  2059. X    }
  2060. X    else{
  2061. X        mkix(TEP);
  2062. X    }
  2063. X  }
  2064. X
  2065. X  sprintf(reply, "%s <%s@%s>", USER.name, username, UUCPID);
  2066. X
  2067. X
  2068. X  ONCE_MORE:
  2069. X
  2070. X  if((HOLD != 0) || ((WEITERLEITEN != 0) && (IS_BUFFERED != 0))) goto HOLD_MARK;
  2071. X
  2072. X  printf("\n\n");
  2073. X  ansi("mr");
  2074. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL28aMSG);
  2075. X  ansi("me");
  2076. X  printf("%c%c", MAL29_MSG, BS);
  2077. X
  2078. X  do {
  2079. X    c = getint();
  2080. X    if (c >= 97) c -= 32;
  2081. X    if (c == '?') {
  2082. X        clearline();
  2083. X        ansi("mr");
  2084. X        printf("%c%s > ", CR, MAL32_MSG);
  2085. X        ansi("me");
  2086. X    }
  2087. X    if (c == ENTER) c = MAL29_MSG;
  2088. X    if ((c != MAL29_MSG) && (c != MAL30_MSG) && (c != MAL31_MSG) && (c != MAL31aMSG)) c = 0;
  2089. X  } while (c == 0);
  2090. X
  2091. X  printf("%c", c);
  2092. X
  2093. X  if (c == MAL31_MSG) {        /* WEITERSCHREIBEN */
  2094. X    sprintf(s, "%s %s", EDDY, TEP);
  2095. X    noctrlx();
  2096. X    system(s);
  2097. X    ctrlx();
  2098. X    goto ONCE_MORE;
  2099. X  }
  2100. X  if (c == MAL30_MSG) {        /* VERWERFEN */
  2101. X    printf("\n");
  2102. X    unlink(TEP);
  2103. X    unlink(REP);
  2104. X    return -1;
  2105. X  }
  2106. X  if (c == MAL31aMSG) {        /* HEADER */
  2107. X    headline( MAL32aMSG );
  2108. X    printf("\n");
  2109. X
  2110. X    time(&timer);
  2111. X
  2112. X    ansi( "md" );
  2113. X    printf("From: ");
  2114. X    ansi( "me" );
  2115. X    printf("%s <%s@%s>\n", USER.name, username, UUCPID);
  2116. X
  2117. X    ansi( "md" );
  2118. X    printf("Reply-To: ");
  2119. X    ansi( "me" );
  2120. X    if(USER.level > GUEST_LEV){
  2121. X        strcpy(reply, (char *) getline(80, 1001, 32, reply));
  2122. X        printf("\n");
  2123. X    }
  2124. X    else printf("%s\n", reply);
  2125. X
  2126. X
  2127. X    i = 0; j = 0;            /* Empfaenger: Realname */
  2128. X    while(from[i] != '\0'){
  2129. X        if(from[i] == '<'){
  2130. X            strcpy(s, (char *) strcopy(from, 0, (i-1)));
  2131. X            j = i;
  2132. X        }
  2133. X        if(from[i] == '(') j = i+1;
  2134. X        if(from[i] == ')') strcpy(s, (char *) strcopy(from, j, (i-1)));
  2135. X        i++;
  2136. X    }
  2137. X    if(j == 0) strcpy(s, from);
  2138. X        
  2139. X    if(mesg_id[0] != '\0'){
  2140. X        ansi( "md" );
  2141. X        printf("In-Reply-To: ");
  2142. X        ansi( "me" );
  2143. X        printf("%s; ", (char *) stripped(mesg_id)); 
  2144. X        printf("from \"%s\" at %s", (char *) stripped(s), date);
  2145. X
  2146. X        if(refs[0] != '\0') 
  2147. X            sprintf(s, "%s ", stripped(refs));
  2148. X        else
  2149. X            s[0] = '\0';
  2150. X        strcat(s, mesg_id);
  2151. X        ansi( "md" );
  2152. X        printf("References: ");
  2153. X        ansi( "me" );
  2154. X        printf("%s", s);
  2155. X    }
  2156. X
  2157. X    ansi( "md" );
  2158. X    printf("To: ");
  2159. X    ansi( "me" );
  2160. X    if(USER.level > GUEST_LEV){
  2161. X        strcpy(rec_char, (char *) getline(80, 1001, 32, rec_char));
  2162. X        printf("\n");
  2163. X    }
  2164. X    else printf("%s\n", rec_char);
  2165. X
  2166. X    ansi( "md" );
  2167. X    printf("Cc: ");
  2168. X    ansi( "me" );
  2169. X    if(USER.level > GUEST_LEV){
  2170. X        strcpy(cc, (char *) getline(80, 1001, 32, cc));
  2171. X        printf("\n");
  2172. X    }
  2173. X    else printf("%s\n", cc);
  2174. X
  2175. X    ansi( "md" );
  2176. X    printf("Bcc: ");
  2177. X    ansi( "me" );
  2178. X    if(USER.level > GUEST_LEV){
  2179. X        strcpy(bcc, (char *) getline(80, 1001, 32, bcc));
  2180. X        printf("\n");
  2181. X    }
  2182. X    else printf("%s\n", bcc);
  2183. X
  2184. X
  2185. X    ansi( "md" );
  2186. X    printf("Subject: ");
  2187. X    ansi( "me" );
  2188. X    if(USER.level > GUEST_LEV){
  2189. X        strcpy(subject, (char *) getline(80, 1001, 32, subject));
  2190. X        printf("\n");
  2191. X    }
  2192. X    else printf("%s\n", subject);
  2193. X
  2194. X    ansi( "md" );
  2195. X    printf("Keywords: ");
  2196. X    ansi( "me" );
  2197. X    if(USER.level > GUEST_LEV){
  2198. X        strcpy(keywords, (char *) getline(80, 1001, 32, keywords));
  2199. X        printf("\n");
  2200. X    }
  2201. X    else printf("%s\n", keywords);
  2202. X
  2203. X    ansi( "md" );
  2204. X    printf("Comments: ");
  2205. X    ansi( "me" );
  2206. X    if(USER.level > GUEST_LEV){
  2207. X        strcpy(comments, (char *) getline(80, 1001, 32, comments));
  2208. X        printf("\n");
  2209. X    }
  2210. X    else printf("%s\n", comments);
  2211. X
  2212. X    ansi( "md" );
  2213. X    printf("Encrypted: ");
  2214. X    ansi( "me" );
  2215. X    if(USER.level > GUEST_LEV){
  2216. X        strcpy(encrypted, (char *) getline(80, 1001, 32, encrypted));
  2217. X        printf("\n");
  2218. X    }
  2219. X    else printf("%s\n", encrypted);
  2220. X
  2221. X#ifdef _MULTIMEDIA
  2222. X    ansi( "md" );
  2223. X    printf("Mime-Version: ");
  2224. X    ansi( "me" );
  2225. X    printf("%s\n", MIME_VERSION);
  2226. X
  2227. X    if(USER.level >= WRITE_INTERNAT){
  2228. X        strcpy(content, (char *) "text/plain; charset=us-ascii");
  2229. X        ansi( "md" ); 
  2230. X        printf("Content-Type: ");
  2231. X        ansi( "me" );
  2232. X        strcpy(content, (char *) getline(80, 1001, 32, content));
  2233. X        printf("\n");
  2234. X    }
  2235. X#endif
  2236. X
  2237. X    ansi( "md" );
  2238. X    printf("X-Mailer: ");
  2239. X    ansi( "me" );
  2240. X    printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  2241. X
  2242. X    ansi( "md" );
  2243. X    printf("Priority: ");
  2244. X    ansi( "me" );
  2245. X    if(USER.level > GUEST_LEV){
  2246. X        strcpy(priority, (char *) getline(80, 1001, 32, priority));
  2247. X        printf("\n");
  2248. X    }
  2249. X    else printf("%s\n", priority);
  2250. X
  2251. X    ansi( "md" );
  2252. X    printf("Action: ");
  2253. X    ansi( "me" );
  2254. X    if(USER.level > GUEST_LEV){
  2255. X        strcpy(action, (char *) getline(80, 1001, 32, action));
  2256. X        printf("\n");
  2257. X    }
  2258. X    else printf("%s\n", action);
  2259. X
  2260. X    ansi( "md" );
  2261. X    printf("X-Fortune: ");
  2262. X    ansi( "me" );
  2263. X    if(USER.level > GUEST_LEV){
  2264. X        strcpy(fortune, (char *) getline(80, 1001, 32, fortune));
  2265. X        printf("\n");
  2266. X    }
  2267. X    else printf("%s\n", fortune);
  2268. X
  2269. X
  2270. X    ansi( "md" );
  2271. X    printf("Message-Id: ");
  2272. X    ansi( "me" );
  2273. X       printf("<%x.%d@%s>\n", timer, USER.id, UUCPID);
  2274. X
  2275. X    goto ONCE_MORE;
  2276. X  }
  2277. X
  2278. X
  2279. X  HOLD_MARK:
  2280. X
  2281. X  if(UMLEITUNG == 0){
  2282. X    if(WEITERLEITEN == 0){
  2283. X        sprintf(s, "cp %s %s/usr/%d/.lastletter > /dev/null", TEP, HOME, USER.id);
  2284. X        system( s );     
  2285. X    }
  2286. X    sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
  2287. X    fp = fopen( s, "w" );
  2288. X    if(fp == NULL){
  2289. X        nerror("mail.c", 500, "brief", "Datei-Schreibfehler", s);
  2290. X    }
  2291. X    fprintf(fp, "%s", subject);
  2292. X    fclose(fp);
  2293. X  }
  2294. X
  2295. X
  2296. X  if (EX_PM == 0) {
  2297. X    sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  2298. X    maybe_locked(s, "r");
  2299. X    fp = fopen(s, "r");
  2300. X    if (fp == NULL) {
  2301. X        nerror("mail.c", 431, "brief", "Datei-Lesefehler", s);
  2302. X    }
  2303. X    fscanf(fp, "%d", &mail_id);
  2304. X    fclose(fp);
  2305. X    fp = fopen(s, "w");
  2306. X    fprintf(fp, "%d\n", (mail_id + 1));
  2307. X    fclose(fp);
  2308. X
  2309. X    sprintf(s, "%s/usr/%d/%d", HOME, receiver, mail_id);
  2310. X  }
  2311. X  else {
  2312. X    umask(0000);
  2313. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  2314. X  }
  2315. X
  2316. X
  2317. X  fp = fopen(s, "w");
  2318. X
  2319. X  if (EX_PM == 0) {
  2320. X    sprintf(s, "%s %s (%s)\n", GBL01_MSG, USER.name, USER.nick);
  2321. X    fputs(s, fp);
  2322. X
  2323. X    time(&timer);
  2324. X    timeptr = localtime(&timer);
  2325. X    strcpy(t, asctime(timeptr));
  2326. X
  2327. X    sprintf(s, "%s %s", GBL02_MSG, t);
  2328. X    fputs(s, fp);
  2329. X
  2330. X    sprintf(s, "%s %s\n\n", GBL03_MSG, subject);
  2331. X    fputs(s, fp);
  2332. X
  2333. X    lines = 5;
  2334. X   }
  2335. X   else {
  2336. X    lines = 4;
  2337. X  }
  2338. X
  2339. X  ff = fopen(TEP, "r");
  2340. X  if (ff == 0) {
  2341. X    printf("\n\n");
  2342. X    ansi("md");
  2343. X    printf("%s\n", MAL33_MSG);
  2344. X    ansi("me");
  2345. X    control(MAL34_MSG, 3);
  2346. X    return;
  2347. X  }
  2348. X
  2349. X
  2350. X  if(EX_PM != 0){
  2351. X
  2352. X    time(&timer);
  2353. X
  2354. X    i = 0; j = 0;            /* Empfaenger: Realname */
  2355. X    while(from[i] != '\0'){
  2356. X        if(from[i] == '<'){
  2357. X            strcpy(s, (char *) strcopy(from, 0, (i-1)));
  2358. X            j = i;
  2359. X        }
  2360. X        if(from[i] == '(') j = i+1;
  2361. X        if(from[i] == ')') strcpy(s, (char *) strcopy(from, j, (i-1)));
  2362. X        i++;
  2363. X    }
  2364. X    if(j == 0) strcpy(s, from);
  2365. X
  2366. X    fprintf(fp, "From: %s@%s (%s)\n", username, UUCPID, USER.name); 
  2367. X    if(reply[0] != '\0')
  2368. X        fprintf(fp, "Reply-To: %s\n", reply);
  2369. X    fprintf(fp, "Organization: %s\n", ORGANIZATION);
  2370. X    if(mesg_id[0] != '\0'){
  2371. X        fprintf(fp, "In-Reply-To: %s; ", (char *) stripped(mesg_id)); 
  2372. X        fprintf(fp, "from \"%s\" at %s", (char *) stripped(s), date);
  2373. X        if(refs[0] != '\0') 
  2374. X            sprintf(s, "%s ", stripped(refs));
  2375. X        else
  2376. X            s[0] = '\0';
  2377. X        strcat(s, mesg_id);
  2378. X        fprintf(fp, "References: %s", s);
  2379. X    }
  2380. X        fprintf(fp, "To: %s\n", rec_char);
  2381. X    if(cc[0] != '\0')
  2382. X        fprintf(fp, "Cc: %s\n", cc);
  2383. X
  2384. X    sprintf(s, "%s/usr/%d/.face", HOME, USER.id); /* X-Face ??? */
  2385. X    ft = fopen( s, "r" );
  2386. X    if(ft != NULL){
  2387. X        while(fgets(s, 70, ft) != NULL){
  2388. X            fprintf(fp, "X-Face: %s\n", (char *) stripped(s));
  2389. X        }
  2390. X        fclose(ft);
  2391. X    }
  2392. X
  2393. X    if(subject[0] != '\0')
  2394. X        fprintf(fp, "Subject: %s\n", subject);
  2395. X    if(keywords[0] != '\0')
  2396. X        fprintf(fp, "Keywords: %s\n", keywords);
  2397. X    if(comments[0] != '\0')
  2398. X        fprintf(fp, "Comments: %s\n", comments);
  2399. X    if(encrypted[0] != '\0')
  2400. X        fprintf(fp, "Encrypted: %s\n", encrypted);
  2401. X
  2402. X#ifdef _MULTIMEDIA
  2403. X    fprintf(fp, "Mime-Version: %s\n", MIME_VERSION);
  2404. X#endif
  2405. X
  2406. X    if(content[0] != '\0')
  2407. X        fprintf(fp, "Content-Type: %s\n", content);
  2408. X    fprintf(fp, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  2409. X    if(priority[0] != '\0')
  2410. X        fprintf(fp, "Priority: %s\n", priority);
  2411. X    if(action[0] != '\0')
  2412. X        fprintf(fp, "Action: %s\n", action);
  2413. X    if(fortune[0] != '\0')
  2414. X        fprintf(fp, "X-Fortune: %s\n", fortune);
  2415. X       fprintf(fp, "Message-Id: <%x.%d@%s>\n", timer, USER.id, UUCPID);
  2416. X     fputs("\n", fp);
  2417. X  }
  2418. X
  2419. X  while (fgets(s, 80, ff) != 0) {
  2420. X    fputs(s, fp);
  2421. X    lines++;
  2422. X  }
  2423. X  fclose(ff);
  2424. X
  2425. X  if(UMLEITUNG == 0){
  2426. X      sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
  2427. X      ff = fopen(s, "r");
  2428. X      if (ff != NULL) {
  2429. X        while (fgets(s, 80, ff) != 0) {
  2430. X            fputs(s, fp);
  2431. X            lines++;
  2432. X        }
  2433. X        fclose(ff);
  2434. X      }
  2435. X  }
  2436. X
  2437. X  if(WEITERLEITEN == 0) unlink(TEP);
  2438. X  fclose(fp);
  2439. X
  2440. X  if (EX_PM == 0) {
  2441. X    sprintf(s, "%s/usr/%d/INDEX", HOME, receiver);
  2442. X    maybe_locked(s, "r"); 
  2443. X    fp = fopen(s, "a");
  2444. X    if (fp == NULL) {
  2445. X        nerror("mail.c", 527, "brief", "Datei-Ergaenzungsfehler", s);
  2446. X    }
  2447. X    sprintf(s, "%d              ", mail_id);
  2448. X    s[6] = '\0';
  2449. X    if(HOLD != 0){
  2450. X        s[5] = '>';
  2451. X    }
  2452. X    fputs(s, fp);
  2453. X
  2454. X    sprintf(ex, "%s                                ", subject);
  2455. X    ex[26] = '\0';
  2456. X    fputs(ex, fp);
  2457. X
  2458. X    sprintf(ex, "  %s                                        ", USER.name);
  2459. X    ex[22] = '\0';
  2460. X    fputs(ex, fp);
  2461. X
  2462. X    strcpy(s, (char *) mydate(1));
  2463. X    strcpy(t, (char *) mytime(1));
  2464. X    sprintf(ex, "  %s  %s         ", s, t);
  2465. X    ex[19] = '\0';
  2466. X    fputs(ex, fp);
  2467. X
  2468. X    sprintf(s, "%-6.d\n", lines);
  2469. X    fputs(s, fp);
  2470. X
  2471. X    fclose(fp);
  2472. X
  2473. X  }
  2474. X  else {
  2475. X    sprintf(s, " X-Mail via UUCP (%s) ", rec_char);
  2476. X    headline(s);
  2477. X    printf("\n%s", MAL35_MSG);
  2478. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  2479. X    sprintf(t, "/bin/sh ./etc/rmail.sh %s %s", s, rec_char);
  2480. X    system(t);
  2481. X    unlink(s);
  2482. X    unlink(f);
  2483. X    umask(0007);
  2484. X    printf(" %s\n", MAL36_MSG);
  2485. X  }
  2486. X
  2487. X  unlink(REP);
  2488. X  if(UMLEITUNG == 0) unlink(TEP);
  2489. X
  2490. X  sprintf(s, "%s \"%s\" %s", MAL11_MSG, rec_char, MAL37_MSG);
  2491. X  control(s, 3);
  2492. X
  2493. X  printf("\n");
  2494. X
  2495. X  if((cc[0] != '\0') || (bcc[0] != '\0')){
  2496. X    carboncopy(cc, bcc);
  2497. X  }
  2498. X
  2499. X  return 0;
  2500. X}
  2501. X
  2502. X
  2503. X
  2504. X
  2505. END_OF_FILE
  2506.   if test 22692 -ne `wc -c <'src/mail.c'`; then
  2507.     echo shar: \"'src/mail.c'\" unpacked with wrong size!
  2508.   fi
  2509.   # end of 'src/mail.c'
  2510. fi
  2511. echo shar: End of archive 3 \(of 11\).
  2512. cp /dev/null ark3isdone
  2513. MISSING=""
  2514. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  2515.     if test ! -f ark${I}isdone ; then
  2516.     MISSING="${MISSING} ${I}"
  2517.     fi
  2518. done
  2519. if test "${MISSING}" = "" ; then
  2520.     echo You have unpacked all 11 archives.
  2521.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2522. else
  2523.     echo You still must unpack the following archives:
  2524.     echo "        " ${MISSING}
  2525. fi
  2526. exit 0
  2527. exit 0 # Just in case...
  2528.