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

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de (Volker Schuermann)
  3. Subject: v35i041:  mbox - ix/Mbox, A BBS for UNIX and MINIX v1.6 PL10j7, Part06/15
  4. Message-ID: <1993Feb5.185705.10231@sparky.imd.sterling.com>
  5. X-Md4-Signature: c999e202c8a8eb41a784f2c2eba1fbf7
  6. Date: Fri, 5 Feb 1993 18:57:05 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Volker.Schuermann@unnet.w.open.de (Volker Schuermann)
  10. Posting-number: Volume 35, Issue 41
  11. Archive-name: mbox/part06
  12. Environment: MINIX, ISC, ESIX, SVR3
  13. Supersedes: mbox: Volume 31, Issue 16-27
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # Contents:  src/mb-daemon.c src/misc.c src/uptodate.c
  20. # Wrapped by kent@sparky on Fri Feb  5 12:18:07 1993
  21. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  22. echo If this archive is complete, you will see the following message:
  23. echo '          "shar: End of archive 6 (of 15)."'
  24. if test -f 'src/mb-daemon.c' -a "${1}" != "-c" ; then 
  25.   echo shar: Will not clobber existing file \"'src/mb-daemon.c'\"
  26. else
  27.   echo shar: Extracting \"'src/mb-daemon.c'\" \(24038 characters\)
  28.   sed "s/^X//" >'src/mb-daemon.c' <<'END_OF_FILE'
  29. X/***************************************************************************/
  30. X/*        PROGRAMM  ix/Mbox                           */
  31. X/*             DATEI  mb-daemon.c                       */
  32. X/*        FUNKTIONEN  reflector(), scan(), mix(), main()           */
  33. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  34. X/*  LETZTE AENDERUNG  16.09.1992                       */
  35. X/***************************************************************************/
  36. X
  37. X#ifndef _ESTDIO
  38. X#include <stdio.h>
  39. X#else
  40. X#include <estdio.h>
  41. X#endif
  42. X#include <sys/types.h>
  43. X#include <sys/stat.h>
  44. X#include <time.h>
  45. X#include <dirent.h>
  46. X
  47. X#include "mbox.h"
  48. X
  49. X
  50. Xint FASTMODE;
  51. X
  52. X
  53. Xint mb_gruppen;
  54. Xint mb_new;
  55. Xlong mb_bytes;
  56. Xlong mb_new_bytes;
  57. Xlong mb_artikel;
  58. X
  59. X#ifdef ADDRMODE
  60. XFILE *ad;
  61. X#endif
  62. X
  63. X/***************************************************************************/
  64. X/*      FUNKTION  reflector()                           */
  65. X/*  BESCHREIBUNG  Sendet eine persoenliche Mail an den Autor eines Arti-   */
  66. X/*          kels in einer bestimmten NG.                               */
  67. X/*                                                               */
  68. X/*          VORSICHT: Wilde Reflectoren werden vom Netz getrennt !!! */
  69. X/*     PARAMETER  arg  =  DUMMY (?)                                        */
  70. X/*          msg  =  Artikel                                          */
  71. X/*     RUECKGABE  -1   =  Artikel nicht gefunden                           */
  72. X/*                0    =  Ok                            */
  73. X/***************************************************************************/
  74. X
  75. Xint FLAG;
  76. X
  77. Xint reflector(arg, msg)
  78. Xunsigned char arg[];
  79. Xunsigned char msg[];
  80. X{
  81. X  FILE *fp;
  82. X  FILE *ff;
  83. X
  84. X  unsigned char s[255];
  85. X  unsigned char tmp[STRING];
  86. X
  87. X  unsigned char receiver[STRING];
  88. X
  89. X  unsigned char path[255];
  90. X  unsigned char reply_to[255];
  91. X  unsigned char from[255];
  92. X  unsigned char sender[255];
  93. X  unsigned char subject[255];
  94. X  unsigned char summary[255];
  95. X  unsigned char keywords[255];
  96. X  unsigned char newsgroups[255];
  97. X  unsigned char followup_to[255];
  98. X  unsigned char distribution[255];
  99. X  unsigned char date[255];
  100. X  unsigned char lines[255];
  101. X  unsigned char message_id[255];
  102. X  unsigned char organization[255];
  103. X  unsigned char posted[255];
  104. X  unsigned char article_id[255];
  105. X  unsigned char nntp_post[255];
  106. X  unsigned char references[255];
  107. X
  108. X  int id_err = 0;
  109. X  int i;
  110. X  int inlines;
  111. X
  112. X  int reply = 0;
  113. X  int noreply = 0;
  114. X  int dirlist = 0;
  115. X  int logfile = 0;
  116. X  int info = 0;
  117. X  int minimal = 0;
  118. X  long timer;
  119. X
  120. X  int ok = 0;
  121. X
  122. X  fp = fopen(msg, "r");
  123. X  if (fp == NULL) return -1;
  124. X
  125. X  sprintf(tmp, "%s/%d", TMP, getpid());
  126. X  ff = fopen(tmp, "w");
  127. X  
  128. X  i = 1;
  129. X  inlines = -1;
  130. X
  131. X  while (fgets(s, 255, fp) != NULL) {
  132. X    ok = 0;
  133. X    if (strcomp("Path:", s) == 0) {
  134. X        sprintf(path, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  135. X        ok++;
  136. X    }
  137. X    if (strcomp("Reply-To:", s) == 0) {
  138. X        sprintf(reply_to, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  139. X        reply--;
  140. X        ok++;
  141. X    }
  142. X    if (strcomp("From:", s) == 0) {
  143. X        sprintf(from, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  144. X        ok++;
  145. X    }
  146. X    if (strcomp("Sender:", s) == 0) {
  147. X        sprintf(sender, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  148. X        ok++;
  149. X    }
  150. X    if (strcomp("Subject:", s) == 0) {
  151. X        sprintf(subject, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  152. X        ok++;
  153. X    }
  154. X    if (strcomp("Summary:", s) == 0) {
  155. X        sprintf(summary, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  156. X        ok++;
  157. X    }
  158. X    if (strcomp("Keywords:", s) == 0) {
  159. X        sprintf(keywords, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  160. X        ok++;
  161. X    }
  162. X    if (strcomp("Newsgroups:", s) == 0) {
  163. X        sprintf(newsgroups, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  164. X        ok++;
  165. X    }
  166. X    if (strcomp("Followup-To:", s) == 0) {
  167. X        sprintf(followup_to, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  168. X        ok++;
  169. X    }
  170. X    if (strcomp("Distribution:", s) == 0) {
  171. X        sprintf(distribution, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  172. X        ok++;
  173. X    }
  174. X    if (strcomp("Date:", s) == 0) {
  175. X        sprintf(date, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  176. X        ok++;
  177. X    }
  178. X    if (strcomp("Lines:", s) == 0) {
  179. X        sprintf(lines, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  180. X        ok++;
  181. X    }
  182. X    if (strcomp("Message-I", s) == 0) {
  183. X        sprintf(message_id, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  184. X        /*
  185. X        if (s[9] == 'D') id_err++;
  186. X        */
  187. X        ok++;
  188. X    }
  189. X    if (strcomp("Organization:", s) == 0) {
  190. X        sprintf(organization, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  191. X        ok++;
  192. X    }
  193. X    if (strcomp("Posted:", s) == 0) {
  194. X        sprintf(posted, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  195. X        ok++;
  196. X    }
  197. X    if (strcomp("Article-I.D.:", s) == 0) {
  198. X        sprintf(article_id, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  199. X        ok++;
  200. X    }
  201. X    if (strcomp("Nntp-Posting-Host:", s) == 0) {
  202. X        sprintf(nntp_post, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  203. X        ok++;
  204. X    }
  205. X    if (strcomp("References:", s) == 0) {
  206. X        sprintf(references, "%02d>> %s <<\n", i, (unsigned char *) stripped(s));
  207. X        ok++;
  208. X    }
  209. X
  210. X
  211. X
  212. X    if (strcomp("NO REPLY", s)        == 0 ||
  213. X        strcomp("NOT REPLY", s)       == 0 ||
  214. X        strcomp("KEIN REPLY", s)      == 0 ||
  215. X        strcomp("NO REPLIES", s)      == 0 ||
  216. X        strcomp("KEINE REPLIES", s)   == 0 ||
  217. X        strcomp("NO REPLYS", s)       == 0 ||
  218. X        strcomp("KEINE REPLYS", s)    == 0 ||
  219. X        strcomp("KEINE ANTWORTEN", s) == 0 ||
  220. X        strcomp("NICHT ANTWORTEN", s) == 0 ||
  221. X        strcomp("NO REFLECT", s)      == 0 ||
  222. X        strcomp("NOT REFLECT", s)     == 0 ||
  223. X        strcomp("NO ANSWER", s)       == 0 ||
  224. X        strcomp("NOT ANSWER", s)      == 0 ||
  225. X        strcomp("IGNORE", s)          == 0)
  226. X        noreply++;
  227. X
  228. X    if (strcomp("PLEASE REPLY", s)    == 0 ||
  229. X        strcomp("BITTE REPLY", s)     == 0 ||
  230. X        strcomp("PLEASE REFLECT", s)  == 0 ||
  231. X        strcomp("BITTE REFLECT", s)   == 0 ||
  232. X        strcomp("BITTE ANTWORT", s)   == 0 ||
  233. X        strcomp("REPLY", s)           == 0 ||
  234. X        strcomp("REFLECT", s)         == 0 ||
  235. X        strcomp("ANTWORT", s)         == 0)
  236. X        reply++;
  237. X
  238. X    if (strcomp("DIRLIST", s) == 0) dirlist++;
  239. X
  240. X    if (strcomp("LOGFILE", s) == 0) logfile++;
  241. X
  242. X    if (strcomp("INFO", s) == 0 ||
  243. X        strcomp("HELP", s) == 0)
  244. X        info++;
  245. X
  246. X    if (strcomp("SHORT", s) == 0) minimal++;
  247. X
  248. X    if (ok == 0) {
  249. X        /* Sprintf(s, "%02d Body >> %s <<\n\n", i, (unsigned char *) stripped(s)); */
  250. X        inlines++;
  251. X    }
  252. X    i++;
  253. X  }
  254. X  fclose(fp);
  255. X
  256. X  strcpy(s, (unsigned char *) strcopy(organization, 19, 80));
  257. X  if ((FLAG == 1) && (strcomp(ORGANIZATION, s) != 0)) return -1;
  258. X
  259. X  if (reply_to[0] != '\0') {
  260. X    strcpy(receiver, (unsigned char *) strcopy(reply_to, 15, 80));
  261. X  } else {
  262. X    strcpy(receiver, (unsigned char *) strcopy(from, 11, 80));
  263. X  }
  264. X
  265. X  i = 0;
  266. X  while ((receiver[i] != '\0') && (receiver[i] != '(')) i++;
  267. X  receiver[(i - 1)] = '\0';
  268. X
  269. X
  270. X
  271. X  time(&timer);
  272. X
  273. X  fprintf(ff, "From: reflector@%s (Reflecting Device)\n", UUCPID2); 
  274. X  fprintf(ff, "Reply-To: postmaster@%s (Reflectors' Boss)\n", UUCPID2);
  275. X  fprintf(ff, "Organization: %s\n", ORGANIZATION);
  276. X  if(message_id[0] != '\0'){
  277. X    fprintf(fp, "References: %s", message_id);
  278. X  }
  279. X  fprintf(ff, "To: %s\n", receiver);
  280. X  fprintf(ff, "Subject: *Reflexion*\n");
  281. X  fprintf(ff, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  282. X  fprintf(ff, "Message-Id: <%x.reflector@%s>\n", timer, UUCPID2);
  283. X  fputs("\n", ff);
  284. X
  285. X
  286. X
  287. X  fp = fopen(REFLECT_LOG, "a");
  288. X  if (fp == NULL) {
  289. X    while (1) printf("%c", 7);
  290. X  }
  291. X  fprintf(fp, "%s - %s", (unsigned char *) mydate(1), from);
  292. X  fprintf(fp, "         - %s", message_id);
  293. X  fprintf(fp, "         - %s", subject);
  294. X  if (dirlist != 0) {
  295. X    fprintf(fp, "         - DIRLIST-Request\n");
  296. X  }
  297. X  if (logfile != 0) {
  298. X    fprintf(fp, "         - LOGFILE-Request\n");
  299. X  }
  300. X  if (info != 0) {
  301. X    fprintf(fp, "         - INFO-Request\n");
  302. X  }
  303. X  fprintf(fp, "         - Reflected to %s\n\n", receiver);
  304. X  fclose(fp);
  305. X
  306. X
  307. X  fprintf(ff, "%s\n\n", MVERSION);
  308. X
  309. X
  310. X  if ((dirlist == 0) && (logfile == 0) && (info == 0) && (minimal == 0)) {
  311. X    fprintf(ff, "That's what we received in NG \"%s\" ...\n\n", arg);
  312. X
  313. X    fputs(path, ff);
  314. X    fputs(from, ff);
  315. X    fputs(reply_to, ff);
  316. X    fputs(sender, ff);
  317. X    fputs(newsgroups, ff);
  318. X    fputs(subject, ff);
  319. X    fputs(article_id, ff);
  320. X    fputs(posted, ff);
  321. X    fputs(nntp_post, ff);
  322. X    fputs(summary, ff);
  323. X    fputs(keywords, ff);
  324. X    fputs(followup_to, ff);
  325. X    fputs(distribution, ff);
  326. X    fputs(references, ff);
  327. X    fputs(message_id, ff);
  328. X    fputs(organization, ff);
  329. X    fputs(date, ff);
  330. X    fputs(lines, ff);
  331. X
  332. X
  333. X    fputs("\n\nDiagnostics ...\n\n", ff);
  334. X
  335. X    ok = 0;
  336. X
  337. X    if (id_err != 0) {
  338. X        fprintf(ff, "- \"Message-ID\" may cause trouble ... use \"Message-Id\".\n\n");
  339. X        ok++;
  340. X    }
  341. X    if (reply_to[0] == '\0') {
  342. X        fprintf(ff, "- No \"Reply-To\"-Path ... not a problem.\n\n");
  343. X        ok++;
  344. X    }
  345. X    i = atoi((unsigned char *) strcopy(lines, 12, 80));
  346. X    inlines--;
  347. X    if (inlines != i) {
  348. X        fprintf(ff, "- Your Header reports %d lines ... we counted %d.\n\n", i, inlines);
  349. X        ok++;
  350. X    }
  351. X    if ((reply != 0) || (noreply != 0)) {
  352. X        fprintf(ff, "- Found %d Reply-Requests and %d No-Replies.\n\n", reply, noreply);
  353. X        ok++;
  354. X    }
  355. X
  356. X    if (ok == 0) {
  357. X        fprintf(ff, "- Everything seems to be correct!\n\n");
  358. X    }
  359. X  }
  360. X
  361. X    
  362. X  if (dirlist != 0) {
  363. X    fp = fopen(DIRLIST, "r");
  364. X    if (fp != NULL) {
  365. X        fputs("DIRLIST:\n\n", ff);
  366. X        while (fgets(s, 250, fp) != NULL) fputs(s, ff);
  367. X        fclose(fp);
  368. X    } else {
  369. X        fputs("Sorry, no DIRLIST-Entry found ...\n\n", ff);
  370. X    }
  371. X    printf("\n\n");
  372. X  }
  373. X  if (logfile != 0) {
  374. X    fp = fopen(REFLECT_LOG, "r");
  375. X    if (fp != NULL) {
  376. X        fputs("LOGFILE:\n\n", ff);
  377. X        while (fgets(s, 250, fp) != NULL) fputs(s, ff);
  378. X        fclose(fp);
  379. X    } else {
  380. X        fputs("Sorry, no LOGFILE-Entry found ...\n\n", ff);
  381. X    }
  382. X    printf("\n\n");
  383. X  }
  384. X  if (info != 0) {
  385. X    fputs("INFO (weitere Schluesselwoerter):\n\n", ff);
  386. X    fputs("LOGFILE - Wenn der Reflektor nicht reflektiert, kann man sich\n", ff);
  387. X    fputs("          das LOGFILE senden lassen, um zu ueberpruefen ob der\n", ff);
  388. X    fputs("                 Artikel jemals erfasst worden ist.\n\n", ff);
  389. X
  390. X    fputs("DIRLIST - Eine Liste des lokalen MINIX-Archivs. Da der Reflektor\n", ff);
  391. X    fputs("          (noch) kein PD-Server ist, kann man diese Liste nur zu\n", ff);
  392. X    fputs("          Testzwecken anfordern.\n\n", ff);
  393. X
  394. X    fputs("SHORT   - Quittiert nur den Empfang des Artikels.\n\n", ff);
  395. X  }
  396. X  if (minimal != 0) {
  397. X    fprintf(ff, "Received your article %s", message_id);
  398. X  }
  399. X  fclose(ff);
  400. X
  401. X  sprintf(s, "/bin/sh ./etc/rmail.sh %s %s", tmp, receiver);
  402. X  system(s);
  403. X
  404. X  unlink(tmp);
  405. X
  406. X  return 0;
  407. X}
  408. X
  409. X
  410. X
  411. X/***************************************************************************/
  412. X/*      FUNKTION  pdsize()                           */
  413. X/*  BESCHREIBUNG  Groesse eine PD-Datei ermitteln                */
  414. X/*     PARAMETER  arg - Name des NG-Eintrags                               */
  415. X/*     RUECKGABE  Groesse in kBytes                                        */
  416. X/***************************************************************************/
  417. X
  418. Xint pdsize( arg )
  419. Xunsigned char arg[];
  420. X{
  421. X  FILE *fp;
  422. X  unsigned char s[STRING];
  423. X  int ok = 0, i;
  424. X  struct stat fstat;
  425. X
  426. X  fp = fopen( arg, "r" );
  427. X  if(fp == NULL){
  428. X    return (int) 0;
  429. X  }
  430. X  while((ok == 0) && (fgets(s, 80, fp) != NULL)){
  431. X    if(strcomp("BINFILE", s) == 0) ok++;
  432. X  }
  433. X  fgets(s, 80, fp);
  434. X  fclose(fp);
  435. X
  436. X  if(ok == 0) strcpy(s, (unsigned char *) arg);
  437. X
  438. X  if(stat((unsigned char *) stripped(s), &fstat) != NULL){
  439. X    return (int) 0;
  440. X  }
  441. X  i = (int) (fstat.st_size / 1024);
  442. X  if(i < 1) i = 1;
  443. X  return (int) i;
  444. X}
  445. X
  446. X
  447. X
  448. X
  449. X
  450. X
  451. X
  452. X/***************************************************************************/
  453. X/*      FUNKTION  scan()                           */
  454. X/*  BESCHREIBUNG  Filtert einen NEWS-Artikel, und erstellt einen Eintrag   */
  455. X/*          fuer das entsprechenden INDEX-Files der ix/Mbox.       */
  456. X/*     PARAMETER  arg  =  NG                                               */
  457. X/*     RUECKGABE  Datum des aktuellsten Artikels                           */
  458. X/***************************************************************************/
  459. X
  460. Xunsigned char *scan(arg)
  461. Xunsigned char arg[];
  462. X{
  463. X  FILE *ff;
  464. X  FILE *fp;
  465. X  FILE *fl;
  466. X  FILE *ft;
  467. X  FILE *fg;
  468. X
  469. X  unsigned char s[STRING];
  470. X  unsigned char t[STRING];
  471. X  unsigned char f[STRING];
  472. X  unsigned char v[STRING];
  473. X  unsigned char from[STRING];
  474. X  unsigned char subj[STRING];
  475. X  unsigned char date[STRING];
  476. X  unsigned char line[STRING];
  477. X  unsigned char orga[STRING];
  478. X  unsigned char Ndir[STRING];
  479. X  unsigned char Ldir[STRING];
  480. X  unsigned char Tdir[STRING];
  481. X  unsigned char ex[1024];
  482. X  unsigned char et[355];
  483. X
  484. X  int dirarray[MAX_PER_NG];
  485. X  int idp = 0, iii = 0;
  486. X
  487. X  DIR *dp;
  488. X  struct dirent *actdir;
  489. X
  490. X
  491. X  static unsigned char sdate[STRING];
  492. X
  493. X  unsigned char today[STRING];
  494. X  unsigned char thatday[STRING];
  495. X  unsigned char arti[STRING];
  496. X
  497. X  int i, j;
  498. X  int ok = 0;
  499. X  int a, b;
  500. X  int BINFILE = 0;
  501. X  int PDGROUP = 0;
  502. X  int fsi = 0;
  503. X  int seq = 0;
  504. X  int OLDENTRY = 0;
  505. X  int OLDn = 0;
  506. X  int OLDo = 0;
  507. X  int got_org = 0;
  508. X
  509. X  struct stat fstat;
  510. X  struct tm *tp;
  511. X
  512. X  i = 0;
  513. X  while (arg[i] != '\0') {
  514. X    t[i] = arg[i];
  515. X    if (t[i] == '.') t[i] = '/';
  516. X    i++;
  517. X  }
  518. X  t[i] = '\0';
  519. X
  520. X  sprintf(Ndir, "%s/%s", NEWS, t);
  521. X
  522. X  if(length(arg) > 14){
  523. X#ifndef _LONGNAMES
  524. X    strcpy(s, (unsigned char *) shortname(arg));
  525. X#else
  526. X    strcpy(s, (unsigned char *) arg);
  527. X#endif
  528. X    sprintf(Ldir, "%s/%s", LIB, s);
  529. X  } 
  530. X  else{
  531. X    sprintf(Ldir, "%s/%s", LIB, arg);
  532. X  }
  533. X  strcpy(Ldir, (unsigned char *) stripped(Ldir));
  534. X
  535. X  sprintf(Tdir, "%s/TD.%d", TMP, getpid());
  536. X
  537. X  if (FLAG == 0) printf("\n%s...\n", Ndir);
  538. X
  539. X  sprintf(f, "%s/%dA", TMP, getpid());
  540. X
  541. X
  542. X  dp = opendir( Ndir );
  543. X  if(dp == NULL){
  544. X    printf("::No such directory!\n\n");
  545. X    return "";
  546. X  }
  547. X  while((actdir = readdir(dp)) != NULL){
  548. X     dirarray[idp] = atoi(actdir->d_name);
  549. X     if(dirarray[idp] != 0) idp++;
  550. X     if(idp >= MAX_PER_NG){
  551. X        nerror("mb-daemon.c", 506, "scan", "Verzeichnis zu gross > ", Ndir );        
  552. X     }
  553. X  }
  554. X  closedir(dp);
  555. X
  556. X  for(i = 0; i < idp; i++){
  557. X    for(j = 0; j< idp; j++){
  558. X        if(dirarray[i] > dirarray[j]){
  559. X            a = dirarray[j];
  560. X            dirarray[j] = dirarray[i];
  561. X            dirarray[i] = a;
  562. X        }
  563. X        }
  564. X  } 
  565. X
  566. X  if(idp == 0){
  567. X    if (FLAG == 0) printf("::Directory is empty!\n\n");
  568. X    ft = fopen(Ldir, "w");
  569. X    fputs(" ", ft);
  570. X    fclose(ft);
  571. X    return "";
  572. X  }
  573. X
  574. X  sprintf(sdate, "%s", ":-)");
  575. X
  576. X  sprintf(today, "%s", (unsigned char *) mydate(1));
  577. X
  578. X
  579. X  ft = fopen(Ldir, "r");
  580. X  if(ft == NULL){
  581. X    ft = fopen(Ldir, "w");
  582. X    fputs("\n\n0\n", ft);
  583. X    fclose(ft);
  584. X    ft = fopen(Ldir, "r");
  585. X    OLDo = -2;
  586. X  }
  587. X  fgets(s, 81, ft);
  588. X  fgets(s, 81, ft);
  589. X  fgets(s, 81, ft);
  590. X  OLDENTRY = atoi(s); 
  591. X
  592. X  mblock(Ldir);
  593. X
  594. X  ff = fopen(Tdir, "w");
  595. X
  596. X  seq = 0;
  597. X
  598. X  mb_gruppen++;
  599. X
  600. X
  601. X  if(strcomp(PDNG, arg) == 0){
  602. X    PDGROUP++;    
  603. X    fprintf(ff, "%s\n", GBL08_MSG); 
  604. X  }
  605. X  else{
  606. X    fprintf(ff, "%s\n", GBL05_MSG);
  607. X  }
  608. X  fputs("===============================================================================\n", ff);
  609. X
  610. X  while (iii < idp) {
  611. X
  612. X    if((dirarray[iii] < OLDENTRY) && (FASTMODE == 1)) goto YET_SCANNED;
  613. X
  614. X    OLDn++;
  615. X
  616. X    seq++;
  617. X    BINFILE = 0;
  618. X    fsi++;
  619. X
  620. X    sprintf(arti, "%s/%d", Ndir, dirarray[iii]);  
  621. X    strcpy(t, (unsigned char *) arti); /* ??? */
  622. X
  623. X    if (FLAG == 0) printf("%s: ", t);
  624. X
  625. X    fp = fopen(t, "r");
  626. X    if (fp != NULL) {
  627. X
  628. X        stat(t, &fstat);
  629. X        tp = localtime(&fstat.st_mtime);
  630. X
  631. X        if(fstat.st_mode & S_IFDIR) goto OFF_HERE;
  632. X
  633. X        mb_bytes += (long) fstat.st_size;
  634. X        sprintf(thatday, "%02.2d.%02.2d.%02.2d", tp->tm_mday, tp->tm_mon + TZS, tp->tm_year);
  635. X        if(strcomp(thatday, today) == 0) mb_new_bytes += (long) fstat.st_size;
  636. X
  637. X        if (sdate[0] == ':') {
  638. X            sprintf(sdate, "%4.4d%02.2d%02.2d",
  639. X                1900 + tp->tm_year, tp->tm_mon + TZS, tp->tm_mday);
  640. X            sprintf(s, "%02.2d:%02.2d",
  641. X                tp->tm_hour, tp->tm_min);
  642. X            LASTTIME = timeconv(s);
  643. X            if (FLAG == 0) printf(" (%s) ", sdate);
  644. X            if(strcomp(thatday, today) == 0) mb_new++;
  645. X        }
  646. X        if ((strcomp(arg, REFLECT_NG) == 0) || (strcomp(arg, "local.test") == 0)) {
  647. X            if (strcomp(thatday, today) == 0) {
  648. X                reflector(arg, t);
  649. X            }
  650. X        }
  651. X        from[0] = '\0';
  652. X        subj[0] = '\0';
  653. X        date[0] = '\0';
  654. X        line[0] = '\0';
  655. X        orga[0] = '\0';
  656. X
  657. X        got_org = 0;
  658. X        i = 0;
  659. X
  660. X        while((got_org == 0) && (i < 20)){
  661. X            fgets(ex, 1024, fp);
  662. X#ifdef ADDRMODE
  663. X            if (strcomp("de.", arg) == 0) {
  664. X                if (strcomp("Path:", ex) == 0) {
  665. X                    fprintf(ad, "%s\n", (unsigned char *) stripped(ex));
  666. X                }
  667. X            }
  668. X#endif
  669. X            ex[80] = '\0'; strcpy(s, ex);
  670. X            if (strcomp("From:", s) == 0) {
  671. X                strcpy(from, s);
  672. X            }
  673. X            if (strcomp("Reply-To:", s) == 0) {
  674. X                strcpy(from, s);
  675. X            }
  676. X            if (strcomp("Subject:", s)      == 0) strcpy(subj, s);
  677. X            if (strcomp("Date:", s)         == 0) strcpy(date, s);
  678. X            if (strcomp("Lines:", s)        == 0) strcpy(line, s);
  679. X            if (strcomp("BINFILE", s)       == 0) BINFILE++;
  680. X            if (strcomp("Organization:", s) == 0) strcpy(orga, s);
  681. X            if (strlen(s) < 3) got_org++;
  682. X            i++;
  683. X        }
  684. X
  685. X#ifdef ADDRMODE        
  686. X        if (strcomp("de.", arg) == 0) {
  687. X            fprintf(ad, "%s\n", (unsigned char *) stripped(from));
  688. X            fprintf(ad, "%s\n", (unsigned char *) stripped(orga));
  689. X        }
  690. X#endif
  691. X
  692. X        if (FLAG == 0) printf("%s", subj);
  693. X
  694. X        if ((from[0] == 'F') || (from[0] == 'R')) {
  695. X
  696. X            sprintf(s, "%d        ", dirarray[iii]);
  697. X            s[6] = '\0';
  698. X            if (BINFILE != 0) s[5] = '*';
  699. X
  700. X            subj[79] = '\0';
  701. X            strcpy(ex, (unsigned char *) strcopy(subj, 8, 79));
  702. X            strcpy(et, (unsigned char *) stripped(ex));
  703. X            strcpy(ex, et);
  704. X            strcat(ex, "                           ");
  705. X            ex[25] = '\0';
  706. X            strcat(s, ex);
  707. X            strcat(s, "   ");
  708. X
  709. X            
  710. X            i = 5; /* 8 */
  711. X            if (from[0] == 'R') i = 10;
  712. X
  713. X            from[79] = '\0';
  714. X            strcpy(ex, (unsigned char *) strcopy(from, i, 80));
  715. X            strcpy(et, (unsigned char *) stripped(ex));
  716. X            strcpy(ex, et);
  717. X
  718. X            a = 0;
  719. X            b = 0;
  720. X            i = 0;
  721. X            while (ex[i] != '\0') {
  722. X                if (ex[i] == '(') a = i + 1;
  723. X                if (ex[i] == ')') b = i - 1;
  724. X                i++;
  725. X            }
  726. X            if (a < b) {
  727. X                strcpy(et, (unsigned char *) strcopy(ex, a, b));
  728. X                strcpy(ex, et);
  729. X            }
  730. X            strcat(ex, "                           ");
  731. X            ex[19] = '\0';
  732. X            strcat(s, ex);
  733. X            strcat(s, "   ");
  734. X
  735. X
  736. X            i = 0;
  737. X            j = 0;
  738. X            while (date[i] != '\0') {
  739. X                if (j == 0) {
  740. X                    if ((date[i] >= '1') && (date[i] <= '9'))
  741. X                        j = i;
  742. X                }
  743. X                i++;
  744. X            }
  745. X
  746. X            sprintf(ex, "%02.2d.%02.2d.%02.2d  %02.2d:%02.2d",
  747. X             tp->tm_mday, tp->tm_mon + TZS, tp->tm_year,
  748. X                tp->tm_hour, tp->tm_min);
  749. X            strcat(ex, "                         ");
  750. X            ex[15] = '\0';
  751. X            strcat(s, ex);
  752. X            strcat(s, "  ");
  753. X
  754. X            strcpy(ex, (unsigned char *) strcopy(line, 7, 20));
  755. X            strcpy(t, (unsigned char *) stripped(ex));
  756. X            i = atoi(t);
  757. X            sprintf(ex, "%-6.d", i);
  758. X        
  759. X            if(PDGROUP != 0){
  760. X                i = pdsize(arti);
  761. X                sprintf(ex, "%-6.d", i);
  762. X                if(i == 0){
  763. X                    fg = fopen( CPRN, "a" );
  764. X                        if(fg != NULL){
  765. X                        fprintf(fg, "\nMB-DAEMON -> %23.23s | %s\n", s, arti);
  766. X                        fclose(fg);
  767. X                    }
  768. X                }
  769. X            }
  770. X
  771. X            strcat(s, ex);
  772. X            fputs(s, ff);
  773. X            fputs("\n", ff);
  774. X
  775. X            mb_artikel++;
  776. X
  777. X            ok = 1;
  778. X        } else {
  779. X            if (FLAG == 0) printf("invalid header!\n");
  780. X        }
  781. X
  782. X        OFF_HERE:
  783. X
  784. X        if (fp != 0) fclose(fp);
  785. X    } else {
  786. X        if (FLAG == 0) printf("can't open!\n");
  787. X    }
  788. X    iii++;
  789. X  }
  790. X
  791. X  YET_SCANNED:
  792. X
  793. X  if(OLDn != 0) OLDn -= 1;
  794. X
  795. X  idp -= 2; /* ??? */
  796. X
  797. X  while(iii < idp){
  798. X    if((OLDn != 0) || (FASTMODE == 0)){
  799. X        fgets(s, 81, ft); 
  800. X        fputs(s, ff);
  801. X    }
  802. X    if(FLAG == 0){
  803. X        sprintf(t, "%s/%d", Ndir, dirarray[iii]);
  804. X        stat(t, &fstat);
  805. X        mb_bytes += (long) fstat.st_size;
  806. X    }
  807. X    mb_artikel++;
  808. X    OLDo++;
  809. X    iii++;
  810. X  }
  811. X
  812. X  if((OLDn != 0) || (FASTMODE == 0)){
  813. X    fgets(s, 81, ft);
  814. X    if((FASTMODE == 1) && (OLDo > 0)) fputs(s, ff);
  815. X    fclose(ff);
  816. X    fclose(ft);
  817. X    if(rename( Tdir, Ldir ) != 0){
  818. X        ff = fopen( Tdir, "r");
  819. X        ft = fopen( Ldir, "w");
  820. X        while(fgets(s, 81, ff) != NULL){
  821. X            fputs(s, ft);
  822. X        }
  823. X    }
  824. X  }
  825. X  if (ff != 0) fclose(ff);
  826. X  if (ft != 0) fclose(ft);
  827. X
  828. X  unlink(f);
  829. X  unlink(Tdir);
  830. X
  831. X
  832. X  if (sdate[0] == ':') {
  833. X    sprintf(sdate, "%s", "19700101");
  834. X    LASTTIME = 0;
  835. X  }
  836. X
  837. X#ifdef _SYS7
  838. X  if ((seq > MAX_PER_NG) && (FLAG == 0) && (strcomp("local", arg) != 0)) {
  839. X    sprintf(s, "%s -n %s -e %d", EXPIRE, arg, EXPIRED_DAYS);
  840. X    printf("%s\n", s);
  841. X    system(s);
  842. X    sprintf(s, "%s %s EXP", MB_DAEMON, arg);
  843. X    system(s);
  844. X  }
  845. X#endif
  846. X  
  847. X  mbunlock(Ldir);
  848. X
  849. X  if((FASTMODE == 1) && (FLAG == 0)){
  850. X    OLDo += 2;
  851. X    printf("\n==> %s %d. %s %d.\n\n", MBD01_MSG, OLDn, MBD02_MSG, OLDo);
  852. X  }
  853. X  
  854. X  return (unsigned char *) sdate;
  855. X}
  856. X
  857. X
  858. X
  859. X/***************************************************************************/
  860. X/*      FUNKTION  mix()                               */
  861. X/*  BESCHREIBUNG  Aktualisiert einzelnen Eintraege im AGROUPS-File.       */
  862. X/*     PARAMETER  s  =  NG                                                 */
  863. X/*          t  =  Neuer AGROUPS-Eintrag                              */
  864. X/*     RUECKGABE  keine                                                    */
  865. X/***************************************************************************/
  866. X
  867. Xvoid mix( s, t )
  868. Xunsigned char s[], t[];
  869. X{
  870. X  FILE *ff, *fp;
  871. X  unsigned char tmp[STRING];
  872. X  unsigned char f[STRING];
  873. X
  874. X  sprintf(tmp, "%s/ff%d", TMP, getpid());
  875. X
  876. X
  877. X  maybe_locked( AGROUPS, "r" );
  878. X  fp = fopen( AGROUPS, "r" );
  879. X  if(fp == NULL){
  880. X    printf("%s ?", AGROUPS);
  881. X    exit(-1);
  882. X  }
  883. X
  884. X  ff = fopen( tmp, "w" );
  885. X  if(ff == NULL){
  886. X    printf("%s ?", tmp);
  887. X    exit(-1);
  888. X  }
  889. X
  890. X  while(fgets(f, 80, fp) != NULL){
  891. X    if(strcomp(s, f) == 0){
  892. X        fputs(t, ff);
  893. X    }
  894. X    else{
  895. X        fputs(f, ff);
  896. X    }
  897. X  }
  898. X  fclose(fp);
  899. X  fclose(ff);
  900. X
  901. X  sprintf(f, "mv %s %s", tmp, AGROUPS);
  902. X  system( f );
  903. X}
  904. X
  905. X
  906. X
  907. X
  908. X
  909. X/***************************************************************************/
  910. X/*      FUNKTION  main() (mb_daemon)                       */
  911. X/*  BESCHREIBUNG  Scannt einen bzw. alle NEWS-Artikel, um die INDEX-Files  */
  912. X/*          der ix/Mbox zu aktualisieren.                            */
  913. X/*     PARAMETER  argc  =  Anzahl der Parameter                            */
  914. X/*          argv  =  NG  = nur diese NG scannen                */
  915. X/*               ''  = alle NGs scannen                    */
  916. X/*     RUECKGABE  keine                                                    */
  917. X/***************************************************************************/
  918. X
  919. Xmain(argc, argv)
  920. Xint argc;
  921. Xunsigned char *argv[];
  922. X{
  923. X  FILE *fp;
  924. X  FILE *fa;
  925. X  FILE *fc;
  926. X  unsigned char s[STRING];
  927. X  unsigned char t[STRING];
  928. X  unsigned char d[STRING];
  929. X  unsigned char TMP_AGROUPS[STRING];
  930. X
  931. X  int a, b, i;
  932. X
  933. X  chdir(HOME);
  934. X
  935. X  setuid(0);
  936. X  setgid(0);
  937. X  umask(0000);
  938. X
  939. X  FLAG = 0;
  940. X  FASTMODE = 1;
  941. X
  942. X  sprintf(TMP_AGROUPS, "%s/ACTIVE.%d", TMP, getpid() );
  943. X
  944. X  if(argc > 1){
  945. X    FLAG++;
  946. X  }
  947. X  if(argc > 2){            /* MB-Daemon ruft MB-Daemon !!! */
  948. X    FLAG++; 
  949. X    FASTMODE = 0; 
  950. X  }
  951. X
  952. X  if(strcomp("all", argv[1]) == 0) FLAG = 0;
  953. X
  954. X#if 0
  955. X  if(argv[2][0] == '-'){    /* Index KOMPLETT neu bilden !!! */
  956. X    FASTMODE = 0;
  957. X  }
  958. X#endif
  959. X
  960. X  if(FLAG == 0){
  961. X    fa = fopen( TMP_AGROUPS, "w" );
  962. X    if(fa == NULL){
  963. X        printf("%s ???", TMP_AGROUPS);
  964. X        exit( 0 );
  965. X    }
  966. X  }
  967. X
  968. X#ifdef ADDRMODE
  969. X    ad = fopen( "/local/address/addresses", "a" );
  970. X    if(ad == NULL){
  971. X    printf("\n[local/address/addresses] ???\n");
  972. X    exit( 0 );    
  973. X    }
  974. X#endif
  975. X
  976. X  mb_gruppen = 0;
  977. X  mb_new = 0;
  978. X  mb_bytes = 0L;
  979. X  mb_new_bytes = 0L;
  980. X  mb_artikel = 0L;
  981. X
  982. X
  983. X  if (fp = fopen(NGROUPS, "r"))
  984. X  while (fscanf(fp, "%s %d %d %s", s, &a, &b, t) > 0) {
  985. X#ifdef _CNEWS
  986. X    if(t[0] == '=')
  987. X        continue;
  988. X#endif
  989. X    if(FLAG > 0){
  990. X        if(strcomp(argv[1], s) == 0){
  991. X            d[0] = '\0';
  992. X#ifdef _SYS7
  993. X            strcat(d, (unsigned char *) scan(s));
  994. X#else
  995. X            strcat(d, (unsigned char *) scan(&s));
  996. X#endif
  997. X            sprintf(t, "%s  %s  %ld\n", s, d, LASTTIME);
  998. X            if(FLAG < 2) mix( s, t );
  999. X        }
  1000. X    }
  1001. X    else{
  1002. X        d[0] = '\0';
  1003. X#ifdef _SYS7    
  1004. X        strcat(d, (unsigned char *) scan(s));
  1005. X#else    
  1006. X        strcat(d, (unsigned char *) scan(&s));
  1007. X#endif
  1008. X        fprintf(fa, "%s  %s  %ld\n", s, d, LASTTIME);
  1009. X    }
  1010. X  }
  1011. X  if(fp != 0) fclose(fp);
  1012. X
  1013. X  if(FLAG > 0){
  1014. X  }
  1015. X  else{
  1016. X     mb_bytes = (long)(mb_bytes / 1024);
  1017. X     mb_new_bytes = (long)(mb_new_bytes /1024);
  1018. X   
  1019. X     sprintf(d, "%s/%d.mbd", TMP, getpid());
  1020. X     fp = fopen( d, "w" );
  1021. X     fprintf(fp, "%s  %s    %6.d   %6.ld",
  1022. X                  mydate(1), mytime(1), mb_new, mb_new_bytes);
  1023. X     fprintf(fp, "%16.16s", " ");
  1024. X     fprintf(fp, "%6.d   %6.ld   %6.ld\n", mb_gruppen, mb_artikel, mb_bytes);
  1025. X
  1026. X     b = PRO_ENTRIES / 2; a = 0;
  1027. X
  1028. X     fc = fopen( MB_DLOG, "r" );
  1029. X     if(fc != 0){
  1030. X    while((fgets(s, STRING, fc) != 0) && (a < b)){
  1031. X        fputs(s, fp);
  1032. X        a++;
  1033. X    }
  1034. X    fclose(fc);
  1035. X     }
  1036. X     if(fp != 0) fclose(fp);
  1037. X
  1038. X     sprintf(s, "mv %s %s > /dev/null", d, MB_DLOG);
  1039. X     system(s);
  1040. X  } 
  1041. X
  1042. X  if((FASTMODE == 1) && (FLAG == 0)){
  1043. X    printf("%s %d %s %ld %s.\n", MBD03_MSG, mb_new, MBD04_MSG, 
  1044. X        mb_new_bytes, MBD05_MSG);
  1045. X    printf("%s %d %s %ld %s %ld %s.\n\n", 
  1046. X        MBD06_MSG, mb_gruppen, MBD07_MSG, mb_artikel, MBD08_MSG, 
  1047. X        mb_bytes, MBD09_MSG);
  1048. X  }
  1049. X
  1050. X
  1051. X#ifdef ADDRMODE
  1052. X  if(ad != 0) fclose(ad);
  1053. X#endif
  1054. X
  1055. X  if(FLAG == 0){
  1056. X    fflush(fa);
  1057. X    fclose(fa);
  1058. X    fp = fopen( TMP_AGROUPS, "r" );
  1059. X    if(fp == NULL){
  1060. X    }
  1061. X    fa = fopen( AGROUPS, "w" );
  1062. X    if(fa == NULL){
  1063. X    }
  1064. X    while(fgets(s, 80, fp) != 0){
  1065. X        fputs(s, fa);
  1066. X    }
  1067. X    fflush(fa);
  1068. X    fclose(fa);
  1069. X    fclose(fp);
  1070. X    unlink( TMP_AGROUPS );
  1071. X  }
  1072. X
  1073. X  return;
  1074. X}
  1075. X
  1076. X
  1077. END_OF_FILE
  1078.   if test 24038 -ne `wc -c <'src/mb-daemon.c'`; then
  1079.     echo shar: \"'src/mb-daemon.c'\" unpacked with wrong size!
  1080.   fi
  1081.   # end of 'src/mb-daemon.c'
  1082. fi
  1083. if test -f 'src/misc.c' -a "${1}" != "-c" ; then 
  1084.   echo shar: Will not clobber existing file \"'src/misc.c'\"
  1085. else
  1086.   echo shar: Extracting \"'src/misc.c'\" \(23300 characters\)
  1087.   sed "s/^X//" >'src/misc.c' <<'END_OF_FILE'
  1088. X/***************************************************************************/
  1089. X/*        PROGRAMM  ix/Mbox                           */
  1090. X/*             DATEI  misc.c                           */
  1091. X/*        FUNKTIONEN  scanner(), schreiben(), prf(), pruefe()           */
  1092. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1093. X/*  LETZTE AENDERUNG  26.09.1992                       */
  1094. X/***************************************************************************/
  1095. X
  1096. X#include <sys/types.h>
  1097. X#include <sys/stat.h>
  1098. X#include <unistd.h>
  1099. X#include <fcntl.h>
  1100. X#include <stdio.h>
  1101. X#include <utmp.h>
  1102. X#include <time.h>
  1103. X
  1104. X
  1105. X#include "mbox.h"
  1106. X
  1107. X
  1108. Xextern unsigned char headinfo[STRING];
  1109. X
  1110. X
  1111. Xint lastpoint( name )
  1112. Xunsigned char name[];
  1113. X{
  1114. X  int a = 0, b = 0;
  1115. X
  1116. X  while(name[a] != '\0'){
  1117. X    if(name[a] == '.') b = a;
  1118. X    a++;
  1119. X  }
  1120. X  if(b == 0) return a;
  1121. X
  1122. X  return (int) b;
  1123. X}
  1124. X
  1125. X
  1126. X/***************************************************************************/
  1127. X/*      FUNKTION  scanner()                              */
  1128. X/*  BESCHREIBUNG  Wechselt BRETTER. Bei "B +" bzw. "B -" wird die Aktual-  */
  1129. X/*          litaet nicht beruecksichtigt. In den anderen Modi        */
  1130. X/*          werden nur aktuelle Bretter angesprungen.                */
  1131. X/*     PARAMETER  mode  =  '> 255'  =  nicht nur aktuelle Bretter       */
  1132. X/*                   '> 500'  =  zur nexten AREA               */
  1133. X/*               '+'      =  aufwaerts springen           */
  1134. X/*               '-'      =  abwaerts springen           */
  1135. X/*     RUECKGABE  keine                                                       */
  1136. X/***************************************************************************/
  1137. X
  1138. Xvoid scanner(mode)
  1139. Xint mode;
  1140. X{
  1141. X  FILE *fp;
  1142. X  unsigned char s[STRING];
  1143. X  unsigned char t[STRING];
  1144. X  unsigned char f[STRING];
  1145. X  unsigned char prevg[STRING];
  1146. X  unsigned char prevf[STRING];
  1147. X  int ok = 0, a, b;
  1148. X  int line = 0, l = 0;
  1149. X  int locmod = 0;
  1150. X  int max = 0;
  1151. X  int widerange = 0;
  1152. X
  1153. X
  1154. X  if (mode >= 1000) {
  1155. X    widerange = 1000;
  1156. X    mode -= 1000;
  1157. X  }
  1158. X
  1159. X  if (mode >= 500) {
  1160. X    locmod = 500;
  1161. X    mode -= 500;
  1162. X  }
  1163. X
  1164. X  if (mode >= 255) {
  1165. X    locmod = 255;
  1166. X    mode -= 255;
  1167. X  }
  1168. X  KEIN_ZUGRIFF:
  1169. X
  1170. X  if (locmod == 255) {
  1171. X    maybe_locked(NGROUPS, "r");
  1172. X    fp = fopen(NGROUPS, "r");
  1173. X    if (fp == NULL) {
  1174. X        nerror("misc.c", 26, "scanner", "Datei-Lesefehler", NGROUPS);
  1175. X    }
  1176. X }
  1177. X  else {
  1178. X    maybe_locked(UGROUPS, "r");
  1179. X    fp = fopen(UGROUPS, "r");
  1180. X    if (fp == NULL) {
  1181. X        nerror("misc.c", 34, "scanner", "Datei-Lesefehler", UGROUPS);
  1182. X    }
  1183. X  }
  1184. X
  1185. X  f[0] = '\0';
  1186. X  ok = 0;
  1187. X  strcpy(prevg, "L.I.S.A.");
  1188. X
  1189. X  while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &a, t) > 0)) {
  1190. X    l++;
  1191. X    if (strcomp(NG, s) == 0) {
  1192. X        ok = 1;
  1193. X    }
  1194. X    else {
  1195. X        strcpy(f, (unsigned char *) s);
  1196. X    
  1197. X        if(strcomp(prevg, s) != 0){
  1198. X            if(widerange == 0){
  1199. X                  a = lastpoint( s );
  1200. X                strcpy(prevg, (unsigned char *) s);
  1201. X                strcpy(prevf, (unsigned char *) s);
  1202. X                prevg[a] = '\0';
  1203. X            }
  1204. X            else{
  1205. X                strcpy(prevg, (unsigned char *) s); prevg[3] = '\0';
  1206. X                strcpy(prevf, (unsigned char *) s);
  1207. X            }
  1208. X        }
  1209. X    }
  1210. X  }
  1211. X
  1212. X  if (locmod == 500) {
  1213. X    if (mode == '+') {
  1214. X        ok = 0;
  1215. X        
  1216. X        if(widerange == 0){
  1217. X            a = lastpoint( NG );
  1218. X            strcpy(prevg, (unsigned char *) NG);
  1219. X            prevg[a] = '\0';
  1220. X        }
  1221. X        else{
  1222. X            strcpy(prevg, (unsigned char *) NG);
  1223. X            prevg[3] = '\0';
  1224. X        }
  1225. X
  1226. X        while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &a, t) > 0)) {
  1227. X            l++;
  1228. X            if (strcomp(prevg, s) != 0) {
  1229. X                ok = 1;
  1230. X                strcpy(f, (unsigned char *) s);
  1231. X            }
  1232. X        }
  1233. X        if(ok == 0) line = -1;
  1234. X    }
  1235. X    if (mode == '-') {
  1236. X        strcpy(f, (unsigned char *) prevf);
  1237. X    }
  1238. X  }
  1239. X  else{
  1240. X      if (mode == '+') {
  1241. X        if (fscanf(fp, "%s %d %d %s", f, &a, &a, t) < 1) {
  1242. X            if (ok == 0) {
  1243. X                rewind(fp);
  1244. X                fscanf(fp, "%s %d %d %s", f, &a, &a, t);
  1245. X            }
  1246. X              else {
  1247. X                line = -1;
  1248. X            }
  1249. X        }
  1250. X      }
  1251. X      if (mode == '-') {
  1252. X        if (f[0] == '\0') {
  1253. X            rewind(fp);
  1254. X            while (fscanf(fp, "%s %d %d %s", f, &a, &a, t) > 0);
  1255. X        }
  1256. X      }
  1257. X  }    
  1258. X  fclose(fp);
  1259. X
  1260. X  if (max > 20) line = -1;
  1261. X
  1262. X  if ((line == -1) || (f[0] == '\0')) {
  1263. X    strcpy(BRETT, (unsigned char *) "PM");
  1264. X    printf("\n");
  1265. X    sprintf(NG, "%s.PM", USER.name);
  1266. X    sprintf(INHALT, "%s/usr/%d/INDEX", HOME, USER.id);
  1267. X    return;
  1268. X  }
  1269. X  if (l == 0) {
  1270. X    ansi("md");
  1271. X    printf(" %s\n", MIS01_MSG);
  1272. X    ansi("me");
  1273. X    return;
  1274. X  }
  1275. X  if (chk_newsgrp(f) != 0) {
  1276. X    sprintf(NG, "%s", f);
  1277. X    max++;
  1278. X    goto KEIN_ZUGRIFF;
  1279. X  }
  1280. X  brett(f);
  1281. X}
  1282. X
  1283. X
  1284. X
  1285. X
  1286. X
  1287. X/***************************************************************************/
  1288. X/*      FUNKTION  schreiben()                           */
  1289. X/*  BESCHREIBUNG  Artikel fuer NEWS einlesen und verteilen. Die Distri-    */
  1290. X/*          bution ist abhaengig von der NG und vom Userlevel.       */
  1291. X/*     PARAMETER  arg = DUMMY (!)                                          */
  1292. X/*     RUECKGABE  keine                                                       */
  1293. X/***************************************************************************/
  1294. X
  1295. Xvoid schreiben(arg)
  1296. Xunsigned char arg[];
  1297. X{
  1298. X  FILE *fp;
  1299. X  FILE *ff;
  1300. X  FILE *fl;
  1301. X  unsigned char s[STRING];
  1302. X  unsigned char t[STRING];
  1303. X  unsigned char f[STRING];
  1304. X  unsigned char g[LSTRING];
  1305. X  unsigned char ex[255];
  1306. X  unsigned char cmdl[STRING];
  1307. X  unsigned char rep[STRING];
  1308. X  unsigned char subj[STRING];
  1309. X  unsigned char keyw[STRING];
  1310. X  unsigned char summ[STRING];
  1311. X  unsigned char from[STRING];
  1312. X  unsigned char msid[STRING];
  1313. X  unsigned char refs[STRING];
  1314. X  unsigned char tmp[STRING];
  1315. X  unsigned char ng[STRING];
  1316. X  unsigned char reply[STRING];
  1317. X  unsigned char group[STRING];
  1318. X  unsigned char newsgroups[STRING];
  1319. X  unsigned char distribution[STRING];
  1320. X  unsigned char followup[STRING];
  1321. X  unsigned char expires[STRING];
  1322. X  unsigned char ctrl[STRING];
  1323. X  unsigned char sender[STRING];
  1324. X  unsigned char approved[STRING];
  1325. X  unsigned char content[STRING];
  1326. X  unsigned char iam[STRING];
  1327. X  unsigned char username[STRING];
  1328. X
  1329. X  int i, a, b, ok;
  1330. X  int app;
  1331. X
  1332. X  unsigned char protokoll = 0;
  1333. X  unsigned char c;
  1334. X  unsigned char lf;
  1335. X
  1336. X  int BINFILE;
  1337. X
  1338. X  struct stat fst;
  1339. X
  1340. X  unsigned char pubdir[STRING];
  1341. X  long tdummy;
  1342. X  long tn, ts;
  1343. X
  1344. X  if (strcomp(BRETT, "PM") == 0) {
  1345. X    ansi("md");
  1346. X    printf(" <- \"%s.PM\" %s\n\n", USER.name, MIS02_MSG);
  1347. X    ansi("me");
  1348. X    return;
  1349. X  }
  1350. X  BINFILE = 0;
  1351. X
  1352. X
  1353. X  i = 0;                /* Vorname.Name */
  1354. X  strcpy(ng, USER.name);
  1355. X  while (ng[i] != '\0') {
  1356. X    if (ng[i] == ' ') ng[i] = '.';
  1357. X    i++;
  1358. X  }
  1359. X  strcpy(username, ng);
  1360. X
  1361. X  strcpy(group, NG);
  1362. X
  1363. X
  1364. X  umask(0000);
  1365. X
  1366. X  if (arg[0] == '\0') {
  1367. X
  1368. X    subj[0] = '\0';
  1369. X    keyw[0] = '\0';
  1370. X    from[0] = '\0';
  1371. X    msid[0] = '\0';
  1372. X    summ[0] = '\0';
  1373. X    refs[0] = '\0';
  1374. X
  1375. X    sprintf(rep, "%s/%dRep", TMP, getpid());
  1376. X
  1377. X    fp = fopen(rep, "r");
  1378. X    if (fp != NULL) {        /* REPLY */
  1379. X        while ((fgets(s, 80, fp) != NULL) && (strlen(s) > 2)) {
  1380. X            if (strcomp("Subject:", s)   == 0) {
  1381. X                strcat(subj, strcopy(s, 8, 79));
  1382. X                strcpy(subj,  (unsigned char *) stripped(subj));                
  1383. X            }
  1384. X            if (strcomp("From:", s)      == 0) {
  1385. X                from[0] = '\0';
  1386. X                strcat(from, strcopy(s, 6, 79));
  1387. X                strcpy(from,  (unsigned char *) stripped(from));
  1388. X            }
  1389. X            if (strcomp("Reply-To:", s)  == 0) {
  1390. X                from[0] = '\0';
  1391. X                strcat(from, strcopy(s, 10, 79));
  1392. X                strcpy(from,  (unsigned char *) stripped(from));
  1393. X            }
  1394. X            if (strcomp("Keywords:", s)  == 0) {
  1395. X                strcat(keyw, strcopy(s, 10, 79));
  1396. X                strcpy(keyw,  (unsigned char *) stripped(keyw));
  1397. X            }
  1398. X            if (strcomp("Summary:", s)   == 0) {
  1399. X                strcat(summ, strcopy(s, 9, 79));
  1400. X                strcpy(summ,  (unsigned char *) stripped(summ));
  1401. X            }
  1402. X            if (strcomp("Message-ID:", s) == 0) {
  1403. X                strcat(msid, strcopy(s, 11, 79));
  1404. X                strcpy(msid,  (unsigned char *) stripped(msid));
  1405. X            }
  1406. X            if (strcomp("Content-Type:", s) == 0) {
  1407. X                strcat(content, strcopy(s, 14, 79));
  1408. X                strcpy(content,  (unsigned char *) stripped(content));
  1409. X            }
  1410. X            if (strcomp("Article-I.D.:", s) == 0) {
  1411. X                strcat(msid, strcopy(s, 13, 79));
  1412. X                strcpy(msid,  (unsigned char *) stripped(msid));
  1413. X            }
  1414. X            if (strcomp("References:", s) == 0) {
  1415. X                strcat(refs, strcopy(s, 12, 79));
  1416. X                strcpy(refs,  (unsigned char *) stripped(refs));
  1417. X            } 
  1418. X            if (strcomp("Followup-To:", s) == 0) {
  1419. X                strcpy(group, strcopy(s, 13, 79));
  1420. X                strcpy(group, (unsigned char *) stripped(group));
  1421. X            }
  1422. X        }
  1423. X        
  1424. X        if(strcomp("Poster", group) == 0){
  1425. X            printf(" <- %s\n", MIS02aMSG);
  1426. X            return;
  1427. X        }
  1428. X
  1429. X
  1430. X        sprintf(t, "%s/A%d", TMP, getpid());
  1431. X        ff = fopen(t, "w");
  1432. X
  1433. X        a = 0;
  1434. X        b = 0;
  1435. X        i = 0;
  1436. X        while (from[i] != '\0') {
  1437. X            if (from[i] == '(') a = i + 1;
  1438. X            if (from[i] == ')') b = i - 1;
  1439. X            i++;
  1440. X        }
  1441. X        if (a < b) {
  1442. X            strcpy(s, (unsigned char *) strcopy(from, a, b));
  1443. X            strcpy(from, (unsigned char *) s);
  1444. X        }
  1445. X        sprintf(ex, "In article %s,\n            %s writes:\n\n", msid, from);
  1446. X        fputs(ex, ff);
  1447. X        while (fgets(s, 80, fp) != NULL) {
  1448. X            if(s[0] != '\n') fputs("> ", ff);
  1449. X            fputs((unsigned char *) iso_line(s), ff);
  1450. X        }
  1451. X        fclose(fp);
  1452. X        fclose(ff);
  1453. X
  1454. X        sprintf(cmdl, "%s %s", EDDY, t);
  1455. X        printf("\n\n");
  1456. X        system(cmdl);
  1457. X        if (strcomp("Re:", subj) != 0) {
  1458. X            sprintf(f, "Re: %s", stripped(subj));
  1459. X            strcpy(subj, (unsigned char *) f);
  1460. X        }
  1461. X        unlink(rep);
  1462. X    }
  1463. X    else {        /* Interactive MAIL */
  1464. X
  1465. X        printf("\n\n%c", CR);
  1466. X        ansi("mr");
  1467. X        printf("%s", MIS03_MSG);
  1468. X        ansi("me");
  1469. X        printf(" %s (%s)\n%c", USER.name, USER.nick, CR);
  1470. X        ansi("mr");
  1471. X        printf("%s", MIS04_MSG);
  1472. X        ansi("me");
  1473. X        printf(" %s\n%c", NG, CR);
  1474. X        ansi("mr");
  1475. X        printf("%s", MIS05_MSG);
  1476. X        ansi("me");
  1477. X        printf(" ");
  1478. X        strcpy(subj, (unsigned char *) getline(57, -11, '.', ""));
  1479. X        printf("\n");
  1480. X        ansi("mr");
  1481. X        printf("%s", MIS06_MSG);
  1482. X        ansi("me");
  1483. X        printf(" ");
  1484. X        strcpy(keyw, (unsigned char *) getline(57, -11, '.', ""));
  1485. X        printf("\n");
  1486. X        ansi("mr");
  1487. X        printf("%s", MIS07_MSG);
  1488. X        ansi("me");
  1489. X        printf(" ");
  1490. X        strcpy(summ, (unsigned char *) getline(57, -11, '.', ""));
  1491. X
  1492. X        printf("\n\n");
  1493. X        ansi("mr");
  1494. X        printf("[%s] %s ? > ", NG, MIS08_MSG);
  1495. X        ansi("me");
  1496. X        printf("%c%c", MIS09_MSG, BS);
  1497. X
  1498. X        do {
  1499. X            c = getint();
  1500. X            if (c >= 97) c -= 32;
  1501. X            if (c == '?') {
  1502. X                clearline();
  1503. X                ansi("mr");
  1504. X                printf("%c%s > ", CR, MIS12_MSG);
  1505. X                ansi("me");
  1506. X            }
  1507. X            if (c == ENTER) c = MIS09_MSG;
  1508. X            if ((c != MIS09_MSG) && (c != MIS10_MSG) && (c != MIS11_MSG)) c = 0;
  1509. X        } while (c == 0);
  1510. X
  1511. X        printf("%c", c);
  1512. X
  1513. X        if (c == MIS11_MSG) {
  1514. X            printf("\n");
  1515. X            unlink(t);
  1516. X            return;
  1517. X        }
  1518. X        if (c == MIS10_MSG) {
  1519. X            printf("%c                                                                       ", CR);
  1520. X            ansi("mr");
  1521. X            printf("%c%s, ? > ", CR, MIS13_MSG);
  1522. X            ansi("me");
  1523. X
  1524. X            do {
  1525. X                protokoll = getint();
  1526. X                if (protokoll >= 97) protokoll -= 32;
  1527. X                if (protokoll == '?') {
  1528. X                    clearline();
  1529. X                    ansi("mr");
  1530. X                    printf("%c%s > ", CR, MIS14_MSG);
  1531. X                    ansi("me"); 
  1532. X                }
  1533. X                if ((protokoll != MIS15_MSG) && (protokoll != MIS15_MSG) &&
  1534. X                    (protokoll != MIS18_MSG) && (protokoll != MIS17_MSG ))
  1535. X                    protokoll = 0;
  1536. X            } while (protokoll == 0);
  1537. X
  1538. X            printf("%c", protokoll);
  1539. X
  1540. X        }
  1541. X        sprintf(tmp, "%s/A%d", TMP, getpid());
  1542. X        sprintf(cmdl, "%s %s", EDDY, tmp);
  1543. X        sprintf(pubdir, "%s/dir%d", TMP, getpid());
  1544. X
  1545. X        if (c == MIS09_MSG) {
  1546. X            noctrlx();
  1547. X            system(cmdl);
  1548. X            ctrlx();
  1549. X            protokoll = '*';
  1550. X        }
  1551. X        else {    /* UPLOAD */
  1552. X
  1553. X            printf("\n\n");
  1554. X            ansi("md");
  1555. X            printf("%s", MIS19_MSG);
  1556. X            ansi("me");
  1557. X
  1558. X            switch (protokoll) {
  1559. X                case MIS15_MSG:
  1560. X                    fp = fopen(tmp, "w");
  1561. X                    if (fp == NULL) {
  1562. X                        nerror("misc.c", 310, "schreiben", "DSF", tmp);
  1563. X                    }
  1564. X                    c = 0;
  1565. X                    lf = CR;
  1566. X                    fputc(LF, fp);
  1567. X
  1568. X                    while ((c != CTRL_X) && (c != CTRL_D)) {
  1569. X                        c = getint();
  1570. X                        if ((c == CR) && (lf == CR))
  1571. X                            fputc(LF, fp);
  1572. X                        if (c == CR) lf = CR;
  1573. X                        if (c == LF) lf = LF;
  1574. X                        if ((c != CTRL_X) && (c != CTRL_D) && (c != CR)) {
  1575. X                            fputc(c, fp);
  1576. X                        }
  1577. X                    }
  1578. X                    fclose(fp);
  1579. X                    break;
  1580. X                case MIS16_MSG:
  1581. X                    printf("\n");
  1582. X                    sprintf(s, "exec %s -bc TimeTravelAgency 2> /dev/null", RX);
  1583. X                    break;
  1584. X                case MIS17_MSG:
  1585. X                    printf("\n");
  1586. X                    sprintf(s, "exec %s -b 2> /dev/null", RB);
  1587. X                    break;
  1588. X                case MIS18_MSG:
  1589. X                    printf("\n");
  1590. X                    sprintf(s, "exec %s -b 2> /dev/null", RZ);
  1591. X                    break;
  1592. X            }
  1593. X            if (protokoll != MIS15_MSG){
  1594. X                mkdir( pubdir, 0777 );
  1595. X                chdir( pubdir );
  1596. X
  1597. X                time(&ts);
  1598. X                system( s );
  1599. X                time(&tn); tn = tn - ts;
  1600. X                tn -= 10;  /* 10 = "Toleranz" */
  1601. X    
  1602. X                chdir( HOME );
  1603. X                sprintf(s, "mv %s/* %s", pubdir, tmp);
  1604. X                system( s );
  1605. X                sprintf(s, "rm -r %s", pubdir);
  1606. X                system( s );
  1607. X            }
  1608. X            sync();
  1609. X            stat(tmp, &fst);
  1610. X            if (fst.st_size < 3L) {
  1611. X                printf("\n\n%s\n", MIS20_MSG);
  1612. X                control(MIS21_MSG, 3);
  1613. X                unlink(tmp);
  1614. X                return;
  1615. X            }
  1616. X            if (prf(tmp) == 1) {
  1617. X                if (strcomp(PDNG, NG) == 0) {
  1618. X                    USER.upratio += ((long) fst.st_size / 1024);
  1619. X                }
  1620. X                BINFILE++;
  1621. X                sprintf(s, MIS22_MSG);
  1622. X            }
  1623. X            else{
  1624. X                mkix(tmp);
  1625. X                sprintf(s, MIS23_MSG);
  1626. X            }
  1627. X            ansi( "md" );
  1628. X            printf("\n\n%ld %s %s %s.\n", fst.st_size, MIS24_MSG, s, MIS25_MSG);
  1629. X            ansi( "me" );
  1630. X            if(tn < 1) tn = 1L;
  1631. X            printf("%s %d cps (ca. %d bps).", MIS26_MSG,
  1632. X                (fst.st_size / tn), ((fst.st_size / tn) * 11));                
  1633. X        }
  1634. X    }
  1635. X
  1636. X    sprintf(iam, "%s <%s@%s>", USER.name, username, UUCPID);
  1637. X    sprintf(reply, "%s@%s (%s)", username, UUCPID, USER.name);
  1638. X    strcpy(newsgroups, group);
  1639. X    if (USER.level < WRITE_EX_LEV) {
  1640. X        strcpy(distribution, "local");
  1641. X    }
  1642. X    else {
  1643. X        /*
  1644. X        strcpy(ng, NG);
  1645. X        i = 0;
  1646. X        while ((ng[i] != '.') && (ng[i] != '\0')) i++;
  1647. X        ng[i] = '\0';
  1648. X        strcpy(distribution, ng);
  1649. X        */
  1650. X        strcpy(distribution, "world");
  1651. X    }
  1652. X    if(refs[0] != '\0') strcat(refs, " ");
  1653. X    strcat(refs, msid);    
  1654. X    followup[0] = '\0';
  1655. X    sender[0] = '\0';
  1656. X    ctrl[0] = '\0';
  1657. X    expires[0] = '\0';
  1658. X    approved[0] = '\0';
  1659. X    app = 0;
  1660. X    content[0] = '\0';    
  1661. X
  1662. X#if defined(_MULTIMEDIA) && defined(_UMLAUT)
  1663. X    strcpy(content, (unsigned char *) "text/plain; charset=iso-8859-1");
  1664. X#endif
  1665. X
  1666. X    ONCE_MORE:
  1667. X
  1668. X    printf("\n\n");
  1669. X    ansi("mr");
  1670. X    if(BINFILE == 0){
  1671. X        printf("[%s] %s, ? > ", NG, MIS27_MSG);
  1672. X    }
  1673. X    else{
  1674. X        printf("[%s] %s, ? > ", NG, MIS28_MSG);
  1675. X    }
  1676. X    ansi("me");
  1677. X    printf("%c%c", MIS29_MSG, BS);
  1678. X
  1679. X    do {
  1680. X        c = getint();
  1681. X        if (c >= 97) c -= 32;
  1682. X        if (c == '?') {
  1683. X            clearline();
  1684. X            ansi("mr");
  1685. X            if(BINFILE == 0){
  1686. X                printf("%c%s > ", CR, MIS32_MSG);
  1687. X            }
  1688. X            else{
  1689. X                printf("%c%s > ", CR, MIS33_MSG);
  1690. X            }
  1691. X            ansi("me");
  1692. X        }
  1693. X        if (c == ENTER) c = MIS29_MSG;
  1694. X        if ((c != MIS29_MSG) && (c != MIS30_MSG) && (c != MIS31_MSG) && (c != MIS31aMSG)) c = 0;
  1695. X    } while (c == 0);
  1696. X
  1697. X    printf("%c", c);
  1698. X    if (c == MIS30_MSG) {
  1699. X        unlink(f);
  1700. X        unlink(s);
  1701. X        unlink(t);
  1702. X        unlink(tmp); /* ??? */
  1703. X        unlink(rep);
  1704. X        printf("\n");
  1705. X        return;
  1706. X    }
  1707. X    if ((c == MIS31_MSG) && (BINFILE == 0)) {
  1708. X        noctrlx();
  1709. X        system(cmdl);
  1710. X        ctrlx();
  1711. X        goto ONCE_MORE;
  1712. X    }
  1713. X    if (c == MIS31aMSG) { /* HEADER */
  1714. X        headline( MIS38aMSG );
  1715. X        printf("\n");
  1716. X        time(&tdummy);
  1717. X
  1718. X        ansi( "md" );
  1719. X        printf("From: ");
  1720. X        ansi( "me" );
  1721. X        if(USER.level > ADMIN_LEV){
  1722. X            strcpy(s, (unsigned char *) getline(80, -1001, 32, iam));
  1723. X            if(strcomp(s, iam) != 0) app++;            
  1724. X            if(s[0] != '\0') strcpy(iam, s);
  1725. X            printf("\n");
  1726. X        }
  1727. X        else printf("%s\n", iam);
  1728. X
  1729. X        ansi( "md" );
  1730. X        printf("Reply-To: ");
  1731. X        ansi( "me" );
  1732. X        if(USER.level > GUEST_LEV){
  1733. X            strcpy(reply, (unsigned char *) getline(80, -1001, 32, reply));
  1734. X            printf("\n");
  1735. X        }
  1736. X        else printf("%s\n", reply);
  1737. X
  1738. X        ansi( "md" );
  1739. X        printf("Sender: ");
  1740. X        ansi( "me" );
  1741. X        if(USER.level >= ADMIN_LEV){
  1742. X            strcpy(sender, (unsigned char *) getline(80, -1001, 32, sender));
  1743. X            printf("\n");
  1744. X        }
  1745. X        else printf("%s\n", sender);    
  1746. X        
  1747. X        ansi( "md" );
  1748. X        printf("Control: ");
  1749. X        ansi( "me" );
  1750. X        if(USER.level >= ADMIN_LEV){
  1751. X            strcpy(ctrl, (unsigned char *) getline(80, -1001, 32, ctrl));
  1752. X            printf("\n");
  1753. X        }
  1754. X        else printf("%s\n", ctrl);    
  1755. X        
  1756. X        ansi( "md" );
  1757. X        printf("Approved: ");
  1758. X        ansi( "me" );
  1759. X        if(app != 0) sprintf(approved, "%s <%s@%s>", USER.name, username, UUCPID);
  1760. X        if(USER.level >= EXE_LEV){
  1761. X            strcpy(approved, (unsigned char *) getline(80, -1001, 32, approved));
  1762. X            printf("\n");
  1763. X        }
  1764. X        else printf("%s\n", approved);    
  1765. X    
  1766. X        ansi( "md" );
  1767. X        printf("Newsgroups: ");
  1768. X        ansi( "me" );
  1769. X        if(USER.level >= WRITE_EX_LEV){
  1770. X            strcpy(newsgroups, (unsigned char *) getline(80, -1001, 32, newsgroups));
  1771. X            printf("\n");
  1772. X            i = 0;
  1773. X            while(newsgroups[i] != '\0'){
  1774. X                if(newsgroups[i] == ' '){
  1775. X                    strcpy(s, (unsigned char *) newsgroups);
  1776. X                    newsgroups[i] = '\0';
  1777. X                    strcat(newsgroups, (unsigned char *) strcopy(s, (i+1), 80));
  1778. X                    i--;
  1779. X                }
  1780. X                i++;
  1781. X            }            
  1782. X        }
  1783. X        else printf("%s\n", newsgroups);    
  1784. X        
  1785. X        ansi( "md" );
  1786. X        printf("Distribution: ");
  1787. X        ansi( "me" );
  1788. X        if(USER.level >= WRITE_INTERNAT){
  1789. X            strcpy(distribution, (unsigned char *) getline(80, -1001, 32, distribution));
  1790. X            printf("\n");
  1791. X        }
  1792. X        else printf("%s\n", distribution);    
  1793. X        
  1794. X        ansi( "md" );
  1795. X        printf("Followup-To: ");
  1796. X        ansi( "me" );
  1797. X        if(USER.level >= WRITE_EX_LEV){
  1798. X            strcpy(followup, (unsigned char *) getline(80, -1001, 32, followup));
  1799. X            printf("\n");
  1800. X        }
  1801. X        else printf("%s\n", followup);    
  1802. X        
  1803. X        ansi( "md" );
  1804. X        printf("Subject: ");
  1805. X        ansi( "me" );
  1806. X        strcpy(subj, (unsigned char *) getline(80, -1001, 32, subj));
  1807. X
  1808. X        ansi( "md" );
  1809. X        printf("\nKeywords: ");
  1810. X        ansi( "me" );
  1811. X        strcpy(keyw, (unsigned char *) getline(80, -1001, 32, keyw));
  1812. X            
  1813. X        ansi( "md" );
  1814. X        printf("\nSummary: ");
  1815. X        ansi( "me" );
  1816. X        strcpy(summ, (unsigned char *) getline(80, -1001, 32, summ));
  1817. X
  1818. X#ifdef _MULTIMEDIA
  1819. X
  1820. X        if(USER.level >= WRITE_INTERNAT){
  1821. X            if(content[0] == '\0')
  1822. X                strcpy(content, (unsigned char *) "text/plain; charset=us-ascii");
  1823. X            ansi( "md" ); 
  1824. X            printf("\nContent-Type: ");
  1825. X            ansi( "me" );
  1826. X            strcpy(content, (unsigned char *) getline(80, -1001, 32, content));
  1827. X        }
  1828. X#endif
  1829. X
  1830. X        ansi( "md" );
  1831. X        printf("\nX-News-Reader: ");
  1832. X        ansi( "me" );
  1833. X            printf("%s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  1834. X
  1835. X        ansi( "md" );
  1836. X        printf("References: ");
  1837. X        ansi( "me" );
  1838. X        printf("%s\n", refs);
  1839. X        
  1840. X        ansi( "md" );
  1841. X        printf("Message-ID: ");
  1842. X        ansi( "me" );
  1843. X        printf("<%x.%d@%s>\n", tdummy, USER.id, UUCPID);
  1844. X        
  1845. X        ansi( "md" );
  1846. X        printf("Expires: ");
  1847. X        ansi( "me" );
  1848. X        if(USER.level >= WRITE_INTERNAT){
  1849. X            strcpy(expires, (unsigned char *) getline(80, -1001, 32, expires));
  1850. X            printf("\n");
  1851. X        }
  1852. X        else printf("%s\n", expires);    
  1853. X
  1854. X        goto ONCE_MORE;        
  1855. X    }
  1856. X
  1857. X    ansi( "md" );
  1858. X    printf("\n\n%s\n", MIS34_MSG);
  1859. X    ansi( "me" );
  1860. X
  1861. X    sprintf(f, "%s/A%d", TMP, getpid());
  1862. X    sprintf(t, "%s/B%d", TMP, getpid());
  1863. X
  1864. X    fp = fopen(f, "r");
  1865. X    if (fp == NULL) {
  1866. X        printf("\n");
  1867. X        ansi("md");
  1868. X        printf("%s ...\n", MIS35_MSG);
  1869. X        ansi("me");
  1870. X        control(MIS36_MSG, 3);
  1871. X        unlink(rep);
  1872. X        return;
  1873. X    }
  1874. X
  1875. X    ff = fopen(t, "w");
  1876. X
  1877. X    time(&tdummy);
  1878. X
  1879. X    fprintf(ff, "From: %s\n", iam);
  1880. X    if(reply[0] != '\0')
  1881. X        fprintf(ff, "Reply-To: %s\n", reply);
  1882. X    if(sender[0] != '\0')
  1883. X        fprintf(ff, "Sender: %s\n", sender);
  1884. X    if(approved[0] != '\0')
  1885. X        fprintf(ff, "Approved: %s\n", approved);
  1886. X    if(newsgroups[0] != '\0')
  1887. X        fprintf(ff, "Newsgroups: %s\n", newsgroups);
  1888. X    if(distribution[0] != '\0')
  1889. X        fprintf(ff, "Distribution: %s\n", distribution);
  1890. X    if(ctrl[0] != '\0')
  1891. X        fprintf(ff, "Control: %s\n", ctrl);
  1892. X    if(followup[0] != '\0')
  1893. X        fprintf(ff, "Followup-To: %s\n", followup);
  1894. X    if(subj[0] != '\0')
  1895. X        fprintf(ff, "Subject: %s\n", subj);
  1896. X    if(keyw[0] != '\0')
  1897. X        fprintf(ff, "Keywords: %s\n", keyw);
  1898. X    if(summ[0] != '\0')
  1899. X        fprintf(ff, "Summary: %s\n", summ);
  1900. X    if(content[0] != '\0'){
  1901. X        fprintf(ff, "Content-Type: %s\n", content);
  1902. X#ifdef _UMLAUT
  1903. X        fprintf(ff, "Content-Transfer-Encoding: 8bit\n");
  1904. X#endif
  1905. X    }
  1906. X    fprintf(ff, "X-News-Reader: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);
  1907. X    fprintf(ff, "Message-ID: <%x.%d@%s>\n", tdummy, USER.id, UUCPID);
  1908. X    if(expires[0] != '\0')
  1909. X        fprintf(ff, "Expires: %s\n", expires);
  1910. X    if(refs[0] != '\0')
  1911. X        fprintf(ff, "References: %s\n", refs);    
  1912. X    fputs("\n", ff);    
  1913. X    
  1914. X    if (BINFILE == 0) {
  1915. X        UMLAUT_MODUS = 1;
  1916. X        while (fgets(s, 80, fp) != 0) {
  1917. X            fputs((unsigned char *) iso_line(s), ff);
  1918. X        }
  1919. X    }
  1920. X    else {
  1921. X        time(&tdummy);
  1922. X        fputs("BINFILE\n", ff);
  1923. X        sprintf(s, "%s/PD.%d", BRETT, tdummy);
  1924. X        fputs(s, ff);
  1925. X        sprintf(f, "cp %s %s &", tmp, s);
  1926. X        system(f);
  1927. X        sprintf(s, "\n/public/pd/%s\n", subj);
  1928. X        fputs(s, ff);
  1929. X        fl = fopen( PDSCRIPT, "a" );
  1930. X        fprintf(fl, "mv %s/PD.%d /public/pd/%s\n", BRETT, tdummy, subj);
  1931. X        fclose(fl);
  1932. X    }
  1933. X    fclose(fp);
  1934. X    unlink(f);
  1935. X
  1936. X    unlink(rep);
  1937. X
  1938. X    if ((USER.level > WRITE_IN_LEV) && (BINFILE == 0)) {
  1939. X        sprintf(s, "%s/usr/%d/.signature", HOME, USER.id);
  1940. X        fp = fopen(s, "r");
  1941. X        if (fp != NULL) {
  1942. X            while (fgets(s, 80, fp) != 0) {
  1943. X                fputs((unsigned char *) iso_line(s), ff);
  1944. X            }
  1945. X            fclose(fp);
  1946. X        }
  1947. X    }
  1948. X    fclose(ff);
  1949. X
  1950. X    UMLAUT_MODUS = USER.schluessel[2];
  1951. X
  1952. X    sprintf(ex, "/bin/sh ./etc/inews.sh %s %s", NG, t);
  1953. X    system(ex);
  1954. X
  1955. X    unlink(t);
  1956. X
  1957. X    sprintf(s, "%s \"%s\" %s", MIS37_MSG, NG, MIS38_MSG);
  1958. X    control(s, 3);
  1959. X
  1960. X    
  1961. X    if(BINFILE != 0){
  1962. X        maybe_locked(NGROUPS, "r");
  1963. X        fp = fopen(NGROUPS, "r");
  1964. X        if (fp == NULL) {
  1965. X            nerror("misc.c", 895, "schreiben", "Datei-Lesefehler", NGROUPS);
  1966. X        }
  1967. X
  1968. X        ok = 0;
  1969. X
  1970. X            while ((ok == 0) && (fscanf(fp, "%s %d %d %s", s, &a, &b, f) > 0)) {
  1971. X            if(strcomp(NG, s) == 0){
  1972. X                i = a;
  1973. X                ok = 1;
  1974. X            }
  1975. X         }
  1976. X        fclose(fp);
  1977. X
  1978. X        fl = fopen( PDSCRIPT, "a" );
  1979. X        fprintf(fl, "mined %s/%d\n", BRETT, i); 
  1980. X        fprintf(fl, "#%s   %s\n\n", NG, USER.name);
  1981. X        fclose(fl);
  1982. X    }
  1983. X
  1984. X    printf("%s", MIS39_MSG);
  1985. X
  1986. X#ifndef _SYS7
  1987. X    sleep(30);    /* Scheinbar laeuft INEWS bei SYSV im Hintergrund */
  1988. X#endif
  1989. X
  1990. X    sprintf(s, "%s %s", MB_DAEMON, group);
  1991. X    system(s);
  1992. X    unlink(tmp);
  1993. X    printf("\n");
  1994. X  }
  1995. X  else {
  1996. X    ansi("md");
  1997. X    printf(" %s\n\n", MIS40_MSG);
  1998. X    ansi("me");
  1999. X  }
  2000. X  umask(0007);
  2001. X
  2002. X  /*              
  2003. X
  2004. X  Better not use the following! It's a not yet complete implemented
  2005. X  new feature - the beginning of a threated NEWSREADER...
  2006. X
  2007. X  sprintf(s, "%s/usr/%d/.dis", HOME, USER.id);
  2008. X  fp = fopen(s, "a");
  2009. X  fprintf(fp, "%-32.32s %-21.21s  %x.%d  %s\n", NG, subj, tdummy, USER.id, (unsigned char *) mydate( 0 )); 
  2010. X  fclose(fp);
  2011. X  */  
  2012. X
  2013. X}
  2014. X
  2015. X
  2016. X
  2017. X
  2018. X
  2019. X/***************************************************************************/
  2020. X/*      FUNKTION  prf()                               */
  2021. X/*  BESCHREIBUNG  Stellt fest, ob eine Datei (die per UPLOAD empfangen     */
  2022. X/*          wurde) einen Text oder ein ausfuehrbares Programm ent-   */
  2023. X/*          haelt.                                                   */
  2024. X/*     PARAMETER  arg  =  Dateiname                                        */
  2025. X/*     RUECKGABE  0    =  Text-Datei                                       */
  2026. X/*          1    =  Ausfuehrbares Programm               */
  2027. X/***************************************************************************/
  2028. X
  2029. Xint prf(arg)
  2030. Xunsigned char arg[];
  2031. X{
  2032. X  FILE *fp;
  2033. X  unsigned char ex[255];
  2034. X  int i, a;
  2035. X
  2036. X  fp = fopen(arg, "r");
  2037. X  if (fp == NULL) return -1;
  2038. X  while ((fgets(ex, 250, fp) != NULL) && (strlen(ex) < 30));
  2039. X  fclose(fp);
  2040. X
  2041. X  i = 0;
  2042. X  a = 0;
  2043. X  while (ex[i] != '\0') {
  2044. X    if ((ex[i] < 32) || (ex[i] > 127)) a++;
  2045. X    i++;
  2046. X  }
  2047. X  if (a > 3) return 1;        /* BINFILE */
  2048. X
  2049. X  return 0;            /* TEXTFILE */
  2050. X}
  2051. X
  2052. X
  2053. X
  2054. X
  2055. X/***************************************************************************/
  2056. X/*      FUNKTION  pruefe()                            */
  2057. X/*  BESCHREIBUNG  Stellt fest, ob eine Datei aus den News-Artikeln die     */
  2058. X/*          Kennung "BINFILE" enthaelt. Faellt die Antwort positiv   */
  2059. X/*          aus, wird die Routine "pd()" aufgerufen.           */
  2060. X/*     PARAMETER  arg  =  Nummer des Artikels                              */
  2061. X/*     RUECKGABE  0    =  Text-Datei                                       */
  2062. X/*                1    =  BINFILE                       */
  2063. X/***************************************************************************/
  2064. X
  2065. Xint pruefe(arg)
  2066. Xunsigned char arg[];
  2067. X{
  2068. X  FILE *fp;
  2069. X  unsigned char ex[255];
  2070. X  unsigned char s[STRING];
  2071. X  unsigned char entry[STRING];
  2072. X  unsigned char keywds[STRING];
  2073. X
  2074. X  if ((arg[0] == '\0') || (arg[0] == '*')) return -1;
  2075. X
  2076. X  if (strcomp(BRETT, "PM") != 0) {
  2077. X    sprintf(entry, "%s/%s", BRETT, arg);
  2078. X  }
  2079. X  else {
  2080. X    sprintf(entry, "%s/usr/%d/%s", HOME, USER.id, arg);
  2081. X  }
  2082. X
  2083. X  keywds[0] = '\0';
  2084. X
  2085. X  fp = fopen(entry, "r");
  2086. X  if (fp == NULL) return -1;
  2087. X
  2088. X  while ((fgets(ex, 250, fp) != NULL) && (ex[0] > 32)){
  2089. X    if(strcomp("Keywords: ", ex) == 0){
  2090. X        ex[80] = '\0';
  2091. X        strcpy(keywds, strcopy(ex, 10, 80));
  2092. X    }
  2093. X  }
  2094. X
  2095. X  while ((fgets(ex, 250, fp) != NULL) && (ex[0] < 32));
  2096. X
  2097. X  if (strcomp("BINFILE", ex) == 0) {
  2098. X    fgets(s, 80, fp);
  2099. X    fclose(fp);
  2100. X    pd(s, keywds);
  2101. X    return 1;
  2102. X  }
  2103. X  fclose(fp);
  2104. X
  2105. X  return 0;
  2106. X}
  2107. X
  2108. X
  2109. X
  2110. X
  2111. X
  2112. X
  2113. END_OF_FILE
  2114.   if test 23300 -ne `wc -c <'src/misc.c'`; then
  2115.     echo shar: \"'src/misc.c'\" unpacked with wrong size!
  2116.   fi
  2117.   # end of 'src/misc.c'
  2118. fi
  2119. if test -f 'src/uptodate.c' -a "${1}" != "-c" ; then 
  2120.   echo shar: Will not clobber existing file \"'src/uptodate.c'\"
  2121. else
  2122.   echo shar: Extracting \"'src/uptodate.c'\" \(2961 characters\)
  2123.   sed "s/^X//" >'src/uptodate.c' <<'END_OF_FILE'
  2124. X/***************************************************************************/
  2125. X/*          PROGRAMM  ix/Mbox                                              */
  2126. X/*             DATEI  update.c                                             */
  2127. X/*        FUNKTIONEN  uptodate()                                           */
  2128. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)                 */
  2129. X/*  LETZTE AENDERUNG  16.03.1993                                           */
  2130. X/***************************************************************************/
  2131. X
  2132. X#include <stdio.h>
  2133. X
  2134. X#include "mbox.h"
  2135. X
  2136. X/*
  2137. X    WARNING! This part of the ix/MBox automagically generates an
  2138. X        update-request every month. This request is sent to "unnet!mbox"
  2139. X        in germany.
  2140. X
  2141. X        If there are any bugfixes, infosheets etc., you'll get them
  2142. X        via mailserver as an reply to the update-request.
  2143. X
  2144. X        The update-request includes some informations about your BBS:
  2145. X        name, uucp-address, sysops name, number of accounts&caller etc. ...
  2146. X
  2147. X        Maybe this data will be used to build reference-lists or will
  2148. X        be mentioned in infosheets.
  2149. X
  2150. X        If you don't want|like that, please change the following
  2151. X        defines!!! 
  2152. X*/
  2153. X
  2154. X#define NO_UPDATE    0    /* 1 means: absolutly no update-requests */
  2155. X#define NO_DETAILS    0    /* 1 means: don't send any data             */
  2156. X
  2157. X
  2158. X
  2159. Xuptodate()
  2160. X{
  2161. X
  2162. X#if !NO_UPDATE
  2163. X
  2164. X  FILE *fp;
  2165. X  
  2166. X  char s[STRING];
  2167. X  char t[STRING];
  2168. X  char d[STRING];
  2169. X
  2170. X  int accounts;
  2171. X  int calls;
  2172. X  int month;
  2173. X
  2174. X
  2175. X  if(USER.level < WRITE_EX_LEV) return;
  2176. X
  2177. X  strcpy(d, (unsigned char *) mydate( 1 ));
  2178. X  month = atoi(strcopy(d, 3, 4));
  2179. X  sprintf(s, "%s/etc/uptodate.%d", HOME, month);
  2180. X  fp = fopen(s, "r");
  2181. X  if(fp != NULL){
  2182. X    fclose(fp);
  2183. X    return;
  2184. X  }
  2185. X  fp = fopen(s, "w");
  2186. X  fprintf(fp, "Update requested: %s at %s", mydate( 1 ), mytime( 0 )); 
  2187. X  fclose(fp);
  2188. X
  2189. X  if(month == 1) month = 13;
  2190. X  month--;
  2191. X
  2192. X  sprintf(s, "%s/etc/uptodate.%d", HOME, month);
  2193. X  unlink( s );
  2194. X
  2195. X  sprintf(s, "%s/etc/users.seq", HOME);
  2196. X  fp = fopen(s, "r");
  2197. X  fgets(s, 80, fp);
  2198. X  fclose(fp);
  2199. X  accounts = atoi(s);
  2200. X
  2201. X  sprintf(s, "%s/etc/mbox.seq", HOME);
  2202. X  fp = fopen(s, "r");
  2203. X  fgets(s, 80, fp);
  2204. X  fclose(fp);
  2205. X  calls = atoi(s);
  2206. X
  2207. X  sprintf(s, "%s/usr/%d/.lastletter", HOME, USER.id);
  2208. X  fp = fopen(s, "w"); 
  2209. X  fprintf(fp, "This is %s %s, on <%s>!\n\n", VERSION, PATCHLEVEL, UUCPID1);
  2210. X
  2211. X#if !NO_DETAILS
  2212. X  fprintf(fp, "My sysop %s of %s\n", POSTMASTER, ORGANIZATION);
  2213. X  fprintf(fp, "wants update patches, infosheets and so on ...\n\n");
  2214. X  fprintf(fp, "Our systems' called \"%s\",\n", SYSTEM);
  2215. X  fprintf(fp, "and we joggle around with %d users (%d calls) at this moment.\n\n", accounts, calls);
  2216. X#endif /* NO_DETAILS */
  2217. X
  2218. X  fprintf(fp, "If you can't reach us, call <%s> or <%s> ...\n\n", UUCPID2, SMARTHOST);
  2219. X  fclose(fp);
  2220. X
  2221. X  sprintf(s, "%s/usr/%d/.lastsubject", HOME, USER.id);
  2222. X  fp = fopen(s, "w");
  2223. X  fprintf(fp, "UPDATE-RQ <%s>", UUCPID1);
  2224. X  fclose(fp);
  2225. X
  2226. X  brief( "mbox@unnet.w.open.DE?" );
  2227. X
  2228. X#endif    /* NO_UPDATE */
  2229. X
  2230. X}
  2231. X
  2232. END_OF_FILE
  2233.   if test 2961 -ne `wc -c <'src/uptodate.c'`; then
  2234.     echo shar: \"'src/uptodate.c'\" unpacked with wrong size!
  2235.   fi
  2236.   # end of 'src/uptodate.c'
  2237. fi
  2238. echo shar: End of archive 6 \(of 15\).
  2239. cp /dev/null ark6isdone
  2240. MISSING=""
  2241. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2242.     if test ! -f ark${I}isdone ; then
  2243.     MISSING="${MISSING} ${I}"
  2244.     fi
  2245. done
  2246. if test "${MISSING}" = "" ; then
  2247.     echo You have unpacked all 15 archives.
  2248.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2249. else
  2250.     echo You still must unpack the following archives:
  2251.     echo "        " ${MISSING}
  2252. fi
  2253. exit 0
  2254. exit 0 # Just in case...
  2255.