home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume42 / mbox / part04 < prev    next >
Internet Message Format  |  1994-03-29  |  93KB

  1. From: Volker.Schuermann@unnet.wupper.de (Volker Schuermann)
  2. Newsgroups: comp.sources.misc
  3. Subject: v42i027:  mbox - ix/MBox BBS, v2.1, Part04/12
  4. Date: 29 Mar 1994 21:07:19 -0600
  5. Organization: THE UNDERGROUND NETWORK
  6. Sender: kent@sparky.sterling.com
  7. Approved: kent@sparky.sterling.com
  8. Message-ID: <2naqd7$iqf@sparky.sterling.com>
  9. Reply-To: Volker Schuermann <Volker.Schuermann@unnet.wupper.de>
  10. X-Md4-Signature: 4f4104b5b18e31f3bcb40e8a10eccbf3
  11.  
  12. Submitted-by: Volker.Schuermann@unnet.wupper.de (Volker Schuermann)
  13. Posting-number: Volume 42, Issue 27
  14. Archive-name: mbox/part04
  15. Environment: MINIX, ISC, ESIX, SVR3, LINUX, SVR4
  16. Supersedes: mbox: Volume 35, Issue 36-50
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then feed it
  20. # into a shell via "sh file" or similar.  To overwrite existing files,
  21. # type "sh file -c".
  22. # Contents:  mbox/src/admin.c mbox/src/mail.c mbox/src/misc.c
  23. #   mbox/src/weiterl.c
  24. # Wrapped by kent@sparky on Thu Mar 24 21:48:34 1994
  25. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  26. echo If this archive is complete, you will see the following message:
  27. echo '          "shar: End of archive 4 (of 12)."'
  28. if test -f 'mbox/src/admin.c' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'mbox/src/admin.c'\"
  30. else
  31.   echo shar: Extracting \"'mbox/src/admin.c'\" \(24678 characters\)
  32.   sed "s/^X//" >'mbox/src/admin.c' <<'END_OF_FILE'
  33. X/* ix/MBox (admin.c) by Volker Schuermann, 01.01.1994
  34. X
  35. X   This C source code contains the following functions:
  36. X
  37. X   #UA user_aendern()           change user data in the BBS database
  38. X   #UZ user_anzeigen()          show user data
  39. X   #UL user_loeschen()          delete user (data) from the database
  40. X   #SG setup_get()              read a number
  41. X   #WU wait_until_keypressed()  guess what ;-)
  42. X   #AD admin()                  sysop changing user data (interactive)
  43. X   #SU setup()                  user changing user data (interactive)
  44. X
  45. X   Contact <volkers@unnet.wupper.de> for help! */
  46. X
  47. X
  48. X
  49. X
  50. X
  51. X#include <sys/types.h>
  52. X#include <sys/stat.h>
  53. X#include <unistd.h>
  54. X#include <stdio.h>
  55. X#include <fcntl.h>
  56. X
  57. X#include "mbox.h"
  58. X
  59. Xvoid wait_until_keypressed();
  60. X
  61. X
  62. X
  63. X
  64. X/* #UA - Change users data. */
  65. X
  66. Xvoid user_aendern()
  67. X{
  68. X  int fd;
  69. X  struct userdaten DUMMY, LOOSER;
  70. X
  71. X  UNSIGNED char s[STRING];
  72. X  UNSIGNED char t[STRING];
  73. X  UNSIGNED char oldname[STRING];
  74. X
  75. X  long ll = -1L;
  76. X  size_t dummy = sizeof(DUMMY);
  77. X  UNSIGNED char c;
  78. X  int i;
  79. X  int uid = -1;
  80. X
  81. X  headline( ADM01_MSG );
  82. X
  83. X  printf("%s ", ADM02_MSG);
  84. X  strcpy(s, (UNSIGNED char *) getline(30, 11, '.', ""));
  85. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  86. X
  87. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  88. X  fd = open(UDBASE, O_RDONLY);
  89. X  if(fd == -1){
  90. X    nerror("admin.c", 324, "aendern", "Can't read", UDBASE);
  91. X  }
  92. X  while(read(fd, (UNSIGNED char *) &DUMMY, dummy) == dummy){
  93. X    if(uid == DUMMY.id){
  94. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  95. X    }
  96. X    else{
  97. X        if((strcomp(s, DUMMY.name) == 0) ||
  98. X           (strcomp(s, DUMMY.nick) == 0) ||
  99. X           (strcomp(s, DUMMY.sh_name) == 0)){
  100. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  101. X        }
  102. X    }
  103. X  }
  104. X  lseek(fd, ll, SEEK_SET);
  105. X  read(fd, (UNSIGNED char *) &LOOSER, sizeof(LOOSER));
  106. X  close(fd);
  107. X  mbunlock(UDBASE);
  108. X
  109. X  if(ll == -1L) return;
  110. X
  111. X  printf("%c%s %d                                               ", CR, ADM03_MSG, LOOSER.id);
  112. X
  113. X  strcpy(oldname, (UNSIGNED char) LOOSER.name);
  114. X
  115. X  printf("\n%s ", ADM04_MSG);
  116. X  strcpy(s, (UNSIGNED char *) getline(30, 1011, '.', LOOSER.name));
  117. X  if (s[0] > 32) sprintf(LOOSER.name, s);
  118. X  if (s[0] == 32) LOOSER.name[0] = '\0';
  119. X
  120. X  printf("\n%s ", ADM05_MSG);
  121. X  strcpy(s, (UNSIGNED char *) getline(10, 1011, '.', LOOSER.passwort));
  122. X  if (s[0] > 32) sprintf(LOOSER.passwort, s);
  123. X  if (s[0] == 32) LOOSER.passwort[0] = '\0';
  124. X
  125. X  printf("\n%s ", ADM06_MSG);
  126. X  strcpy(s, (UNSIGNED char *) getline(14, 1011, '.', LOOSER.sh_name));
  127. X  if (s[0] > 32) sprintf(LOOSER.sh_name, s);
  128. X  if (s[0] == 32) LOOSER.sh_name[0] = '\0';
  129. X
  130. X  printf("\n%s ", ADM07_MSG);
  131. X  strcpy(s, (UNSIGNED char *) getline(30, 1011, '.', LOOSER.nick));
  132. X  if (s[0] > 32) sprintf(LOOSER.nick, s);
  133. X  if (s[0] == 32) LOOSER.nick[0] = '\0';
  134. X
  135. X  printf("\n%s ", ADM08_MSG);
  136. X  strcpy(s, (UNSIGNED char *) getline(30, 1011, '.', LOOSER.wohnort));
  137. X  if (s[0] > 31) sprintf(LOOSER.wohnort, s);
  138. X
  139. X  printf("\n%s ", ADM09_MSG);
  140. X  strcpy(s, (UNSIGNED char *) getline(30, 1011, '.', LOOSER.strasse));
  141. X  if (s[0] > 31) sprintf(LOOSER.strasse, s);
  142. X
  143. X  printf("\n%s ", ADM10_MSG);
  144. X  strcpy(s, (UNSIGNED char *) getline(20, 1011, '.', LOOSER.telefon1));
  145. X  if (s[0] > 31) sprintf(LOOSER.telefon1, s);
  146. X
  147. X  printf("\n%s ", ADM11_MSG);
  148. X  strcpy(s, (UNSIGNED char *) getline(20, 1011, '.', LOOSER.telefon2));
  149. X  if (s[0] > 31) sprintf(LOOSER.telefon2, s);
  150. X
  151. X  printf("\n%s ", ADM12_MSG);
  152. X  strcpy(s, (UNSIGNED char *) getline(10, 1114, '?', LOOSER.geburtsdatum));
  153. X  if (s[0] > 31) sprintf(LOOSER.geburtsdatum, s);
  154. X
  155. X  printf("\n%s ", ADM13_MSG);
  156. X  sprintf(t, "%d", LOOSER.terminal);
  157. X  strcpy(s, (UNSIGNED char *) getline(5, 1111, '.', t));
  158. X  if (s[0] > 31) LOOSER.terminal = atoi(s);
  159. X  if ((LOOSER.terminal < 1) || (LOOSER.terminal > 8)) LOOSER.terminal = 1;
  160. X
  161. X  printf("\n%s ", ADM14_MSG);
  162. X  sprintf(t, "%d", LOOSER.editor);
  163. X  strcpy(s, (UNSIGNED char *) getline(5, 1111, '.', t));
  164. X  if (s[0] > 31) LOOSER.editor = atoi(s);
  165. X  if ((LOOSER.editor < 1) || (LOOSER.editor > OFFERED_EDITORS)) LOOSER.editor = 1;
  166. X
  167. X  printf("\n%s ", ADM15_MSG);
  168. X  sprintf(t, "%d", LOOSER.level);
  169. X  strcpy(s, (UNSIGNED char *) getline(5, 1111, '.', t));
  170. X  if (s[0] > 31) LOOSER.level = atoi(s);
  171. X
  172. X  printf("\n%s ", ADM16_MSG);
  173. X  sprintf(t, "%d", LOOSER.more);
  174. X  strcpy(s, (UNSIGNED char *) getline(5, 1111, '.', t));
  175. X  if (s[0] > 31) LOOSER.more = atoi(s);
  176. X  if ((LOOSER.more < 0) || (LOOSER.more > 3)) LOOSER.more = 1;
  177. X
  178. X  printf("\n%s ", ADM17_MSG);
  179. X  sprintf(t, "%d", LOOSER.bell);
  180. X  strcpy(s, (UNSIGNED char *) getline(5, 1111, '.', t));
  181. X  if (s[0] > 31) LOOSER.bell = atoi(s);
  182. X  if ((LOOSER.bell < -1) || (LOOSER.bell > 1)) LOOSER.bell = 0;
  183. X
  184. X  printf("\n%s ", ADM18_MSG);
  185. X  sprintf(t, "%d", LOOSER.prompt);
  186. X  strcpy(s, (UNSIGNED char *) getline(5, 1111, '.', t));
  187. X  if (s[0] > 31) LOOSER.prompt = atoi(s);
  188. X  if ((LOOSER.prompt < 1) || (LOOSER.prompt > 3)) LOOSER.prompt = 2;
  189. X
  190. X  printf("\n%s ", ADM19_MSG);
  191. X  LOOSER.tlines += 2;
  192. X  sprintf(t, "%d", LOOSER.tlines);
  193. X  strcpy(s, (UNSIGNED char *) getline(5, 1111, '.', t));
  194. X  if (s[0] > 31) LOOSER.tlines = atoi(s);
  195. X  LOOSER.tlines -= 2;
  196. X  if ((LOOSER.tlines < 22) || (LOOSER.tlines > 23)) LOOSER.tlines = DEF_MAX_SCR_LINES;
  197. X  
  198. X  printf("\n%s ", ADM20_MSG);
  199. X  strcpy(s, (UNSIGNED char *) getline(10, 1114, '?', LOOSER.lastlog));
  200. X  if (s[0] > 31) sprintf(LOOSER.lastlog, s);
  201. X
  202. X  printf("\n%s ", ADM21_MSG);
  203. X  strcpy(t, (UNSIGNED char *) timereconv((long) LOOSER.lasttime));
  204. X  t[5] = '\0';
  205. X  strcpy(s, (UNSIGNED char *) getline(5, 1113, '?', t));
  206. X  LOOSER.lasttime = timeconv(s);
  207. X
  208. X  printf("\n%s ", ADM21aMSG);
  209. X  strcpy(s, (UNSIGNED char *) ttyname(0));
  210. X  if(strcomp(PMS_TTY, s) == 0){
  211. X    strcpy(s, (UNSIGNED char *) getline(17, 1011, '.', LOOSER.account));
  212. X    if (s[0] > 31) sprintf(LOOSER.account, s);
  213. X  }
  214. X  else{
  215. X    printf("%s", LOOSER.account);
  216. X  }
  217. X
  218. X  printf("\n%s ", ADM22_MSG);
  219. X  strcpy(s, (UNSIGNED char *) getline(58, 1011, '.', LOOSER.newsgrps));
  220. X  if (s[0] > 31) sprintf(LOOSER.newsgrps, s);
  221. X
  222. X  printf("\n%s ", ADM23_MSG);
  223. X  sprintf(t, "%d", LOOSER.seq);
  224. X  strcpy(s, (UNSIGNED char *) getline(10, 1111, '.', t));
  225. X  if (s[0] > 31) LOOSER.seq = atoi(s);
  226. X
  227. X  wait_until_keypressed();
  228. X
  229. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  230. X  fd = open(UDBASE, O_WRONLY);
  231. X  if (fd == -1) {
  232. X    nerror("admin.c", 428, "aendern", "Can't write to", UDBASE);
  233. X  }
  234. X  if (lseek(fd, ll, SEEK_SET) == -1) {
  235. X    nerror("admin.c", 431, "aendern", "Position not found in", UDBASE);
  236. X  }
  237. X  write(fd, (UNSIGNED char *) &LOOSER, sizeof(LOOSER));
  238. X  close(fd);
  239. X  mbunlock(UDBASE);
  240. X
  241. X  if (LOOSER.id == USER.id) {    /* Ich bin's !!! */
  242. X
  243. X    maybe_locked(UDBASE, "r");
  244. X    mblock(UDBASE);
  245. X    fd = open(UDBASE, O_RDONLY);
  246. X    if (fd == -1) {
  247. X        nerror("admin.c", 324, "aendern", "Can't read", UDBASE);
  248. X    }
  249. X    lseek(fd, ll, SEEK_SET);
  250. X    read(fd, (UNSIGNED char *) &USER, sizeof(USER));
  251. X    close(fd);
  252. X    mbunlock(UDBASE);
  253. X  }
  254. X
  255. X  if(LOOSER.name[0] != oldname[0]){
  256. X    moving( oldname, LOOSER.name, LOOSER.id );
  257. X  }
  258. X}
  259. X
  260. X
  261. X
  262. X
  263. X/* #UZ - Show users data. */
  264. X
  265. Xvoid user_anzeigen()
  266. X{
  267. X  int fd;
  268. X  struct userdaten DUMMY, LOOSER;
  269. X  UNSIGNED char s[STRING];
  270. X  UNSIGNED char t[STRING];
  271. X  long ll = -1L;
  272. X  size_t dummy = sizeof(DUMMY);
  273. X  UNSIGNED char c;
  274. X  int i;
  275. X  int uid = -1;
  276. X
  277. X
  278. X  headline( ADM01_MSG );
  279. X
  280. X  printf("%s ", ADM02_MSG);
  281. X  strcpy(s, (UNSIGNED char *) getline(30, 11, '.', ""));
  282. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  283. X
  284. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  285. X  fd = open(UDBASE, O_RDONLY);
  286. X  if (fd == -1) {
  287. X    nerror("admin.c", 324, "aendern", "Can't read", UDBASE);
  288. X  }
  289. X  while (read(fd, (UNSIGNED char *) &DUMMY, dummy) == dummy) {
  290. X    if (uid == DUMMY.id) {
  291. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  292. X    } 
  293. X    else{
  294. X        if ((strcomp(s, DUMMY.name) == 0) ||
  295. X            (strcomp(s, DUMMY.nick) == 0) ||
  296. X            (strcomp(s, DUMMY.sh_name) == 0)) {
  297. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  298. X        }
  299. X    }
  300. X  }
  301. X  lseek(fd, ll, SEEK_SET);
  302. X  read(fd, (UNSIGNED char *) &LOOSER, sizeof(LOOSER));
  303. X  close(fd);
  304. X  mbunlock(UDBASE);
  305. X
  306. X  if (ll == -1L) return;
  307. X
  308. X  printf("%c  %s %d                                               ", CR, ADM03_MSG, LOOSER.id);
  309. X  printf("\n  %s %s",   ADM04_MSG, LOOSER.name);
  310. X  printf("\n  %s %s",   ADM05_MSG, LOOSER.passwort);
  311. X  printf("\n  %s %s",   ADM06_MSG, LOOSER.sh_name);
  312. X  printf("\n  %s %s",   ADM07_MSG, LOOSER.nick);
  313. X  printf("\n  %s %s",   ADM08_MSG, LOOSER.wohnort);
  314. X  printf("\n  %s %s",   ADM09_MSG, LOOSER.strasse);
  315. X  printf("\n  %s %s",   ADM10_MSG, LOOSER.telefon1);
  316. X  printf("\n  %s %s",   ADM11_MSG, LOOSER.telefon2);
  317. X  printf("\n  %s %s",   ADM12_MSG, LOOSER.geburtsdatum);
  318. X  printf("\n  %s %d",   ADM13_MSG, LOOSER.terminal);
  319. X  printf("\n  %s %d",   ADM14_MSG, LOOSER.editor);
  320. X  printf("\n  %s %d",   ADM15_MSG, LOOSER.level);
  321. X  printf("\n  %s %d",   ADM16_MSG, LOOSER.more);
  322. X  printf("\n  %s %d",   ADM17_MSG, LOOSER.bell);
  323. X  printf("\n  %s %d",   ADM18_MSG, LOOSER.prompt);
  324. X  printf("\n  %s %d",   ADM19_MSG, LOOSER.tlines += 2);
  325. X  printf("\n  %s %s",   ADM20_MSG, LOOSER.lastlog);
  326. X  printf("\n  %s %.5s", ADM21_MSG, (UNSIGNED char *) timereconv((long) LOOSER.lasttime));
  327. X  printf("\n  %s %s",   ADM21aMSG, LOOSER.account);
  328. X  printf("\n  %s %s",   ADM22_MSG, LOOSER.newsgrps);
  329. X  printf("\n  %s %d",   ADM23_MSG, LOOSER.seq);
  330. X
  331. X  wait_until_keypressed();
  332. X}
  333. X
  334. X
  335. X/* #UL - Delete BBS user account including all directories and files. */
  336. X
  337. Xvoid user_loeschen()
  338. X{
  339. X  int fd;
  340. X  int gd;
  341. X  struct userdaten DUMMY, LOOSER;
  342. X  UNSIGNED char s[STRING];
  343. X  UNSIGNED char t[STRING];
  344. X  long ll = -1L;
  345. X  size_t dummy = sizeof(DUMMY);
  346. X  UNSIGNED char c;
  347. X  int i;
  348. X  int uid = -1;
  349. X
  350. X
  351. X  headline( ADM25_MSG );
  352. X    
  353. X  printf("\n%s ", ADM02_MSG);
  354. X  strcpy(s, (UNSIGNED char *) getline(30, 11, '.', ""));
  355. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  356. X
  357. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  358. X  fd = open(UDBASE, O_RDONLY);
  359. X  if (fd == -1) {
  360. X    nerror("admin.c", 459, "loeschen", "Can't read", UDBASE);
  361. X  }
  362. X  while (read(fd, (UNSIGNED char *) &DUMMY, dummy) == dummy) {
  363. X    if (uid == DUMMY.id) {
  364. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  365. X    }
  366. X    else{
  367. X        if ((strcomp(s, DUMMY.name) == 0) ||
  368. X            (strcomp(s, DUMMY.nick) == 0) ||
  369. X            (strcomp(s, DUMMY.sh_name) == 0)) {
  370. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  371. X        }
  372. X    }
  373. X  }
  374. X  lseek(fd, ll, SEEK_SET);
  375. X  read(fd, (UNSIGNED char *) &LOOSER, sizeof(LOOSER));
  376. X  close(fd);
  377. X  mbunlock(UDBASE);
  378. X
  379. X  if (ll == -1L) return;
  380. X
  381. X  printf("%c%s (%d)                                     ", CR, ADM26_MSG, LOOSER.id);
  382. X  printf("\n%s (%s) ", ADM27_MSG, LOOSER.name);
  383. X
  384. X  ansi2("md", 0, 0);
  385. X  printf("\n\n%s [%c, %c] ? > ", ADM28_MSG, GBL06_MSG, GBL07_MSG);
  386. X  ansi2("me", 0, 0);
  387. X
  388. X  c = yesno();
  389. X
  390. X  if (c != GBL06_MSG) return;
  391. X
  392. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  393. X  fd = open(UDBASE, O_RDONLY);
  394. X  if (fd == -1) {
  395. X    nerror("admin.c", 490, "loeschen", "Can't read", UDBASE);
  396. X  }
  397. X  sprintf(s, "%s/%dbase", TMP, getpid());
  398. X
  399. X  gd = open(s, O_WRONLY | O_CREAT);
  400. X  if (gd == -1) {
  401. X    nerror("admin.c", 497, "loeschen", "Can't create", s);
  402. X  }
  403. X  while (read(fd, (UNSIGNED char *) &DUMMY, dummy) == dummy) {
  404. X    if (DUMMY.id != LOOSER.id) {
  405. X        write(gd, (UNSIGNED char *) &DUMMY, dummy);
  406. X    }
  407. X  }
  408. X  close(gd);
  409. X  close(fd);
  410. X  mbunlock(UDBASE);
  411. X
  412. X  sprintf(t, "cp %s %s", s, UDBASE);
  413. X  system(t);
  414. X
  415. X  unlink(s);
  416. X
  417. X  sprintf(s, "rm -r %s/usr/%c/%d", HOME, LOOSER.name[0], LOOSER.id);
  418. X  system(s);
  419. X}
  420. X
  421. X
  422. X
  423. X/* #SG - Read a number. Only accept numbers between 1 and 'max'. */
  424. X
  425. Xint setup_get(max)
  426. XUNSIGNED char max;
  427. X{
  428. X  UNSIGNED char c;
  429. X
  430. X  ansi2("md", 0 ,0);
  431. X  printf("\n[1-%c] %s > ", max, ADM29_MSG);
  432. X  ansi2("me", 0, 0);
  433. X
  434. X  do {
  435. X    c = getint();
  436. X    if ((c < '0') || (c > max)) c = 0;
  437. X  } while (c == 0);
  438. X  printf("%c", c);
  439. X
  440. X  return c;
  441. X}
  442. X
  443. X
  444. X
  445. X/* #WU - Wait until keypressed ... what a surprise! */
  446. X
  447. Xvoid wait_until_keypressed()
  448. X{
  449. X  UNSIGNED char c;
  450. X
  451. X  ansi2("md", 0, 0);
  452. X  printf("\n\n%s > ", ADM30_MSG);
  453. X  ansi2("me", 0, 0);
  454. X  c = getint();
  455. X}
  456. X
  457. X
  458. X
  459. X/* #AD - Sysop maintaining users database. */
  460. X
  461. Xvoid admin()
  462. X{
  463. X  UNSIGNED char c;
  464. X
  465. XAGAIN:
  466. X
  467. X  headline( ADM31_MSG );
  468. X
  469. X  printf(  "\n  1 - %s", ADM32_MSG);
  470. X  printf("\n\n  2 - %s", ADM33_MSG);
  471. X  printf("\n\n  3 - %s", ADM34_MSG);
  472. X  printf("\n\n  4 - %s", ADM35_MSG);
  473. X  printf("\n\n  5 - %s", ADM36_MSG);
  474. X
  475. X  printf("\n");
  476. X  printf("\n\n  8 - %s", ADM37_MSG);
  477. X
  478. X  MEDIUM: printf("\n");
  479. X
  480. X  c = setup_get('8');
  481. X
  482. X  switch (c) {
  483. X      case '1':    
  484. X        postfach("*");
  485. X        logout();
  486. X        intro();
  487. X        break;
  488. X
  489. X      case '2':    
  490. X        user_aendern();
  491. X        break;
  492. X
  493. X      case '3':    
  494. X        user_loeschen();
  495. X        break;
  496. X
  497. X      case '4':    
  498. X        user_anzeigen();
  499. X        break;
  500. X
  501. X      case '5':
  502. X        userliste("");
  503. X        wait_until_keypressed();
  504. X        break;
  505. X
  506. X       default:
  507. X        printf("\n");
  508. X        return;
  509. X  }
  510. X  goto AGAIN;
  511. X
  512. X}
  513. X
  514. X
  515. X
  516. X/* #SU - User maintaining his/her data. */
  517. X
  518. Xvoid setup()
  519. X{
  520. X  FILE *fp;
  521. X  int fd;
  522. X  UNSIGNED char s[STRING];
  523. X  UNSIGNED char t[STRING];
  524. X  UNSIGNED char c;
  525. X  int i;
  526. X  int ok = 0;
  527. X  long ll;
  528. X  struct userdaten DUMMY;
  529. X  int dummy = sizeof(DUMMY);
  530. X  UNSIGNED char *BLANKS = (UNSIGNED char *) "                                               ";
  531. X  UNSIGNED char oldname[STRING];
  532. X
  533. X
  534. X  AGAIN:
  535. X
  536. X  headline( ADM38_MSG );
  537. X  printf("\n");
  538. X
  539. X  printf("  1 - %s\n\n", ADM39_MSG);
  540. X  printf("  2 - %s\n\n", ADM40_MSG);
  541. X  printf("  3 - %s\n\n", ADM41_MSG);
  542. X  printf("  4 - %s\n\n", ADM42_MSG);
  543. X  printf("  5 - %s\n\n", ADM43_MSG);
  544. X  printf("  6 - %s\n\n", ADM44_MSG);
  545. X  printf("  7 - %s\n\n", ADM45_MSG);
  546. X  printf("  8 - %s\n\n", ADM46_MSG);
  547. X  printf("\n");
  548. X  printf("  9 - %s\n\n", ADM47_MSG);
  549. X
  550. X  c = setup_get('9');
  551. X
  552. X  switch (c) {
  553. X      case '1':
  554. X        headline( ADM48_MSG );
  555. X        printf("\n");
  556. X        if (USER.terminal == 1)
  557. X            printf("*");
  558. X        else
  559. X            printf(" ");
  560. X        printf(" 1 - ANSI (X3.64 ... PC-BBS-ANSI)\n\n");
  561. X        if (USER.terminal == 2)
  562. X            printf("*");
  563. X        else
  564. X            printf(" ");
  565. X        printf(" 2 - VT100 (Digital Equipment VT100)\n\n");
  566. X        if (USER.terminal == 3)
  567. X            printf("*");
  568. X        else
  569. X            printf(" ");
  570. X        printf(" 3 - VT52 (Digital Equipment VT52)\n\n");
  571. X        if (USER.terminal == 4)
  572. X            printf("*");
  573. X        else
  574. X            printf(" ");
  575. X        printf(" 4 - Dump (%s)\n\n", ADM49_MSG);
  576. X        if (USER.terminal == 5)
  577. X            printf("*");
  578. X        else
  579. X            printf(" ");
  580. X        printf(" 5 - COLOR-ANSI (X3.64 & ISO 6429)\n\n");
  581. X                if (USER.terminal == 6)
  582. X            printf("*");
  583. X        else
  584. X            printf(" ");
  585. X        printf(" 6 - %s (%s)\n\n", TECA[1].name, TECA[1].desc);
  586. X        if (USER.terminal == 7)
  587. X            printf("*");
  588. X        else
  589. X            printf(" ");
  590. X                printf(" 7 - %s (%s)\n\n", TECA[2].name, TECA[2].desc);
  591. X        if (USER.terminal == 8)
  592. X            printf("*");
  593. X        else
  594. X            printf(" ");
  595. X        printf(" 8 - %s (%s)\n\n", TECA[3].name, TECA[3].desc);
  596. X
  597. X        USER.terminal = setup_get('8') - 48;
  598. X        
  599. X        break;
  600. X
  601. X      case '2':
  602. X        headline( ADM50_MSG );
  603. X        printf("\n");
  604. X        fp = fopen(EDITORS, "r");
  605. X        if (fp == NULL) {
  606. X            nerror("admin.c", 563, "setup", "Can't read", EDITORS);
  607. X        }
  608. X        i = 0;
  609. X        while((fgets(s, STRING, fp) != NULL) && (s[0] != '='));
  610. X        while (fscanf(fp, "%s %s", s, t) > 0) {
  611. X            i++;
  612. X            if (USER.editor == i)
  613. X                printf("*");
  614. X            else
  615. X                printf(" ");
  616. X            printf(" %d - %s\n\n", i, s);
  617. X        }
  618. X        fclose(fp);
  619. X        USER.editor = setup_get((i + 48)) - 48;
  620. X    
  621. X        break;
  622. X
  623. X      case '3':
  624. X        headline( ADM51_MSG );
  625. X        printf("\n");
  626. X        strcpy(s, (UNSIGNED char *) mytime(0));
  627. X        if ((USER.prompt == 1) && (USER.bell == 1))
  628. X            printf("*");
  629. X        else
  630. X            printf(" ");
  631. X        printf(" 1 - %s->     \"[%s] %s > \"\n\n", ADM52_MSG, s, LOP06_MSG);
  632. X        if ((USER.prompt == 1) && (USER.bell == 0))
  633. X            printf("*");             
  634. X        else
  635. X            printf(" ");
  636. X        printf(" 2 - %s->     \"[%s] %s > \"\n\n", ADM53_MSG, s, LOP06_MSG);
  637. X        if ((USER.prompt == 2) && (USER.bell == 1))
  638. X            printf("*");
  639. X        else
  640. X            printf(" ");
  641. X        printf(" 3 - %s->     \"[%s] %s > \"\n\n", ADM54_MSG, NG, LOP06_MSG);
  642. X        if ((USER.prompt == 2) && (USER.bell == 0))
  643. X            printf("*");
  644. X        else
  645. X            printf(" ");
  646. X        printf(" 4 - %s->     \"[%s] %s > \"\n\n", ADM55_MSG, NG, LOP06_MSG);
  647. X        if ((USER.prompt == 3) && (USER.bell == 1))
  648. X            printf("*");
  649. X        else
  650. X            printf(" ");
  651. X        printf(" 5 - %s->     \"[(Sec.) NZ, RZ, WZ] %s > \"\n\n", ADM56_MSG, LOP06_MSG);
  652. X        if ((USER.prompt == 3) && (USER.bell == 0))
  653. X            printf("*");
  654. X        else
  655. X            printf(" ");
  656. X        printf(" 6 - %s->     \"[(Sec.) NZ, RZ, WZ] %s > \"\n\n", ADM57_MSG, LOP06_MSG);
  657. X    
  658. X        c = setup_get('6');
  659. X        switch (c) {
  660. X                case '1':
  661. X                    USER.prompt = 1;
  662. X                    USER.bell = 1;
  663. X                    break;
  664. X                case '2':
  665. X                    USER.prompt = 1;
  666. X                    USER.bell = 0;
  667. X                    break;
  668. X                case '3':
  669. X                    USER.prompt = 2;
  670. X                    USER.bell = 1;
  671. X                    break;
  672. X                case '4':
  673. X                    USER.prompt = 2;
  674. X                    USER.bell = 0;
  675. X                    break;
  676. X                case '5':
  677. X                    USER.prompt = 3;
  678. X                    USER.bell = 1;
  679. X                    break;
  680. X                case '6':
  681. X                    USER.prompt = 3;
  682. X                    USER.bell = 0;
  683. X                    break;
  684. X        }
  685. X        break;
  686. X
  687. X      case '4':
  688. X        headline( ADM58_MSG );
  689. X        printf("\n");
  690. X        if (USER.more == 0)
  691. X            printf("*");
  692. X        else
  693. X            printf(" ");
  694. X        printf(" 1 - %s\n\n", ADM59_MSG);
  695. X        if (USER.more == 1)
  696. X            printf("*");
  697. X        else
  698. X            printf(" ");
  699. X        printf(" 2 - %s\n\n", ADM60_MSG);
  700. X        if (USER.more == 3)
  701. X            printf("*");
  702. X        else
  703. X            printf(" ");
  704. X        printf(" 3 - %s\n\n", ADM61_MSG);
  705. X        printf("\n");
  706. X        printf("  4 - %s\n\n", ADM62_MSG);
  707. X        printf("  5 - %s\n\n", ADM63_MSG);
  708. X        printf("  6 - %s\n\n", ADM64_MSG);        
  709. X        printf("  7 - %s\n\n", ADM64aMSG);
  710. X        printf("  8 - %s\n\n", ADM64bMSG);
  711. X
  712. X        i = setup_get('8') - 49;
  713. X
  714. X        if (i < 3) {
  715. X            USER.more = i;
  716. X            if (USER.more == 2) USER.more++;
  717. X        }
  718. X        else {
  719. X            headline( ADM58_MSG );
  720. X            printf("\n");
  721. X            
  722. X            if (i == 3) {
  723. X                if (USER.leserichtung == 1)
  724. X                    printf("*");
  725. X                else
  726. X                    printf(" ");
  727. X                printf(" 1 - %s\n\n", ADM65_MSG);
  728. X                if (USER.leserichtung == 2)
  729. X                    printf("*");
  730. X                else
  731. X                    printf(" ");
  732. X                printf(" 2 - %s\n\n", ADM66_MSG);
  733. X        
  734. X                USER.leserichtung = setup_get('2') - 48;
  735. X            }
  736. X            if (i == 4) {
  737. X                if (USER.tlines == 22)
  738. X                    printf("*");
  739. X                else
  740. X                    printf(" ");
  741. X                printf(" 1 - %s\n\n", ADM67_MSG);
  742. X                if (USER.tlines == 23)
  743. X                    printf("*");
  744. X                else
  745. X                    printf(" ");
  746. X                printf(" 2 - %s\n\n", ADM68_MSG);
  747. X                if (USER.tlines == 43)
  748. X                    printf("*");
  749. X                else
  750. X                    printf(" ");
  751. X                printf(" 3 - %s\n\n", ADM68aMSG);
  752. X
  753. X                USER.tlines = setup_get('3') - 48 + 21;
  754. X                if(USER.tlines == 24) USER.tlines = 43; /* 45 Zeilen !! */    
  755. X            }
  756. X            if (i == 5) {
  757. X                if (USER.schluessel[0] != 32)
  758. X                    printf("*");
  759. X                else
  760. X                    printf(" ");
  761. X                printf(" 1 - %s\n\n", ADM69_MSG);
  762. X                if (USER.schluessel[0] == 32)
  763. X                    printf("*");
  764. X                else
  765. X                    printf(" ");
  766. X                printf(" 2 - %s\n\n", ADM70_MSG);
  767. X        
  768. X                i = setup_get('2') - 48;
  769. X                if (i == 2){
  770. X                    USER.schluessel[0] = 32;
  771. X                }                
  772. X                else{
  773. X                    USER.schluessel[0] = 1;
  774. X                }
  775. X            }
  776. X            if (i == 6) {
  777. X                if (USER.schluessel[1] == 2)
  778. X                    printf("*");
  779. X                else
  780. X                    printf(" ");
  781. X                printf(" 1 - %s\n\n", ADM70aMSG);
  782. X                if (USER.schluessel[1] == 3)
  783. X                    printf("*");
  784. X                else
  785. X                    printf(" ");
  786. X                printf(" 2 - %s\n\n", ADM70bMSG);
  787. X        
  788. X                if (USER.schluessel[1] == 4)
  789. X                    printf("*");
  790. X                else
  791. X                    printf(" ");
  792. X                printf(" 3 - %s\n\n", ADM70cMSG);
  793. X    
  794. X                i = setup_get('3') - 48;
  795. X                USER.schluessel[1] = i + 1;
  796. X            }
  797. X            if (i == 7) {
  798. X                if (USER.schluessel[2] == 1)
  799. X                    printf("*");
  800. X                else
  801. X                    printf(" ");
  802. X                printf(" 1 - %s [%c %c %c %c %c %c %c]\n\n", 
  803. X                    ADM70dMSG, 196, 214, 220, 228, 246, 252, 223);
  804. X                if (USER.schluessel[2] == 2)
  805. X                    printf("*");
  806. X                else
  807. X                    printf(" ");
  808. X                printf(" 2 - %s [%c %c %c %c %c %c %c]\n\n",
  809. X                     ADM70eMSG, 142, 153, 154, 132, 148, 129, 225);
  810. X                if (USER.schluessel[2] == 3)
  811. X                    printf("*");
  812. X                else
  813. X                    printf(" ");
  814. X                printf(" 3 - %s\n\n", ADM70fMSG);
  815. X                if (USER.schluessel[2] == 4)
  816. X                    printf("*");
  817. X                else
  818. X                    printf(" ");
  819. X                printf(" 4 - %s\n\n", ADM70gMSG);
  820. X
  821. X                i = setup_get('4') - 48;
  822. X                USER.schluessel[2] = i;
  823. X            }
  824. X        }
  825. X        break;
  826. X
  827. X    case '5':
  828. X        if (strcomp(GUEST, USER.name) == 0) break;
  829. X
  830. X        headline( ADM71_MSG );
  831. X        printf("\n");
  832. X
  833. X        ansi2("md", 0, 0);
  834. X        printf("%s\n", ADM72_MSG);
  835. X        printf("%s\n", ADM73_MSG);
  836. X        printf("%s\n", ADM74_MSG);
  837. X        printf("\n");
  838. X        printf("%s\n", ADM75_MSG);
  839. X        printf("%s\n", ADM76_MSG);
  840. X        ansi2("me", 0, 0);
  841. X
  842. X        maybe_locked(UDBASE, "r"); 
  843. X            fd = open(UDBASE, O_RDONLY);
  844. X        if (fd == -1) {
  845. X            nerror("admin.c", 747, "setup", "Can't read", UDBASE);
  846. X        }    
  847. X
  848. X        strcpy(oldname, (UNSIGNED char *) USER.name);
  849. X
  850. X        printf("\n%s ", ADM04_MSG);
  851. X        strcpy(s, (UNSIGNED char *) getline(30, 1015, '.', USER.name));
  852. X        if(strcomp(GUEST, s) != 0){
  853. X            if (s[0] > 31){
  854. X                ok = 0;
  855. X                lseek(fd, 0L, SEEK_SET);
  856. X                while ((read(fd, (UNSIGNED char *) &DUMMY, sizeof(DUMMY)) == sizeof(DUMMY)) && (ok == 0)) {
  857. X                    if (strcomp(s, DUMMY.name)    == 0) ok = 1;
  858. X                    if (strcomp(s, DUMMY.nick)    == 0) ok = 1;
  859. X                    if (strcomp(s, DUMMY.sh_name) == 0) ok = 1;
  860. X                }
  861. X                if(USER.level < ADMIN_LEV){
  862. X                    if ((strcomp("SYSOP", s) == 0) ||
  863. X                        (strcomp("POST",  s) == 0) ||
  864. X                        (strcomp("GAST",  s) == 0) ||
  865. X                        (strcomp("ADMIN", s) == 0) ||
  866. X                        (strcomp("COSYS", s) == 0)) ok++;
  867. X                }
  868. X                if(s[0] >= 97) s[0] -= 32;
  869. X
  870. X                if(ok == 0) strcpy(USER.name, (UNSIGNED char *) s);
  871. X            }
  872. X        }
  873. X
  874. X        printf("\n%s ", ADM07_MSG);
  875. X        strcpy(s, (UNSIGNED char *) getline(30, 1015, '.', USER.nick));
  876. X        if (s[0] > 31){    
  877. X            ok = 0;
  878. X            lseek(fd, 0L, SEEK_SET);
  879. X            while ((read(fd, (UNSIGNED char *) &DUMMY, sizeof(DUMMY)) == sizeof(DUMMY)) && (ok == 0)) {
  880. X                if (strcomp(s, DUMMY.name)    == 0) ok = 1;
  881. X                if (strcomp(s, DUMMY.nick)    == 0) ok = 1;
  882. X                if (strcomp(s, DUMMY.sh_name) == 0) ok = 1;
  883. X            }
  884. X            if (USER.level < ADMIN_LEV){
  885. X                if ((strcomp("SYSOP", s) == 0) ||
  886. X                    (strcomp("POST",  s) == 0) ||
  887. X                    (strcomp("GAST",  s) == 0) ||
  888. X                    (strcomp("ADMIN", s) == 0) ||
  889. X                    (strcomp("COSYS", s) == 0)) ok++;
  890. X            }
  891. X
  892. X            if(ok == 0) strcpy(USER.nick, (UNSIGNED char *) s);
  893. X        }
  894. X
  895. X        close(fd);
  896. X        mbunlock(UDBASE);
  897. X
  898. X        printf("\n%s ", ADM08_MSG);
  899. X        strcpy(s, (UNSIGNED char *) getline(30, 1011, '.', USER.wohnort));
  900. X        if (s[0] > 31) sprintf(USER.wohnort, s);
  901. X
  902. X        printf("\n%s ", ADM09_MSG);
  903. X        strcpy(s, (UNSIGNED char *) getline(30, 1011, '.', USER.strasse));
  904. X        if (s[0] > 31) sprintf(USER.strasse, s);
  905. X
  906. X        printf("\n%s ", ADM10_MSG);
  907. X        strcpy(s, (UNSIGNED char *) getline(20, 1011, '.', USER.telefon1));
  908. X        if (s[0] > 31) sprintf(USER.telefon1, s);
  909. X
  910. X        printf("\n%s ", ADM11_MSG);
  911. X        strcpy(s, (UNSIGNED char *) getline(20, 1011, '.', USER.telefon2));
  912. X        if (s[0] > 31) sprintf(USER.telefon2, s);
  913. X
  914. X        printf("\n%s ", ADM12_MSG);
  915. X        strcpy(s, (UNSIGNED char *) getline(10, 1114, '?', USER.geburtsdatum));
  916. X        if (s[0] > 31) sprintf(USER.geburtsdatum, s);
  917. X
  918. X        if(USER.name[0] != oldname[0]){
  919. X            moving( oldname, USER.name, USER.id );
  920. X        }
  921. X        break;
  922. X
  923. X      case '6':
  924. X        if (strcomp(GUEST, USER.name) == 0) break;
  925. X
  926. X        headline( ADM77_MSG );
  927. X        
  928. X        NIX: printf("\n%s ", ADM78_MSG);
  929. X    
  930. X        strcpy(s, (UNSIGNED char *) getline(10, 12, '.', ""));
  931. X        if (s[0] != '\0') {
  932. X            strcpy(USER.passwort, (UNSIGNED char *) crypted(s));
  933. X            printf(" (%s)", USER.passwort);
  934. X        }
  935. X        if (strlen(USER.passwort) < 5) {
  936. X            ansi2("md", 0, 0);
  937. X            printf("\n\n%s\n", ADM79_MSG);
  938. X            ansi2("me", 0, 0);
  939. X            goto NIX;
  940. X        }
  941. X        printf("\n\n%s ", ADM80_MSG);
  942. X        strcpy(s, (UNSIGNED char *) getline(10, 12, '.', ""));
  943. X        strcpy(t, (UNSIGNED char *) crypted(s));
  944. X        printf(" (%s)", t);
  945. X        if ((strcomp(t, USER.passwort) != 0) || (strcomp(USER.passwort, t) != 0)) {
  946. X            ansi2("md", 0, 0);
  947. X            printf(" %s         \n", ADM81_MSG);
  948. X            ansi2("me", 0, 0);
  949. X            goto NIX;
  950. X        }
  951. X        break;
  952. X
  953. X    case '7':
  954. X        headline( ADM82_MSG );
  955. X        printf("\n");
  956. X        strcpy(s, (UNSIGNED char *) mytime(0));
  957. X        if (USER.intro == 1)
  958. X            printf("*");
  959. X        else
  960. X            printf(" ");
  961. X        printf(" 1 - %s\n\n", ADM83_MSG);
  962. X        if (USER.intro == 2)
  963. X            printf("*");
  964. X        else
  965. X            printf(" ");
  966. X        printf(" 2 - %s\n\n", ADM84_MSG);
  967. X        if (USER.intro == 3)
  968. X            printf("*");
  969. X        else
  970. X            printf(" ");
  971. X        printf(" 3 - %s\n\n", ADM85_MSG);
  972. X        if (USER.intro == 4)
  973. X            printf("*");
  974. X        else
  975. X            printf(" ");
  976. X        printf(" 4 - %s\n\n", ADM86_MSG);
  977. X
  978. X        USER.intro = setup_get('4') - 48;
  979. X        break;
  980. X
  981. X      case '8':
  982. X        headline( ADM87_MSG );
  983. X        printf("\n");
  984. X        if (USER.lastmode == 1)
  985. X            printf("*");
  986. X        else
  987. X            printf(" ");
  988. X        printf(" 1 - %s\n\n", ADM88_MSG);
  989. X        if (USER.lastmode == 2)
  990. X            printf("*");
  991. X        else
  992. X            printf(" ");
  993. X        printf(" 2 - %s\n\n", ADM89_MSG);
  994. X        printf("\n");
  995. X        printf("  3 - %s\n\n", ADM90_MSG);
  996. X    
  997. X        i = setup_get('3') - 48;
  998. X
  999. X        switch (i) {
  1000. X            case 1:
  1001. X                USER.lastmode = 1;
  1002. X                LASTTIME = USER.lasttime;
  1003. X                break;
  1004. X            case 2:
  1005. X                USER.lastmode = 2;
  1006. X                LASTTIME = (int) 0;
  1007. X                break;
  1008. X            case 3:
  1009. X                headline( ADM87_MSG );
  1010. X                ansi2("md", 0, 0);
  1011. X                printf("\n%s\n", ADM91_MSG);
  1012. X                printf("%s\n", ADM92_MSG);
  1013. X                printf("%s\n", ADM93_MSG);
  1014. X                printf("%s\n", ADM94_MSG);
  1015. X                ansi2("me", 0, 0);
  1016. X
  1017. X                printf("\n%s ", ADM95_MSG);
  1018. X                strcpy(t, (UNSIGNED char *) datereconv(LASTLOG));
  1019. X                strcpy(s, (UNSIGNED char *) getline(10, 1114, '?', t));
  1020. X                LASTLOG = (long) dateconv(s);
  1021. X
  1022. X                printf("\n%s ", ADM96_MSG);
  1023. X                strcpy(t, (UNSIGNED char *) timereconv(LASTTIME));
  1024. X                strcpy(s, (UNSIGNED char *) getline(8, 1113, '?', t));
  1025. X                LASTTIME = timeconv(s);
  1026. X
  1027. X                break;
  1028. X        }
  1029. X        break;
  1030. X
  1031. X      case '9':    
  1032. X        goto ENDE;
  1033. X        break;
  1034. X  }
  1035. X  printf("\n\n");
  1036. X  init_user( ADM97_MSG );
  1037. X  goto AGAIN;
  1038. X
  1039. X  ENDE:
  1040. X
  1041. X  sprintf(s, "%s/surf.%d", TMP, getpid());
  1042. X  unlink(s);
  1043. X
  1044. X  printf("\n");
  1045. X  return;
  1046. X}
  1047. END_OF_FILE
  1048.   if test 24678 -ne `wc -c <'mbox/src/admin.c'`; then
  1049.     echo shar: \"'mbox/src/admin.c'\" unpacked with wrong size!
  1050.   fi
  1051.   # end of 'mbox/src/admin.c'
  1052. fi
  1053. if test -f 'mbox/src/mail.c' -a "${1}" != "-c" ; then 
  1054.   echo shar: Will not clobber existing file \"'mbox/src/mail.c'\"
  1055. else
  1056.   echo shar: Extracting \"'mbox/src/mail.c'\" \(24817 characters\)
  1057.   sed "s/^X//" >'mbox/src/mail.c' <<'END_OF_FILE'
  1058. X/* ix/MBox (mail.c) by Volker Schuermann, 04.12.1993
  1059. X
  1060. X   This C source code contains the following functions:
  1061. X
  1062. X   #BF brief()           mailing to local and foreign users
  1063. X
  1064. X   Contact <volkers@unnet.wupper.de> for help! */
  1065. X
  1066. X
  1067. X
  1068. X
  1069. X
  1070. X
  1071. X
  1072. X
  1073. X#include <sys/types.h>
  1074. X#include <sys/stat.h>
  1075. X#include <unistd.h>
  1076. X#include <stdio.h>
  1077. X#include <fcntl.h>
  1078. X#include <time.h>
  1079. X
  1080. X#include "mbox.h"
  1081. X
  1082. X
  1083. X
  1084. X
  1085. X/* #BF - The internal mailer.
  1086. X
  1087. X   This one is able to mail to BBS users, to shell users and users
  1088. X   abroad.
  1089. X
  1090. X   If [arg] contains the text "~REPLY~", the mailer looks for a mail
  1091. X   to replay on. If not, [arg] must be some kind of address. The mailer
  1092. X   itself finds out wheter the receiver is a BBS user, shell user or
  1093. X   even a user on another site.
  1094. X
  1095. X   The function returns a -1 to announce a break or an error. */
  1096. X
  1097. Xint brief(arg)
  1098. XUNSIGNED char arg[];
  1099. X{
  1100. X  FILE *fp;
  1101. X  FILE *ff;
  1102. X  FILE *ft;
  1103. X  int fd;
  1104. X  int i, j, a;
  1105. X  int ok;
  1106. X  struct userdaten LOOSER;
  1107. X
  1108. X  int endless;
  1109. X
  1110. X  time_t timer;
  1111. X  struct tm *timeptr;
  1112. X
  1113. X  int receiver;
  1114. X  int mail_id;
  1115. X  int EX_PM = 0;
  1116. X  int REPLY = 0;
  1117. X  int lines = 0;
  1118. X  int WEITERLEITEN = 0;
  1119. X  int HOLD = 0;
  1120. X  int UMLEITUNG = 0;
  1121. X  int KOPIE = 0;
  1122. X
  1123. X  UNSIGNED char s[STRING];
  1124. X  UNSIGNED char t[STRING];
  1125. X  UNSIGNED char TEP[STRING];
  1126. X  UNSIGNED char REP[STRING];
  1127. X  UNSIGNED char f[STRING];
  1128. X  UNSIGNED char subject[STRING];
  1129. X  UNSIGNED char from[STRING];
  1130. X  UNSIGNED char rec_char[STRING];
  1131. X  UNSIGNED char ex[LONGSTRING];
  1132. X  UNSIGNED char user[STRING];
  1133. X  UNSIGNED char mesg_id[STRING];
  1134. X  UNSIGNED char refs[STRING];
  1135. X  UNSIGNED char date[STRING];
  1136. X  UNSIGNED char c;
  1137. X  UNSIGNED char protokoll;
  1138. X  UNSIGNED char lf;
  1139. X  UNSIGNED char pubdir[STRING];
  1140. X  UNSIGNED char dummy[STRING];
  1141. X  UNSIGNED char username[STRING];
  1142. X  UNSIGNED char reply[STRING];
  1143. X  UNSIGNED char priority[STRING];
  1144. X  UNSIGNED char action[STRING];
  1145. X  UNSIGNED char cc[STRING];
  1146. X  UNSIGNED char bcc[STRING];
  1147. X  UNSIGNED char encrypted[STRING];
  1148. X  UNSIGNED char comments[STRING];
  1149. X  UNSIGNED char keywords[STRING];
  1150. X  UNSIGNED char fortune[STRING];
  1151. X  UNSIGNED char content[STRING];
  1152. X  UNSIGNED char receipt[STRING];
  1153. X  UNSIGNED char delivery[STRING];
  1154. X
  1155. X  long cont_length = 0;
  1156. X
  1157. X  UNSIGNED char YOUR_SITE[STRING];
  1158. X
  1159. X  int BINFILE;
  1160. X  int news_reply = 0;
  1161. X
  1162. X  struct stat fst;
  1163. X
  1164. X
  1165. X  i = 0;
  1166. X  ok = 0;
  1167. X
  1168. X  mesg_id[0] = '\0';
  1169. X
  1170. X  if (arg[0] == '\0') {
  1171. X    ansi2("md", 0, 0);
  1172. X    printf(" %s\n", MAL03_MSG);
  1173. X    ansi2("me", 0, 0);
  1174. X    return -1;
  1175. X  }
  1176. X  EX_PM = 0;
  1177. X
  1178. X  i = 0;
  1179. X  strcpy(t, USER.name);
  1180. X  while (t[i] != '\0') {
  1181. X    if (t[i] == ' ') t[i] = '.';
  1182. X    i++;
  1183. X  }
  1184. X  strcpy(username, t);
  1185. X  action[0]     = '\0';
  1186. X  priority[0]    = '\0';
  1187. X  encrypted[0]    = '\0';
  1188. X  keywords[0]     = '\0';
  1189. X  comments[0]    = '\0';
  1190. X  cc[0]     = '\0';
  1191. X  bcc[0]    = '\0';
  1192. X  fortune[0]     = '\0';
  1193. X  content[0]    = '\0';
  1194. X  receipt[0]     = '\0';
  1195. X  reply[0]       = '\0';
  1196. X  delivery[0]    = '\0';
  1197. X
  1198. X#ifdef _UMLAUT
  1199. X  if(UMLAUT_MODUS < 3) strcpy(content, (UNSIGNED char *) "text/plain; charset=iso-8859-1");
  1200. X#endif
  1201. X
  1202. X  if(ROT13_MODUS) strcpy(encrypted, (UNSIGNED char *) "rot13");
  1203. X
  1204. X  i = 0;
  1205. X  while (arg[i] != '\0') {
  1206. X    if ((arg[i] == '!') || (arg[i] == '@') || (arg[i] == '%')) EX_PM++;
  1207. X    i++;
  1208. X  }
  1209. X
  1210. X  if ((EX_PM > 0) && (USER.level < MAILOUT_LEV)) {
  1211. X    ansi2("md", 0, 0);
  1212. X    printf("\n\n%s (%d) %s\n", MAL04_MSG, MAILOUT_LEV, MAL05_MSG);
  1213. X    ansi2("me", 0, 0);
  1214. X    return -1;
  1215. X  }
  1216. X
  1217. X  if(arg[strlen(arg) -1] == '?'){
  1218. X    arg[strlen(arg) -1] = '$';
  1219. X    HOLD++;
  1220. X    KOPIE++;
  1221. X  }
  1222. X
  1223. X  if(arg[strlen(arg) -1] == '$'){
  1224. X    WEITERLEITEN++;
  1225. X    arg[strlen(arg) -1] = '\0';
  1226. X    sprintf(TEP, "%s/usr/%c/%d/.lastletter", HOME, USER.name[0], USER.id);
  1227. X    sprintf(t, "%s/usr/%c/%d/.lastsubject", HOME, USER.name[0], USER.id);
  1228. X    fp = fopen( t, "r" );
  1229. X    if(fp == NULL) {
  1230. X        return -1; 
  1231. X    }
  1232. X    fgets(s, STRING, fp);
  1233. X    fclose(fp);
  1234. X    if(HOLD == 0){
  1235. X        sprintf(subject, "%s %s", MAL06_MSG, s);
  1236. X        UMLEITUNG++;
  1237. X    }else
  1238. X        sprintf(subject, "%s", s);
  1239. X  }
  1240. X
  1241. X  user[0] = '\0';
  1242. X  strcat(user, arg);
  1243. X
  1244. X  if(WEITERLEITEN != 0) goto TRY_AGAIN;
  1245. X
  1246. X  if (strcomp("~REPLY~", arg) == 0) {
  1247. X    REPLY++;
  1248. X    sprintf(REP, "%s/%dRep", TMP, getpid());
  1249. X    sprintf(TEP, "%s/%dTep", TMP, getpid());
  1250. X    fp = fopen(REP, "r");
  1251. X    if (fp == NULL) {
  1252. X        nerror("mail.c", 278, "brief", "Can't read", REP);
  1253. X    }
  1254. X    fgets(s, STRING, fp    );            /* HEADER: Autor */
  1255. X
  1256. X    sprintf(dummy, "%s %s", GBL01_MSG, X_MAIL_DEMON);
  1257. X
  1258. X    if ((strcomp(GBL01_MSG, s) == 0) && (strcomp(dummy, s) != 0)) {
  1259. X        strcpy(user, (UNSIGNED char *) strcopy(s, (1+strlen(GBL01_MSG)), 80));
  1260. X
  1261. X        fgets(s, STRING, fp);        /* HEADER: Datum */
  1262. X        fgets(s, STRING, fp);        /* HEADER: Betreff */
  1263. X
  1264. X        strcpy(t, (UNSIGNED char *) strcopy(s, (1+strlen(GBL03_MSG)), STRING));
  1265. X        subject[0]= '\0';
  1266. X        if (strcomp("Re: ", t) != 0) {
  1267. X            strcpy(subject, "Re: ");
  1268. X        }
  1269. X        strcat(subject, (UNSIGNED char *) stripped(t));
  1270. X
  1271. X        fgets(s, STRING, fp);    /* HEADER: empty */
  1272. X        fgets(s, STRING, fp);    /* HEADER: empty */
  1273. X    }
  1274. X    else {        /* UUCP-Header (!MBox) */
  1275. X
  1276. X        sprintf(subject, MAL07_MSG);
  1277. X        refs[0] = '\0';
  1278. X        mesg_id[0] = '\0';
  1279. X
  1280. X        ok = -1;
  1281. X
  1282. X        while ((ok < 1) && (fgets(s, STRING, fp) != NULL)) {
  1283. X            if (strcomp("Lines: ", s)      == 0) ok = 1;
  1284. X            if (strcomp("Date: ",  s)      == 0) {
  1285. X                strcpy(date, (UNSIGNED char *) strcopy(s, 6, STRING));
  1286. X            }
  1287. X            if (strcomp("Newsgroups: ", s) == 0) news_reply++;
  1288. X            if (strcomp("Subject: ", s)    == 0) {
  1289. X                subject[0] = '\0';
  1290. X                strcpy(t, (UNSIGNED char *) strcopy(s, 9, STRING));
  1291. X                if (strcomp("Re: ", t) != 0) {
  1292. X                    sprintf(subject, "%s", "Re: ");
  1293. X                }
  1294. X                strcat(subject, (UNSIGNED char *) stripped(t));
  1295. X            }
  1296. X            if (strcomp("Message-Id: ", s) == 0) {
  1297. X                strcpy(mesg_id, (UNSIGNED char *) strcopy(s, 12, STRING));
  1298. X            }
  1299. X            if (strcomp("From: ", s) == 0) {
  1300. X                strcpy(from, (UNSIGNED char *) strcopy(s, 6, STRING));
  1301. X                ok = 0;
  1302. X            }
  1303. X            if (strcomp("From ", s) == 0) {
  1304. X                strcpy(from, (UNSIGNED char *) strcopy(s, 5, STRING));
  1305. X                ok = 0;
  1306. X            }
  1307. X            if (strcomp("References: ", s) == 0) {
  1308. X                strcpy(refs, (UNSIGNED char *) strcopy(s, 12, STRING));
  1309. X            }
  1310. X            if (strcomp("Comments: ", s) == 0) {
  1311. X                strcpy(comments, (UNSIGNED char *) strcopy(s, 10, STRING));
  1312. X                strcpy(comments, (UNSIGNED char *) stripped(comments));    
  1313. X            }
  1314. X            if (strcomp("Keywords: ", s) == 0) {
  1315. X                strcpy(keywords, (UNSIGNED char *) strcopy(s, 10, STRING));
  1316. X                strcpy(keywords, (UNSIGNED char *) stripped(keywords));
  1317. X            }
  1318. X            if (strcomp("Content-Type: ", s) == 0) {
  1319. X                strcpy(content, (UNSIGNED char *) strcopy(s, 14, STRING));
  1320. X                strcpy(content, (UNSIGNED char *) stripped(content));
  1321. X            }
  1322. X            if (strcomp("X-Delivering-Time: ", s) == 0) {
  1323. X                strcpy(delivery, (UNSIGNED char *) strcopy(s, 19, STRING));
  1324. X                strcpy(delivery, (UNSIGNED char *) stripped(delivery));
  1325. X            }
  1326. X
  1327. X            if ((strlen(s) < 5) && (ok == 0)) ok = 1;
  1328. X
  1329. X            /* THE FOLLOWING IS A LOUSY TRICK, EATING HEADER INFORMATION! */
  1330. X
  1331. X            while(strlen(s) == (STRING - 1)){ 
  1332. X                fgets(s, STRING, fp);
  1333. X            }
  1334. X        }
  1335. X    }
  1336. X
  1337. X    i = 0; a = 0; printf(" %-4.4d", a );
  1338. X
  1339. X    ff = fopen(TEP, "w");
  1340. X
  1341. X    if(news_reply > 0){
  1342. X        fprintf(ff, "In \"%s\" you wrote the other day:\n", NG);
  1343. X    }
  1344. X    
  1345. X
  1346. X    while (fgets(s, STRING, fp) != NULL) {
  1347. X
  1348. X        a++; 
  1349. X        printf("%c%c%c%c%-4.4d", BS, BS, BS, BS, a );
  1350. X
  1351. X        if((s[0] != '\n') && (i == 0)){
  1352. X
  1353. X            if(s[0] != '>')
  1354. X                fputs(">     ", ff);
  1355. X            else{
  1356. X                if(strcomp(">  ", s) == 0){
  1357. X                    s[1] = '>';
  1358. X                }
  1359. X                else fputs(">", ff);
  1360. X            }
  1361. X        }
  1362. X
  1363. X        if(s[0] != '>'){
  1364. X
  1365. X            if(i >= 65){    
  1366. X                fputs("\n>     ", ff);
  1367. X                i = 0;
  1368. X            }
  1369. X
  1370. X            endless = 0;
  1371. X
  1372. X            BETTER_TWICE:
  1373. X
  1374. X            if((strlen(s) + i) > 65){
  1375. X                j = 65 - i;
  1376. X                i = 0;
  1377. X                ok = 0;
  1378. X                while((ok == 0) && (j > 0)){
  1379. X                    if(s[j] == ' '){
  1380. X                        fputs((UNSIGNED char *) iso_line( (UNSIGNED char *) strcopy(s, 0, (j-1))), ff);
  1381. X                        fputs("\n>     ", ff);
  1382. X                        strcpy(f, (UNSIGNED char *) stripped( strcopy(s, (j+1), strlen(s))));
  1383. X                        strcpy(s, (UNSIGNED char *) f);
  1384. X                        strcat(s, (UNSIGNED char *) " ");
  1385. X                        i = strlen(s);
  1386. X                        ok++;
  1387. X                    }
  1388. X                    j--;
  1389. X                }
  1390. X                if((j == 0) && (ok == 0)){
  1391. X                    fputs("\n>     ", ff);
  1392. X                    endless++;
  1393. X                    if(endless == 1) goto BETTER_TWICE;
  1394. X                }
  1395. X            }
  1396. X            else{
  1397. X                i = 0;
  1398. X            }
  1399. X        }
  1400. X
  1401. X        fputs((UNSIGNED char *) iso_line(s), ff);
  1402. X    }
  1403. X    fputs("", ff);
  1404. X    fclose(ff);
  1405. X    fclose(fp);
  1406. X  }
  1407. X
  1408. X  TRY_AGAIN:
  1409. X
  1410. X  if((WEITERLEITEN != 0) && (EX_PM != 0)){
  1411. X    sprintf(rec_char, "%s", user);
  1412. X    if(checkdomaintype( rec_char ) != 0) return -1;
  1413. X    goto ONCE_MORE;
  1414. X  }
  1415. X
  1416. X  receiver = 0;
  1417. X
  1418. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  1419. X  fd = open(UDBASE, O_RDONLY);
  1420. X  if (fd == -1) {
  1421. X    nerror("mail.c", 216, "brief", "Can't read", UDBASE);
  1422. X  }
  1423. X  lseek(fd, 0L, SEEK_SET);
  1424. X  while ((receiver == 0) && (read(fd, (UNSIGNED char *) &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER))) {
  1425. X    if ((strcomp(user, LOOSER.name) == 0) ||
  1426. X        (strcomp(LOOSER.name, user) == 0) ||
  1427. X        (strcomp(user, LOOSER.nick) == 0) ||
  1428. X        (strcomp(user, LOOSER.sh_name) == 0)) {
  1429. X        receiver = LOOSER.id;
  1430. X        strcpy(rec_char, LOOSER.name);
  1431. X    }
  1432. X  }
  1433. X  close(fd);
  1434. X  mbunlock(UDBASE);
  1435. X
  1436. X  if ((receiver == 0) && (EX_PM == 0)) {
  1437. X
  1438. X    if (REPLY != 0) {
  1439. X        strcpy(user, fetch_reciepy(REP));
  1440. X        if (fetch_local == 1) goto TRY_AGAIN;
  1441. X        strcpy(rec_char, (UNSIGNED char *) stripped(user));
  1442. X        if (strcomp(user, "OOPS") == 0) {
  1443. X            ansi2("md", 0, 0);
  1444. X            printf("\n\n%s\n", MAL08_MSG);
  1445. X            ansi2("me", 0, 0);
  1446. X            unlink(TEP);
  1447. X            unlink(REP); /* ??? */
  1448. X            return -1;
  1449. X        }
  1450. X        EX_PM = 1;
  1451. X        c = MAL13_MSG;
  1452. X        goto REPLY_MARK;
  1453. X    }
  1454. X    else {
  1455. X        ansi2("md", 0, 0);
  1456. X        strcpy(rec_char, (UNSIGNED char *) stripped(user));
  1457. X        printf("\n\n%s \"%s\" %s\n", MAL09_MSG, user, MAL10_MSG);
  1458. X        ansi2("me", 0, 0);
  1459. X        if(WEITERLEITEN == 0) unlink(TEP);
  1460. X        unlink(REP);
  1461. X        return -1;
  1462. X    }
  1463. X  }
  1464. X
  1465. X  if(WEITERLEITEN != 0) goto ONCE_MORE;
  1466. X
  1467. X  unlink(REP);
  1468. X
  1469. X  if (EX_PM == 0) {
  1470. X    ansi2("md", 0, 0);
  1471. X    sprintf(s, "%s/usr/%d/.hello", HOME, receiver);
  1472. X    printf("\n\n");
  1473. X    show(s, 22, 0);
  1474. X    ansi2("me", 0, 0);
  1475. X  }
  1476. X  else {
  1477. X    strcpy(rec_char, arg);
  1478. X  }
  1479. X
  1480. X  if(checkdomaintype( rec_char ) != 0) return -1;
  1481. X
  1482. X  if (REPLY != 0) {
  1483. X    c = MAL13_MSG;
  1484. X    goto REPLY_MARK;
  1485. X  }
  1486. X  printf("\n\n%c", CR);
  1487. X
  1488. X  if(ROT13_MODUS){
  1489. X    printf("%s ", MAL11aMSG);
  1490. X    ansi2("md", 0, 0);
  1491. X    printf("ROT13");
  1492. X    ansi2("me", 0, 0);
  1493. X    printf(" %s\n\n", MAL11bMSG);
  1494. X  }
  1495. X  ansi2("mr", 0, 0);
  1496. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL12_MSG);
  1497. X  ansi2("me", 0, 0);
  1498. X  printf("%c%c", MAL13_MSG, BS);
  1499. X
  1500. X  do {
  1501. X    c = getint();
  1502. X    if (c >= 97) c -= 32;
  1503. X    if (c == '?') {
  1504. X        clearline();
  1505. X        ansi2("mr", 0, 0);
  1506. X        printf("%c%s > ", CR, MAL16_MSG);
  1507. X        ansi2("me", 0, 0);
  1508. X    }
  1509. X    if (c == ENTER) c = MAL13_MSG;
  1510. X    if ((c != MAL13_MSG) && (c != MAL14_MSG) && (c != MAL15_MSG)) c = 0;
  1511. X  } while (c == 0);
  1512. X
  1513. X  printf("%c", c);
  1514. X
  1515. X  if (c == MAL15_MSG) {        /* REJECT / VERWERFEN */
  1516. X    unlink(REP);
  1517. X    unlink(TEP);
  1518. X    printf("\n");
  1519. X    return -1;
  1520. X  }
  1521. X  sprintf(TEP, "%s/M%d", TMP, getpid());
  1522. X  sprintf(pubdir, "%s/dir%d", TMP, getpid());
  1523. X
  1524. X  if (c == MAL14_MSG) {        /* UPLOAD */
  1525. X    clearline();
  1526. X    ansi2("mr", 0, 0);
  1527. X    printf("%c%s, ? > ", CR, MAL17_MSG);
  1528. X    ansi2("me", 0, 0);
  1529. X
  1530. X    do {
  1531. X        protokoll = getint();
  1532. X        if (protokoll >= 97) protokoll -= 32;
  1533. X        if (protokoll == '?') {
  1534. X            clearline();
  1535. X            ansi2("mr", 0, 0);
  1536. X            printf("%c%s > ", CR, MAL17aMSG);
  1537. X            ansi2("me", 0, 0);
  1538. X        }
  1539. X        if ((protokoll != MAL18_MSG) && (protokoll != MAL18_MSG) &&
  1540. X            (protokoll != MAL20_MSG) && (protokoll != MAL21_MSG))
  1541. X            protokoll = 0;
  1542. X    } while (protokoll == 0);
  1543. X
  1544. X    printf("%c", protokoll);
  1545. X
  1546. X  }
  1547. X  printf("\n\n%c", CR);
  1548. X  ansi2("mr", 0, 0);
  1549. X  printf("%s ", MAL22_MSG);
  1550. X  ansi2("me", 0, 0);
  1551. X  printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
  1552. X  ansi2("mr", 0, 0);
  1553. X  printf("%s ", MAL23_MSG);
  1554. X  ansi2("me", 0, 0);
  1555. X  printf(" %s\n%c", rec_char, CR);
  1556. X  ansi2("mr", 0, 0);
  1557. X  printf("%s ", MAL24_MSG);
  1558. X  ansi2("me", 0, 0);
  1559. X  printf(" ");
  1560. X  strcpy(subject, (UNSIGNED char *) getline(50, -11, '.', ""));
  1561. X  if(subject[0] == '\0'){
  1562. X    strcpy(subject, (UNSIGNED char *) "Just another letter ...");
  1563. X    printf("%s                           ", subject);
  1564. X  }
  1565. X  printf("\n");
  1566. X  ansi2("mr", 0, 0);
  1567. X  printf("%s ", MAL23aMSG);
  1568. X  ansi2("me", 0, 0);
  1569. X  printf(" ");
  1570. X  strcpy(cc, (UNSIGNED char *) getline(50, -11, '.', ""));
  1571. X
  1572. X  REPLY_MARK:
  1573. X
  1574. X  if(checkdomaintype( rec_char ) != 0) return -1;
  1575. X
  1576. X  if (c == MAL13_MSG) {
  1577. X    security_ed( TEP );
  1578. X    protokoll = '*';
  1579. X  }
  1580. X  else {            /* UPLOAD */
  1581. X
  1582. X    noctrlx();
  1583. X
  1584. X    printf("\n\n%s\n\n", MAL25_MSG); 
  1585. X    ansi2("md", 0, 0);
  1586. X    printf("%s", MAL26_MSG);
  1587. X    ansi2("me", 0, 0);
  1588. X          
  1589. X    unlink( TEP );
  1590. X    
  1591. X    switch (protokoll) {
  1592. X        case MAL18_MSG:
  1593. X            fp = fopen(TEP, "w");
  1594. X            if (fp == NULL) {
  1595. X                nerror("mail.c", 268, "brief", "Can't write to", TEP);
  1596. X            }
  1597. X            c = 0;
  1598. X            lf = CR;
  1599. X
  1600. X            fputc(LF, fp);
  1601. X
  1602. X            /*
  1603. X            while ((c != CTRL_X) && (c != CTRL_D)) {
  1604. X            */
  1605. X            while ((c != CTRL_E) && (c != CTRL_D)) {
  1606. X                c = getint();
  1607. X                if ((c == CR) && (lf == CR)) fputc(LF, fp);
  1608. X                if (c == CR) lf = CR;
  1609. X                if (c == LF) lf = LF;
  1610. X                /*
  1611. X                if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
  1612. X                    fputc(c, fp);
  1613. X                }
  1614. X                */
  1615. X                if ((c != CTRL_E) && (c != CTRL_D) && (c != CR)) {
  1616. X                    fputc(c, fp);
  1617. X                }
  1618. X            }
  1619. X            fclose(fp);
  1620. X            break;
  1621. X
  1622. X        case MAL19_MSG:
  1623. X            printf("\n");
  1624. X            sprintf(s, "exec %s -c TimeTravelAgency", RX);
  1625. X            break;
  1626. X        case MAL20_MSG:
  1627. X            printf("\n");
  1628. X            sprintf(s, "exec %s", RB);
  1629. X            break;
  1630. X        case MAL21_MSG:
  1631. X            printf("\n");
  1632. X            sprintf(s, "exec %s", RZ);
  1633. X            break;
  1634. X    }
  1635. X    if (protokoll != MAL18_MSG){
  1636. X        mkdir( pubdir, 0777 );
  1637. X        chdir( pubdir );
  1638. X
  1639. X        system( s );
  1640. X
  1641. X        chdir( HOME );
  1642. X        sprintf(s, "mv %s/* %s", pubdir, TEP);
  1643. X        system( s );
  1644. X        sprintf(s, "rm -r %s", pubdir);
  1645. X        system( s );
  1646. X    }
  1647. X    sync();
  1648. X    ctrlx();
  1649. X    stat(TEP, &fst);
  1650. X    if (fst.st_size < 3L) {
  1651. X        printf("\n\n%s\n", MAL27_MSG);
  1652. X        control(MAL28_MSG, 3);
  1653. X        unlink(REP);    
  1654. X        unlink(TEP);
  1655. X        return -1;
  1656. X    }    
  1657. X    if (prf(TEP) == 1) {
  1658. X        printf("\n\n");
  1659. X        ansi2( "md", 0, 0 );
  1660. X        printf("%s", MAL25_MSG);        
  1661. X        ansi2( "me", 0, 0 );
  1662. X        unlink(REP);     
  1663. X        unlink(TEP);
  1664. X        BINFILE++;
  1665. X        return -1;
  1666. X    }
  1667. X    else{
  1668. X        mkix(TEP);
  1669. X    }
  1670. X  }
  1671. X
  1672. X  sprintf(reply, "%s <%s@%s>", USER.name, username, UUCPID);
  1673. X
  1674. X  ONCE_MORE:
  1675. X
  1676. X
  1677. X  if((HOLD != 0) || ((WEITERLEITEN != 0) && (IS_BUFFERED != 0))) goto HOLD_MARK;
  1678. X
  1679. X  printf("\n\n");
  1680. X  ansi2("mr", 0, 0);
  1681. X  printf("[%s \"%s\"] %s, ? > ", MAL11_MSG, rec_char, MAL28aMSG);
  1682. X  ansi2("me", 0, 0);
  1683. X  printf("%c%c", MAL29_MSG, BS);
  1684. X
  1685. X  do {
  1686. X    c = getint();
  1687. X    if (c >= 97) c -= 32;
  1688. X    if (c == '?') {
  1689. X        clearline();
  1690. X        ansi2("mr", 0, 0);
  1691. X        printf("%c%s > ", CR, MAL32_MSG);
  1692. X        ansi2("me", 0, 0);
  1693. X    }
  1694. X    if (c == ENTER) c = MAL29_MSG;
  1695. X    if ((c != MAL29_MSG) && (c != MAL30_MSG) && (c != MAL30aMSG) &&  (c != MAL31_MSG) && (c != MAL31aMSG)) c = 0;
  1696. X  } while (c == 0);
  1697. X
  1698. X  printf("%c", c);
  1699. X
  1700. X  if (c == MAL31_MSG) {        /* CONTINUE / WEITERSCHREIBEN */
  1701. X    security_ed( TEP );
  1702. X    goto ONCE_MORE;
  1703. X  }
  1704. X  if (c == MAL30_MSG) {        /* REJECT / VERWERFEN */
  1705. X    printf("\n");
  1706. X    unlink(TEP);
  1707. X    unlink(REP);
  1708. X    return -1;
  1709. X  }
  1710. X  if (c == MAL31aMSG) {        /* HEADER */
  1711. X    headline( MAL32aMSG );
  1712. X    printf("\n");
  1713. X
  1714. X    time(&timer);
  1715. X
  1716. X    ansi2( "md", 0, 0 );
  1717. X    printf("From: ");
  1718. X    ansi2( "me", 0, 0 );
  1719. X    printf("%s <%s@%s>\n", USER.name, username, UUCPID);
  1720. X
  1721. X    ansi2( "md", 0, 0 );
  1722. X    printf("Reply-To: ");
  1723. X    ansi2( "me", 0, 0 );
  1724. X    if(USER.level > GUEST_LEV){
  1725. X        strcpy(reply, (UNSIGNED char *) getline(STRING, -1001, 32, reply));
  1726. X        printf("\n");
  1727. X    }
  1728. X    else printf("%s\n", reply);
  1729. X
  1730. X    ansi2( "md", 0, 0 );
  1731. X    printf("Return-Receipt-To: ");
  1732. X    ansi2( "me", 0, 0 );
  1733. X    if(USER.level > GUEST_LEV){
  1734. X        strcpy(receipt, (UNSIGNED char *) getline(STRING, -1001, 32, receipt));
  1735. X        printf("\n");
  1736. X    }
  1737. X
  1738. X    i = 0; j = 0;            /* Receiver: Realname */
  1739. X    while(from[i] != '\0'){
  1740. X        if(from[i] == '<'){
  1741. X            strcpy(s, (UNSIGNED char *) strcopy(from, 0, (i-1)));
  1742. X            j = i;
  1743. X        }
  1744. X        if(from[i] == '(') j = i+1;
  1745. X        if(from[i] == ')') strcpy(s, (UNSIGNED char *) strcopy(from, j, (i-1)));
  1746. X        i++;
  1747. X    }
  1748. X    if(j == 0) strcpy(s, from);
  1749. X        
  1750. X    if(mesg_id[0] != '\0'){
  1751. X        ansi2( "md", 0, 0 );
  1752. X        printf("In-Reply-To: ");
  1753. X        ansi2( "me", 0, 0 );
  1754. X        printf("%s; ", (UNSIGNED char *) stripped(mesg_id)); 
  1755. X        printf("from \"%s\" at %s", (UNSIGNED char *) stripped(s), date);
  1756. X
  1757. X        if(refs[0] != '\0') 
  1758. X            sprintf(s, "%s ", stripped(refs));
  1759. X        else
  1760. X            s[0] = '\0';
  1761. X        strcat(s, mesg_id);
  1762. X        ansi2( "md", 0, 0 );
  1763. X        printf("References: ");
  1764. X        ansi2( "me", 0, 0 );
  1765. X        printf("%s\n", s);
  1766. X    }
  1767. X
  1768. X    ansi2( "md", 0, 0 );
  1769. X    printf("To: ");
  1770. X    ansi2( "me", 0, 0 );
  1771. X    if(USER.level > GUEST_LEV){
  1772. X        strcpy(rec_char, (UNSIGNED char *) getline(STRING, -1001, 32, rec_char));
  1773. X        printf("\n");
  1774. X    }
  1775. X    else printf("%s\n", rec_char);
  1776. X
  1777. X    ansi2( "md", 0, 0 );
  1778. X    printf("Cc: ");
  1779. X    ansi2( "me", 0, 0 );
  1780. X    if(USER.level > GUEST_LEV){
  1781. X        strcpy(cc, (UNSIGNED char *) getline(STRING, -1001, 32, cc));
  1782. X        printf("\n");
  1783. X    }
  1784. X    else printf("%s\n", cc);
  1785. X
  1786. X    ansi2( "md", 0, 0 );
  1787. X    printf("Bcc: ");
  1788. X    ansi2( "me", 0, 0 );
  1789. X    if(USER.level > GUEST_LEV){
  1790. X        strcpy(bcc, (UNSIGNED char *) getline(STRING, -1001, 32, bcc));
  1791. X        printf("\n");
  1792. X    }
  1793. X    else printf("%s\n", bcc);
  1794. X
  1795. X
  1796. X    ansi2( "md", 0, 0 );
  1797. X    printf("Subject: ");
  1798. X    ansi2( "me", 0, 0 );
  1799. X    if(USER.level > GUEST_LEV){
  1800. X        strcpy(subject, (UNSIGNED char *) getline(STRING, -1001, 32, subject));
  1801. X        printf("\n");
  1802. X    }
  1803. X    else printf("%s\n", subject);
  1804. X
  1805. X    ansi2( "md", 0, 0 );
  1806. X    printf("Keywords: ");
  1807. X    ansi2( "me", 0, 0 );
  1808. X    if(USER.level > GUEST_LEV){
  1809. X        strcpy(keywords, (UNSIGNED char *) getline(STRING, -1001, 32, keywords));
  1810. X        printf("\n");
  1811. X    }
  1812. X    else printf("%s\n", keywords);
  1813. X
  1814. X    ansi2( "md", 0, 0 );
  1815. X    printf("Comments: ");
  1816. X    ansi2( "me", 0, 0 );
  1817. X    if(USER.level > GUEST_LEV){
  1818. X        strcpy(comments, (UNSIGNED char *) getline(STRING, -1001, 32, comments));
  1819. X        printf("\n");
  1820. X    }
  1821. X    else printf("%s\n", comments);
  1822. X
  1823. X    ansi2( "md", 0, 0 );
  1824. X    printf("Encrypted: ");
  1825. X    ansi2( "me", 0, 0 );
  1826. X    if(USER.level > GUEST_LEV){
  1827. X        strcpy(encrypted, (UNSIGNED char *) getline(STRING, -1001, 32, encrypted));
  1828. X        printf("\n");
  1829. X    }
  1830. X    else printf("%s\n", encrypted);
  1831. X
  1832. X#ifdef _MULTIMEDIA
  1833. X    ansi2( "md", 0, 0 );
  1834. X    printf("MIME-Version: ");
  1835. X    ansi2( "me", 0, 0 );
  1836. X    printf("%s\n", MIME_VERSION);
  1837. X
  1838. X    if(USER.level >= WRITE_INTERNAT){
  1839. X        if(content[0] == '\0')
  1840. X            strcpy(content, (UNSIGNED char *) "text/plain; charset=us-ascii");
  1841. X        ansi2( "md", 0, 0 ); 
  1842. X        printf("Content-Type: ");
  1843. X        ansi2( "me", 0, 0 );
  1844. X        strcpy(content, (UNSIGNED char *) getline(STRING, -1001, 32, content));
  1845. X        printf("\n");
  1846. X    }
  1847. X#endif
  1848. X
  1849. X    ansi2( "md", 0, 0 );
  1850. X    printf("X-Mailer: ");
  1851. X    ansi2( "me", 0, 0 );
  1852. X    printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  1853. X
  1854. X    ansi2( "md", 0, 0 );
  1855. X    printf("Priority: ");
  1856. X    ansi2( "me", 0, 0 );
  1857. X    if(USER.level > GUEST_LEV){
  1858. X        strcpy(priority, (UNSIGNED char *) getline(STRING, -1001, 32, priority));
  1859. X        printf("\n");
  1860. X    }
  1861. X    else printf("%s\n", priority);
  1862. X
  1863. X    ansi2( "md", 0, 0 );
  1864. X    printf("Action: ");
  1865. X    ansi2( "me", 0, 0 );
  1866. X    if(USER.level > GUEST_LEV){
  1867. X        strcpy(action, (UNSIGNED char *) getline(STRING, -1001, 32, action));
  1868. X        printf("\n");
  1869. X    }
  1870. X    else printf("%s\n", action);
  1871. X
  1872. X    ansi2( "md", 0, 0 );
  1873. X    printf("X-Fortune: ");
  1874. X    ansi2( "me", 0, 0 );
  1875. X    if(USER.level > GUEST_LEV){
  1876. X        strcpy(fortune, (UNSIGNED char *) getline(STRING, -1001, 32, fortune));
  1877. X        printf("\n");
  1878. X    }
  1879. X    else printf("%s\n", fortune);
  1880. X
  1881. X
  1882. X    ansi2( "md", 0, 0 );
  1883. X    printf("Message-Id: ");
  1884. X    ansi2( "me", 0, 0 );
  1885. X       printf("<%x.%d@%s>\n", timer, USER.id, UUCPID);
  1886. X
  1887. X    goto ONCE_MORE;
  1888. X  }
  1889. X
  1890. X
  1891. X  HOLD_MARK: 
  1892. X
  1893. X  if((UMLEITUNG == 0) && (WEITERLEITEN == 0) && (strcomp(TMP, TEP) == 0)){
  1894. X    sprintf(s, "cp %s %s/usr/%c/%d/.lastletter > /dev/null", TEP, HOME, USER.name[0], USER.id);
  1895. X    system( s );     
  1896. X    sprintf(s, "%s/usr/%c/%d/.lastsubject", HOME, USER.name[0], USER.id);
  1897. X    fp = fopen( s, "w" );
  1898. X    if(fp == NULL){
  1899. X        nerror("mail.c", 500, "brief", "Can't write to", s);
  1900. X    }
  1901. X    fprintf(fp, "%s", subject);
  1902. X    fclose(fp);
  1903. X  }
  1904. X
  1905. X
  1906. X  if (EX_PM == 0) {
  1907. X
  1908. X     if(rec_char[0] >= 'a') rec_char[0] -= 32;
  1909. X
  1910. X    sprintf(s, "%s/usr/%c/%d/seq", HOME, rec_char[0], receiver);
  1911. X    maybe_locked(s, "r"); mblock(s);
  1912. X    fp = fopen(s, "r");
  1913. X    if (fp == NULL) {
  1914. X        nerror("mail.c", 431, "brief", "Can't read", s);
  1915. X    }
  1916. X    fscanf(fp, "%d", &mail_id);
  1917. X    fclose(fp);
  1918. X    fp = fopen(s, "w");
  1919. X    fprintf(fp, "%d\n", (mail_id + 1));
  1920. X    fclose(fp);
  1921. X    mbunlock(s);
  1922. X    sprintf(s, "%s/usr/%c/%d/%d", HOME, rec_char[0], receiver, mail_id);
  1923. X  }
  1924. X  else {
  1925. X    umask(0000);
  1926. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  1927. X  }
  1928. X
  1929. X
  1930. X  fp = fopen(s, "w");
  1931. X
  1932. X  if (EX_PM == 0) {
  1933. X    sprintf(s, "%s %s (%s)\n", GBL01_MSG, USER.name, USER.nick);
  1934. X    fputs(s, fp);
  1935. X
  1936. X    time(&timer);
  1937. X    timeptr = localtime(&timer);
  1938. X    strcpy(t, asctime(timeptr));
  1939. X
  1940. X    sprintf(s, "%s %s", GBL02_MSG, t);
  1941. X    fputs(s, fp);
  1942. X
  1943. X    sprintf(s, "%s %s\n\n", GBL03_MSG, subject);
  1944. X    fputs(s, fp);
  1945. X
  1946. X    fputs("Content-Type: text/richtext;\n", fp);
  1947. X
  1948. X    lines = 5;
  1949. X   }
  1950. X   else {
  1951. X    lines = 4;
  1952. X  }
  1953. X
  1954. X  ff = fopen(TEP, "r");
  1955. X  if (ff == 0) {
  1956. X    printf("\n\n");
  1957. X    ansi2("md", 0, 0);
  1958. X    printf("%s\n", MAL33_MSG);
  1959. X    ansi2("me", 0, 0);
  1960. X    control(MAL34_MSG, 3);
  1961. X    return;
  1962. X  }
  1963. X  stat(TEP, &fst);
  1964. X  cont_length = fst.st_size;
  1965. X
  1966. X  if(EX_PM != 0){
  1967. X
  1968. X    time(&timer);
  1969. X
  1970. X    i = 0; j = 0;            /* Receiver: Realname */
  1971. X    while(from[i] != '\0'){
  1972. X        if(from[i] == '<'){
  1973. X            strcpy(s, (UNSIGNED char *) strcopy(from, 0, (i-1)));
  1974. X            j = i;
  1975. X        }
  1976. X        if(from[i] == '(') j = i+1;
  1977. X        if(from[i] == ')') strcpy(s, (UNSIGNED char *) strcopy(from, j, (i-1)));
  1978. X        i++;
  1979. X    }
  1980. X    if(j == 0) strcpy(s, from);
  1981. X
  1982. X    fprintf(fp, "From: %s@%s (%s)\n", username, UUCPID, USER.name); 
  1983. X    if(reply[0] != '\0')
  1984. X        fprintf(fp, "Reply-To: %s\n", reply);
  1985. X    if(receipt[0] != '\0')
  1986. X        fprintf(fp, "Return-Receipt-To: %s\n", receipt);
  1987. X    fprintf(fp, "Organization: %s\n", ORGANIZATION);
  1988. X    if(mesg_id[0] != '\0'){
  1989. X        fprintf(fp, "In-Reply-To: %s; ", (UNSIGNED char *) stripped(mesg_id)); 
  1990. X        fprintf(fp, "from \"%s\" at %s", (UNSIGNED char *) stripped(s), date);
  1991. X        if(refs[0] != '\0') 
  1992. X            sprintf(s, "%s ", stripped(refs));
  1993. X        else
  1994. X            s[0] = '\0';
  1995. X        strcat(s, mesg_id);
  1996. X        fprintf(fp, "References: %s\n", s);
  1997. X    }
  1998. X        fprintf(fp, "To: %s\n", rec_char);
  1999. X    if(cc[0] != '\0')
  2000. X        fprintf(fp, "Cc: %s\n", cc);
  2001. X
  2002. X    sprintf(s, "%s/usr/%c/%d/.face", HOME, USER.name[0], USER.id); /* X-Face ??? */
  2003. X    ft = fopen( s, "r" );
  2004. X    if(ft != NULL){
  2005. X        while(fgets(s, 70, ft) != NULL){
  2006. X            fprintf(fp, "X-Face: %s\n", (UNSIGNED char *) stripped(s));
  2007. X        }
  2008. X        fclose(ft);
  2009. X    }
  2010. X
  2011. X    if(subject[0] != '\0')
  2012. X        fprintf(fp, "Subject: %s\n", subject);
  2013. X    if(keywords[0] != '\0')
  2014. X        fprintf(fp, "Keywords: %s\n", keywords);
  2015. X    if(comments[0] != '\0')
  2016. X        fprintf(fp, "Comments: %s\n", comments);
  2017. X    if(encrypted[0] != '\0')
  2018. X        fprintf(fp, "Encrypted: %s\n", encrypted);
  2019. X
  2020. X#ifdef _MULTIMEDIA
  2021. X    fprintf(fp, "MIME-Version: %s\n", MIME_VERSION);
  2022. X    if(content[0] != '\0'){
  2023. X        fprintf(fp, "Content-Type: %s\n", content);
  2024. X        if(UMLAUT_MODUS < 3) fprintf(fp, "Content-Transfer-Encoding: 8bit\n");
  2025. X        fprintf(fp, "Content-Length: %ld\n", cont_length);
  2026. X    }
  2027. X#endif
  2028. X    fprintf(fp, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  2029. X    if(priority[0] != '\0')
  2030. X        fprintf(fp, "Priority: %s\n", priority);
  2031. X    if(action[0] != '\0')
  2032. X        fprintf(fp, "Action: %s\n", action);
  2033. X    if(fortune[0] != '\0')
  2034. X        fprintf(fp, "X-Fortune: %s\n", fortune);
  2035. X       fprintf(fp, "Message-Id: <%x.%d@%s>\n", timer, USER.id, UUCPID);
  2036. X    if(delivery[0] != '\0')
  2037. X        fprintf(fp, "X-Delivered-After: %s\n", delivery);
  2038. X     fputs("\n", fp);
  2039. X
  2040. X  }
  2041. X
  2042. X  UMLAUT_MODUS = 1;
  2043. X  if(WEITERLEITEN == 0) printf(" %-4.4d", lines);
  2044. X  while (fgets(s, STRING, ff) != 0) {
  2045. X    if(ROT13_MODUS) strcpy(s, (UNSIGNED char *) rot13( s ));
  2046. X    fputs((UNSIGNED char *) iso_line(s), fp);
  2047. X    lines++;
  2048. X    if(WEITERLEITEN == 0) printf("%c%c%c%c%-4.4d", BS, BS, BS, BS, lines);
  2049. X  }
  2050. X  fclose(ff);
  2051. X
  2052. X  if(UMLEITUNG == 0){
  2053. X      sprintf(s, "%s/usr/%c/%d/.signature", HOME, USER.name[0], USER.id);
  2054. X      ff = fopen(s, "r");
  2055. X      if (ff != NULL) {
  2056. X        while (fgets(s, STRING, ff) != 0) {
  2057. X            if(ROT13_MODUS) strcpy(s, (UNSIGNED char *) rot13( s ));
  2058. X            fputs((UNSIGNED char *) iso_line(s), fp);
  2059. X            lines++;
  2060. X            if(KOPIE == 0) printf("%c%c%c%c%-4.4d", BS, BS, BS, BS, lines);
  2061. X        }
  2062. X        fclose(ff);
  2063. X      }
  2064. X  }
  2065. X
  2066. X  UMLAUT_MODUS = USER.schluessel[2];
  2067. X
  2068. X  if(WEITERLEITEN == 0) unlink(TEP);
  2069. X  fclose(fp);
  2070. X
  2071. X  if (EX_PM == 0) {
  2072. X    sprintf(s, "%s/usr/%c/%d/INDEX", HOME, rec_char[0], receiver);
  2073. X    maybe_locked(s, "r"); 
  2074. X    fp = fopen(s, "a");
  2075. X    if (fp == NULL) {
  2076. X        nerror("mail.c", 527, "brief", "Can't append to", s);
  2077. X    }
  2078. X    sprintf(s, "%d              ", mail_id);
  2079. X    s[6] = '\0';
  2080. X    if(HOLD != 0){
  2081. X        s[5] = '>';
  2082. X    }
  2083. X    fputs(s, fp);
  2084. X
  2085. X    sprintf(ex, "%s                                ", subject);
  2086. X    ex[26] = '\0';
  2087. X    fputs(ex, fp);
  2088. X
  2089. X    sprintf(ex, "  %s                                        ", USER.name);
  2090. X    ex[22] = '\0';
  2091. X    fputs(ex, fp);
  2092. X
  2093. X    strcpy(s, (UNSIGNED char *) mydate(1));
  2094. X    strcpy(t, (UNSIGNED char *) mytime(1));
  2095. X    sprintf(ex, "  %s  %s         ", s, t);
  2096. X    ex[19] = '\0';
  2097. X    fputs(ex, fp);
  2098. X
  2099. X    if(HOLD != 0)
  2100. X        sprintf(s, "%s\n", LE216_MSG);
  2101. X    else{
  2102. X        if(priority[0] != '\0')
  2103. X            sprintf(s, "%s\n", LE219_MSG);
  2104. X        else
  2105. X            sprintf(s, "%s\n", LE215_MSG);
  2106. X    }
  2107. X
  2108. X    fputs(s, fp);
  2109. X
  2110. X    fclose(fp);
  2111. X  }
  2112. X  else {
  2113. X    sprintf(s, " X-Mail via UUCP (%s) ", rec_char);
  2114. X    headline(s);
  2115. X    printf("\n%s", MAL35_MSG);
  2116. X    sprintf(s, "%s/%d.expm", TMP, getpid());
  2117. X    sprintf(t, "/bin/sh ./etc/rmail.sh %s %s > /dev/null 2>&1", s, rec_char);
  2118. X    system(t);
  2119. X    unlink(s);
  2120. X    unlink(f);
  2121. X    umask(0007);
  2122. X    printf(" %s\n", MAL36_MSG);
  2123. X  }
  2124. X
  2125. X  unlink(REP);
  2126. X  if((UMLEITUNG == 0) && (WEITERLEITEN == 0)) unlink(TEP);
  2127. X
  2128. X  sprintf(s, "%s \"%s\" %s", MAL11_MSG, rec_char, MAL37_MSG);
  2129. X  control(s, 3);
  2130. X
  2131. X  printf("\n");
  2132. X
  2133. X
  2134. X#ifdef _PMCOPY
  2135. X
  2136. X  IS_BUFFERED = 0;
  2137. X
  2138. X  if(WEITERLEITEN == 0){
  2139. X      if((strcomp(POSTMASTER, LOOSER.sh_name) == 0) || (strcomp(POSTMASTER, LOOSER.nick) == 0)){
  2140. X        if(bcc[0] != '\0') strcat(bcc, ", ");
  2141. X        sprintf(s, "%s!root", UUCPSITE);
  2142. X        strcat(bcc, (UNSIGNED char *) s);
  2143. X        IS_BUFFERED = 1;
  2144. X      }
  2145. X  }
  2146. X#endif
  2147. X
  2148. X  if((cc[0] != '\0') || (bcc[0] != '\0')){
  2149. X    carboncopy(cc, bcc);
  2150. X  }
  2151. X
  2152. X  return 0;
  2153. X}
  2154. END_OF_FILE
  2155.   if test 24817 -ne `wc -c <'mbox/src/mail.c'`; then
  2156.     echo shar: \"'mbox/src/mail.c'\" unpacked with wrong size!
  2157.   fi
  2158.   # end of 'mbox/src/mail.c'
  2159. fi
  2160. if test -f 'mbox/src/misc.c' -a "${1}" != "-c" ; then 
  2161.   echo shar: Will not clobber existing file \"'mbox/src/misc.c'\"
  2162. else
  2163.   echo shar: Extracting \"'mbox/src/misc.c'\" \(24307 characters\)
  2164.   sed "s/^X//" >'mbox/src/misc.c' <<'END_OF_FILE'
  2165. X/* ix/MBox (misc.c) by Volker Schuermann, 04.12.1993
  2166. X
  2167. X   This C source code contains the following functions:
  2168. X
  2169. X   #SC scanner()           switching from one newsgroup to another
  2170. X   #SN schreiben()         write news articles 
  2171. X   #PF prf()               is the uploaded file a text or a binaries?
  2172. X   #PR pruefe()            contains an article the BINFILE key?
  2173. X
  2174. X   Contact <volkers@unnet.wupper.de> for help! */
  2175. X
  2176. X
  2177. X
  2178. X
  2179. X
  2180. X
  2181. X
  2182. X#include <sys/types.h>
  2183. X#include <sys/stat.h>
  2184. X#include <unistd.h>
  2185. X#include <fcntl.h>
  2186. X#include <stdio.h>
  2187. X#include <utmp.h>
  2188. X#include <time.h>
  2189. X
  2190. X
  2191. X#include "mbox.h"
  2192. X
  2193. X
  2194. Xextern UNSIGNED char headinfo[STRING];
  2195. X
  2196. X
  2197. Xint lastpoint( name )
  2198. XUNSIGNED char name[];
  2199. X{
  2200. X  int a = 0, b = 0;
  2201. X
  2202. X  while(name[a] != '\0'){
  2203. X    if(name[a] == '.') b = a;
  2204. X    a++;
  2205. X  }
  2206. X  if(b == 0) return a;
  2207. X
  2208. X  return (int) b;
  2209. X}
  2210. X
  2211. X
  2212. X
  2213. X/* #SC - Changing the current newsgroup.
  2214. X
  2215. X   [mode]  ->    >  255 = all boards (ignore date)
  2216. X                 >  500 = next AREA
  2217. X         > 1000 = no idea (next hiearchy, maybe)
  2218. X                 +      = next board
  2219. X                 -      = previous board */
  2220. X
  2221. Xvoid scanner(mode)
  2222. Xint mode;
  2223. X{
  2224. X  FILE *fp;
  2225. X  UNSIGNED char s[STRING];
  2226. X  UNSIGNED char t[STRING];
  2227. X  UNSIGNED char f[STRING];
  2228. X  UNSIGNED char prevg[STRING];
  2229. X  UNSIGNED char prevf[STRING];
  2230. X  int ok = 0, a, b;
  2231. X  int line = 0, l = 0;
  2232. X  int locmod = 0;
  2233. X  int max = 0;
  2234. X  int widerange = 0;
  2235. X
  2236. X
  2237. X  if (mode >= 1000) {
  2238. X    widerange = 1000;
  2239. X    mode -= 1000;
  2240. X  }
  2241. X
  2242. X  if (mode >= 500) {
  2243. X    locmod = 500;
  2244. X    mode -= 500;
  2245. X  }
  2246. X
  2247. X  if (mode >= 255) {
  2248. X    locmod = 255;
  2249. X    mode -= 255;
  2250. X  }
  2251. X  KEIN_ZUGRIFF:
  2252. X
  2253. X  if (locmod == 255) {
  2254. X    maybe_locked(SGROUPS, "r");
  2255. X    fp = fopen(SGROUPS, "r");
  2256. X    if (fp == NULL) {
  2257. X        nerror("misc.c", 26, "scanner", "Can't read", NGROUPS);
  2258. X    }
  2259. X }
  2260. X  else {
  2261. X    maybe_locked(UGROUPS, "r");
  2262. X    fp = fopen(UGROUPS, "r");
  2263. X    if (fp == NULL) {
  2264. X        nerror("misc.c", 34, "scanner", "Can't read", UGROUPS);
  2265. X    }
  2266. X  }
  2267. X
  2268. X  f[0] = '\0';
  2269. X  ok = 0;
  2270. X  strcpy(prevg, "L.I.S.A.");
  2271. X
  2272. X  while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &a, t) > 0)) {
  2273. X    l++;
  2274. X    if (strcomp(NG, s) == 0) {
  2275. X        ok = 1;
  2276. X    }
  2277. X    else {
  2278. X        strcpy(f, (UNSIGNED char *) s);
  2279. X    
  2280. X        if(strcomp(prevg, s) != 0){
  2281. X            if(widerange == 0){
  2282. X                  a = lastpoint( s );
  2283. X                strcpy(prevg, (UNSIGNED char *) s);
  2284. X                strcpy(prevf, (UNSIGNED char *) s);
  2285. X                prevg[a] = '\0';
  2286. X            }
  2287. X            else{
  2288. X                strcpy(prevg, (UNSIGNED char *) s); prevg[3] = '\0';
  2289. X                strcpy(prevf, (UNSIGNED char *) s);
  2290. X            }
  2291. X        }
  2292. X    }
  2293. X  }
  2294. X
  2295. X  if (locmod == 500) {
  2296. X    if (mode == '+') {
  2297. X        ok = 0;
  2298. X        
  2299. X        if(widerange == 0){
  2300. X            a = lastpoint( NG );
  2301. X            strcpy(prevg, (UNSIGNED char *) NG);
  2302. X            prevg[a] = '\0';
  2303. X        }
  2304. X        else{
  2305. X            strcpy(prevg, (UNSIGNED char *) NG);
  2306. X            prevg[3] = '\0';
  2307. X        }
  2308. X
  2309. X        while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &a, t) > 0)) {
  2310. X            l++;
  2311. X            if (strcomp(prevg, s) != 0) {
  2312. X                ok = 1;
  2313. X                strcpy(f, (UNSIGNED char *) s);
  2314. X            }
  2315. X        }
  2316. X        if(ok == 0) line = -1;
  2317. X    }
  2318. X    if (mode == '-') {
  2319. X        strcpy(f, (UNSIGNED char *) prevf);
  2320. X    }
  2321. X  }
  2322. X  else{
  2323. X      if (mode == '+') {
  2324. X        if (fscanf(fp, "%s %d %d %s", f, &a, &a, t) < 1) {
  2325. X            if (ok == 0) {
  2326. X                rewind(fp);
  2327. X                fscanf(fp, "%s %d %d %s", f, &a, &a, t);
  2328. X            }
  2329. X              else {
  2330. X                line = -1;
  2331. X            }
  2332. X        }
  2333. X      }
  2334. X      if (mode == '-') {
  2335. X        if (f[0] == '\0') {
  2336. X            rewind(fp);
  2337. X            while (fscanf(fp, "%s %d %d %s", f, &a, &a, t) > 0);
  2338. X        }
  2339. X      }
  2340. X  }    
  2341. X  fclose(fp);
  2342. X
  2343. X  if (max == 20) {
  2344. X    ansi2( "md", 0, 0 );
  2345. X    printf("\n\n%s", MIS00_MSG);
  2346. X    ansi2( "me", 0, 0 );
  2347. X  }
  2348. X
  2349. X  if ((line == -1) || (f[0] == '\0')) {
  2350. X    strcpy(BRETT, (UNSIGNED char *) "PM");
  2351. X    printf("\n");
  2352. X    sprintf(NG, "%s.PM", USER.name);
  2353. X    sprintf(INHALT, "%s/usr/%c/%d/INDEX", HOME, USER.name[0], USER.id);
  2354. X    return;
  2355. X  }
  2356. X  if (l == 0) {
  2357. X    ansi2("md", 0, 0);
  2358. X    printf(" %s\n", MIS01_MSG);
  2359. X    ansi2("me", 0, 0);
  2360. X    return;
  2361. X  }
  2362. X  if ((chk_newsgrp(f) != 0) || (is_subscribed(f) != 1)) {
  2363. X    sprintf(NG, "%s", f);
  2364. X    max++;
  2365. X    goto KEIN_ZUGRIFF;
  2366. X  }
  2367. X  brett(f);
  2368. X}
  2369. X
  2370. X
  2371. X
  2372. X
  2373. X
  2374. X
  2375. X/* #SN - Write an article for the news system.
  2376. X
  2377. X   [arg] seems to be a dummy ... don't comment on this! */
  2378. X
  2379. Xvoid schreiben(arg)
  2380. XUNSIGNED char arg[];
  2381. X{
  2382. X  FILE *fp;
  2383. X  FILE *ff;
  2384. X  FILE *fl;
  2385. X  UNSIGNED char s[STRING];
  2386. X  UNSIGNED char t[STRING];
  2387. X  UNSIGNED char f[STRING];
  2388. X  UNSIGNED char g[LSTRING];
  2389. X  UNSIGNED char ex[LONGSTRING];
  2390. X  UNSIGNED char cmdl[STRING];
  2391. X  UNSIGNED char rep[STRING];
  2392. X  UNSIGNED char subj[STRING];
  2393. X  UNSIGNED char keyw[STRING];
  2394. X  UNSIGNED char summ[STRING];
  2395. X  UNSIGNED char from[STRING];
  2396. X  UNSIGNED char msid[STRING];
  2397. X  UNSIGNED char refs[STRING];
  2398. X  UNSIGNED char tmp[STRING];
  2399. X  UNSIGNED char ng[STRING];
  2400. X  UNSIGNED char reply[STRING];
  2401. X  UNSIGNED char group[STRING];
  2402. X  UNSIGNED char newsgroups[STRING];
  2403. X  UNSIGNED char distribution[STRING];
  2404. X  UNSIGNED char followup[STRING];
  2405. X  UNSIGNED char expires[STRING];
  2406. X  UNSIGNED char ctrl[STRING];
  2407. X  UNSIGNED char sender[STRING];
  2408. X  UNSIGNED char approved[STRING];
  2409. X  UNSIGNED char content[STRING];
  2410. X  UNSIGNED char iam[STRING];
  2411. X  UNSIGNED char username[STRING];
  2412. X
  2413. X  int i, j, a, b, ok;
  2414. X  int app, endless;
  2415. X  int lines;
  2416. X
  2417. X  UNSIGNED char protokoll = 0;
  2418. X  UNSIGNED char c;
  2419. X  UNSIGNED char lf;
  2420. X
  2421. X  int BINFILE;
  2422. X
  2423. X  struct stat fst;
  2424. X
  2425. X  UNSIGNED char pubdir[STRING];
  2426. X  long tdummy;
  2427. X  long tn, ts;
  2428. X
  2429. X  if (strcomp(BRETT, "PM") == 0) {
  2430. X    brief( arg );
  2431. X    return;
  2432. X  }
  2433. X  BINFILE = 0;
  2434. X
  2435. X  if (moderated( NG ) == 1) return;
  2436. X
  2437. X  i = 0;                /* Vorname.Name */
  2438. X  strcpy(ng, USER.name);
  2439. X  while (ng[i] != '\0') {
  2440. X    if (ng[i] == ' ') ng[i] = '.';
  2441. X    i++;
  2442. X  }
  2443. X  strcpy(username, ng);
  2444. X  strcpy(group, NG);
  2445. X
  2446. X
  2447. X  umask(0000);
  2448. X
  2449. X  if (arg[0] == '\0') {
  2450. X
  2451. X    subj[0] = '\0';
  2452. X    keyw[0] = '\0';
  2453. X    from[0] = '\0';
  2454. X    msid[0] = '\0';
  2455. X    summ[0] = '\0';
  2456. X    refs[0] = '\0';
  2457. X
  2458. X    sprintf(rep, "%s/%dRep", TMP, getpid());
  2459. X
  2460. X    fp = fopen(rep, "r");
  2461. X    if (fp != NULL) {        /* REPLY */
  2462. X        while ((fgets(s, STRING, fp) != NULL) && (strlen(s) > 2)) {
  2463. X            if (strcomp("Subject:", s)   == 0) {
  2464. X                strcat(subj, strcopy(s, 8, 79));
  2465. X                strcpy(subj,  (UNSIGNED char *) stripped(subj));                
  2466. X            }
  2467. X            if (strcomp("From:", s)      == 0) {
  2468. X                from[0] = '\0';
  2469. X                strcat(from, strcopy(s, 6, 79));
  2470. X                strcpy(from,  (UNSIGNED char *) stripped(from));
  2471. X            }
  2472. X            if (strcomp("Reply-To:", s)  == 0) {
  2473. X                from[0] = '\0';
  2474. X                strcat(from, strcopy(s, 10, 79));
  2475. X                strcpy(from,  (UNSIGNED char *) stripped(from));
  2476. X            }
  2477. X            if (strcomp("Keywords:", s)  == 0) {
  2478. X                strcat(keyw, strcopy(s, 10, 79));
  2479. X                strcpy(keyw,  (UNSIGNED char *) stripped(keyw));
  2480. X            }
  2481. X            if (strcomp("Summary:", s)   == 0) {
  2482. X                strcat(summ, strcopy(s, 9, 79));
  2483. X                strcpy(summ,  (UNSIGNED char *) stripped(summ));
  2484. X            }
  2485. X            if (strcomp("Message-ID:", s) == 0) {
  2486. X                strcat(msid, strcopy(s, 11, 79));
  2487. X                strcpy(msid,  (UNSIGNED char *) stripped(msid));
  2488. X            }
  2489. X            if (strcomp("Content-Type:", s) == 0) {
  2490. X                strcat(content, strcopy(s, 14, 79));
  2491. X                strcpy(content,  (UNSIGNED char *) stripped(content));
  2492. X            }
  2493. X            if (strcomp("Article-I.D.:", s) == 0) {
  2494. X                strcat(msid, strcopy(s, 13, 79));
  2495. X                strcpy(msid,  (UNSIGNED char *) stripped(msid));
  2496. X            }
  2497. X            if (strcomp("References:", s) == 0) {
  2498. X                strcat(refs, strcopy(s, 12, 79));
  2499. X                strcpy(refs,  (UNSIGNED char *) stripped(refs));
  2500. X            } 
  2501. X            if (strcomp("Followup-To:", s) == 0) {
  2502. X                strcpy(group, strcopy(s, 13, 79));
  2503. X                strcpy(group, (UNSIGNED char *) stripped(group));
  2504. X            }
  2505. X
  2506. X            /* THE FOLLOWING IS A LOUSY TRICK, EATING HEADER INFORMATION! */
  2507. X
  2508. X            while(strlen(s) == (STRING - 1)){ 
  2509. X                fgets(s, STRING, fp);
  2510. X            }
  2511. X        }
  2512. X        
  2513. X        if(strcomp("Poster", group) == 0){
  2514. X            printf(" <- %s\n", MIS02aMSG);
  2515. X            return;
  2516. X        }
  2517. X
  2518. X
  2519. X        sprintf(t, "%s/A%d", TMP, getpid());
  2520. X        ff = fopen(t, "w");
  2521. X
  2522. X        a = 0;
  2523. X        b = 0;
  2524. X        i = 0;
  2525. X        while (from[i] != '\0') {
  2526. X            if (from[i] == '(') a = i + 1;
  2527. X            if (from[i] == ')') b = i - 1;
  2528. X            i++;
  2529. X        }
  2530. X        if (a < b) {
  2531. X            strcpy(s, (UNSIGNED char *) strcopy(from, a, b));
  2532. X            strcpy(from, (UNSIGNED char *) s);
  2533. X        }
  2534. X        sprintf(ex, "In article %s,\n            %s writes:\n\n", msid, from);
  2535. X        fputs(ex, ff);
  2536. X
  2537. X        a = 0; printf(" %-4.4d", a );
  2538. X
  2539. X        while (fgets(s, STRING, fp) != NULL) {
  2540. X    
  2541. X        a++; 
  2542. X        printf("%c%c%c%c%-4.4d", BS, BS, BS, BS, a );
  2543. X
  2544. X        if((s[0] != '\n') && (i == 0)){
  2545. X
  2546. X            if(s[0] != '>')
  2547. X                fputs(">     ", ff);
  2548. X            else{
  2549. X                if(strcomp(">  ", s) == 0){
  2550. X                    s[1] = '>';
  2551. X                }
  2552. X                else fputs(">", ff);
  2553. X            }
  2554. X        }
  2555. X
  2556. X        if(s[0] != '>'){
  2557. X
  2558. X            if(i >= 65){    
  2559. X                fputs("\n>     ", ff);
  2560. X                i = 0;
  2561. X            }
  2562. X
  2563. X            endless = 0;
  2564. X
  2565. X            BETTER_TWICE:
  2566. X
  2567. X            if((strlen(s) + i) > 65){
  2568. X                j = 65 - i;
  2569. X                i = 0;
  2570. X                ok = 0;
  2571. X                while((ok == 0) && (j > 0)){
  2572. X                    if(s[j] == ' '){
  2573. X                        fputs((UNSIGNED char *) iso_line( (UNSIGNED char *) strcopy(s, 0, (j-1))), ff);
  2574. X                        fputs("\n>     ", ff);
  2575. X                        strcpy(f, (UNSIGNED char *) stripped( strcopy(s, (j+1), strlen(s))));
  2576. X                        strcpy(s, (UNSIGNED char *) f);
  2577. X                        strcat(s, (UNSIGNED char *) " ");
  2578. X                        i = strlen(s);
  2579. X                        ok++;
  2580. X                    }
  2581. X                    j--;
  2582. X                }
  2583. X                if((j == 0) && (ok == 0)){
  2584. X                    fputs("\n>     ", ff);
  2585. X                    endless++;
  2586. X                    if(endless == 1) goto BETTER_TWICE;
  2587. X                }
  2588. X            }
  2589. X            else{
  2590. X                i = 0;
  2591. X            }
  2592. X        }
  2593. X
  2594. X        fputs((UNSIGNED char *) iso_line(s), ff);
  2595. X        }
  2596. X        fclose(fp);
  2597. X        fclose(ff);
  2598. X
  2599. X
  2600. X        printf("\n\n");
  2601. X        security_ed( t );
  2602. X        if (strcomp("Re:", subj) != 0) {
  2603. X            sprintf(f, "Re: %s", stripped(subj));
  2604. X            strcpy(subj, (UNSIGNED char *) f);
  2605. X        }
  2606. X        unlink(rep);
  2607. X    }
  2608. X    else {        /* Interactive Articles */
  2609. X
  2610. X        printf("\n\n%c", CR);
  2611. X
  2612. X        if(ROT13_MODUS){
  2613. X            printf("%s ", MIS02bMSG);
  2614. X            ansi2("md", 0, 0);
  2615. X            printf("ROT13");
  2616. X            ansi2("me", 0, 0);
  2617. X            printf(" %s\n\n", MIS02cMSG);
  2618. X        }
  2619. X
  2620. X        ansi2("mr", 0, 0);
  2621. X        printf("%s", MIS03_MSG);
  2622. X        ansi2("me", 0, 0);
  2623. X        printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
  2624. X        ansi2("mr", 0, 0);
  2625. X        printf("%s", MIS04_MSG);
  2626. X        ansi2("me", 0, 0);
  2627. X        printf(" %s\n%c", NG, CR);
  2628. X        ansi2("mr", 0, 0);
  2629. X        printf("%s", MIS05_MSG);
  2630. X        ansi2("me", 0, 0);
  2631. X        printf(" ");
  2632. X        strcpy(subj, (UNSIGNED char *) getline(57, -11, '.', ""));
  2633. X        if(subj[0] == '\0'){
  2634. X            strcpy(subj, (UNSIGNED char *) "Yet another article ...");
  2635. X            printf("%s                                  ", subj);
  2636. X        }    
  2637. X
  2638. X        printf("\n");
  2639. X        ansi2("mr", 0, 0);
  2640. X        printf("%s", MIS06_MSG);
  2641. X        ansi2("me", 0, 0);
  2642. X        printf(" ");
  2643. X        strcpy(keyw, (UNSIGNED char *) getline(57, -11, '.', ""));
  2644. X        printf("\n");
  2645. X        ansi2("mr", 0, 0);
  2646. X        printf("%s", MIS07_MSG);
  2647. X        ansi2("me", 0, 0);
  2648. X        printf(" ");
  2649. X        strcpy(summ, (UNSIGNED char *) getline(57, -11, '.', ""));
  2650. X
  2651. X        printf("\n\n");
  2652. X        ansi2("mr", 0, 0);
  2653. X        printf("[%s] %s ? > ", NG, MIS08_MSG);
  2654. X        ansi2("me", 0, 0);
  2655. X        printf("%c%c", MIS09_MSG, BS);
  2656. X
  2657. X        do {
  2658. X            c = getint();
  2659. X            if (c >= 97) c -= 32;
  2660. X            if (c == '?') {
  2661. X                clearline();
  2662. X                ansi2("mr", 0, 0);
  2663. X                printf("%c%s > ", CR, MIS12_MSG);
  2664. X                ansi2("me", 0, 0);
  2665. X            }
  2666. X            if (c == ENTER) c = MIS09_MSG;
  2667. X            if ((c != MIS09_MSG) && (c != MIS10_MSG) && (c != MIS11_MSG)) c = 0;
  2668. X        } while (c == 0);
  2669. X
  2670. X        printf("%c", c);
  2671. X
  2672. X        if (c == MIS11_MSG) {    /* REJECT / VERWERFEN */
  2673. X            printf("\n");
  2674. X            unlink(t);
  2675. X            return;
  2676. X        }
  2677. X        if (c == MIS10_MSG) {    /* UPLOAD */
  2678. X            printf("%c                                                                       ", CR);
  2679. X            ansi2("mr", 0, 0);
  2680. X            printf("%c%s, ? > ", CR, MIS13_MSG);
  2681. X            ansi2("me", 0, 0);
  2682. X
  2683. X            do {
  2684. X                protokoll = getint();
  2685. X                if (protokoll >= 97) protokoll -= 32;
  2686. X                if (protokoll == '?') {
  2687. X                    clearline();
  2688. X                    ansi2("mr", 0, 0);
  2689. X                    printf("%c%s > ", CR, MIS14_MSG);
  2690. X                    ansi2("me", 0, 0); 
  2691. X                }
  2692. X                if ((protokoll != MIS15_MSG) && (protokoll != MIS15_MSG) &&
  2693. X                    (protokoll != MIS18_MSG) && (protokoll != MIS17_MSG ))
  2694. X                    protokoll = 0;
  2695. X            } while (protokoll == 0);
  2696. X
  2697. X            printf("%c", protokoll);
  2698. X
  2699. X        }
  2700. X        sprintf(tmp, "%s/A%d", TMP, getpid());
  2701. X        sprintf(pubdir, "%s/dir%d", TMP, getpid());
  2702. X        strcpy(cmdl, (UNSIGNED char *) tmp);
  2703. X
  2704. X        if (c == MIS09_MSG) {    /* SEND / SCHREIBEN */
  2705. X            strcpy(cmdl, (UNSIGNED char *) tmp);
  2706. X            security_ed( cmdl );
  2707. X            protokoll = '*';
  2708. X        }
  2709. X        else {    /* UPLOAD */
  2710. X
  2711. X            noctrlx();
  2712. X
  2713. X            printf("\n\n");
  2714. X            ansi2("md", 0, 0);
  2715. X            printf("%s", MIS19_MSG);
  2716. X            ansi2("me", 0, 0);
  2717. X
  2718. X            switch (protokoll) {
  2719. X                case MIS15_MSG:
  2720. X                    fp = fopen(tmp, "w");
  2721. X                    if (fp == NULL) {
  2722. X                        nerror("misc.c", 310, "schreiben", "Can't write to", tmp);
  2723. X                    }
  2724. X                    c = 0;
  2725. X                    lf = CR;
  2726. X                    fputc(LF, fp);
  2727. X
  2728. X                    /*
  2729. X                    while ((c != CTRL_X) && (c != CTRL_D)) {
  2730. X                    */
  2731. X                    while ((c != CTRL_E) && (c != CTRL_D)) {
  2732. X                        c = getint();
  2733. X                        if ((c == CR) && (lf == CR))
  2734. X                            fputc(LF, fp);
  2735. X                        if (c == CR) lf = CR;
  2736. X                        if (c == LF) lf = LF;
  2737. X                        /*
  2738. X                        if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
  2739. X                            fputc(c, fp);
  2740. X                        }
  2741. X                        */
  2742. X                        if ((c != CTRL_E) && (c != CTRL_D) && (c != CR)) {
  2743. X                            fputc(c, fp);
  2744. X                        }
  2745. X                    }
  2746. X                    fclose(fp);
  2747. X                    break;
  2748. X                case MIS16_MSG:
  2749. X                    printf("\n");
  2750. X                    sprintf(s, "exec %s -c TimeTravelAgency 2> /dev/null", RX);
  2751. X                    break;
  2752. X                case MIS17_MSG:
  2753. X                    printf("\n");
  2754. X                    sprintf(s, "exec %s 2> /dev/null", RB);
  2755. X                    break;
  2756. X                case MIS18_MSG:
  2757. X                    printf("\n");
  2758. X                    sprintf(s, "exec %s 2> /dev/null", RZ);
  2759. X                    break;
  2760. X            }
  2761. X            if (protokoll != MIS15_MSG){
  2762. X                mkdir( pubdir, 0777 );
  2763. X                chdir( pubdir );
  2764. X
  2765. X                time(&ts);
  2766. X                system( s );
  2767. X                time(&tn); tn = tn - ts;
  2768. X                tn -= 10;  /* 10 = "Toleranz" */
  2769. X    
  2770. X                chdir( HOME );
  2771. X                sprintf(s, "mv %s/* %s", pubdir, tmp);
  2772. X                system( s );
  2773. X                sprintf(s, "rm -r %s", pubdir);
  2774. X                system( s );
  2775. X            }
  2776. X            sync();
  2777. X            ctrlx();
  2778. X            stat(tmp, &fst);
  2779. X            if (fst.st_size < 3L) {
  2780. X                printf("\n\n%s\n", MIS20_MSG);
  2781. X                control(MIS21_MSG, 3);
  2782. X                unlink(tmp);
  2783. X                return;
  2784. X            }
  2785. X            if (prf(tmp) == 1) {
  2786. X                if (strcomp(PDNG, NG) == 0) {
  2787. X                    USER.upratio += ((long) fst.st_size / 1024);
  2788. X                }
  2789. X                BINFILE++;
  2790. X                sprintf(s, MIS22_MSG);
  2791. X            }
  2792. X            else{
  2793. X                mkix(tmp);
  2794. X                sprintf(s, MIS23_MSG);
  2795. X            }
  2796. X            ansi2( "md", 0, 0 );
  2797. X            printf("\n\n%ld %s %s %s.\n", fst.st_size, MIS24_MSG, s, MIS25_MSG);
  2798. X            ansi2( "me", 0, 0 );
  2799. X            if(tn < 1) tn = 1L;
  2800. X            printf("%s %d cps (ca. %d bps).", MIS26_MSG,
  2801. X                (fst.st_size / tn), ((fst.st_size / tn) * 11));                
  2802. X        }
  2803. X    }
  2804. X
  2805. X    sprintf(iam, "%s <%s@%s>", USER.name, username, UUCPID);
  2806. X    /*    
  2807. X    sprintf(reply, "%s@%s (%s)", username, UUCPID, USER.name);
  2808. X    */
  2809. X    strcpy(newsgroups, group);
  2810. X    if (USER.level < WRITE_EX_LEV) {
  2811. X        strcpy(distribution, "local");
  2812. X    }
  2813. X    else {
  2814. X        /*
  2815. X        strcpy(ng, NG);
  2816. X        i = 0;
  2817. X        while ((ng[i] != '.') && (ng[i] != '\0')) i++;
  2818. X        ng[i] = '\0';
  2819. X        strcpy(distribution, ng);
  2820. X        */
  2821. X        strcpy(distribution, "world");
  2822. X    }
  2823. X    if(refs[0] != '\0') strcat(refs, " ");
  2824. X    strcat(refs, msid);    
  2825. X    followup[0] = '\0';
  2826. X    sender[0] = '\0';
  2827. X    ctrl[0] = '\0';
  2828. X    expires[0] = '\0';
  2829. X    approved[0] = '\0';
  2830. X    app = 0;
  2831. X    content[0] = '\0';    
  2832. X
  2833. X#if defined(_MULTIMEDIA) && defined(_UMLAUT)
  2834. X    strcpy(content, (UNSIGNED char *) "text/plain; charset=iso-8859-1");
  2835. X#endif
  2836. X
  2837. X    ONCE_MORE:
  2838. X
  2839. X    printf("\n\n");
  2840. X    ansi2("mr", 0, 0);
  2841. X    if(BINFILE == 0){
  2842. X        printf("[%s] %s, ? > ", NG, MIS27_MSG);
  2843. X    }
  2844. X    else{
  2845. X        printf("[%s] %s, ? > ", NG, MIS28_MSG);
  2846. X    }
  2847. X    ansi2("me", 0, 0);
  2848. X    printf("%c%c", MIS29_MSG, BS);
  2849. X
  2850. X    do {
  2851. X        c = getint();
  2852. X        if (c >= 97) c -= 32;
  2853. X        if (c == '?') {
  2854. X            clearline();
  2855. X            ansi2("mr", 0, 0);
  2856. X            if(BINFILE == 0){
  2857. X                printf("%c%s > ", CR, MIS32_MSG);
  2858. X            }
  2859. X            else{
  2860. X                printf("%c%s > ", CR, MIS33_MSG);
  2861. X            }
  2862. X            ansi2("me", 0, 0);
  2863. X        }
  2864. X        if (c == ENTER) c = MIS29_MSG;
  2865. X        if ((c != MIS29_MSG) && (c != MIS30_MSG) && (c != MIS31_MSG) && (c != MIS31aMSG)) c = 0;
  2866. X    } while (c == 0);
  2867. X
  2868. X    printf("%c", c);
  2869. X    if (c == MIS30_MSG) {    /* REJECT / VERWERFEN */
  2870. X        unlink(f);
  2871. X        unlink(s);
  2872. X        unlink(t);
  2873. X        unlink(tmp); /* ??? */
  2874. X        unlink(rep);
  2875. X        printf("\n");
  2876. X        return;
  2877. X    }
  2878. X    if ((c == MIS31_MSG) && (BINFILE == 0)) {    /* REEDIT / WEITERSCHREIBEN */
  2879. X        security_ed( cmdl );
  2880. X        goto ONCE_MORE;
  2881. X    }
  2882. X    if (c == MIS31aMSG) { /* HEADER */
  2883. X        headline( MIS38aMSG );
  2884. X        printf("\n");
  2885. X        time(&tdummy);
  2886. X
  2887. X        ansi2( "md", 0, 0 );
  2888. X        printf("From: ");
  2889. X        ansi2( "me", 0, 0 );
  2890. X        if(USER.level > ADMIN_LEV){
  2891. X            strcpy(s, (UNSIGNED char *) getline(80, -1001, 32, iam));
  2892. X            if(strcomp(s, iam) != 0) app++;            
  2893. X            if(s[0] != '\0') strcpy(iam, s);
  2894. X            printf("\n");
  2895. X        }
  2896. X        else printf("%s\n", iam);
  2897. X
  2898. X        ansi2( "md", 0, 0 );
  2899. X        printf("Reply-To: ");
  2900. X        ansi2( "me", 0, 0 );
  2901. X        if(USER.level > GUEST_LEV){
  2902. X            strcpy(reply, (UNSIGNED char *) getline(80, -1001, 32, reply));
  2903. X            printf("\n");
  2904. X        }
  2905. X        else printf("%s\n", reply);
  2906. X
  2907. X        ansi2( "md", 0, 0 );
  2908. X        printf("Sender: ");
  2909. X        ansi2( "me", 0, 0 );
  2910. X        if(USER.level >= ADMIN_LEV){
  2911. X            strcpy(sender, (UNSIGNED char *) getline(80, -1001, 32, sender));
  2912. X            printf("\n");
  2913. X        }
  2914. X        else printf("%s\n", sender);    
  2915. X        
  2916. X        ansi2( "md", 0, 0 );
  2917. X        printf("Control: ");
  2918. X        ansi2( "me", 0, 0 );
  2919. X        if(USER.level >= ADMIN_LEV){
  2920. X            strcpy(ctrl, (UNSIGNED char *) getline(80, -1001, 32, ctrl));
  2921. X            printf("\n");
  2922. X        }
  2923. X        else printf("%s\n", ctrl);    
  2924. X        
  2925. X        ansi2( "md", 0, 0 );
  2926. X        printf("Approved: ");
  2927. X        ansi2( "me", 0, 0 );
  2928. X        if(app != 0) sprintf(approved, "%s <%s@%s>", USER.name, username, UUCPID);
  2929. X        if(USER.level >= EXE_LEV){
  2930. X            strcpy(approved, (UNSIGNED char *) getline(80, -1001, 32, approved));
  2931. X            printf("\n");
  2932. X        }
  2933. X        else printf("%s\n", approved);    
  2934. X    
  2935. X        ansi2( "md", 0, 0 );
  2936. X        printf("Newsgroups: ");
  2937. X        ansi2( "me", 0, 0 );
  2938. X        if(USER.level >= WRITE_EX_LEV){
  2939. X            strcpy(newsgroups, (UNSIGNED char *) getline(80, -1001, 32, newsgroups));
  2940. X            printf("\n");
  2941. X            i = 0;
  2942. X            while(newsgroups[i] != '\0'){
  2943. X                if(newsgroups[i] == ' '){
  2944. X                    strcpy(s, (UNSIGNED char *) newsgroups);
  2945. X                    newsgroups[i] = '\0';
  2946. X                    strcat(newsgroups, (UNSIGNED char *) strcopy(s, (i+1), 80));
  2947. X                    i--;
  2948. X                }
  2949. X                i++;
  2950. X            }            
  2951. X        }
  2952. X        else printf("%s\n", newsgroups);    
  2953. X        
  2954. X        ansi2( "md", 0, 0 );
  2955. X        printf("Distribution: ");
  2956. X        ansi2( "me", 0, 0 );
  2957. X        if(USER.level >= WRITE_INTERNAT){
  2958. X            strcpy(distribution, (UNSIGNED char *) getline(80, -1001, 32, distribution));
  2959. X            printf("\n");
  2960. X        }
  2961. X        else printf("%s\n", distribution);    
  2962. X        
  2963. X        ansi2( "md", 0, 0 );
  2964. X        printf("Followup-To: ");
  2965. X        ansi2( "me", 0, 0 );
  2966. X        if(USER.level >= WRITE_EX_LEV){
  2967. X            strcpy(followup, (UNSIGNED char *) getline(80, -1001, 32, followup));
  2968. X            printf("\n");
  2969. X        }
  2970. X        else printf("%s\n", followup);    
  2971. X        
  2972. X        ansi2( "md", 0, 0 );
  2973. X        printf("Subject: ");
  2974. X        ansi2( "me", 0, 0 );
  2975. X        strcpy(subj, (UNSIGNED char *) getline(80, -1001, 32, subj));
  2976. X
  2977. X        ansi2( "md", 0, 0 );
  2978. X        printf("\nKeywords: ");
  2979. X        ansi2( "me", 0, 0 );
  2980. X        strcpy(keyw, (UNSIGNED char *) getline(80, -1001, 32, keyw));
  2981. X            
  2982. X        ansi2( "md", 0, 0 );
  2983. X        printf("\nSummary: ");
  2984. X        ansi2( "me", 0, 0 );
  2985. X        strcpy(summ, (UNSIGNED char *) getline(80, -1001, 32, summ));
  2986. X
  2987. X#ifdef _MULTIMEDIA
  2988. X
  2989. X        if(USER.level >= WRITE_INTERNAT){
  2990. X            if(content[0] == '\0')
  2991. X                strcpy(content, (UNSIGNED char *) "text/plain; charset=us-ascii");
  2992. X            ansi2( "md", 0, 0 ); 
  2993. X            printf("\nContent-Type: ");
  2994. X            ansi2( "me", 0, 0 );
  2995. X            strcpy(content, (UNSIGNED char *) getline(80, -1001, 32, content));
  2996. X        }
  2997. X#endif
  2998. X
  2999. X        ansi2( "md", 0, 0 );
  3000. X        printf("\nX-News-Reader: ");
  3001. X        ansi2( "me", 0, 0 );
  3002. X            printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  3003. X
  3004. X        ansi2( "md", 0, 0 );
  3005. X        printf("References: ");
  3006. X        ansi2( "me", 0, 0 );
  3007. X        printf("%s\n", refs);
  3008. X        
  3009. X        ansi2( "md", 0, 0 );
  3010. X        printf("Message-ID: ");
  3011. X        ansi2( "me", 0, 0 );
  3012. X        printf("<%x.%d@%s>\n", tdummy, USER.id, UUCPID);
  3013. X        
  3014. X        ansi2( "md", 0, 0 );
  3015. X        printf("Expires: ");
  3016. X        ansi2( "me", 0, 0 );
  3017. X        if(USER.level >= WRITE_INTERNAT){
  3018. X            strcpy(expires, (UNSIGNED char *) getline(80, -1001, 32, expires));
  3019. X            printf("\n");
  3020. X        }
  3021. X        else printf("%s\n", expires);    
  3022. X
  3023. X        goto ONCE_MORE;        
  3024. X    }
  3025. X
  3026. X    ansi2( "md", 0, 0 );
  3027. X    printf("\n\n%s\n", MIS34_MSG);
  3028. X    ansi2( "me", 0, 0 );
  3029. X
  3030. X    sprintf(f, "%s/A%d", TMP, getpid());
  3031. X    sprintf(t, "%s/B%d", TMP, getpid());
  3032. X
  3033. X    fp = fopen(f, "r");
  3034. X    if (fp == NULL) {
  3035. X        printf("\n");
  3036. X        ansi2("md", 0, 0);
  3037. X        printf("%s ...\n", MIS35_MSG);
  3038. X        ansi2("me", 0, 0);
  3039. X        control(MIS36_MSG, 3);
  3040. X        unlink(rep);
  3041. X        return;
  3042. X    }
  3043. X
  3044. X#ifdef _CNEWS
  3045. X    lines = 0;
  3046. X    while(fgets(s, STRING, fp) != 0) lines++;
  3047. X    rewind(fp);
  3048. X#endif
  3049. X
  3050. X    ff = fopen(t, "w");
  3051. X
  3052. X    time(&tdummy);
  3053. X
  3054. X    fprintf(ff, "From: %s\n", iam);
  3055. X    if(reply[0] != '\0')
  3056. X        fprintf(ff, "Reply-To: %s\n", reply);
  3057. X    if(sender[0] != '\0')
  3058. X        fprintf(ff, "Sender: %s\n", sender);
  3059. X    if(approved[0] != '\0')
  3060. X        fprintf(ff, "Approved: %s\n", approved);
  3061. X    if(newsgroups[0] != '\0')
  3062. X        fprintf(ff, "Newsgroups: %s\n", newsgroups);
  3063. X    if(distribution[0] != '\0')
  3064. X        fprintf(ff, "Distribution: %s\n", distribution);
  3065. X    if(ctrl[0] != '\0')
  3066. X        fprintf(ff, "Control: %s\n", ctrl);
  3067. X    if(followup[0] != '\0')
  3068. X        fprintf(ff, "Followup-To: %s\n", followup);
  3069. X    if(subj[0] != '\0')
  3070. X        fprintf(ff, "Subject: %s\n", subj);
  3071. X    if(keyw[0] != '\0')
  3072. X        fprintf(ff, "Keywords: %s\n", keyw);
  3073. X    if(summ[0] != '\0')
  3074. X        fprintf(ff, "Summary: %s\n", summ);
  3075. X    if(content[0] != '\0'){
  3076. X        fprintf(ff, "MIME-Version: %s\n", MIME_VERSION);        
  3077. X        fprintf(ff, "Content-Type: %s\n", content);
  3078. X#ifdef _UMLAUT
  3079. X        fprintf(ff, "Content-Transfer-Encoding: 8bit\n");
  3080. X#endif
  3081. X    }
  3082. X    fprintf(ff, "X-News-Reader: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  3083. X    fprintf(ff, "Message-ID: <%x.%d@%s>\n", tdummy, USER.id, UUCPID);
  3084. X    if(expires[0] != '\0')
  3085. X        fprintf(ff, "Expires: %s\n", expires);
  3086. X    if(refs[0] != '\0')
  3087. X        fprintf(ff, "References: %s\n", refs);    
  3088. X#ifdef _CNEWS
  3089. X    fprintf(ff, "Lines: %d\n", lines);    
  3090. X#endif
  3091. X    fputs("\n", ff);    
  3092. X    
  3093. X    if (BINFILE == 0) {
  3094. X        UMLAUT_MODUS = 1;
  3095. X        i = 0;
  3096. X        while (fgets(s, STRING, fp) != 0) {
  3097. X            if(ROT13_MODUS) strcpy(s, (UNSIGNED char *) rot13( s ));
  3098. X            fputs((UNSIGNED char *) iso_line(s), ff);
  3099. X            i++;
  3100. X        }
  3101. X    }
  3102. X    else {
  3103. X        time(&tdummy);
  3104. X        fputs("BINFILE\n", ff);
  3105. X        sprintf(s, "%s/PD.%d", BRETT, tdummy);
  3106. X        fputs(s, ff);
  3107. X        sprintf(f, "cp %s %s &", tmp, s);
  3108. X        system(f);
  3109. X        sprintf(s, "\n/public/pd/%s\n", subj);
  3110. X        fputs(s, ff);
  3111. X        fl = fopen( PDSCRIPT, "a" );
  3112. X        fprintf(fl, "mv %s/PD.%d /public/pd/%s\n", BRETT, tdummy, subj);
  3113. X        fclose(fl);
  3114. X    }
  3115. X    fclose(fp);
  3116. X    unlink(f);
  3117. X
  3118. X    unlink(rep);
  3119. X
  3120. X    if ((USER.level > WRITE_IN_LEV) && (BINFILE == 0)) {
  3121. X        sprintf(s, "%s/usr/%c/%d/.signature", HOME, USER.name[0], USER.id);
  3122. X        fp = fopen(s, "r");
  3123. X        if (fp != NULL) {
  3124. X            while (fgets(s, STRING, fp) != 0) {
  3125. X                if(ROT13_MODUS) strcpy(s, (UNSIGNED char *) rot13( s ));
  3126. X                fputs((UNSIGNED char *) iso_line(s), ff);
  3127. X            }
  3128. X            fclose(fp);
  3129. X        }
  3130. X    }
  3131. X    fclose(ff);
  3132. X
  3133. X    UMLAUT_MODUS = USER.schluessel[2];
  3134. X
  3135. X    sprintf(ex, "/bin/sh ./etc/inews.sh %s %s", NG, t);
  3136. X    system(ex);
  3137. X
  3138. X    unlink(t);
  3139. X
  3140. X    sprintf(s, "%s \"%s\" %s", MIS37_MSG, NG, MIS38_MSG);
  3141. X    control(s, 3);
  3142. X
  3143. X    
  3144. X    if(BINFILE != 0){
  3145. X        maybe_locked(NGROUPS, "r");
  3146. X        fp = fopen(NGROUPS, "r");
  3147. X        if (fp == NULL) {
  3148. X            nerror("misc.c", 895, "schreiben", "Can't read", NGROUPS);
  3149. X        }
  3150. X
  3151. X        ok = 0;
  3152. X
  3153. X            while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &b, f) > 0)) {
  3154. X            if(strcomp(NG, s) == 0){
  3155. X                i = a;
  3156. X                ok = 1;
  3157. X            }
  3158. X         }
  3159. X        fclose(fp);
  3160. X
  3161. X        fl = fopen( PDSCRIPT, "a" );
  3162. X        fprintf(fl, "%s %s/%d\n", FAVORITE_EDITOR, BRETT, i); 
  3163. X        fprintf(fl, "#%s   %s\n\n", NG, USER.name);
  3164. X        fclose(fl);
  3165. X    }
  3166. X
  3167. X    printf("%s", MIS39_MSG);
  3168. X
  3169. X#ifndef _SYS7
  3170. X    sleep(30);    /* Scheinbar laeuft INEWS bei SYSV im Hintergrund */
  3171. X#endif
  3172. X
  3173. X    sprintf(s, "%s %s", MB_DAEMON, group);
  3174. X    system(s);
  3175. X    unlink(tmp);
  3176. X    printf("\n");
  3177. X  }
  3178. X  else {
  3179. X    ansi2("md", 0, 0);
  3180. X    printf(" %s\n\n", MIS40_MSG);
  3181. X    ansi2("me", 0, 0);
  3182. X  }
  3183. X  umask(0007);
  3184. X
  3185. X}
  3186. X
  3187. X
  3188. X
  3189. X
  3190. X
  3191. X
  3192. X/* #PR - Finds out whether a file is a text or binary.
  3193. X
  3194. X   [arg] is the name/path of the file to check.   
  3195. X
  3196. X   This function returns 0 if the file includes a text or an 1 if
  3197. X   its binary. */
  3198. X
  3199. Xint prf(arg)
  3200. XUNSIGNED char arg[];
  3201. X{
  3202. X  FILE *fp;
  3203. X  UNSIGNED char ex[LONGSTRING];
  3204. X  int i, a;
  3205. X
  3206. X#ifdef _PROFILE
  3207. X  profile( "prf()" );
  3208. X#endif
  3209. X
  3210. X  fp = fopen(arg, "r");
  3211. X  if (fp == NULL) return -1;
  3212. X  while ((fgets(ex, LONGSTRING, fp) != NULL) && (strlen(ex) < 30));
  3213. X  fclose(fp);
  3214. X
  3215. X  i = 0;
  3216. X  a = 0;
  3217. X  while (ex[i] != '\0') {
  3218. X    if ((ex[i] < 32) || (ex[i] > 127)) {
  3219. X        if ((ex[i] != LF) && (ex[i] != CR)) a++;
  3220. X    }
  3221. X    i++;
  3222. X  }
  3223. X  if (a > 3) return 1;        /* BINFILE */
  3224. X
  3225. X  return 0;            /* TEXTFILE */
  3226. X}
  3227. X
  3228. X
  3229. X
  3230. X
  3231. X
  3232. X
  3233. X/* #PF - Checks if an article includes the key BINFILE. If so, the 
  3234. X   function "pd()" is called to handle it.
  3235. X
  3236. X   [arg] gives the number (NOT path) of an article.
  3237. X
  3238. X   This function returns 0 if the article includes a text and 1 if it
  3239. X   is a binary file. */
  3240. X
  3241. Xint pruefe(arg)
  3242. XUNSIGNED char arg[];
  3243. X{
  3244. X  FILE *fp;
  3245. X  UNSIGNED char ex[LONGSTRING];
  3246. X  UNSIGNED char s[STRING];
  3247. X  UNSIGNED char entry[STRING];
  3248. X  UNSIGNED char keywds[STRING];
  3249. X
  3250. X#ifdef _PROFILE
  3251. X  profile( "pruefe()" );
  3252. X#endif
  3253. X
  3254. X  if ((arg[0] == '\0') || (arg[0] == '*')) return -1;
  3255. X
  3256. X  if (strcomp(BRETT, "PM") != 0) {
  3257. X    sprintf(entry, "%s/%s", BRETT, arg);
  3258. X  }
  3259. X  else {
  3260. X    sprintf(entry, "%s/usr/%c/%d/%s", HOME, USER.name[0], USER.id, arg);
  3261. X  }
  3262. X
  3263. X  keywds[0] = '\0';
  3264. X
  3265. X  fp = fopen(entry, "r");
  3266. X  if (fp == NULL) return -1;
  3267. X
  3268. X  while ((fgets(ex, LONGSTRING, fp) != NULL) && (ex[0] > 32)){
  3269. X    if(strcomp("Keywords: ", ex) == 0){
  3270. X        ex[80] = '\0';
  3271. X        strcpy(keywds, strcopy(ex, 10, 80));
  3272. X    }
  3273. X  }
  3274. X
  3275. X  while ((fgets(ex, LONGSTRING, fp) != NULL) && (ex[0] < 32));
  3276. X
  3277. X  if (strcomp("Content-", ex) == 0) 
  3278. X          fgets(ex, LONGSTRING, fp);
  3279. X
  3280. X  if (strcomp("BINFILE", ex) == 0) {
  3281. X    fgets(s, STRING, fp);
  3282. X    fclose(fp);
  3283. X    pd(s, keywds);
  3284. X    return 1;
  3285. X  }
  3286. X  fclose(fp);
  3287. X
  3288. X  return 0;
  3289. X}
  3290. X
  3291. X
  3292. X
  3293. X
  3294. X
  3295. X
  3296. END_OF_FILE
  3297.   if test 24307 -ne `wc -c <'mbox/src/misc.c'`; then
  3298.     echo shar: \"'mbox/src/misc.c'\" unpacked with wrong size!
  3299.   fi
  3300.   # end of 'mbox/src/misc.c'
  3301. fi
  3302. if test -f 'mbox/src/weiterl.c' -a "${1}" != "-c" ; then 
  3303.   echo shar: Will not clobber existing file \"'mbox/src/weiterl.c'\"
  3304. else
  3305.   echo shar: Extracting \"'mbox/src/weiterl.c'\" \(11765 characters\)
  3306.   sed "s/^X//" >'mbox/src/weiterl.c' <<'END_OF_FILE'
  3307. X/* ix/MBox (weiterl.c) by Volker Schuermann, 04.12.1993
  3308. X
  3309. X   This C source code contains the following functions:
  3310. X
  3311. X   #WL weiterleiten()    forward mails or articles
  3312. X   #CC carboncopy()      send copies to other users
  3313. X   #BO boerse()          stock exchange ("de.etc.finanz")
  3314. X
  3315. X   Contact <volkers@unnet.wupper.de> for help! */
  3316. X
  3317. X
  3318. X
  3319. X
  3320. X
  3321. X
  3322. X#include <stdio.h>
  3323. X#include <sys/types.h>
  3324. X#include <sys/stat.h>
  3325. X#include <dirent.h>
  3326. X
  3327. X#include "mbox.h"
  3328. X
  3329. X
  3330. X
  3331. X
  3332. X/* #WL - Forward mails.
  3333. X
  3334. X   [arg]    ->  ''             = show which mail may be forwarded
  3335. X            ->  'user'         = forward the last mail to 'user'
  3336. X            ->  'article user' = forward 'article' to 'user' */
  3337. X
  3338. Xvoid weiterleiten( arg )
  3339. XUNSIGNED char arg[];
  3340. X{
  3341. X  FILE *fp;
  3342. X  UNSIGNED char s[STRING];
  3343. X  UNSIGNED char t[STRING];
  3344. X  UNSIGNED char subject[STRING];
  3345. X  int i, a, num;
  3346. X  UNSIGNED char empf[STRING];
  3347. X
  3348. X  subject[0] = '\0';
  3349. X
  3350. X  sprintf(s, "%s/usr/%c/%d/.lastsubject", HOME, USER.name[0], USER.id);
  3351. X  fp = fopen( s, "r" );
  3352. X  if(fp != NULL){
  3353. X    fgets(subject, STRING, fp);
  3354. X    fclose(fp);
  3355. X  }
  3356. X
  3357. X  if((subject[0] == '\0') && ((arg[0] > 64) || (arg[0] == '?'))){
  3358. X    ansi2("md", 0, 0);
  3359. X    printf(" %s\n", WEI01_MSG);
  3360. X    ansi2("me", 0, 0);
  3361. X    return;
  3362. X  }
  3363. X
  3364. X  if(arg[0] == '\0'){
  3365. X    printf("\n\n%s\n\n", WEI02_MSG);
  3366. X    ansi2("md", 0, 0);
  3367. X    printf("%s %s\n\n", WEI03_MSG, subject);
  3368. X    ansi2("me", 0, 0);
  3369. X    return;
  3370. X  }
  3371. X
  3372. X  num = 0;
  3373. X
  3374. X  if(arg[0] < 65){
  3375. X    i = 0;
  3376. X    while((arg[i] > 32) && (arg[i] != '\0')) i++;
  3377. X    strcpy(s, (UNSIGNED char *) strcopy(arg, 0, (i-1)));
  3378. X    num = atoi(s);
  3379. X    strcpy(empf, (UNSIGNED char *) strcopy(arg, (i+1), strlen(arg)));
  3380. X    strcat(empf, "$");
  3381. X  }
  3382. X  else{
  3383. X    sprintf(empf, "%s$", arg);
  3384. X  }  
  3385. X
  3386. X  if(num != 0){
  3387. X    if(strcomp(BRETT, "PM") != 0){
  3388. X        sprintf(t, "%s/%d", BRETT, num);
  3389. X        sprintf(s, "cp %s/%d %s/usr/%c/%d/.lastletter", BRETT, num, HOME, USER.name[0], USER.id);
  3390. X    }
  3391. X    else{
  3392. X        sprintf(t, "%s/usr/%c/%d/%d", HOME, USER.name[0], USER.id, num);
  3393. X        sprintf(s, "cp %s/usr/%c/%d/%d %s/usr/%c/%d/.lastletter", HOME, USER.name[0], USER.id, num, HOME, USER.name[0], USER.id);
  3394. X    }
  3395. X    fp = fopen( t, "r" );
  3396. X    if(fp == NULL){
  3397. X        ansi2("md", 0, 0);
  3398. X        printf(" %s\n", WEI04_MSG);
  3399. X        ansi2("me", 0, 0);
  3400. X    return;
  3401. X    }
  3402. X    fclose(fp);
  3403. X    system(s);
  3404. X    sprintf(s, "%s/usr/%c/%d/.lastletter", HOME, USER.name[0], USER.id);
  3405. X
  3406. X    sprintf(s, "%s/usr/%c/%d/.lastsubject", HOME, USER.name[0], USER.id);
  3407. X    fp = fopen( s, "w" );
  3408. X    if(fp == NULL){
  3409. X        nerror("weiterl.c", 76, "weiterleiten", "Can't write to", s);
  3410. X    }
  3411. X    fprintf(fp, "%d <%s>", num, NG);
  3412. X    fclose(fp);
  3413. X  }
  3414. X
  3415. X  brief(empf);
  3416. X}
  3417. X
  3418. X
  3419. X
  3420. X
  3421. X/* #CC - Send copies of mails to various users.
  3422. X
  3423. X   [cc]   ->  name of users (shown in "Cc:" header line)
  3424. X   [bcc]  ->  name of users (shown in "Bcc:" header line, not shown to
  3425. X              users) */
  3426. X
  3427. Xvoid carboncopy( cc, bcc )
  3428. XUNSIGNED char cc[], bcc[];
  3429. X{
  3430. X  UNSIGNED char ex[LONGSTRING];
  3431. X  UNSIGNED char ef[LONGSTRING];
  3432. X  UNSIGNED char s[STRING];
  3433. X
  3434. X  int a = 0, i = 0;
  3435. X  int ok = 0;
  3436. X
  3437. X  printf("\n");
  3438. X
  3439. X  sprintf(ex, "%s,%s ", (UNSIGNED char *) stripped(cc), bcc);
  3440. X
  3441. X  if(ex[0] == '\0') return;
  3442. X
  3443. X  while(ok == 0){
  3444. X    while((ex[i] != ',') && (ex[i] != '\0')) i++;
  3445. X
  3446. X    if(ex[i] == '\0') ok++;
  3447. X
  3448. X    strcpy(ef, (UNSIGNED char *) bigcopy(ex, a, (i-1)));
  3449. X    strcpy(s, (UNSIGNED char *) stripped(ef));
  3450. X
  3451. X    if((strlen(s) > 1) && (s[0] != '(')){
  3452. X        weiterleiten( s );
  3453. X    }
  3454. X    a = i + 1;
  3455. X    i++;
  3456. X  }
  3457. X  
  3458. X}
  3459. X
  3460. X
  3461. X
  3462. X
  3463. X/* #BO - Handle stock exchange database.
  3464. X
  3465. X   This needs informations from newsgroup "de.etc.finanz".
  3466. X
  3467. X   NOTE: This stuff is still under construction!  */
  3468. X
  3469. X#define MAX_BOERSE    40
  3470. X#define MAX_KURSE    40
  3471. X
  3472. Xvoid boerse( arg )
  3473. XUNSIGNED char arg[];
  3474. X{
  3475. X  UNSIGNED char s[STRING];
  3476. X  UNSIGNED char t[STRING];
  3477. X  UNSIGNED char u[STRING];
  3478. X
  3479. X  UNSIGNED char d[MAX_BOERSE][STRING];
  3480. X  UNSIGNED char l[MAX_KURSE][STRING];
  3481. X  int dptr;
  3482. X
  3483. X  FILE *fp;
  3484. X  FILE *ff;
  3485. X
  3486. X  int c, i, j, a, b;
  3487. X
  3488. X  long t1, t2;
  3489. X  long o1, o2;
  3490. X  long p1;
  3491. X  long x1, x2;
  3492. X  long q;
  3493. X
  3494. X  DIR *dp;
  3495. X  struct dirent *actdir;
  3496. X
  3497. X
  3498. X
  3499. X  if(USER.terminal == 4){
  3500. X    printf(" <- %s\n", BAU04_MSG );
  3501. X    return;
  3502. X  }
  3503. X
  3504. X
  3505. X  sprintf(s, " Stock Exchange                      [Support: %s] ", STOCK_AUTOR);
  3506. X  headline( s );
  3507. X
  3508. X  fp = fopen( STOCK_INDEX, "r" );
  3509. X  if(fp != NULL){
  3510. X
  3511. X    ansi2( "cm", 56, 3 );
  3512. X    printf("DAX ........");
  3513. X    ansi2( "cm", 56, 4 );
  3514. X    printf("FTSE .......");
  3515. X    ansi2( "cm", 56, 5 );
  3516. X    printf("DOW JONES ..");
  3517. X    ansi2( "cm", 56, 6 );
  3518. X    printf("CAC ........");
  3519. X    ansi2( "cm", 56, 7 );
  3520. X    printf("MIBTEL .....");
  3521. X    ansi2( "cm", 56, 8 );
  3522. X    printf("IBEX .......");
  3523. X
  3524. X    while(fgets(s, STRING, fp) != 0){
  3525. X        if(strlen(s) > 10) strcpy(t, (UNSIGNED char *) s);
  3526. X    }
  3527. X
  3528. X    fclose(fp);
  3529. X
  3530. X    ansi2( "md", 0, 0 );
  3531. X
  3532. X    j = 12;
  3533. X
  3534. X    for(i = 3; i < 9; i++){
  3535. X        ansi2( "cm", 69, i );
  3536. X        printf("%s", (UNSIGNED char *) strcopy(t, j, (j + 8)));
  3537. X        j += 11;
  3538. X     }      
  3539. X
  3540. X    ansi2( "cm", 56, 10 );
  3541. X    ansi2( "mr", 0, 0 );
  3542. X    printf("      %s      ", (UNSIGNED char *) strcopy(t, 0, 9) );
  3543. X  }
  3544. X
  3545. X  ansi2( "cm", 1, 2 );
  3546. X  ansi2( "me", 0, 0 ); 
  3547. X
  3548. X  printf("\n  1 - DAX Aktien Kurse\n");
  3549. X  printf("\n  2 - Dow Jones Aktien Kurse\n");
  3550. X  ansi2( "us", 0, 0 );
  3551. X  printf("\n  3 - Diagramm\n\n\n");
  3552. X  ansi2( "me", 0, 0 );  
  3553. X
  3554. X  ansi2( "md", 0, 0 );
  3555. X  printf("[Kurse] Welche? > ");
  3556. X
  3557. X  c = getint();
  3558. X
  3559. X  ansi2( "me", 0, 0 );
  3560. X
  3561. X  if((c < '1') || (c > '3')){
  3562. X    printf("\n");
  3563. X    return;
  3564. X  }
  3565. X
  3566. X  if(c != '3'){
  3567. X
  3568. X    sprintf(s, " Stock Exchange                      [Support: %s] ", STOCK_AUTOR);
  3569. X    headline( s );
  3570. X
  3571. X    dptr = 1;
  3572. X
  3573. X    dp = opendir( STOCK_PATH );
  3574. X    if(dp == NULL){
  3575. X        nerror("weiterl.c", 216, "boerse", "Directory not found", STOCK_PATH);
  3576. X    }
  3577. X  
  3578. X    while(((actdir = readdir(dp)) != NULL) && (dptr < MAX_BOERSE)){
  3579. X        strcpy(s, (UNSIGNED char *) actdir->d_name);
  3580. X        i = strlen(s);
  3581. X        if(i > 3){
  3582. X            while(i > -1){
  3583. X                if(s[i] == '.'){
  3584. X                    a = i + 1;
  3585. X                    i = -1;
  3586. X                }
  3587. X                i--;
  3588. X            }
  3589. X            strcpy(t, (UNSIGNED char *) strcopy(s, a, strlen(s)));
  3590. X    
  3591. X            if(c == '1'){
  3592. X                if(strcomp("dax", t) == 0){
  3593. X                    strcpy(d[dptr], actdir->d_name);
  3594. X                    dptr++;
  3595. X                }
  3596. X            }
  3597. X            if(c == '2'){
  3598. X                if(strcomp("dj", t) == 0){
  3599. X                    strcpy(d[dptr], actdir->d_name);
  3600. X                    dptr++;
  3601. X                }    
  3602. X            }
  3603. X        }
  3604. X    }
  3605. X    closedir(dp);
  3606. X
  3607. X  
  3608. X    for(i = 1; i < dptr; i++){
  3609. X        for(j = 1; j < dptr; j++){
  3610. X            t1 = dateconv( d[i] );
  3611. X            t2 = dateconv( d[j] );
  3612. X            if(t1 > t2){
  3613. X                strcpy(s, (UNSIGNED char *) d[i]);
  3614. X                strcpy(d[i], (UNSIGNED char *) d[j]);
  3615. X                strcpy(d[j], (UNSIGNED char *) s);
  3616. X            }
  3617. X        }
  3618. X    }
  3619. X    
  3620. X    
  3621. X    j = 0; strcpy(l[0], "                               "); 
  3622. X
  3623. X    if(dptr > 5) dptr = 5;
  3624. X
  3625. X    for(i = 1; i < dptr; i++){
  3626. X    
  3627. X        sprintf(s, "%s/%s", STOCK_PATH, d[i]);
  3628. X
  3629. X        b = 1;
  3630. X    
  3631. X        fp = fopen( s, "r" );
  3632. X        if(fp == NULL){
  3633. X            nerror("weiterl.c", 274, "boerse", "Can't read", s);
  3634. X        }
  3635. X    
  3636. X        strcat(l[0], "    ");
  3637. X        strcat(l[0], (UNSIGNED char *) strcopy(d[i], 0, 7));
  3638. X    
  3639. X        while(fgets(s, STRING, fp) != 0){
  3640. X            if(j == 0){
  3641. X                strcpy(l[b], stripped( (UNSIGNED char *) strcopy(s, 7, 80)));
  3642. X                while(strlen(l[b]) < 31) strcat(l[b], " ");    
  3643. X                l[b][31] = '\0';
  3644. X            }
  3645. X            fgets(t, STRING, fp);
  3646. X            if(s[0] == t[0]){
  3647. X                sprintf(s, "   %9.9s", stripped( (UNSIGNED char *) strcopy(t, 7, 80)));
  3648. X            }
  3649. X            else{
  3650. X                sprintf(s, "   %9.9s", "WPKN?");
  3651. X            }
  3652. X            strcat(l[b], s);
  3653. X            if(b < MAX_KURSE) b++;
  3654. X           }
  3655. X        fclose(fp);
  3656. X    
  3657. X        j++;
  3658. X    }  
  3659. X
  3660. X    sprintf(t, "%s/city.%d", STOCK_PATH, getpid());
  3661. X
  3662. X    fp = fopen( t, "w" );
  3663. X    if(fp == NULL){
  3664. X        nerror("weiterl.c", 303, "boerse", "Can't write to", t);
  3665. X    }
  3666. X
  3667. X    fputs("Content-Type: text/richtext\n", fp);
  3668. X
  3669. X    a = 0;
  3670. X
  3671. X    for(i = 1; i < b; i++){
  3672. X        if(l[i][0] >= 'A'){
  3673. X            if(a == 0){
  3674. X                fprintf(fp, "%s\n", l[i]);
  3675. X                a++;
  3676. X            }
  3677. X            else{
  3678. X                fprintf(fp, "<Underline>%s</Underline>\n", l[i]);
  3679. X                a = 0;
  3680. X            }
  3681. X        }
  3682. X    }
  3683. X    fclose(fp);
  3684. X
  3685. X    sprintf(s, " Stock Exchange                      [Support: %s] ", STOCK_AUTOR);
  3686. X    headblock( s, l[0] );
  3687. X    show( t, 9999, USER.more + 100 );
  3688. X
  3689. X    unlink( t );
  3690. X
  3691. X  }    
  3692. X  else{ /* Grafik */
  3693. X
  3694. X    sprintf(s, " Stock Exchange                      [Support: %s] ", STOCK_AUTOR);
  3695. X    headline( s );
  3696. X
  3697. X    dptr = 1;
  3698. X
  3699. X    dp = opendir( STOCK_PATH );
  3700. X    if(dp == NULL){
  3701. X        nerror("weiterl.c", 341, "boerse", "Directory not found", STOCK_PATH);
  3702. X    }
  3703. X  
  3704. X    while((actdir = readdir(dp)) != NULL){
  3705. X        if(dptr >= MAX_BOERSE){
  3706. X            for(i = 1; i <= dptr; i++)
  3707. X                strcpy(d[i], (UNSIGNED char *) d[i+1]);
  3708. X            dptr--;
  3709. X        }
  3710. X        strcpy(s, (UNSIGNED char *) actdir->d_name);
  3711. X        i = strlen(s);
  3712. X        if(i > 3){
  3713. X            while(i > -1){
  3714. X                if(s[i] == '.'){
  3715. X                    a = i + 1;
  3716. X                    i = -1;
  3717. X                }
  3718. X                i--;
  3719. X            }
  3720. X            strcpy(t, (UNSIGNED char *) strcopy(s, a, strlen(s)));
  3721. X    
  3722. X            if((strcomp("wpkn", t) != 0) && (strcomp("index", s) != 0)){
  3723. X                strcpy(d[dptr], actdir->d_name);
  3724. X                dptr++;
  3725. X            }
  3726. X        }
  3727. X    }
  3728. X    closedir(dp);
  3729. X
  3730. X  
  3731. X    for(i = 1; i < dptr; i++){
  3732. X        for(j = 1; j < dptr; j++){
  3733. X            t1 = dateconv( d[i] );
  3734. X            t2 = dateconv( d[j] );
  3735. X            if(t1 < t2){
  3736. X                strcpy(s, (UNSIGNED char *) d[i]);
  3737. X                strcpy(d[i], (UNSIGNED char *) d[j]);
  3738. X                strcpy(d[j], (UNSIGNED char *) s);
  3739. X            }
  3740. X        }
  3741. X    }
  3742. X
  3743. X    b = 1; t1 = 9999L; t2 = 0L; o1 = 9999L; o2 = 0L;
  3744. X    
  3745. X    for(i = 1; i < dptr; i++){                /* Pass 1 */
  3746. X        sprintf(s, "%s/%s", STOCK_PATH, d[i]);
  3747. X    
  3748. X        fp = fopen( s, "r" );
  3749. X        if(fp == NULL){
  3750. X            nerror("weiterl.c", 385, "boerse", "Can't read", s);            
  3751. X        }
  3752. X    
  3753. X        fgets(t, STRING, fp); 
  3754. X        fgets(s, STRING, fp); 
  3755. X
  3756. X        if(atol(t) != atol(s)){    /* WPKN ??? */
  3757. X            fclose(fp);
  3758. X            continue;
  3759. X        }
  3760. X
  3761. X        strcpy(l[b], (UNSIGNED char *) strcopy(s, 7, 80));
  3762. X
  3763. X        q = atol(l[b]);
  3764. X    
  3765. X        if(d[i][strlen(d[i]) -1] == 'x'){
  3766. X            if(q < t1) t1 = q;
  3767. X            if(q > t2) t2 = q;
  3768. X        }
  3769. X        else{
  3770. X            if(q < o1) o1 = q;
  3771. X            if(q > o2) o2 = q;
  3772. X        }
  3773. X
  3774. X        if(b < MAX_KURSE) b++;
  3775. X        fclose(fp);
  3776. X    }
  3777. X
  3778. X    t1 = (t1 + t2) / 2;
  3779. X    o1 = (o1 + o2) / 2;    
  3780. X
  3781. X    x1 = (t2 - t1) / 10 + 1;
  3782. X    x2 = (o2 - o1) / 10 + 1;
  3783. X
  3784. X    a = 15;
  3785. X
  3786. X    for( i = 3; i < (42 - USER.tlines); i++){
  3787. X        ansi2( "cm", 14, i );
  3788. X        printf("------------------------------------------------------------------");
  3789. X    }
  3790. X
  3791. X
  3792. X    ansi2( "md", 0, 0 );
  3793. X    ansi2( "cm", 14, 12 );
  3794. X    printf("------------------------------------------------------------------");
  3795. X    ansi2( "cm", 14, (42 - USER.tlines) );
  3796. X    printf("------------------------------------------------------------------");
  3797. X
  3798. X    ansi2( "me", 0, 0 );
  3799. X
  3800. X    for( i = 4; i < 7; i++){
  3801. X        ansi2( "cm", 68, i );
  3802. X        printf("             ");
  3803. X    }
  3804. X
  3805. X    ansi2( "cm", 69, 4 );
  3806. X    ansi2( "mr", 0, 0 );
  3807. X    printf("=");
  3808. X    ansi2( "me", 0, 0 );
  3809. X    ansi2( "md", 0, 0 );
  3810. X    printf(" DAX");
  3811. X    ansi2( "me", 0, 0 );
  3812. X
  3813. X     ansi2( "cm", 69, 6 );
  3814. X    ansi2( "mr", 0, 0 );
  3815. X    printf("+");
  3816. X    ansi2( "me", 0, 0 );
  3817. X    printf(" Dow Jones");
  3818. X
  3819. X    ansi2( "cm", 58, (41 - USER.tlines) );
  3820. X    ansi2( "us", 0, 0 );
  3821. X    strcpy(t, (UNSIGNED char *) strcopy(d[(dptr - 1)], 0, 7));
  3822. X      printf(" %s bis %s", (UNSIGNED char *) strcopy(d[1], 0, 7), t); 
  3823. X    ansi2( "me", 0, 0 );
  3824. X
  3825. X    j = 1;
  3826. X    /*
  3827. X        if(dptr > 22) j = dptr - 22;
  3828. X    */
  3829. X     if(dptr > 27) j = dptr - 27;
  3830. X
  3831. X    for(i = j; i < dptr; i++){                /* Pass 2 */
  3832. X        sprintf(s, "%s/%s", STOCK_PATH, d[i]);
  3833. X    
  3834. X        fp = fopen( s, "r" );
  3835. X        if(fp == NULL){
  3836. X            nerror("weiterl.c", 476, "boerse", "Can't read", s);
  3837. X        }
  3838. X    
  3839. X        fgets(t, STRING, fp); 
  3840. X        fgets(s, STRING, fp); 
  3841. X
  3842. X        if(atol(t) != atol(s)){    /* WPKN ??? */
  3843. X            fclose(fp);
  3844. X            continue;
  3845. X        }
  3846. X
  3847. X        strcpy(t, (UNSIGNED char *) strcopy(s, 7, 80));
  3848. X            
  3849. X        q = atol(t);
  3850. X
  3851. X        ansi2( "mr", 0, 0 );
  3852. X
  3853. X        if(d[i][strlen(d[i]) -1] == 'x'){
  3854. X
  3855. X            p1 = t1 - q;
  3856. X            p1 /= x1;
  3857. X            if(p1 == 0) p1 = 1;
  3858. X
  3859. X            
  3860. X            if(p1 > 0){
  3861. X                for(j = 0; j < p1; j++){
  3862. X                    b = 12 + j;
  3863. X                    ansi2( "cm", a, b);
  3864. X                    printf("=");
  3865. X                }
  3866. X            }
  3867. X            else{
  3868. X                p1 *= -1;
  3869. X
  3870. X                for(j = 0; j < p1; j++){
  3871. X                    b = 12 - j;
  3872. X                    ansi2( "cm", a, b);
  3873. X                    printf("=");
  3874. X                }
  3875. X
  3876. X            }
  3877. X            
  3878. X            ansi2( "cm", 1, b);
  3879. X            ansi2( "me", 0, 0 );
  3880. X            ansi2( "md", 0, 0 );
  3881. X            printf("%s", t);
  3882. X        }
  3883. X        else{
  3884. X            p1 = o1 - q;
  3885. X            p1 /= x2;
  3886. X            if(p1 == 0) p1 = 1;
  3887. X
  3888. X
  3889. X            if(p1 > 0){
  3890. X                for(j = 0; j < p1; j++){
  3891. X                    b = 12 + j;
  3892. X                    ansi2( "cm", a, b);
  3893. X                    printf("+");
  3894. X                }
  3895. X            }
  3896. X            else{
  3897. X                p1 *= -1;
  3898. X
  3899. X                for(j = 0; j < p1; j++){
  3900. X                    b = 12 - j;
  3901. X                    ansi2( "cm", a, b);
  3902. X                    printf("+");
  3903. X                }
  3904. X
  3905. X            }
  3906. X            ansi2( "cm", 1, b);
  3907. X            ansi2( "me", 0, 0 );
  3908. X            printf("%s", t);
  3909. X        }
  3910. X
  3911. X        for(j = 0; j < 2; j++){
  3912. X            ansi2( "cm", a, (43 - USER.tlines) + j );
  3913. X            printf("%c", d[i][j]);
  3914. X        }
  3915. X
  3916. X        ansi2( "me", 0, 0 );
  3917. X
  3918. X        a += 2;
  3919. X
  3920. X        fclose(fp);
  3921. X    }    
  3922. X    ansi2( "cm", 1, (USER.tlines + 1) );
  3923. X  }
  3924. X}
  3925. END_OF_FILE
  3926.   if test 11765 -ne `wc -c <'mbox/src/weiterl.c'`; then
  3927.     echo shar: \"'mbox/src/weiterl.c'\" unpacked with wrong size!
  3928.   fi
  3929.   # end of 'mbox/src/weiterl.c'
  3930. fi
  3931. echo shar: End of archive 4 \(of 12\).
  3932. cp /dev/null ark4isdone
  3933. MISSING=""
  3934. for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
  3935.     if test ! -f ark${I}isdone ; then
  3936.     MISSING="${MISSING} ${I}"
  3937.     fi
  3938. done
  3939. if test "${MISSING}" = "" ; then
  3940.     echo You have unpacked all 12 archives.
  3941.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3942. else
  3943.     echo You still must unpack the following archives:
  3944.     echo "        " ${MISSING}
  3945. fi
  3946. exit 0
  3947. exit 0 # Just in case...
  3948.