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

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de (Volker Schuermann)
  3. Subject: v35i044:  mbox - ix/Mbox, A BBS for UNIX and MINIX v1.6 PL10j7, Part09/15
  4. Message-ID: <1993Feb5.185815.10481@sparky.imd.sterling.com>
  5. X-Md4-Signature: 858339a0c6b9f11dc461d16061300e36
  6. Date: Fri, 5 Feb 1993 18:58:15 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 44
  11. Archive-name: mbox/part09
  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:  etc/logo~ src/portinfo.c src/proto.h src/show.c src/xmd.c
  20. # Wrapped by kent@sparky on Fri Feb  5 12:18:10 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 9 (of 15)."'
  24. if test -f 'etc/logo~' -a "${1}" != "-c" ; then 
  25.   echo shar: Will not clobber existing file \"'etc/logo~'\"
  26. else
  27.   echo shar: Extracting \"'etc/logo~'\" \(243 characters\)
  28.   sed "s/^X//" >'etc/logo~' <<'END_OF_FILE'
  29. X
  30. X
  31. X
  32. Xooo o o ooo   ooo o ooo ooo   ooo oo   o  o o ooo o      o  oo  ooo ooo ooo o o
  33. X o  ooo oo     o  o ooo oo     o  ooo ooo o o oo  o     ooo o o oo  ooo o    o
  34. X o  o o ooo    o  o o o ooo    o  o o o o  o  ooo ooo   o o ooo ooo ooo ooo  o
  35. X
  36. X
  37. END_OF_FILE
  38.   if test 243 -ne `wc -c <'etc/logo~'`; then
  39.     echo shar: \"'etc/logo~'\" unpacked with wrong size!
  40.   fi
  41.   # end of 'etc/logo~'
  42. fi
  43. if test -f 'src/portinfo.c' -a "${1}" != "-c" ; then 
  44.   echo shar: Will not clobber existing file \"'src/portinfo.c'\"
  45. else
  46.   echo shar: Extracting \"'src/portinfo.c'\" \(15712 characters\)
  47.   sed "s/^X//" >'src/portinfo.c' <<'END_OF_FILE'
  48. X/***************************************************************************/
  49. X/*        PROGRAMM  ix/Mbox                           */
  50. X/*             DATEI  portinfo.c                       */
  51. X/*        FUNKTIONEN  port(), show_level(), userliste(), finger()       */
  52. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  53. X/*  LETZTE AENDERUNG  31.12.1992                       */
  54. X/***************************************************************************/
  55. X#include <sys/types.h>
  56. X#include <sys/stat.h>
  57. X#include <fcntl.h>
  58. X#include <unistd.h>
  59. X#include <stdio.h>
  60. X#include <utmp.h>
  61. X#include <time.h>
  62. X
  63. X#include <string.h>
  64. X
  65. X#include "mbox.h"
  66. X
  67. X
  68. X
  69. X
  70. X/***************************************************************************/
  71. X/*      FUNKTION  port()                           */
  72. X/*  BESCHREIBUNG  Anzeigen was die Mbox- und die SH-User z. Zt. anstellen. */
  73. X/*     PARAMETER  keine                                                       */
  74. X/*     RUECKGABE  keine                                                       */
  75. X/***************************************************************************/
  76. X
  77. Xvoid port(arg)
  78. Xunsigned char arg[];
  79. X{
  80. X  FILE *fp;
  81. X  FILE *ff;
  82. X  FILE *pp;
  83. X  int fd;
  84. X  unsigned char s[STRING];
  85. X  unsigned char t[STRING];
  86. X  unsigned char ks[STRING];
  87. X  unsigned char ls[STRING];
  88. X  unsigned char tmp[STRING];
  89. X  unsigned char ex[255];
  90. X  unsigned char terms[MAX_TERMINALS][STRING];
  91. X  int termc = 0;
  92. X  int a, b, k, l;
  93. X  struct utmp US;
  94. X  struct tm *tmt;
  95. X  long ltime;
  96. X  
  97. X
  98. X  if(arg[0] != '-'){
  99. X    headline( POR01_MSG );
  100. X  }
  101. X  else printf("\n\n");
  102. X
  103. X  printf("%s\n", POR02_MSG);
  104. X  printf("===============================================================================\n");
  105. X
  106. X  printf("%s ", POR03_MSG);
  107. X
  108. X  maybe_locked(WHO, "r");
  109. X  fp = fopen(WHO, "r");
  110. X  if (fp == NULL) {
  111. X    nerror("portinfo.c", 56, "port", "Datei-Lesefehler", WHO);
  112. X  }
  113. X  while (fgets(s, 80, fp) != NULL) {
  114. X    printf(".");
  115. X    if(s[0] > 32){
  116. X        strcpy(t, (unsigned char *) strcopy(s, 9, 37));
  117. X        sprintf(terms[termc], "%s  ", t);
  118. X        strcpy(t, (unsigned char *) strcopy(s, 37, 80));
  119. X        strcat(terms[termc], t);
  120. X        strcat(terms[termc], "                 ");
  121. X        terms[termc][56] = '\0';
  122. X        sprintf(t, "%s", (unsigned char *) strcopy(s, 37, 49));
  123. X
  124. X        sprintf(s, "%s/etc/%s.", HOME, (unsigned char *) stripped(t));
  125. X        ff = fopen(s, "r");
  126. X        if (ff == NULL) {
  127. X            continue;
  128. X        }
  129. X        fgets(s, 80, ff);
  130. X        s[23] = '\0';
  131. X        fclose(ff);
  132. X        strcat(terms[termc], s);
  133. X        strcat(terms[termc], "\n");
  134. X        termc++;
  135. X    }
  136. X  }
  137. X  fclose(fp);
  138. X
  139. X  sprintf(tmp, "%s/%dps", TMP, getpid());
  140. X  sprintf(s, "ps -a > %s", tmp);
  141. X  system( s );
  142. X
  143. X#ifdef _SYS7
  144. X  maybe_locked(UTMP, "r");
  145. X  fd = open(UTMP, O_RDONLY);
  146. X#else
  147. X  maybe_locked(UTMP_FILE, "r");
  148. X  fd = open(UTMP_FILE, O_RDONLY);
  149. X#endif
  150. X
  151. X  if (fd == -1) {
  152. X
  153. X#ifdef _SYS7
  154. X    nerror("portinfo.c", 83, "port", "Datei-Lesefehler", UTMP);
  155. X#else
  156. X    nerror("portinfo.c", 83, "port", "Datei-Lesefehler", UTMP_FILE);
  157. X#endif
  158. X
  159. X  }
  160. X  while (read(fd, (unsigned char *) &US, sizeof(US)) == sizeof(US)) {
  161. X
  162. X    printf(".");
  163. X    t[0] = '\0';
  164. X    strcat(t, "[$] -\n");
  165. X
  166. X    if (US.ut_type == USER_PROCESS) {
  167. X        terms[termc][0] = '\0';
  168. X        sprintf(ex, "%.8s [SH-Account]                                                  ",
  169. X            US.ut_user);
  170. X        ex[33] = '\0';
  171. X        strcat(terms[termc], ex);
  172. X
  173. X        sprintf(ex, "%8.8s   ",
  174. X            US.ut_line);
  175. X        strcat(terms[termc], ex);
  176. X
  177. X        ltime = US.ut_time;
  178. X        tmt = localtime(<ime);
  179. X        sprintf(ex, "%02.2d:%02.2d   ",
  180. X            tmt->tm_hour, tmt->tm_min);
  181. X        strcat(terms[termc], ex);
  182. X
  183. X        l = atoi(strcopy(US.ut_line, 3, 6));
  184. X
  185. X        pp = fopen(tmp, "r");
  186. X        if (pp == NULL) {
  187. X            nerror("portinfo.c", 113, "port", tmp, "???");
  188. X        }
  189. X        while (fgets(s, 80, pp) != NULL) {
  190. X            k = atoi((unsigned char *) strcopy(s, 8, 10));
  191. X            if ((k == l) && (s[17] != '-')) {
  192. X                t[0] = '\0';
  193. X                strcat(t, "[$] ");
  194. X                strcat(t, (unsigned char *) strcopy(s, 17, 40));
  195. X                s[0] = '\0';
  196. X                strcat(s, t);
  197. X                t[0] = '\0';
  198. X                strcat(t, (unsigned char *) stripped(s));
  199. X                t[27] = '\0';
  200. X                strcat(t, "\n");
  201. X            }
  202. X        }
  203. X        fclose(pp);
  204. X
  205. X        strcat(terms[termc], t);
  206. X        termc++;
  207. X    }
  208. X  }
  209. X  close(fd);
  210. X
  211. X  unlink(tmp);
  212. X
  213. X  printf("%c", CR);
  214. X
  215. X  for (a = 0; a < termc; a++) {
  216. X    for (b = 0; b < termc; b++) {
  217. X        sprintf(ks, "%s", (unsigned char *) strcopy(terms[a], 34, 40));
  218. X        sprintf(ls, "%s", (unsigned char *) strcopy(terms[b], 34, 40));
  219. X        if((strcomp(ks, ls) == 0) && (a != b)){
  220. X            if (terms[a][53] == '$') terms[a][0] = '*';
  221. X            if (terms[b][53] == '$') terms[b][0] = '*';
  222. X        }
  223. X        sprintf(s, "%d", ks); k = atoi(s);
  224. X        sprintf(s, "%d", ls); l = atoi(s);
  225. X        if (k < l) {
  226. X            s[0] = '\0';
  227. X            strcat(s, terms[a]);
  228. X            terms[a][0] = '\0';
  229. X            strcat(terms[a], terms[b]);
  230. X            terms[b][0] = '\0';
  231. X            strcat(terms[b], s);
  232. X        }
  233. X    }
  234. X  }
  235. X
  236. X
  237. X  for (a = 0; a < termc; a++) {
  238. X    if (terms[a][0] != '*'){
  239. X        if(terms[a][53] != '$') ansi( "md" );
  240. X        printf("%s", terms[a]);
  241. X        if(terms[a][53] != '$') ansi( "me" );
  242. X    }
  243. X  }
  244. X
  245. X  printf("\n");
  246. X}
  247. X
  248. X
  249. X
  250. X
  251. X
  252. X/***************************************************************************/
  253. X/*      FUNKTION  show_level()                           */
  254. X/*  BESCHREIBUNG  Zuweisung der Userlevel anzeigen.               */
  255. X/*     PARAMETER  keine                                                       */
  256. X/*     RUECKGABE  keine                                                       */
  257. X/***************************************************************************/
  258. X
  259. Xvoid show_level()
  260. X{
  261. X  headline( POR04_MSG );
  262. X  printf("\n");
  263. X
  264. X  printf("%s\n", POR05_MSG);
  265. X  printf("-----------------------------------------\n");
  266. X  printf("%s (%d)\n", POR06_MSG, GUEST_LEV);
  267. X  printf("%s (%d)\n", POR07_MSG, WRITE_IN_LEV);
  268. X  printf("%s (%d)\n", POR08_MSG, MAILOUT_LEV);
  269. X  printf("%s (%d)\n", POR09_MSG, WRITE_EX_LEV);
  270. X  printf("%s (%d)\n", POR10_MSG, WRITE_INTERNAT);
  271. X  printf("%s (%d)\n", POR11_MSG, PD_D_LEV);
  272. X  printf("%s (%d)\n", POR12_MSG, PD_U_LEV);
  273. X  printf("%s (%d)\n", POR13_MSG, EXE_LEV);
  274. X  printf("%s (%d)\n", POR14_MSG, ADMIN_LEV);
  275. X
  276. X  printf("\n%s (%d), %s !\n\n", POR15_MSG, USER.level, USER.name);
  277. X
  278. X}
  279. X
  280. X
  281. X
  282. X/***************************************************************************/
  283. X/*      FUNKTION  userliste()                           */
  284. X/*  BESCHREIBUNG  Verschieden Formen der Userliste ausgeben.           */
  285. X/*     PARAMETER  arg  =  ''   =  nur Username und ID                      */
  286. X/*              '*'  =  Name, letzter Anruf etc.                 */
  287. X/*              '#'  =  Name, Up- / Downloads               */
  288. X/*              '$'  =  Gebuehren-Stand               */
  289. X/*              '%'  =  Level & Bretter               */
  290. X/*     RUECKGABE  keine                                                       */
  291. X/***************************************************************************/
  292. X
  293. Xvoid userliste(arg)
  294. Xunsigned char arg[];
  295. X{
  296. X  FILE *fp;
  297. X  int fd;
  298. X  struct userdaten LOOSER;
  299. X  unsigned char s[STRING];
  300. X  unsigned char u[(STRING*2)];
  301. X  unsigned char tmp[STRING];
  302. X  unsigned char t[STRING];
  303. X  int i = 0, l, z;
  304. X  int mode = 0;
  305. X  int totalusr = 0;
  306. X  int totalact = 0;
  307. X  int totalgas = 0;
  308. X
  309. X  unsigned char c;
  310. X
  311. X  if (arg[0] == '*') mode = 1;
  312. X  if ((arg[0] == '#') && (USER.level >= ADMIN_LEV)) mode = 2;
  313. X  if ((arg[0] == '$') && (USER.level >= ADMIN_LEV)) mode = 3;
  314. X  if (arg[0] == '%') mode = 4;
  315. X  if ((arg[0] > 47) && (mode == 0)){
  316. X    finger(arg);
  317. X    return;
  318. X  }
  319. X  headline( POR15aMSG );
  320. X
  321. X  show(UDBASE, 99, 99); /* RESET */
  322. X
  323. X  if (mode == 1) {
  324. X    printf("%s\n", POR16_MSG);    
  325. X    printf("===============================================================================\n");
  326. X    printf("%s", POR17_MSG);
  327. X  }
  328. X  if (mode == 2) {
  329. X    printf("%s\n", POR18_MSG);    
  330. X    printf("===============================================================================\n");
  331. X    printf("%s", POR17_MSG);
  332. X  }
  333. X  if (mode == 3) {
  334. X        printf("%s\n", POR18aMSG);    
  335. X    printf("===============================================================================\n");
  336. X    printf("%s", POR17_MSG);
  337. X  }
  338. X  if (mode == 4) {
  339. X        printf("%s\n", POR18bMSG);    
  340. X    printf("===============================================================================\n");
  341. X    printf("%s", POR17_MSG);
  342. X  }
  343. X
  344. X  sprintf(tmp, "%s/%d", TMP, getpid());
  345. X  fp = fopen(tmp, "w");
  346. X  if (fp == NULL) {
  347. X    nerror("portinfo.c", 231, "userliste", "Datei-Schreibfehler", tmp);
  348. X  }
  349. X  maybe_locked(UDBASE, "r");
  350. X  fd = open(UDBASE, O_RDONLY);
  351. X  if (fd == -1) {
  352. X    nerror("admin.c", 254, "userliste", "Datei-Lesefehler", UDBASE);
  353. X  }
  354. X  while (read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) {
  355. X    if (mode == 0) {
  356. X        sprintf(u, "%s", LOOSER.name);
  357. X        sprintf(s, " (%d) ", LOOSER.id);        
  358. X        u[26 - strlen(s)] = '\0';
  359. X        strcat(u, s); strcat(u, "                                ");    
  360. X         u[26] = '\0';
  361. X        fprintf(fp, "%s", u);
  362. X        i++;
  363. X        if (i == 3) {
  364. X            i = 0;
  365. X            fprintf(fp, "\n");
  366. X        }
  367. X    }
  368. X    if (mode == 1) {
  369. X        sprintf(s, "%s", LOOSER.name);
  370. X        s[24] = '\0';
  371. X        sprintf(u, "%s [%d]", s, LOOSER.id);
  372. X
  373. X        sprintf(s, "%s", "   ");
  374. X        if ((LOOSER.elapsed / 60) > 2) {
  375. X            if (LOOSER.wohnort[0] < 48) {
  376. X                if (strcomp(GUEST, LOOSER.name) != 0)
  377. X                    sprintf(s, "%s", "<?>");
  378. X            }
  379. X        }
  380. X        else {
  381. X            sprintf(s, "%s", "{-}");
  382. X        }
  383. X        if (LOOSER.seq == 1) {
  384. X            sprintf(s, "%s", "<!>");
  385. X        }
  386. X        fprintf(fp, "%-30.30s  %10s %s%6.d   %6.ld\"  %5.d%10.10s\n",
  387. X            u, LOOSER.lastlog, s, LOOSER.seq, (LOOSER.elapsed / 60), LOOSER.level, LOOSER.sh_name);
  388. X
  389. X    }
  390. X    if (mode == 2) {
  391. X        fprintf(fp, "%-30.30s  %8.d kB  %10.d kB %8.d\"\n",
  392. X            LOOSER.name, LOOSER.upratio, LOOSER.downratio, (LOOSER.elapsed / 60));
  393. X    }
  394. X        if (mode == 3) {
  395. X        if(LOOSER.level >= WRITE_INTERNAT){
  396. X            if(LOOSER.account[0] == '\0') strcpy(LOOSER.account, "00.00.0000");
  397. X            strcpy(s, LOOSER.account);
  398. X            s[10] = '\0';
  399. X            c = ' ';
  400. X            strcpy(t, (unsigned char *) strcopy(LOOSER.account, 11, 16));
  401. X            z = atoi(t);            
  402. X            fprintf(fp, "%-30.30s  %5.d   %c %s   [%3d.%02d DM]\n",  
  403. X                LOOSER.name, LOOSER.id, c, s, fix(z), flt(z));
  404. X        }
  405. X        }
  406. X        if (mode == 4) {
  407. X        fprintf(fp, "%-15.15s %5.d %4.d    %s\n",
  408. X            LOOSER.name, LOOSER.id, LOOSER.level, LOOSER.newsgrps);
  409. X    }       
  410. X    totalusr++;
  411. X    sprintf(s, "%s", (unsigned char *) mydate( 0 )); 
  412. X    if((strcomp(s, LOOSER.lastlog) < 3) && (LOOSER.seq > 10)) totalact++;
  413. X    if(strcomp(GUEST, LOOSER.name) == 0) totalgas = LOOSER.seq;
  414. X  }
  415. X  close(fd);
  416. X
  417. X  fclose(fp);
  418. X
  419. X  if (mode != 0) {
  420. X    printf("%c", CR);
  421. X    sprintf(s, "sort -d -o %s %s", tmp, tmp);
  422. X    system(s);
  423. X    show(tmp, 9999, USER.more + 100);
  424. X    if (mode == 1) {
  425. X        printf("\n%s\n%s", POR19_MSG, POR20_MSG);
  426. X    }
  427. X  }
  428. X  else{
  429. X    show(tmp, 9999, USER.more);
  430. X  }
  431. X  if(mode == 0){
  432. X    printf("\n\n%s %d %s %d %s", POR21_MSG, totalusr, POR22_MSG, totalact, POR23_MSG); 
  433. X    printf("\n%s %d %s", POR24_MSG, totalgas, POR25_MSG);
  434. X  }
  435. X  printf("\n");
  436. X  unlink(tmp);
  437. X}
  438. X
  439. X
  440. X
  441. X
  442. X/***************************************************************************/
  443. X/*      FUNKTION  finger()                           */
  444. X/*  BESCHREIBUNG  Informationen ueber einen Teilnehmer anzeigen.       */
  445. X/*     PARAMETER  arg  =  User-Name/User-Id des Teilnehmers                */
  446. X/*     RUECKGABE  keine                                                       */
  447. X/***************************************************************************/
  448. X
  449. Xvoid finger(arg)
  450. Xunsigned char arg[];
  451. X{
  452. X  int fd;
  453. X  struct userdaten DUMMY, LOOSER;
  454. X  unsigned char s[STRING];
  455. X  unsigned char t[STRING];
  456. X  long ll = -1L;
  457. X  size_t dummy = sizeof(DUMMY);
  458. X  unsigned char c;
  459. X  unsigned char ex[LONGSTRING];
  460. X  int i, ok, a, b;
  461. X  int uid = -1;
  462. X  unsigned char name[STRING];
  463. X  unsigned char domain[STRING];      
  464. X
  465. X
  466. X  FILE *fp;
  467. X
  468. X  
  469. X  if ((arg[0] > 47) && (arg[0] < 58)) {
  470. X    uid = atoi(arg);
  471. X  }
  472. X  else{
  473. X    a = 0; b = 0;
  474. X    i = 0;
  475. X    while(arg[i] != '\0'){    
  476. X        if(arg[i] == '!') a = i;
  477. X        if(arg[i] == '@') b = i;
  478. X        i++;
  479. X    }
  480. X    if((a != 0) && (b == 0)){
  481. X        if(a != 0){
  482. X            strcpy(name, (unsigned char *) strcopy(arg, (a+1), length(arg)));
  483. X            strcpy(domain, (unsigned char *) strcopy(arg, 0, (a-1)));
  484. X        }
  485. X        else{
  486. X            strcpy(name, (unsigned char *) strcopy(arg, 0, (b-1)));
  487. X            strcpy(domain, (unsigned char *) strcopy(arg, (b+1), length(arg)));
  488. X        }
  489. X        strcpy(t, USER.name);
  490. X        i = 0;
  491. X        while(t[i] != '\0'){
  492. X            if(t[i] == ' ') t[i] = '.';
  493. X            i++;
  494. X        }
  495. X        chdir( "/" );
  496. X        sprintf(s, "%s %s!%s!\"finger %s\" \\| mail %s@%s", UUX, SMARTHOST, domain, name, t, UUCPID);
  497. X        /*
  498. X        printf("\n\n%s\n\n", s);
  499. X        */
  500. X        system( s );
  501. X        chdir( HOME );
  502. X        printf("\n\n%s \"%s\",\n%s \"%s\" %s.", POR25aMSG, name, POR25bMSG, domain, POR25cMSG);
  503. X        ansi( "md" );
  504. X        printf("\n%s\n", POR26_MSG);
  505. X        ansi( "me" );
  506. X        return;
  507. X    }
  508. X    else{
  509. X        if(b != 0){
  510. X            ansi( "md" );
  511. X            printf(" <- %s\n\n", POR26aMSG);
  512. X            ansi( "me" );
  513. X            return;
  514. X        }
  515. X    }
  516. X  }
  517. X
  518. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  519. X  fd = open(UDBASE, O_RDONLY);
  520. X  if (fd == -1) {
  521. X    nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  522. X  }
  523. X  while (read(fd, (unsigned char *) &DUMMY, dummy) == dummy) {
  524. X    if (uid == DUMMY.id) {
  525. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  526. X    } 
  527. X    else{
  528. X        if ((strcomp(arg, DUMMY.name) == 0) ||
  529. X            (strcomp(arg, DUMMY.nick) == 0) ||
  530. X            (strcomp(arg, DUMMY.sh_name) == 0)) {
  531. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  532. X        }
  533. X    }
  534. X  }
  535. X  lseek(fd, ll, SEEK_SET);
  536. X  read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER));
  537. X  close(fd);
  538. X  mbunlock(UDBASE);
  539. X
  540. X  if (ll == -1L) {
  541. X    ansi( "md" );
  542. X    printf(" <- %s\n\n", POR27_MSG);
  543. X    ansi( "me" );
  544. X    return;
  545. X  }
  546. X
  547. X  sprintf(s, " %s: %s ", POR28_MSG, arg);
  548. X  headline( s );
  549. X
  550. X  ansi( "md" );
  551. X  printf("\n%s ", POR29_MSG);
  552. X  ansi( "me" );
  553. X  printf("%d\n", LOOSER.id);
  554. X
  555. X  ansi( "md" );
  556. X  printf("%s ", POR30_MSG);
  557. X  ansi( "me");
  558. X  printf("%s\n", LOOSER.name);
  559. X
  560. X  if(LOOSER.sh_name[0] != '\0'){
  561. X    ansi( "md" );
  562. X    printf("%s ", POR31_MSG);
  563. X    ansi( "me" );
  564. X    printf("%s\n", LOOSER.sh_name);
  565. X  }
  566. X
  567. X  if(LOOSER.nick[0] != '\0'){
  568. X    ansi( "md" );
  569. X      printf("%s ", POR32_MSG);
  570. X    ansi( "me" );
  571. X    printf("%s\n", LOOSER.nick);
  572. X  }
  573. X
  574. X  ansi( "md" );
  575. X  printf("%s ", POR33_MSG);
  576. X  ansi( "me" );
  577. X  strcpy(s, LOOSER.name);
  578. X  i = 0;
  579. X  while(s[i] != '\0'){
  580. X    if(s[i] == ' ') s[i] = '.';
  581. X    i++;
  582. X  }
  583. X  if(LOOSER.level >= WRITE_INTERNAT)
  584. X    printf("%s@%s\n", s, UUCPID2);
  585. X  else
  586. X    printf("%s@%s\n", s, UUCPID1);
  587. X
  588. X  printf("\n"); ok = 0;
  589. X
  590. X  if(USER.level >= WRITE_EX_LEV){
  591. X    if(LOOSER.wohnort[0] != '\0'){
  592. X        ok++;
  593. X        ansi( "md" );
  594. X        printf("%s ", POR34_MSG);
  595. X        ansi( "me" );
  596. X        printf("%s\n", LOOSER.wohnort);
  597. X    }
  598. X  }
  599. X
  600. X  if(USER.level >= ADMIN_LEV){
  601. X    if(LOOSER.strasse[0] != '\0'){
  602. X        ok++;
  603. X        ansi( "md" );
  604. X        printf("%s ", POR35_MSG);
  605. X        ansi( "me" );
  606. X        printf("%s\n", LOOSER.strasse);
  607. X    }
  608. X    if(LOOSER.telefon1[0] != '\0'){
  609. X        ok++;
  610. X        ansi( "md" ); 
  611. X        printf("%s ", POR36_MSG);
  612. X        ansi( "me" );
  613. X        printf("%s", LOOSER.telefon1);
  614. X
  615. X        if(LOOSER.telefon2[0] != '\0'){
  616. X            printf(" // %s\n", LOOSER.telefon2);
  617. X        }
  618. X        else{
  619. X            printf("\n");
  620. X        }
  621. X    }
  622. X
  623. X    if(ok != 0) printf("\n"); 
  624. X    ok = 0;
  625. X
  626. X    if(LOOSER.geburtsdatum[0] != '\0'){
  627. X        ok++;
  628. X        ansi( "md" );
  629. X        printf("%s ", POR37_MSG);
  630. X        ansi( "me" );
  631. X        printf("%s\n", LOOSER.geburtsdatum);
  632. X    }
  633. X  }
  634. X
  635. X  if(ok != 0) printf("\n");
  636. X
  637. X  if(USER.level >= WRITE_EX_LEV){
  638. X    ansi( "md" );
  639. X    printf("%s ", POR38_MSG);
  640. X    ansi( "me" );
  641. X    printf("%d\n", LOOSER.seq);
  642. X      ansi( "md" );
  643. X    printf("%s ", POR39_MSG);
  644. X    ansi( "me" );
  645. X    printf("%s // %s\n", LOOSER.lastlog, (unsigned char *) timereconv(LOOSER.lasttime));
  646. X  }
  647. X
  648. X  ansi( "md" );
  649. X  printf("%s ", POR45_MSG);
  650. X  ansi( "me" );
  651. X  b = 0;
  652. X  sprintf(s, "%s/usr/%d/INDEX", HOME, LOOSER.id);  
  653. X    
  654. X  fp = fopen(s, "r");
  655. X  if (fp == NULL) {
  656. X    nerror("intro.c", 291, "intro", "Datei-Lesefehler", s);
  657. X  }
  658. X  while (fgets(ex, 200, fp) != NULL){
  659. X    if(ex[0] < 65) b++;
  660. X  }
  661. X  fclose(fp);
  662. X  printf("%d\n", b-1);
  663. X
  664. X  if(USER.level >= ADMIN_LEV){
  665. X    ansi( "md" );
  666. X    printf("%s ", POR40_MSG);
  667. X    ansi( "me" );
  668. X    b = LOOSER.elapsed/(3600*24);
  669. X    printf("%d %s, ", b, POR41_MSG);
  670. X    a = (LOOSER.elapsed - (b*(3600*24)))/3600; 
  671. X    printf("%d %s, ", a, POR41aMSG);
  672. X        b = (LOOSER.elapsed - (b*(3600*24)) - (a*3600))/360;
  673. X       printf("%d %s\n", b, POR41bMSG);
  674. X        ansi( "md" );
  675. X        printf("%s ", POR41cMSG);
  676. X        ansi( "me" );
  677. X        printf("%s\n", LOOSER.account);
  678. X    ansi( "md" );
  679. X    printf("%s ", POR42_MSG);
  680. X    ansi( "me" );
  681. X    printf("%ld %s\n", LOOSER.upratio, POR43_MSG);
  682. X    ansi( "md" );
  683. X    printf("%s ", POR44_MSG);
  684. X    ansi( "me" );
  685. X    printf("%ld %s\n", LOOSER.downratio, POR43_MSG);
  686. X  }
  687. X
  688. X  printf("\n");
  689. X}
  690. X
  691. END_OF_FILE
  692.   if test 15712 -ne `wc -c <'src/portinfo.c'`; then
  693.     echo shar: \"'src/portinfo.c'\" unpacked with wrong size!
  694.   fi
  695.   # end of 'src/portinfo.c'
  696. fi
  697. if test -f 'src/proto.h' -a "${1}" != "-c" ; then 
  698.   echo shar: Will not clobber existing file \"'src/proto.h'\"
  699. else
  700.   echo shar: Extracting \"'src/proto.h'\" \(5444 characters\)
  701.   sed "s/^X//" >'src/proto.h' <<'END_OF_FILE'
  702. X
  703. X/***************************************************************************/
  704. X/*        PROGRAMM  ix/Mbox                           */
  705. X/*             DATEI  proto.h                           */
  706. X/*        FUNKTIONEN  Prototypen der Funktionen                   */
  707. X/*             AUTOR  Olaf's CPROTO                       */
  708. X/*  LETZTE AENDERUNG  28.05.1992                       */
  709. X/***************************************************************************/
  710. X
  711. X#if defined(__STDC__) || defined(__cplusplus)
  712. X# define P_(s) s
  713. X#else
  714. X# define P_(s) ()
  715. X#endif
  716. X
  717. X/* admin.c */
  718. Xvoid user_aendern P_((void));
  719. Xvoid user_anzeigen P_((void));
  720. Xvoid user_loeschen P_((void));
  721. Xint setup_get P_((int max));
  722. Xvoid wait_until_keypressed P_((void));
  723. Xvoid admin P_((void));
  724. Xvoid setup P_((void));
  725. X
  726. X/* befehl.c */
  727. Xint bef P_((unsigned char befehl[], unsigned char arg[]));
  728. X
  729. X/* baudrate.c */
  730. Xint baudrate P_((int try));
  731. X
  732. X/* control.c */
  733. Xvoid control P_((unsigned char text[], int mode));
  734. Xvoid whodo P_((unsigned char text[]));
  735. X
  736. X/* coreleft.c */
  737. Xint coreleft P_((void));
  738. X
  739. X/* ctrlx.c */
  740. Xvoid ctrlx P_((void));
  741. Xvoid noctrlx P_((void));
  742. X
  743. X/* derror.c */
  744. Xvoid nerror P_((unsigned char file[], int line, unsigned char function[], unsigned char descr[], unsigned char er[]));
  745. X
  746. X/* games.c */
  747. Xint games P_((void));
  748. X
  749. X/* getch.c */
  750. Xint getch P_((void));
  751. X
  752. X/* getline.c */
  753. Xunsigned char *getline P_((int len, int mode, int bsc, unsigned char deftext[]));
  754. Xint getint P_((void));
  755. Xint yesno P_((void));
  756. X
  757. X/* help.c */
  758. Xint help P_((unsigned char cmd[]));
  759. X
  760. X/* intro.c */
  761. Xvoid intro P_((void));
  762. Xvoid init_user P_((unsigned char info[]));
  763. X
  764. X/* lesen.c */
  765. Xunsigned char *getsite P_((unsigned char arg[]));
  766. Xint checkdomaintype P_((unsigned char arg[]));
  767. Xvoid ansage P_((void));
  768. Xvoid unterschrift P_((void));
  769. Xvoid lesen P_((unsigned char arg[]));
  770. X
  771. X/* lesen2.c */
  772. Xint anzeigen P_((int art, int von, int bis));
  773. Xvoid lesen2 P_((unsigned char arg[], int mode));
  774. Xvoid inhalt2 P_((unsigned char arg[], int mode));
  775. Xvoid loeschen2 P_((unsigned char arg[], int mode));
  776. X
  777. X/* loop.c */
  778. Xvoid sigcatch P_((int sig));
  779. Xunsigned char *cut_bef P_((unsigned char s[]));
  780. Xunsigned char *cut_arg P_((unsigned char s[]));
  781. Xunsigned char *rates P_((void));
  782. Xvoid loop P_((void));
  783. X
  784. X/* mail.c */
  785. Xunsigned char *fetch_reciepy P_((unsigned char REP[]));
  786. Xint brief P_((unsigned char arg[]));
  787. X
  788. X/* main.c */
  789. Xvoid logout P_((void));
  790. Xvoid init P_((void));
  791. Xvoid fixoutput P_((void));
  792. X/* int main P_((void)); */
  793. X
  794. X/* makro.c */
  795. Xunsigned char *makro P_((unsigned char s[]));
  796. Xvoid set_makros P_((void));
  797. Xvoid get_makros P_((void));
  798. Xvoid add_makro P_((unsigned char s[]));
  799. Xint makro_definition P_((unsigned char s[]));
  800. X
  801. X/* mb-daemon.c */
  802. Xint reflector P_((unsigned char arg[], unsigned char msg[]));
  803. Xint pdsize P_((unsigned char arg[]));
  804. Xunsigned char *scan P_((unsigned char arg[]));
  805. Xvoid mix P_((unsigned char s[], unsigned char t[]));
  806. Xint main P_((int argc, unsigned char *argv[]));
  807. X
  808. X/* mbrsh.c */
  809. Xint main P_((int argc, unsigned char *argv[]));
  810. X
  811. X/* misc.c */
  812. Xvoid scanner P_((int mode));
  813. Xvoid schreiben P_((unsigned char arg[]));
  814. Xint prf P_((unsigned char arg[]));
  815. Xint pruefe P_((unsigned char arg[]));
  816. X
  817. X/* misc2.c */
  818. Xint chk_newsgrp P_((unsigned char s[]));
  819. Xint subb P_((unsigned char s[]));
  820. Xvoid loeschen P_((unsigned char arg[]));
  821. Xint brett P_((unsigned char arg[]));
  822. X
  823. X/* nerror.c */
  824. Xvoid nerror P_((unsigned char file[], int line, unsigned char function[], unsigned char descr[], unsigned char er[]));
  825. X
  826. X/* outdial.c */
  827. Xvoid outdial P_((void));
  828. X
  829. X/* pd.c */
  830. Xvoid pd P_((unsigned char arg[], unsigned char keywds[]));
  831. Xvoid status P_((void));
  832. Xvoid mkix P_((unsigned char pfad[]));
  833. Xvoid statistik P_((void));
  834. Xvoid download P_((unsigned char arg[]));
  835. X
  836. X/* portinfo.c */
  837. Xvoid port P_((unsigned char arg[]));
  838. Xvoid show_level P_((void));
  839. Xvoid userliste P_((unsigned char arg[]));
  840. Xvoid finger P_((unsigned char arg[]));
  841. X
  842. X/* postfach.c */
  843. Xvoid postfach P_((unsigned char arg[]));
  844. X
  845. X/* show.c */
  846. Xint show P_((unsigned char fname[], int maxlines, int mode));
  847. Xint more P_((void));
  848. X
  849. X/* suchen.c */
  850. Xvoid suchen P_((unsigned char muster[]));
  851. X
  852. X/* tools.c */
  853. Xunsigned char *whoami P_((void));
  854. Xunsigned char *stripped P_((unsigned char st[]));
  855. Xunsigned char *upcased P_((unsigned char st[]));
  856. Xint length P_((unsigned char st[]));
  857. Xunsigned char *strcopy P_((unsigned char st[], int v, int b));
  858. Xunsigned char *bigcopy P_((unsigned char st[], int v, int b));
  859. Xint strcomp P_((unsigned char s[], unsigned char t[]));
  860. Xint ansi P_((unsigned char code[]));
  861. Xint ansi2 P_((unsigned char code[], int x, int y));
  862. X/* unsigned char *termansi P_((unsigned char code[])); */
  863. Xunsigned char *mydate P_((int mode));
  864. Xunsigned char *mytime P_((int mode));
  865. Xunsigned char *crypted P_((unsigned char s[]));
  866. Xlong dateconv P_((unsigned char d[]));
  867. Xunsigned char *datereconv P_((long l));
  868. Xint timeconv P_((unsigned char t[]));
  869. Xunsigned char *timereconv P_((int i));
  870. Xunsigned char *shortname P_((unsigned char longname[]));
  871. Xint maybe_locked P_((unsigned char name[], unsigned char mode[]));
  872. Xunsigned char *numstripped P_((unsigned char s[]));
  873. Xvoid headline P_((unsigned char line[]));
  874. Xvoid mblock P_((unsigned char path[]));
  875. Xvoid mbunlock P_((unsigned char path[]));
  876. Xint tty P_((void));
  877. Xunsigned char *ttyna P_((void));
  878. Xvoid clearline P_((void));
  879. Xint isin P_((unsigned char pattern[], int c)); 
  880. X
  881. X/* weiterl.c */
  882. Xvoid weiterleiten P_((unsigned char arg[]));
  883. Xvoid carboncopy P_((unsigned char cc[], unsigned char bcc[]));
  884. X
  885. X/* xmd.c */
  886. Xint brief P_((unsigned char arg[]));
  887. Xint mailing P_((void));
  888. Xint main P_((int argc, unsigned char *argv[]));
  889. X
  890. X#undef P_
  891. X
  892. X
  893. X
  894. END_OF_FILE
  895.   if test 5444 -ne `wc -c <'src/proto.h'`; then
  896.     echo shar: \"'src/proto.h'\" unpacked with wrong size!
  897.   fi
  898.   # end of 'src/proto.h'
  899. fi
  900. if test -f 'src/show.c' -a "${1}" != "-c" ; then 
  901.   echo shar: Will not clobber existing file \"'src/show.c'\"
  902. else
  903.   echo shar: Extracting \"'src/show.c'\" \(15144 characters\)
  904.   sed "s/^X//" >'src/show.c' <<'END_OF_FILE'
  905. X/***************************************************************************/
  906. X/*        PROGRAMM  ix/Mbox                           */
  907. X/*             DATEI  show.c                           */
  908. X/*        FUNKTIONEN  show(), more(), richtext(), quoted_printable(),        */
  909. X/*              iso_convert(), sio_line()                       */
  910. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  911. X/*  LETZTE AENDERUNG  17.11.1992                       */
  912. X/***************************************************************************/
  913. X
  914. X#include <stdio.h>
  915. X#include <string.h>
  916. X
  917. X#include "mbox.h"
  918. X
  919. X
  920. Xstatic int show_more;
  921. Xstatic FILE *page;
  922. Xstatic unsigned char show_tmp[STRING];
  923. Xstatic int seite;
  924. X
  925. X
  926. Xextern unsigned char headinfo[STRING];
  927. X
  928. Xstatic int morechen;
  929. X
  930. X
  931. X/* Globals fuer RTF (Richtext Format): */
  932. X
  933. Xstatic int RTFcomment; 
  934. Xstatic int RTFcenter;
  935. Xstatic int RTFrightflush;
  936. Xstatic int RTFheading;
  937. X
  938. Xstatic unsigned char ENCODING[STRING];
  939. X
  940. Xstatic int QPkeys;
  941. X
  942. Xunsigned char *richtext();
  943. Xunsigned char *quoted_printable();
  944. Xunsigned char *iso_convert();
  945. Xunsigned char *iso_line();
  946. X
  947. X/***************************************************************************/
  948. X/*      FUNKTION  show()                               */
  949. X/*  BESCHREIBUNG  Zeigt den Inhalt einer Datei an.                */
  950. X/*     PARAMETER  fname    = Dateiname                                     */
  951. X/*          maxlines = mehr Zeilen auf keinen Fall ausgeben          */
  952. X/*          mode     = '> 99'  Ueberschrift einrechnen               */
  953. X/*                   '= 99'  Reset (alle Parameter von "show")   */
  954. X/*                   '=  0'  Kontinuierlich ausgeben             */
  955. X/*     RUECKGABE  -1  =  Datei nicht gefunden                              */
  956. X/*          -9  =  Datei ueberspringen                       */
  957. X/***************************************************************************/
  958. X
  959. X#define LLL 80
  960. X
  961. Xint show(fname, maxlines, mode)
  962. Xunsigned char fname[];
  963. Xint maxlines;
  964. Xint mode;
  965. X{
  966. X  FILE *fp;
  967. X
  968. X  unsigned char s[LONGSTRING];
  969. X  unsigned char o[LONGSTRING];
  970. X  unsigned char t[STRING];
  971. X  unsigned char CONTENT[STRING];
  972. X  int c;
  973. X  int ml;
  974. X  int ret_status = 0;
  975. X  int maxi = MAX_SCR_LINES;
  976. X  int swing = 0;
  977. X  int sl, ok;
  978. X  int i, e;
  979. X  int HEADER_lines = 0;
  980. X  int HEADER_path = 0;
  981. X  int HEADER_double = 0;
  982. X
  983. X  int FACE = 0;
  984. X
  985. X
  986. X  if (mode > 99) {        /* HEADLINE */
  987. X    mode -= 100;
  988. X    maxi -= 2;
  989. X    swing = 2;
  990. X    morechen = 1;
  991. X    seite = 1;
  992. X  }
  993. X  if (mode == 99) {        /* RESET */
  994. X    show_more = 0;
  995. X    seite = 1;
  996. X    return 0;
  997. X  }
  998. X  fp = fopen(fname, "r");
  999. X  if (fp == NULL) {
  1000. X    return -1;
  1001. X  }
  1002. X  ml = 0;
  1003. X  morechen = 0;
  1004. X
  1005. X  CONTENT[0] = '\0';
  1006. X  ENCODING[0] = '\0';
  1007. X  RTFcomment    = 0;
  1008. X  RTFcenter     = 0;
  1009. X  RTFrightflush = 0; 
  1010. X  RTFheading    = 0;
  1011. X
  1012. X  QPkeys     = 0;
  1013. X
  1014. X
  1015. X
  1016. X  /* Temporary checking Usage */
  1017. X
  1018. X  if((strcomp("PM", BRETT) != 0) && (USER.level < 10)){
  1019. X    page = fopen( "/local/mbox/etc/usage", "a" );
  1020. X    fprintf(page, "%s\n", NG); 
  1021. X    fclose(page);
  1022. X  }
  1023. X
  1024. X  sprintf(show_tmp, "%s/show%d", TMP, getpid());
  1025. X  page = fopen(show_tmp, "w");
  1026. X
  1027. X  if (mode != 2)
  1028. X    show_more = 0;
  1029. X  else
  1030. X    morechen = show_more;
  1031. X
  1032. X  if (show_more > maxi) show_more = 0;
  1033. X
  1034. X
  1035. X  if(DISKUSSION){
  1036. X    while((fgets(t, STRING, fp) != NULL) && (strcomp("Subject: ", t) != 0));
  1037. X
  1038. X    if(strcomp("Subject: ", t) != 0) return -9;
  1039. X
  1040. X    if(sgrep( t, DIS_subject ) != 0){
  1041. X        rewind(fp);
  1042. X    }        
  1043. X    else{
  1044. X        fclose(fp);
  1045. X        fclose(page);
  1046. X        return -9;
  1047. X    }
  1048. X  }
  1049. X
  1050. X
  1051. X  while ((ml < maxlines) && (fgets(s, LONGSTRING, fp) != NULL)) {
  1052. X
  1053. X    if(SHORT_HEADER){
  1054. X        if((strcomp("Path: ", s) == 0) || (strcomp("Newsgroups: ", s) == 0)){
  1055. X            HEADER_path++;
  1056. X            continue;
  1057. X        }
  1058. X
  1059. X        if((HEADER_path != 0) && (HEADER_lines == 0)){
  1060. X
  1061. X            if(strcomp("From: ", s) == 0){
  1062. X                printf("%s %s", GBL01_MSG, strcopy(s, 6, strlen(s)));
  1063. X                fprintf(fp, "%s %s", GBL01_MSG, strcopy(s, 6, strlen(s)));
  1064. X                morechen++;
  1065. X            }
  1066. X            if(strcomp("Subject: ", s) == 0){
  1067. X                printf("%s %s", GBL03_MSG, strcopy(s, 9, strlen(s)));
  1068. X                fprintf(fp, "%s %s", GBL03_MSG, strcopy(s, 9, strlen(s)));
  1069. X                morechen++;
  1070. X            }        
  1071. X            if(strcomp("Date: ", s) == 0){
  1072. X                printf("%s %s\n", GBL02_MSG, strcopy(s, 6, strlen(s)));
  1073. X                fprintf(fp, "%s %s\n", GBL02_MSG, strcopy(s, 6, strlen(s)));
  1074. X                morechen++;
  1075. X            }
  1076. X            if(strlen(s) < 3){
  1077. X                HEADER_lines++;
  1078. X                morechen++;
  1079. X            }
  1080. X            continue;
  1081. X         }    
  1082. X    }
  1083. X    else{
  1084. X        if(HEADER_lines == 0){
  1085. X            sprintf(t, "%s %s", GBL01_MSG, X_MAIL_DEMON);
  1086. X            if(strcomp(t, s) == 0){
  1087. X                do{
  1088. X                    fgets(s, 250, fp);
  1089. X                }while(strcomp("From", s) != 0);
  1090. X                HEADER_double++;
  1091. X                ansi("md");
  1092. X            }
  1093. X            if((strcomp("Path:", s) == 0) || (strcomp("Newsgroups:", s) == 0) || (strcomp(GBL01_MSG, s) == 0)){
  1094. X                ansi("md");
  1095. X                HEADER_double++;
  1096. X            }    
  1097. X            if(strlen(s) < 3){
  1098. X                HEADER_lines++;
  1099. X                HEADER_double = 0;
  1100. X                ansi("me");
  1101. X            }            
  1102. X        }
  1103. X    }
  1104. X
  1105. X    if(strcomp("Content-Type:", s) == 0){
  1106. X        strcpy(CONTENT, (unsigned char *) strcopy(s, 14, 80));
  1107. X        if(strcomp("text/richtext", CONTENT) != 0) /* RTF etc. */
  1108. X             CONTENT[0] = '\0';
  1109. X    }
  1110. X    if(strcomp("Content-Transfer-Encoding:", s) == 0){
  1111. X        strcpy(ENCODING, (unsigned char *) strcopy(s, 27, 80));
  1112. X                
  1113. X    }
  1114. X    if(strcomp("Content-", s) == 0){
  1115. X        if((HEADER_lines != 0) || (ml < 2)) continue; /* :-)) */
  1116. X    }
  1117. X        if(strcomp("X-Face:", s) == 0){
  1118. X        if(FACE == 0){
  1119. X            FACE++;
  1120. X        }
  1121. X    }
  1122. X
  1123. X#ifdef _MULTIMEDIA
  1124. X    if(strcomp("Quoted-Printable", ENCODING) == 0){
  1125. X        strcpy(s, (unsigned char *) quoted_printable(s));
  1126. X    }
  1127. X    if(CONTENT[0] != '\0'){
  1128. X        strcpy(s, (unsigned char *) richtext(s));
  1129. X    }
  1130. X#endif    
  1131. X    if(UMLAUT_MODUS != 4) strcpy(s, (unsigned char *) iso_line(s));
  1132. X
  1133. X    sl = length(s);
  1134. X    while(sl > LLL){
  1135. X        strcpy(o, (unsigned char *) s);
  1136. X        sl = LLL; ok = 0;
  1137. X        i = 0;
  1138. X        while((s[i] != '\0') && (i <= sl)){
  1139. X            if(s[i] == ESC){
  1140. X                i++;
  1141. X                while((s[i] < 65) || (s[i] == '[')){
  1142. X                    i++;
  1143. X                    sl++;
  1144. X                }
  1145. X                sl += 2;
  1146. X            }            
  1147. X            i++;
  1148. X        }
  1149. X
  1150. X        while((sl > 0) && (ok == 0)){
  1151. X            if(s[sl] < 48){
  1152. X                ok = sl;
  1153. X            }
  1154. X            sl--;
  1155. X        }
  1156. X        s[ok] = '\0';
  1157. X        morechen++;
  1158. X
  1159. X        if(sl < (strlen(o)-1)){
  1160. X            printf("%s\n",  s);
  1161. X            fprintf(page, "%s\n", s);
  1162. X        
  1163. X            strcpy(s, (unsigned char *)bigcopy(o, ok, length(o)));
  1164. X            sl = length(s);
  1165. X        }
  1166. X        else{
  1167. X            sl = 0;
  1168. X        }    
  1169. X
  1170. X        if(ok == 0){
  1171. X            sl = LLL;
  1172. X            printf("[SysBug \"show.c\"]");
  1173. X        }
  1174. X        if(s[0] == '\n') s[0] = '\0';
  1175. X    }
  1176. X    i = strlen(s) -1;
  1177. X    if(s[i] == '\n') s[i] = '\0'; 
  1178. X    printf("%s\n", s);
  1179. X    fputs(s, page);
  1180. X    ml++;
  1181. X    morechen++;
  1182. X    if ((morechen >= maxi) && (mode > 0)) {
  1183. X        morechen = 0;
  1184. X        maxi += swing;
  1185. X        swing = 0;
  1186. X        fclose(page);
  1187. X        ret_status = more();
  1188. X        if (ret_status != 0) {
  1189. X            ml = maxlines + 9999;
  1190. X        }
  1191. X        else {
  1192. X            page = fopen(show_tmp, "w");
  1193. X            if(HEADER_double != 0){
  1194. X                ansi( "md" );
  1195. X            }
  1196. X        }
  1197. X    }
  1198. X  }
  1199. X  fclose(fp);
  1200. X
  1201. X  show_more = morechen;
  1202. X
  1203. X  if (page != NULL) fclose(page);
  1204. X  unlink(show_tmp);
  1205. X
  1206. X  /*            Experimental Use only !
  1207. X  */
  1208. X  if(FACE != 0){
  1209. X    faces( fname );
  1210. X  }
  1211. X
  1212. X
  1213. X  return (int) ret_status;
  1214. X}
  1215. X
  1216. X
  1217. X
  1218. X/***************************************************************************/
  1219. X/*      FUNKTION  more()                           */
  1220. X/*  BESCHREIBUNG  Erfragen ob weitergelesen werden soll, oder nicht.       */
  1221. X/*     PARAMETER  keine                                                 */
  1222. X/*     RUECKGABE  0  =  weiterlesen                                        */
  1223. X/*         -1  =  abbrechen                           */
  1224. X/***************************************************************************/
  1225. X
  1226. Xint more()
  1227. X{
  1228. X  unsigned char s[LONGSTRING];
  1229. X  unsigned char c;
  1230. X  int ok = 0;
  1231. X
  1232. XFIRST_TRY:
  1233. X
  1234. X  ansi("mr");
  1235. X  printf("                                                                               ");
  1236. X  printf("%c[%s] (?) > ", CR, SHO04_MSG);
  1237. X  ansi("me");
  1238. X
  1239. XSECOND_TRY:
  1240. X
  1241. X  c = getint();
  1242. X
  1243. X  if (c == '?') {
  1244. X    ansi("mr");
  1245. X    clearline();
  1246. X    printf("%c%s > ", CR, SHO05_MSG);
  1247. X    ansi("me");
  1248. X    goto SECOND_TRY;
  1249. X  }
  1250. X  if (c > 96) c -= 32;
  1251. X
  1252. X  if ((c == DEL) ||
  1253. X      (c == CTRL_D) ||
  1254. X      (c == CTRL_X) ||
  1255. X      (c == SHO06_MSG) ||
  1256. X      (c == SHO07_MSG))
  1257. X    ok = -1;
  1258. X
  1259. X  if ((c == SHO08_MSG) || (c == SHO09_MSG)) ok = 1;
  1260. X
  1261. X  if (c == SHO10_MSG) {
  1262. X    ansi("cl");
  1263. X    ansi("mr");
  1264. X    printf("                                                                               ");
  1265. X    printf("%c%s\n", CR, SHO11_MSG);
  1266. X    ansi("me");    
  1267. X    page = fopen(show_tmp, "r");
  1268. X    if (page != NULL) {
  1269. X        while (fgets(s, 250, page) != NULL) {
  1270. X            printf("%s", s);
  1271. X        }
  1272. X        fclose(page);
  1273. X    }
  1274. X    goto FIRST_TRY;
  1275. X  }
  1276. X  if(ok != 1){    
  1277. X      if (USER.more == 3) {
  1278. X        clearline();
  1279. X      }
  1280. X      else {
  1281. X        if(USER.more != 0){
  1282. X            ansi("cl");
  1283. X            seite++;
  1284. X            sprintf(s, "%s^-  [%s %d]", headinfo, SHO12_MSG, seite);
  1285. X            headline(s);
  1286. X        }
  1287. X        else printf("\n\n");
  1288. X      }
  1289. X  }
  1290. X  else{    
  1291. X    clearline();
  1292. X  }
  1293. X
  1294. X  return (int) ok;
  1295. X}
  1296. X
  1297. X
  1298. X
  1299. X/***************************************************************************/
  1300. X/*      FUNKTION  richtext()                           */
  1301. X/*  BESCHREIBUNG  RTF ... die Zukunft kommt bestimmt :-)))           */
  1302. X/*     PARAMETER  Zeile im RT-Format                                       */
  1303. X/*     RUECKGABE  Zeile im ANSI-Format                       */
  1304. X/***************************************************************************/
  1305. X
  1306. Xunsigned char *richtext( s )
  1307. Xunsigned char s[];
  1308. X{
  1309. X  unsigned char rt[LONGSTRING];
  1310. X  unsigned char line[LONGSTRING];
  1311. X  unsigned char space[LONGSTRING];
  1312. X  int i = 0, j;
  1313. X  int l = 0;
  1314. X  int not;
  1315. X  int keys = 0;
  1316. X
  1317. X  while(s[i] != '\0'){
  1318. X    if(s[i] != '<'){
  1319. X        if(RTFcomment == 0){
  1320. X            /* RTF-Konform:
  1321. X            if(s[i] == '\n')
  1322. X                line[l] = ' ';
  1323. X            else
  1324. X                line[l] = s[i];
  1325. X            NICHT RTF-Konform: */
  1326. X
  1327. X            line[l] = s[i];
  1328. X            l++;
  1329. X            keys++;
  1330. X        }
  1331. X    }
  1332. X    else{
  1333. X        line[l] = '\0';
  1334. X        not = 0;
  1335. X        i++;
  1336. X        j = i;
  1337. X        while((s[j] != '>') && (s[j] != '\0')){
  1338. X            if(s[j] == '/'){
  1339. X                i++;
  1340. X                not++;
  1341. X            }
  1342. X            j++;
  1343. X        }
  1344. X        strcpy(rt, (unsigned char *) strcopy(s, i, (j-1)));
  1345. X
  1346. X        if(not == 0){
  1347. X            if(strcomp("Bold",       rt) == 0) 
  1348. X                strcat( line, (unsigned char *) termansi( "md" ));
  1349. X            if(strcomp("Italic",     rt) == 0) 
  1350. X                strcat( line, (unsigned char *) termansi( "mr" ));
  1351. X            if(strcomp("Bigger",     rt) == 0) 
  1352. X                strcat( line, (unsigned char *) termansi( "mb" ));
  1353. X            if(strcomp("Underline",  rt) == 0) 
  1354. X                strcat( line, (unsigned char *) termansi( "us" ));
  1355. X            if(strcomp("Paragraph",  rt) == 0){
  1356. X                strcat( line, "\n\n");
  1357. X                morechen += 2;
  1358. X            }
  1359. X            if(strcomp("Comment",    rt) == 0)
  1360. X                RTFcomment++;
  1361. X            if(strcomp("Center",     rt) == 0)
  1362. X                RTFcenter++;
  1363. X            if(strcomp("FlushRight", rt) == 0)
  1364. X                RTFrightflush++;
  1365. X            if(strcomp("Heading",   rt) == 0){
  1366. X                RTFheading++;
  1367. X                strcat( line, (unsigned char *) termansi( "md" ));
  1368. X            }
  1369. X        }
  1370. X        else{
  1371. X            if(strcomp("Bold",       rt) == 0) 
  1372. X                strcat( line, (unsigned char *) termansi( "me" ));
  1373. X            if(strcomp("Italic",     rt) == 0) 
  1374. X                strcat( line, (unsigned char *) termansi( "me" ));
  1375. X            if(strcomp("Bigger",     rt) == 0) 
  1376. X                strcat( line, (unsigned char *) termansi( "me" ));
  1377. X            if(strcomp("Underline",  rt) == 0) 
  1378. X                strcat( line, (unsigned char *) termansi( "me" ));
  1379. X            if(strcomp("Paragraph",  rt) == 0){
  1380. X                strcat( line, "\n\n");
  1381. X                morechen += 2;
  1382. X            }
  1383. X            if(strcomp("Comment",    rt) == 0)
  1384. X                RTFcomment = 0;
  1385. X            if(strcomp("Center",     rt) == 0)
  1386. X                RTFcenter = 9999;
  1387. X            if(strcomp("FlushRight", rt) == 0)
  1388. X                RTFrightflush = 9999;
  1389. X            if(strcomp("Heading",   rt) == 0){
  1390. X                RTFheading = 9999;
  1391. X                strcat( line, (unsigned char *) termansi( "me" ));
  1392. X            }
  1393. X        }
  1394. X
  1395. X        if(strcomp("LT", rt) == 0) 
  1396. X            strcat( line, (unsigned char *) "<" );
  1397. X
  1398. X        /* NICHT RTF-Konform:
  1399. X        if(strcomp("NL", rt) == 0){ 
  1400. X            strcat( line, (unsigned char *)  "\n" );
  1401. X            morechen++;
  1402. X        }
  1403. X        */
  1404. X
  1405. X        if(strcomp("NP", rt) == 0) 
  1406. X            strcat( line, (unsigned char *) "\f" );
  1407. X        if(RTFcomment == 0){
  1408. X            l = strlen(line);
  1409. X        }
  1410. X        i = j;
  1411. X    }
  1412. X    i++;
  1413. X  }
  1414. X  line[l] = '\0';
  1415. X  strcpy(space, (unsigned char *) "                                                                              ");    
  1416. X
  1417. X  if((RTFcenter != 0) || (RTFheading != 0)){
  1418. X    i = (79 - keys) / 2; 
  1419. X    if(i <  0) i = 0;
  1420. X    if(i > 79) i = 0;
  1421. X    space[i] = '\0';
  1422. X    strcat(space, (unsigned char *) line);
  1423. X    strcpy(line, (unsigned char *) space);
  1424. X  }
  1425. X  if(RTFrightflush != 0){
  1426. X    i = 79 - keys;
  1427. X    space[i] = '\0';
  1428. X    strcat(space, (unsigned char *) line);
  1429. X    strcpy(line, (unsigned char *) space);
  1430. X  }
  1431. X  /*  
  1432. X  printf("%s", line);
  1433. X  */
  1434. X  if(RTFcenter     == 9999) RTFcenter = 0;
  1435. X  if(RTFrightflush == 9999) RTFrightflush = 0;
  1436. X  if(RTFheading    == 9999) RTFheading = 0;
  1437. X
  1438. X  return (unsigned char *) line;
  1439. X}
  1440. X
  1441. X
  1442. X
  1443. X
  1444. X/***************************************************************************/
  1445. X/*      FUNKTION  quoted_printable()                       */
  1446. X/*  BESCHREIBUNG  Transfer-Encoding: Regel #1 bis #5               */
  1447. X/*     PARAMETER  Zeile im RT-Format                                       */
  1448. X/*     RUECKGABE  Decodierte Zeile                       */
  1449. X/***************************************************************************/
  1450. X
  1451. Xunsigned char *quoted_printable( s )
  1452. Xunsigned char s[];
  1453. X{
  1454. X  unsigned char line[LONGSTRING];
  1455. X  unsigned char t[STRING];
  1456. X  int i = 0, l = 0, p = 0;
  1457. X
  1458. X  while(s[i] != '\0'){
  1459. X    if(s[i] == '='){
  1460. X        if(s[(i+1)] == '\n'){
  1461. X            i++;
  1462. X        }
  1463. X        else{
  1464. X            if(s[(i+1)] < 65)
  1465. X                p = 16 * (s[(i+1)] - 48);
  1466. X            else
  1467. X                p = 16 * (s[(i+1)] - 55);
  1468. X            if(s[(i+2)] < 65)
  1469. X                p = p  + (s[(i+2)] - 48); 
  1470. X            else
  1471. X                p = p  + (s[(i+2)] - 55); 
  1472. X            line[l] = p;
  1473. X            l++;
  1474. X            i += 2;
  1475. X        }
  1476. X    }
  1477. X    else{
  1478. X        line[l] = s[i];
  1479. X        l++;
  1480. X        QPkeys++;
  1481. X        if(s[i] == '\n') QPkeys = 0;
  1482. X    }
  1483. X
  1484. X    if(QPkeys >= 75){
  1485. X        p = l;
  1486. X        while((line[p] != ' ') && (p > 0)){
  1487. X            p--;
  1488. X        }
  1489. X        line[p] = '\n';
  1490. X        QPkeys = 0;
  1491. X    }
  1492. X    i++;
  1493. X  }
  1494. X  line[l] = '\0';
  1495. X
  1496. X  return (unsigned char *) line;
  1497. X}
  1498. X
  1499. X
  1500. X
  1501. X
  1502. X/***************************************************************************/
  1503. X/*      FUNKTION  iso_convert()                           */
  1504. X/*  BESCHREIBUNG  Konvertiert ISO 8859-1 / IBM                    */
  1505. X/*     PARAMETER  Char als ISO-Zeichen                                     */
  1506. X/*     RUECKGABE  String mit Ersatz-Zeichen                   */
  1507. X/***************************************************************************/
  1508. X
  1509. Xunsigned char *iso_convert( c )
  1510. Xint c;
  1511. X{
  1512. X  int i = 0;
  1513. X  int ok = 0;
  1514. X
  1515. X  unsigned char t[STRING];
  1516. X  t[1] = '\0';
  1517. X
  1518. X  if(c > 127){
  1519. X
  1520. X    if(UMLAUT_MODUS == 1){
  1521. X        switch(c){
  1522. X            case 142 :
  1523. X            case 196 : t[0] = 196; 
  1524. X                   break;
  1525. X            case 153 :
  1526. X            case 214 : t[0] = 214; 
  1527. X                   break;
  1528. X            case 154 :
  1529. X            case 220 : t[0] = 220; 
  1530. X                   break;
  1531. X            case 225 : 
  1532. X            case 223 : t[0] = 223; 
  1533. X                   break;
  1534. X            case 132 :
  1535. X            case 228 : t[0] = 228; 
  1536. X                   break;
  1537. X            case 148 :
  1538. X            case 246 : t[0] = 246;
  1539. X                   break;
  1540. X            case 129 :
  1541. X            case 252 : t[0] = 252; 
  1542. X                   break;
  1543. X        }
  1544. X    }
  1545. X    if(UMLAUT_MODUS == 2){
  1546. X        switch(c){
  1547. X            case 142 :
  1548. X            case 196 : t[0] = 142; 
  1549. X                   break;
  1550. X            case 153 :
  1551. X            case 214 : t[0] = 153; 
  1552. X                   break;
  1553. X            case 154 :
  1554. X            case 220 : t[0] = 154; 
  1555. X                   break;
  1556. X            case 225 : 
  1557. X            case 223 : t[0] = 225; 
  1558. X                   break;
  1559. X            case 132 :
  1560. X            case 228 : t[0] = 132; 
  1561. X                   break;
  1562. X            case 148 :
  1563. X            case 246 : t[0] = 148;
  1564. X                   break;
  1565. X            case 129 :
  1566. X            case 252 : t[0] = 129; 
  1567. X                   break;
  1568. X        }
  1569. X    }
  1570. X    if(UMLAUT_MODUS == 3){
  1571. X        switch(c){
  1572. X            case 142 :
  1573. X            case 196 : t[0] = 'A'; ok++;
  1574. X                   break;
  1575. X            case 153 :
  1576. X            case 214 : t[0] = 'O'; ok++;
  1577. X                   break;
  1578. X            case 154 :
  1579. X            case 220 : t[0] = 'U'; ok++;
  1580. X                   break;
  1581. X            case 225 : 
  1582. X            case 223 : t[0] = 's'; 
  1583. X                   t[1] = 's';
  1584. X                   break;
  1585. X            case 132 :
  1586. X            case 228 : t[0] = 'a'; ok++;
  1587. X                   break;
  1588. X            case 148 :
  1589. X            case 246 : t[0] = 'o'; ok++;
  1590. X                   break;
  1591. X            case 129 :
  1592. X            case 252 : t[0] = 'u'; ok++;
  1593. X                   break;
  1594. X        }
  1595. X        if(ok != 0){
  1596. X            t[1] = 'e';
  1597. X        }
  1598. X        t[2] = '\0';
  1599. X    }
  1600. X  }
  1601. X  else{
  1602. X    t[0] = c;
  1603. X  }
  1604. X    
  1605. X  return (unsigned char *) t;
  1606. X}
  1607. X
  1608. X
  1609. Xunsigned char *iso_line( s )
  1610. Xunsigned char s[];
  1611. X{
  1612. X  unsigned char t[LONGSTRING];
  1613. X
  1614. X  int i = 0;
  1615. X
  1616. X  t[0] = '\0';
  1617. X  
  1618. X  while(s[i] != '\0'){
  1619. X    strcat(t, (unsigned char *) iso_convert( s[i] ));
  1620. X    i++;
  1621. X  }
  1622. X
  1623. X  return (unsigned char *) t;
  1624. X}
  1625. END_OF_FILE
  1626.   if test 15144 -ne `wc -c <'src/show.c'`; then
  1627.     echo shar: \"'src/show.c'\" unpacked with wrong size!
  1628.   fi
  1629.   # end of 'src/show.c'
  1630. fi
  1631. if test -f 'src/xmd.c' -a "${1}" != "-c" ; then 
  1632.   echo shar: Will not clobber existing file \"'src/xmd.c'\"
  1633. else
  1634.   echo shar: Extracting \"'src/xmd.c'\" \(13319 characters\)
  1635.   sed "s/^X//" >'src/xmd.c' <<'END_OF_FILE'
  1636. X/***************************************************************************/
  1637. X/*        PROGRAMM  ix/Mbox                           */
  1638. X/*             DATEI  xmd.c                           */
  1639. X/*        FUNKTIONEN  brief(), mailing(), main()               */
  1640. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1641. X/*  LETZTE AENDERUNG  04.09.1992                       */
  1642. X/***************************************************************************/
  1643. X
  1644. X#include <sys/types.h>
  1645. X#include <sys/stat.h>
  1646. X#include <unistd.h>
  1647. X#include <stdio.h>
  1648. X#include <fcntl.h>
  1649. X#include <time.h>
  1650. X
  1651. X#include "mbox.h"
  1652. X
  1653. X
  1654. Xunsigned char tmp[STRING];
  1655. Xunsigned char alias[MAX_XMD_ALIAS][2][STRING];
  1656. Xunsigned char x400[STRING];
  1657. Xint INTERACT;
  1658. X
  1659. X
  1660. X
  1661. X/***************************************************************************/
  1662. X/*      FUNKTION  brief()                           */
  1663. X/*  BESCHREIBUNG  Leitet einen Brief weiter an einen MBox-Account.       */
  1664. X/*          Auf diese Weise ist der Mbox-User auch unter der         */
  1665. X/*          Adresse 'Real.Name@UUCPID' erreichbar.           */
  1666. X/*     PARAMETER  arg  =  Mbox-User-Name                                   */
  1667. X/*     RUECKGABE  keine                                                    */
  1668. X/***************************************************************************/
  1669. X
  1670. Xbrief(arg)
  1671. Xunsigned char arg[];
  1672. X{
  1673. X  FILE *fp;
  1674. X  FILE *ff;
  1675. X  int fd;
  1676. X  int i, a, b;
  1677. X  int ok;
  1678. X  struct userdaten LOOSER;
  1679. X
  1680. X  struct tm *timeptr;
  1681. X  time_t timer;
  1682. X
  1683. X  int receiver;
  1684. X  static int mail_id;
  1685. X  int EX_PM   = 0;
  1686. X  int REPLY   = 0;
  1687. X  int lines   = 0;
  1688. X  int local   = 0;
  1689. X  int arrived = 1;
  1690. X
  1691. X
  1692. X  unsigned char s[STRING];
  1693. X  unsigned char t[STRING];
  1694. X  unsigned char top[STRING];
  1695. X  unsigned char subject[STRING];
  1696. X  unsigned char autor[STRING];
  1697. X  unsigned char rec_char[STRING];
  1698. X  unsigned char ex[255];
  1699. X  unsigned char user[STRING];
  1700. X  unsigned char c;
  1701. X  unsigned char protokoll;
  1702. X  unsigned char destination[STRING];
  1703. X  unsigned char receipt[STRING];
  1704. X
  1705. X  i = 0;
  1706. X  ok = 0;
  1707. X
  1708. X
  1709. X  strcpy(user, (unsigned char *) stripped(arg));
  1710. X  strcpy(subject, XMD01_MSG);
  1711. X
  1712. X  JUNK:    receiver = 0;
  1713. X
  1714. X  fd = open(UDBASE, O_RDONLY);
  1715. X  if (fd == -1) {
  1716. X    printf("\nSHIT!\n");
  1717. X    exit(-1);
  1718. X  }
  1719. X  lseek(fd, 0L, SEEK_SET);
  1720. X  while ((read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) && (receiver == 0)) {
  1721. X    if ((strcomp(user, LOOSER.name) == 0) ||
  1722. X        (strcomp(LOOSER.name, user) == 0) ||
  1723. X        (strcomp(user, LOOSER.nick) == 0) ||
  1724. X        (strcomp(user, LOOSER.sh_name) == 0)) {
  1725. X        receiver = LOOSER.id;
  1726. X        strcpy(rec_char, LOOSER.name);
  1727. X    }
  1728. X  }
  1729. X  close(fd);
  1730. X
  1731. X  if (receiver == 0) {
  1732. X    sprintf(subject, "[xmd:] '%s' ???   ", user);
  1733. X    strcpy(user, POSTMASTER);
  1734. X    arrived = 0;
  1735. X    goto JUNK;
  1736. X  }
  1737. X  sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  1738. X  fp = fopen(s, "r");
  1739. X  fgets(s, 80, fp);
  1740. X  mail_id = atoi( s );
  1741. X  fclose(fp);
  1742. X
  1743. X  sprintf(destination, "%s/usr/%d/%d", HOME, receiver, mail_id);
  1744. X  fp = fopen(destination, "w");
  1745. X
  1746. X  sprintf(s, "%s %s (%s)\n", GBL01_MSG, X_MAIL_DEMON, "xmd");
  1747. X  fputs(s, fp);
  1748. X
  1749. X  time(&timer);
  1750. X  timeptr = localtime(&timer);
  1751. X  strcpy(t, (unsigned char *) asctime(timeptr));
  1752. X
  1753. X  sprintf(s, "%s %s", GBL02_MSG, t);
  1754. X  fputs(s, fp);
  1755. X
  1756. X  sprintf(s, "%s %s\n\n", GBL03_MSG, subject);
  1757. X  fputs(s, fp);
  1758. X
  1759. X  fprintf(fp, "%s\n\n", XMD02_MSG);
  1760. X
  1761. X  lines = 7;
  1762. X
  1763. X  autor[0] = '\0';
  1764. X  subject[0] = '\0';
  1765. X
  1766. X  ff = fopen(tmp, "r");
  1767. X  if (ff == NULL) {
  1768. X    return;
  1769. X  }
  1770. X  while (fgets(s, 80, ff) != NULL) {
  1771. X    i = 0;
  1772. X    /*
  1773. X    while(s[i] != '\0'){
  1774. X        if(s[i] > 127){
  1775. X            s[i] = '?';
  1776. X        }
  1777. X        i++;
  1778. X    }
  1779. X    */
  1780. X    if(strcomp("*From ", s) == 0){
  1781. X        strcpy(s, (unsigned char *) stripped(strcopy(s, 1, 80)));
  1782. X        strcat(s, "\n");
  1783. X    }
  1784. X    fputs(s, fp);
  1785. X    lines++;
  1786. X    if((strcomp("Subject: ", s) == 0) && (subject[0] == '\0')){
  1787. X        strcpy(subject, (unsigned char *) stripped(strcopy(s, 9, 80)));
  1788. X    }
  1789. X    if((strcomp("From: ", s) == 0) && ((autor[0] == '\0') || (local = 1))){
  1790. X        strcpy(autor, (unsigned char *) stripped(strcopy(s, 6, 80)));
  1791. X        local = 0;
  1792. X    }
  1793. X    if(strcomp("From ", s) == 0){
  1794. X        strcpy(autor, (unsigned char *) stripped(strcopy(s, 5, 80)));
  1795. X        local = 1;
  1796. X    }
  1797. X    if(strcomp("*From ", s) == 0){
  1798. X        strcpy(autor, (unsigned char *) stripped(strcopy(s, 6, 80)));
  1799. X        local = 1;
  1800. X    }
  1801. X    if(strcomp("Return-Receipt-To: ", s) == 0){
  1802. X        strcpy(receipt, (unsigned char *) stripped(strcopy(s, 19, 80)));
  1803. X    }
  1804. X  }
  1805. X  fclose(ff);
  1806. X  fclose(fp);
  1807. X
  1808. X  i = 0; 
  1809. X  while(autor[i] != '\0'){
  1810. X    if(autor[i] == '(') autor[(i-1)] = '\0';
  1811. X    i++;
  1812. X  }
  1813. X
  1814. X  if((local == 1) && (strcomp("postmaster", autor) == 0)){
  1815. X    fclose(fp);
  1816. X    unlink(destination);
  1817. X    if(INTERACT == 0) printf("[%s]\n", arg);
  1818. X    fp = fopen( XMDLOG, "a" );
  1819. X    fprintf(fp, "%-29.29s   %33.33s\n", (unsigned char *) stripped(arg), subject);
  1820. X    fclose(fp);
  1821. X    return;
  1822. X  }
  1823. X
  1824. X  sprintf(s, "%s/usr/%d/INDEX", HOME, receiver);
  1825. X  fp = fopen(s, "a");
  1826. X
  1827. X  sprintf(s, "%d              ", mail_id);
  1828. X  s[6] = '\0';
  1829. X  fputs(s, fp);
  1830. X
  1831. X  sprintf(ex, "%s                                  ", subject);
  1832. X  ex[26] = '\0';
  1833. X  fputs(ex, fp);
  1834. X
  1835. X  sprintf(ex, "  %s                                        ", autor);
  1836. X  ex[22] = '\0';
  1837. X  fputs(ex, fp);
  1838. X
  1839. X
  1840. X  strcpy(s, (unsigned char *) mydate(1));
  1841. X  strcpy(t, (unsigned char *) mytime(1));
  1842. X  sprintf(ex, "  %s  %s         ", s, t);
  1843. X  ex[19] = '\0';
  1844. X  fputs(ex, fp);
  1845. X
  1846. X  sprintf(s, "%-5.d\n", lines);
  1847. X  fputs(s, fp);
  1848. X
  1849. X  fclose(fp);
  1850. X
  1851. X  sprintf(s, "%s/usr/%d/seq", HOME, receiver);
  1852. X  fp = fopen(s, "w");
  1853. X  rewind(fp);
  1854. X  fprintf(fp, "%d\n", (int) (mail_id + 1));
  1855. X  fclose(fp);
  1856. X
  1857. X  if(INTERACT == 0) printf("%s\n", arg);
  1858. X
  1859. X  ff = fopen( XMDLOG, "a" );
  1860. X  fprintf(ff, "%5.5s  %5.5s   %-29.29s   %-31.31s\n", 
  1861. X      (unsigned char *) mydate( 1 ), (unsigned char *) mytime( 1 ),
  1862. X      (unsigned char *) stripped(arg), subject);
  1863. X  fclose(ff);
  1864. X
  1865. X  if(receipt[0] != '\0'){
  1866. X    i = 0; b = 0;
  1867. X    while(receipt[i] != '\0'){
  1868. X        if(receipt[i] == '!') b = i;
  1869. X        if(receipt[i] == '@') b = i;
  1870. X        i++;
  1871. X    }
  1872. X    if(b == 0) return;
  1873. X     i = b; a = 0;
  1874. X    while((i > 0) && (a == 0)){
  1875. X        if((receipt[i] == ' ') ||
  1876. X           (receipt[i] == '<') ||
  1877. X           (receipt[i] == '(')) a = i + 1;
  1878. X        i--;
  1879. X    }
  1880. X      i = b; b = 0;
  1881. X     while((receipt[i] != '\0') && (b == 0)){
  1882. X        if((receipt[i] == ' ') ||
  1883. X           (receipt[i] == '>') ||
  1884. X           (receipt[i] == ')')) b = i -1;
  1885. X        i++;
  1886. X    }
  1887. X    if(b == 0) b = i -1;
  1888. X     strcpy(receipt, (unsigned char *) strcopy(receipt, a, b));
  1889. X
  1890. X    sprintf(t, "%s/%d.REC", TMP, getpid());
  1891. X    ff = fopen( t, "w" );    
  1892. X
  1893. X    time(&timer);
  1894. X
  1895. X    fprintf(ff, "From: XMD@%s\n", UUCPID2); 
  1896. X    fprintf(ff, "Sender: postmaster@%s (Die Postmeisterei)\n", UUCPID2);
  1897. X    fprintf(ff, "Organization: %s\n", ORGANIZATION);
  1898. X    fprintf(ff, "To: %s\n", receipt);
  1899. X    fprintf(ff, "Subject: Delivering Report\n");
  1900. X    fprintf(ff, "X-Mailer: %s %s %s\n", VERSION, PATCHLEVEL, AUTOR);    
  1901. X    fprintf(ff, "Message-Id: <%x.xmd@%s>\n", timer, UUCPID2);
  1902. X    fputs("\n", ff);
  1903. X
  1904. X    fprintf(ff, "Wuppertal (FRG), %s at %s\n\n", mydate( 1 ), mytime( 1 ));
  1905. X
  1906. X    fprintf(ff, "Your mail \"%s\" ...\n", subject);
  1907. X    if(arrived == 1){
  1908. X        fprintf(ff, "reached %s.\n\nBye now!\n", (unsigned char *) stripped(arg));
  1909. X    }
  1910. X    else{
  1911. X        fprintf(ff, "couldn't be delivered to %s.\n\n", (unsigned char *) stripped(arg));
  1912. X        fprintf(ff, "The local postmaster got a copy of your mail! Maybe he is able to forward it\nto the correct receipient!\n\n");
  1913. X    }
  1914. X    fclose(ff);
  1915. X
  1916. X    sprintf(s, "/bin/sh ./etc/rmail.sh %s %s", t, receipt);
  1917. X    printf("%s\n", s);
  1918. X    system(s);
  1919. X    unlink( t );
  1920. X  }
  1921. X}
  1922. X
  1923. X
  1924. X
  1925. X
  1926. X/***************************************************************************/
  1927. X/*      FUNKTION  is_external()                           */
  1928. X/*  BESCHREIBUNG  Wenn die MBox auch ein Gateway betreibt ...           */
  1929. X/*     PARAMETER  s = "To: ...." Zeile                                     */
  1930. X/*     RUECKGABE  Position des "%" Zeichens                                */
  1931. X/***************************************************************************/
  1932. X
  1933. X
  1934. Xint is_external( s )
  1935. Xunsigned char s[];
  1936. X{
  1937. X  int i = 0, j = 0, p = 0;
  1938. X
  1939. X  if(strcomp("To: Empty Address", s) == 0) return (int) -1;
  1940. X
  1941. X  while(s[i] != '\0'){
  1942. X    if(s[i] == '%') j++;
  1943. X    if((s[i] == '@') && (j > 0)) p = i;
  1944. X    i++;
  1945. X  }
  1946. X  return (int) p;
  1947. X}
  1948. X
  1949. X
  1950. X
  1951. X/***************************************************************************/
  1952. X/*      FUNKTION  mailing()                           */
  1953. X/*  BESCHREIBUNG  Isoliert den Mbox-User-Namen aus der UUCP-Adresse und       */
  1954. X/*                ruft mit diesem Namen die Routine "brief()" auf.       */
  1955. X/*     PARAMETER  keine                                                       */
  1956. X/*     RUECKGABE  keine                                                    */
  1957. X/***************************************************************************/
  1958. X
  1959. Xmailing()
  1960. X{
  1961. X  FILE *fp;
  1962. X  FILE *ff;
  1963. X  unsigned char s[255];
  1964. X  unsigned char t[STRING];
  1965. X  int i, j;
  1966. X  int toggle = 0;
  1967. X
  1968. X  fp = fopen(tmp, "r");
  1969. X  if (fp == NULL) {
  1970. X    printf("\nPuhhh???\n");
  1971. X    exit(-1);
  1972. X  }
  1973. X  while (fgets(s, 80, fp) != NULL) {
  1974. X    if ((strcomp("X400-Recipients:", s) == 0) && (toggle == 0)){
  1975. X        i = 16;
  1976. X        j = 0;
  1977. X        while(s[i] != '\0'){
  1978. X            if(s[i] == '<') j = i+1;
  1979. X            if(s[i] == '@'){
  1980. X                strcpy(x400, (unsigned char *) strcopy(s, j, (i-1)));
  1981. X            }
  1982. X            i++;
  1983. X        }
  1984. X    }
  1985. X    if ((strcomp("To:", s) == 0) && (toggle == 0)){
  1986. X        i = 1;
  1987. X        toggle++;
  1988. X        while(strcomp("EOL", alias[i][1]) != 0){    
  1989. X            if(strcomp(alias[i][1], s) == 0) strcpy(s, alias[i][2]);
  1990. X            i++;
  1991. X        }
  1992. X
  1993. X        i = 0;
  1994. X        j = 0;
  1995. X        while ((s[i] != '\0') && (s[i] != '@')) {
  1996. X            if (s[i] == '!') j = i;
  1997. X            if (s[i] == '.') s[i] = ' ';
  1998. X            i++;
  1999. X        }
  2000. X        i--;
  2001. X        if (j == 0) {
  2002. X            strcpy(t, (unsigned char *) strcopy(s, 4, i));
  2003. X        } else {
  2004. X            strcpy(t, (unsigned char *) strcopy(s, (j + 1), length(s)));
  2005. X        }
  2006. X        if(is_external(s) == 0){
  2007. X            brief(t);
  2008. X        }
  2009. X        else{    
  2010. X            if(strcomp("Empty Address", t) == 0){
  2011. X                strcpy(t, (unsigned char *) x400);
  2012. X            }
  2013. X            sprintf(s, "rmail -v -d -i %s %s@amnet.UUCP", tmp, t);
  2014. X            if(INTERACT == 0) printf("%s\n", t);
  2015. X            system( s );
  2016. X            ff = fopen( XMDLOG, "a" );
  2017. X            fprintf(ff, "%5.5s  %5.5s > %-29.29s   [Gateway]\n", 
  2018. X                (unsigned char *) mydate( 1 ), (unsigned char *) mytime( 1 ),
  2019. X                    (unsigned char *) t);
  2020. X            fclose(ff);
  2021. X        }
  2022. X    }
  2023. X  }
  2024. X
  2025. X  fclose(fp);
  2026. X
  2027. X  /*
  2028. X  unlink(tmp);
  2029. X  */
  2030. X}
  2031. X
  2032. X
  2033. X
  2034. X
  2035. X/***************************************************************************/
  2036. X/*      FUNKTION  main() (xmd)                           */
  2037. X/*  BESCHREIBUNG  Der Briefkasten des ERRORUSERS (POSTMASTER) wird ge-       */
  2038. X/*          scannt. Alle Eintraege fuer Mbox-User, deren Adresse     */
  2039. X/*          im Format 'Real.Name@UUCPID' vorliegen, werden zuge-       */
  2040. X/*          stellt.                                                  */
  2041. X/*     PARAMETER  keine                                                       */
  2042. X/*     RUECKGABE  keine                                                    */
  2043. X/***************************************************************************/
  2044. X
  2045. Xmain(argc, argv)
  2046. Xint argc;
  2047. Xunsigned char *argv[];
  2048. X{
  2049. X  FILE *fp;
  2050. X  FILE *ff;
  2051. X  unsigned char s[255];
  2052. X  unsigned char t[255];
  2053. X  unsigned char u[255];
  2054. X  unsigned char dump[STRING];
  2055. X  unsigned char maildrop[STRING];
  2056. X  int toggle = 0;
  2057. X  int l;
  2058. X  int c;
  2059. X  int p;
  2060. X  int i;
  2061. X  int j;
  2062. X
  2063. X  setuid(0);
  2064. X  setgid(0);
  2065. X  umask(0000);
  2066. X
  2067. X  chdir(HOME);
  2068. X
  2069. X
  2070. X  if(argc < 2){
  2071. X    maybe_locked(ERRMBOX); mblock(ERRMBOX);
  2072. X    fp = fopen(ERRMBOX, "r");
  2073. X    INTERACT = 0;
  2074. X  }
  2075. X  else{
  2076. X    if(argv[2][0] == '-'){
  2077. X        sprintf(maildrop, "%s/%dPIP", TMP, getpid());
  2078. X        fp = fopen(maildrop, "w");
  2079. X        c = 0;
  2080. X        do{
  2081. X            c = fgetc(stdin);
  2082. X            if((c != EOF) && (c != 4)){
  2083. X                fputc(c, fp);
  2084. X                printf("%c", c);
  2085. X            }
  2086. X        }while((c != EOF) && (c != 4));
  2087. X        fclose(fp);
  2088. X        fp = fopen(maildrop, "r");
  2089. X        INTERACT = 1;    
  2090. X    }
  2091. X    else{
  2092. X        maybe_locked(maildrop); mblock(maildrop);
  2093. X        sprintf(maildrop, "%s/%s", MAILDROP, argv[1]);
  2094. X        fp = fopen(maildrop, "r");
  2095. X        INTERACT = 1;
  2096. X    }
  2097. X  }
  2098. X  if(INTERACT == 0) printf("\n");
  2099. X
  2100. X  if (fp == NULL) {
  2101. X    if(INTERACT == 0) printf("\nNo mail.\n");
  2102. X    return;
  2103. X  }
  2104. X
  2105. X  l = 1; 
  2106. X  ff = fopen( XMD_ALIAS, "r" );
  2107. X  if(ff != 0){
  2108. X    while(fgets(s, 80, ff) != 0){
  2109. X        if((s[0] > 64) && (l < MAX_XMD_ALIAS)){
  2110. X            strcpy(alias[l][1], (unsigned char *) stripped(s));
  2111. X            fgets(s, 80, ff);
  2112. X            strcpy(alias[l][2], (unsigned char *) stripped(s));
  2113. X            l++;
  2114. X        }
  2115. X    }
  2116. X    fclose(ff);
  2117. X  }
  2118. X  strcpy(alias[l][1], "EOL");
  2119. X
  2120. X  sprintf(dump, "%s/%d.DUMP", TMP, getpid());
  2121. X  ff = fopen(dump, "w");
  2122. X
  2123. X  toggle = 0;
  2124. X
  2125. X  while (fgets(s, 80, fp) != NULL) {
  2126. X    l = 2;
  2127. X    if (s[0] == '>') {
  2128. X        if(s[1] != ' ') l = 1;
  2129. X        strcpy(t, (unsigned char *) strcopy(s, l, length(s)));
  2130. X        strcpy(s, t);
  2131. X        if (strcomp("OOPS", s) != 0) {
  2132. X            fputs(s, ff);
  2133. X        }
  2134. X    }
  2135. X    else{
  2136. X        if(strcomp("From ", s) == 0){
  2137. X            fprintf(ff, "*%s", s);
  2138. X            if(strcomp(RETURNED_MAIL, s) == 0){
  2139. X                while(strcomp("> ", s) != 0){
  2140. X                    fgets(s, 80, fp);
  2141. X                }
  2142. X            }
  2143. X        }
  2144. X        else{
  2145. X            fputs(s, ff);
  2146. X        }
  2147. X    }
  2148. X
  2149. X  }
  2150. X  fclose(ff);
  2151. X  fclose(fp);
  2152. X
  2153. X  fp = fopen(dump, "r");
  2154. X
  2155. X  sprintf(tmp, "%s/%d.XMD", TMP, getpid());
  2156. X
  2157. X  ff = fopen(tmp, "w");
  2158. X
  2159. X  toggle = 0;
  2160. X
  2161. X  while (fgets(s, 80, fp) != NULL) {
  2162. X    if (strcomp("*From ", s) == 0){
  2163. X        if (toggle == 1) {
  2164. X            if (ff != 0) fclose(ff);
  2165. X            mailing();
  2166. X            ff = fopen(tmp, "w");
  2167. X        }
  2168. X        toggle = 1;
  2169. X    }
  2170. X    if ((toggle == 1) && (strcomp("*From ", s) != 0)){
  2171. X
  2172. X        if (strcomp("X400-Recipients:", s) == 0){
  2173. X            i = 16;
  2174. X            j = 0;
  2175. X            while(s[i] != '\0'){
  2176. X                if(s[i] == '<') j = i+1;
  2177. X                if(s[i] == '@'){
  2178. X                    strcpy(x400, (unsigned char *) strcopy(s, j, (i-1)));
  2179. X                }
  2180. X                i++;
  2181. X            }
  2182. X        }        
  2183. X        
  2184. X        if(strcomp("To: ", s) == 0){
  2185. X            p = is_external(s);
  2186. X
  2187. X            if(p > 0){
  2188. X                s[p] = '\0';
  2189. X                strcat(s, (unsigned char *) "@amnet.UUCP\n");
  2190. X            }
  2191. X            if(p == -1){
  2192. X                sprintf(s, "To: %s@amnet.UUCP\n", x400);
  2193. X            }
  2194. X        }
  2195. X        fputs(s, ff);
  2196. X    }
  2197. X  }
  2198. X  if (ff != 0) fclose(ff);
  2199. X  if (toggle == 1) mailing();
  2200. X  fclose(fp);
  2201. X
  2202. X  unlink(tmp);
  2203. X  unlink(dump);
  2204. X
  2205. X  if(INTERACT == 0){
  2206. X     sprintf(s, "> %s", ERRMBOX);
  2207. X    mbunlock(ERRMBOX);
  2208. X  }
  2209. X  else{
  2210. X    if(getgid() == GUEST_GID){
  2211. X         sprintf(s, "> %s", maildrop);
  2212. X        mbunlock(maildrop);
  2213. X    }
  2214. X  }
  2215. X  system(s);
  2216. X}
  2217. END_OF_FILE
  2218.   if test 13319 -ne `wc -c <'src/xmd.c'`; then
  2219.     echo shar: \"'src/xmd.c'\" unpacked with wrong size!
  2220.   fi
  2221.   # end of 'src/xmd.c'
  2222. fi
  2223. echo shar: End of archive 9 \(of 15\).
  2224. cp /dev/null ark9isdone
  2225. MISSING=""
  2226. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2227.     if test ! -f ark${I}isdone ; then
  2228.     MISSING="${MISSING} ${I}"
  2229.     fi
  2230. done
  2231. if test "${MISSING}" = "" ; then
  2232.     echo You have unpacked all 15 archives.
  2233.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2234. else
  2235.     echo You still must unpack the following archives:
  2236.     echo "        " ${MISSING}
  2237. fi
  2238. exit 0
  2239. exit 0 # Just in case...
  2240.