home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume29 / mbox / part06 < prev    next >
Text File  |  1992-04-06  |  56KB  |  2,147 lines

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  3. Subject:  v29i068:  mbox - A Bulletin Board System for UNIX and MINIX, Part06/10
  4. Message-ID: <1992Apr5.183536.29812@sparky.imd.sterling.com>
  5. X-Md4-Signature: ddf5005c58f3cb830bf57ca26d6c91a2
  6. Date: Sun, 5 Apr 1992 18:35:36 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Volker.Schuermann@unnet.w.open.de@unnet (Volker Schuermann)
  10. Posting-number: Volume 29, Issue 68
  11. Archive-name: mbox/part06
  12. Environment: MINIX, ISC, ESIX, SVR3
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then feed it
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # Contents:  src/mbox.h src/misc2.c src/pd.c src/portinfo.c
  21. # Wrapped by kent@sparky on Sun Apr  5 11:57:43 1992
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. echo If this archive is complete, you will see the following message:
  24. echo '          "shar: End of archive 6 (of 10)."'
  25. if test -f 'src/mbox.h' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'src/mbox.h'\"
  27. else
  28.   echo shar: Extracting \"'src/mbox.h'\" \(12398 characters\)
  29.   sed "s/^X//" >'src/mbox.h' <<'END_OF_FILE'
  30. X/***************************************************************************/
  31. X/*        PROGRAMM  ix/MBox                           */
  32. X/*             DATEI  mbox.h                           */
  33. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  34. X/*  LETZTE AENDERUNG  28.02.1992                       */
  35. X/***************************************************************************/
  36. X#include "mbox.msg"
  37. X#include "defs.h"
  38. X#include "patchlevel.h"
  39. X
  40. X
  41. X/***************************************************************************/
  42. X/* >ORGANIZATION  -  frei waehlbar (moeglichst identisch mit dem ent-      */
  43. X/*             sprechenden Eintrag fuer NEWS)               */
  44. X/* >SYSTEM        -  frei waehlbar (Name der Mailbox)                  */
  45. X/***************************************************************************/
  46. X
  47. X#define ORGANIZATION     "THE UNDERGROUND NETWORK"
  48. X#define SYSTEM           "The Time Traveling Agency"  
  49. X
  50. X
  51. X
  52. X/***************************************************************************/
  53. X/*  VERSION       -  wird vom Autor (und nur vom dem) geandert           */
  54. X/*                   Co-Autoren, Portierer etc. koennen sich gefaelligst   */
  55. X/*             ihren eigenen Eintrag basteln.                   */
  56. X/*  AUTOR         -  das bin ich - Hallo auch !                   */
  57. X/***************************************************************************/
  58. X
  59. X#define VERSION             "ix/MBox 1.6"
  60. X#define AUTOR            "by <volkers@unnet.w.open.DE>"
  61. X
  62. X
  63. X
  64. X
  65. X/***************************************************************************/
  66. X/* >UUCPSITE       - Systemname innerhalb der UUCP-Netze           */
  67. X/* >UUCPID2        - Adresse (Domain-) im Internet               */
  68. X/* >UUCPID1        - Adresse (Domain-) im lokalen UUCP-Netz            */
  69. X/* >UUCPBANG       - Adresse als BANG-Pfad                   */
  70. X/*  UUCPCOSTS      - Gebuehrenaufstellung                   */
  71. X/* >SMARTHOST       -                                */
  72. X/***************************************************************************/
  73. X
  74. X#define UUCPSITE         "unnet"
  75. X#define UUCPID2          "unnet.w.open.DE"        
  76. X#define UUCPID1             "unnet.ruhr.SUB.ORG"
  77. X#define UUCPBANG         "~!unido!horga!xenox!unnet!"
  78. X#define UUCPCOSTS        "/usr/spool/uucp/.costs"
  79. X#define SMARTHOST    "xenox"
  80. X
  81. X
  82. X
  83. X/***************************************************************************/
  84. X/*  X_MAIL_DEMON    - Name des X-Mail-Daemons (HAENDE WEG !!!)            */
  85. X/***************************************************************************/
  86. X
  87. X#define X_MAIL_DEMON     "X-Mail-Daemon"
  88. X
  89. X
  90. X
  91. X
  92. X/***************************************************************************/
  93. X/* >HOME             - HOME-Directory der ix/MBox                    */
  94. X/*  LIB             - Pfad zum MBox-Directory LIB               */
  95. X/*  TMP              - Directory fuer temporaere Dateien           */
  96. X/* >NEWS         - Pfad zum SPOOL-Directory fuer NEWS           */
  97. X/*  ERRMBOX          - Mailbox des Error-Users (POSTMASTER)           */
  98. X/*  MAILDROP         - Pfad zu den Maildrops der SH-User           */
  99. X/* >NGROUPS          - Pfad zur "active"-Datei von NEWS               */
  100. X/*  AGROUPS         - Pfad zur MBox-"active"-Datei               */
  101. X/***************************************************************************/
  102. X     
  103. X#define HOME             "/mbox"
  104. X#define LIB             "./lib"
  105. X#define TMP             "/tmp"
  106. X#define NEWS             "/usr/spool/news"
  107. X#define ERRMBOX          "/usr/spool/mail/postmaster"
  108. X#define MAILDROP         "/usr/spool/mail"
  109. X#define NGROUPS          "/usr/lib/news/active"
  110. X#define AGROUPS          "./etc/active"
  111. X
  112. X
  113. X
  114. X
  115. X
  116. X/***************************************************************************/
  117. X/* >CONSOLE          - Geraet/Datei fuer die Logbuch-Ausgaben           */
  118. X/*            Ist CONSOLE als "REDIRECT" definiert, wird aus der */
  119. X/*                      Datei CDIRECTFL der Name der Ausgabedatei gelesen  */
  120. X/*            gelesen                               */
  121. X/*  CDIRECTFL         - Geraet/Datei wohin CONSOLE-Info ausgeben wird       */
  122. X/*                Die Datei ENTHAELT DEN NAMEN der Ausgabedatei !!!  */
  123. X/* >CPRN              - Geraet/Datei fuer Fehler-Ausgaben           */
  124. X/* >POSTMASTER        - Name des SYSOPs (identisch mit dessen SH-Account)  */
  125. X/*  MAX_BPS           - Maximale Modem-Ubertragungsrate in BPS             */
  126. X/* >PMS_TTY           - Nummer des einzigen Terminals, auf dem sich "root" */
  127. X/*            anmelden darf                       */
  128. X/*  GUEST             - MBox-Account fuer Besucher               */
  129. X/*  UDBASE            - Pfad zur Teilnehmer-Datenbank               */
  130. X/*  UDSEQ             - Pfad zur Teilnehmer-SEQ-Datei               */
  131. X/***************************************************************************/
  132. X
  133. X#define CONSOLE             "REDIRECT"
  134. X#define CDIRECTFL        "/etc/mbox.out"
  135. X#define CPRN             "/tmp/errlog"
  136. X#define POSTMASTER       "volkers"
  137. X#define PMS_TTY          "/dev/tty4"
  138. X#define MAX_BPS          19200
  139. X#define GUEST            "GAST"
  140. X#define UDBASE           "./etc/users.data"
  141. X#define UDSEQ            "./etc/users.seq"
  142. X
  143. X
  144. X
  145. X
  146. X/***************************************************************************/
  147. X/*  BEFEHLE        - Pfad zur Befehls-Tabelle                   */
  148. X/*  HILFE          - Pfad zu den HELP-Texten                   */
  149. X/*  KURZHILFE       - Kurzuebersicht                       */
  150. X/*  INTRO          - Pfad zur INTRO-Meldung                   */
  151. X/*  LOGO           - Optionaler Text als Mailbox-LOGO                */
  152. X/***************************************************************************/
  153. X
  154. X#define BEFEHLE             "./etc/help.befehle"  
  155. X#define HILFE             "./etc/help.hilfe"
  156. X#define KURZHILFE        "./etc/help.shorthelp"
  157. X#define INTRO            "./etc/intro"
  158. X#define LOGO             "./etc/logo"
  159. X
  160. X
  161. X
  162. X
  163. X/***************************************************************************/
  164. X/*  SEQ             - Pfad zur MBox-SEQ-Datei (Anzahl der Anrufe)       */
  165. X/*  CALLS           - Pfad zur MBox-CALLS-Datei (Logfile)           */
  166. X/*  WHO             - Pfad zur MBox-WHO-Datei (gerade aktive User)       */
  167. X/***************************************************************************/
  168. X
  169. X#define SEQ              "./etc/mbox.seq"
  170. X#define CALLS            "./etc/mbox.calls"
  171. X#define WHO              "./etc/mbox.who"
  172. X
  173. X
  174. X
  175. X
  176. X/***************************************************************************/
  177. X/*  EDITORS          - Pfad zur Liste der verfuegbaren Eddies           */
  178. X/*  GAMES            - Pfad zur Liste der Online-Spiele               */
  179. X/*  MAX_GAMES          - Anzahl der max. angebotenen Spiele           */
  180. X/* >CHAT             - Pfad zum CHAT-Programm                   */
  181. X/*  RSH              - MBox-RSH; NICHT identisch mit RemoteSH/RestrictedSH */
  182. X/***************************************************************************/
  183. X
  184. X#define EDITORS          "./etc/mbox.editors"
  185. X#define GAMES             "./etc/mbox.games"
  186. X#define MAX_GAMES    10
  187. X#define CHAT             "/usr/bin/chat"
  188. X#define RSH              "./mbrsh"
  189. X
  190. X
  191. X
  192. X
  193. X
  194. X/***************************************************************************/
  195. X/*  ROOT_UID          - siehe "/etc/passwd"                   */
  196. X/*  ROOT_GID          - dito                           */
  197. X/*  GUEST_GID           - dito (unbedingt != GID fuer "normale" User)        */
  198. X/***************************************************************************/
  199. X
  200. X#define ROOT_UID          0
  201. X#define ROOT_GID          0
  202. X#define GUEST_GID         1
  203. X
  204. X
  205. X
  206. X
  207. X
  208. X/***************************************************************************/
  209. X/* >FIRST_EX_TTY       - Nummer des ersten seriellen Terminals           */
  210. X/*  MAX_TERMINALS      - Max. Anzahl der aktiven Terminals            */
  211. X/***************************************************************************/
  212. X
  213. X#define FIRST_EX_TTY    64
  214. X#define MAX_TERMINALS    20
  215. X
  216. X
  217. X
  218. X
  219. X/***************************************************************************/
  220. X/* >SIGNATURE          - Name des '.signature'-File im $HOME eins SH-Users */
  221. X/* >TSET               - Pfad zum TSET-Programm                   */
  222. X/* >EXPIRE             - Pfad zum EXPIRE-Programm               */
  223. X/*  MB-DAEMON          - Pfad zum MB-DAEMON-Programm               */
  224. X/*  MB_DLOG            - Pfad zum MB-DAEMON-Statistik-File           */
  225. X/*  XMDLOG           - Pfad zum XMD-Protokoll-File                   */
  226. X/*  XMD_ALIAS           - Pfad zur Alias-Datei des XMD               */
  227. X/***************************************************************************/
  228. X
  229. X#define SIGNATURE        ".wmailsign"
  230. X#define TSET             "./etc/tset"
  231. X#define EXPIRE           "/usr/lib/news/expire"
  232. X#define MB_DAEMON        "/usr/bin/mb-daemon"
  233. X#define MB_DLOG          "./etc/mbd.log"
  234. X#define XMDLOG             "/usr/adm/xmd.log"
  235. X#define XMD_ALIAS    "./etc/xmd.alias"
  236. X
  237. X
  238. X
  239. X
  240. X/***************************************************************************/
  241. X/* >COMPRESS        - Pfad zum Standard-COMPRESS               */
  242. X/* >GREP         - Pfad zum SUCH-Programm (GREP -L: Filename only !)*/
  243. X/* >SORTEDCUT           - Zaehlt die Downloads pro File               */
  244. X/* >SECONDCUT           - Zaehlt die Anrufe pro User               */
  245. X/* >UUX                 - Fuehrt Kommandos auf fremden Sites aus       */
  246. X/***************************************************************************/
  247. X
  248. X#define COMPRESS         "/usr/bin/compress"
  249. X#define GREP             "/usr/bin/grep -l"
  250. X#define SORTEDCUT       "cut -d' ' -i2 -f3 %s | sort - | uniq -c | sort -r - | sed '/ \\//s//   \\//g' > %s"
  251. X#define SECONDCUT    "cut -c6-35 %s | sed '/  /s//    /g' | sort - | uniq -c | sort -r - > %s"
  252. X#define UUX        "uux -r"
  253. X
  254. X
  255. X
  256. X
  257. X/***************************************************************************/
  258. X/*  PDNG         - Name der Freeware/Shareware/PD-NG           */
  259. X/*  PDLOG                - PD-Download-Protokoll               */
  260. X/*  PDSCRIPT         - Pfad zum Protokoll der UPLOADs           */
  261. X/* >NEWS_MINIMUM         - Mindestens verfuegbare NGs               */
  262. X/*  MAX_PER_NG           - Maximale Anzahl der Eintraege pro NG           */
  263. X/*  EXPIRE_DAYS          - Ab wann loeschen, wenn MAX_PER_NG erreicht ist  */
  264. X/*  MAX_XMD_ALIAS     - Wieviele Namen kann XMD "umleiten"              */
  265. X/*  NAT_DOMAIN1          - Nationale Domains (gebuehrenfrei)           */
  266. X/*  NAT_DOMAIN2          - (dito)                       */
  267. X/*  NAT_DOMAIN3          - (dito)                       */
  268. X/***************************************************************************/
  269. X
  270. X#define PDNG             "local.pd"
  271. X#define PDLOG             "./etc/pd.log"
  272. X#define PDSCRIPT         "./etc/pd.script"
  273. X#define NEWS_MINIMUM     "junk local xenox de"
  274. X#define MAX_PER_NG       700
  275. X#define EXPIRED_DAYS     32
  276. X#define MAX_XMD_ALIAS   20
  277. X#define NAT_DOMAIN1      ".de"
  278. X#define NAT_DOMAIN2      ".sub.org"
  279. X#define NAT_DOMAIN3      ".de" 
  280. X
  281. X
  282. X
  283. X
  284. X
  285. X/***************************************************************************/
  286. X/*  SZ            - ZModem Download                   */
  287. X/*  SX              - X-Modem                       */
  288. X/*  SB                  - Y-Modem                       */
  289. X/*  RZ              - ZModem Upload                   */
  290. X/*  RX                    - X-Modem                        */
  291. X/*  RB                    - Y-Modem                       */
  292. X/***************************************************************************/
  293. X
  294. X#define SZ               "/usr/bin/sz"
  295. X#define SX               "/usr/bin/sx"
  296. X#define SB              "/usr/bin/sb"
  297. X
  298. X#define RZ               "/usr/bin/rz"
  299. X#define RX             "/usr/bin/rx"
  300. X#define RB             "/usr/bin/rb"
  301. X
  302. X
  303. X
  304. X
  305. X
  306. X/***************************************************************************/
  307. X/*  TARIF                 - Pfennige pro Einheit (Telefongebuehren)       */
  308. X/*  NZNT                  - Sekunden pro Einheit Nahzone/Normal-Tarif       */
  309. X/*  NZBT                  -                      Nahzone/Billig-Tarif       */
  310. X/*  RZNT                  -                  Regionalzone/Normal-Tarif */
  311. X/*  RZBT          -             Regionalzone/Billig-Tarif */
  312. X/*  WZNT          -             Weitzone/Normal-Tarif     */
  313. X/*  WZBT          -             Weitzone/Billig-Tarif     */
  314. X/***************************************************************************/
  315. X
  316. X#define TARIF            23
  317. X#define NZNT             360
  318. X#define NZBT             720
  319. X#define RZNT              60
  320. X#define RZBT            120
  321. X#define WZNT             21
  322. X#define WZBT             42
  323. X
  324. X
  325. X
  326. X
  327. X/***************************************************************************/
  328. X/*  PRO_ENTRIES          - Maximal Eintraege in MBOX.CALLS             */
  329. X/*  MAX_TAGE          - Max. Eintraege im PRO-Diagramm           */
  330. X/***************************************************************************/
  331. X
  332. X#define PRO_ENTRIES      999
  333. X#define MAX_TAGE    16
  334. X
  335. X
  336. X
  337. X/***************************************************************************/
  338. X/*  MVERSION          - Version des MB-DAEMON               */
  339. X/*  REFLECT_NG          - Auf diese Gruppe wird "reflektiert"           */
  340. X/*  REFLECT_LOG          - LOG-File des Reflektors               */
  341. X/*  DIRLIST          - Wird gesendet bei DIRLIST-Request            */
  342. X/*  REFLECTUID          - UID des Reflektors (siehe /etc/passwd)         */
  343. X/*  TZS              - ?? Fehler in der Zeitberechnung ??           */
  344. X/***************************************************************************/
  345. X
  346. X#define MVERSION        "+++ Un.Net Reflecting Device - Version 1.6 / MB-DAEMON +++"
  347. X#define REFLECT_NG      "xenox.test"
  348. X#define REFLECT_LOG     "/mbox/etc/reflector.log"
  349. X#define DIRLIST         "/public/pd/DIRLIST"
  350. X#define REFLECTUID      22
  351. X#define TZS        1
  352. X
  353. X
  354. X
  355. X
  356. X
  357. X
  358. END_OF_FILE
  359.   if test 12398 -ne `wc -c <'src/mbox.h'`; then
  360.     echo shar: \"'src/mbox.h'\" unpacked with wrong size!
  361.   fi
  362.   # end of 'src/mbox.h'
  363. fi
  364. if test -f 'src/misc2.c' -a "${1}" != "-c" ; then 
  365.   echo shar: Will not clobber existing file \"'src/misc2.c'\"
  366. else
  367.   echo shar: Extracting \"'src/misc2.c'\" \(8307 characters\)
  368.   sed "s/^X//" >'src/misc2.c' <<'END_OF_FILE'
  369. X/***************************************************************************/
  370. X/*        PROGRAMM  ix/Mbox                           */
  371. X/*             DATEI  misc2.c                           */
  372. X/*        FUNKTIONEN  chk_newsgrp(), subb(), loeschen(), brett()        */
  373. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  374. X/*  LETZTE AENDERUNG  23.01.1992                       */
  375. X/***************************************************************************/
  376. X
  377. X#include <stdio.h>
  378. X
  379. X#include "mbox.h"
  380. X
  381. X
  382. X
  383. X
  384. X
  385. X/***************************************************************************/
  386. X/*      FUNKTION  chk_newsgrp()                           */
  387. X/*  BESCHREIBUNG  Stellt fest, ob ein Benutzer die angefragt NG betreten   */
  388. X/*          darf.                                                       */
  389. X/*     PARAMETER  s  =  Name der fraglichen NG                   */
  390. X/*     RUECKGABE  -1 =  Kein Zugang/Zugriff :-(                            */
  391. X/*                 1 =  Zugang erlaubt :-)                    */
  392. X/***************************************************************************/
  393. X
  394. Xint chk_newsgrp( s )
  395. Xchar s[];
  396. X{
  397. X  int i = 1, ok = -1;
  398. X
  399. X  while ((i < MAX_NEWSGRPS) && (newsgrp[i][0] != '\0') && (ok == -1)) {
  400. X    if (strcomp(newsgrp[i], s) == 0) ok = 0;
  401. X    if (strcomp(newsgrp[i], "all") == 0) ok = 0;
  402. X    i++;
  403. X  }
  404. X
  405. X  return ok;
  406. X}
  407. X
  408. X
  409. X
  410. X
  411. X/***************************************************************************/
  412. X/*      FUNKTION  subb()                           */
  413. X/*  BESCHREIBUNG  Ist die angefragte NG eine Unter-NG, oder ein kompletter */
  414. X/*          Pfad ??                                                  */
  415. X/*     PARAMETER  s  =  Name der NG                         |              */
  416. X/*     RUECKGABE  0  =  Unter-NG (z.B. minix)               v              */
  417. X/*          n  =  Erste Obergruppe endet bei 'n' (comp.os.minix)     */
  418. X/***************************************************************************/
  419. X
  420. Xint subb(s)
  421. Xchar s[];
  422. X{
  423. X  int a = 0, i = 0;
  424. X
  425. X  while (s[i] != '\0') {
  426. X    if ((s[i] == '.') && (a == 0)) a = i;
  427. X    i++;
  428. X  }
  429. X  return a;
  430. X}
  431. X
  432. X
  433. X
  434. X
  435. X/***************************************************************************/
  436. X/*      FUNKTION  loeschen()                           */
  437. X/*  BESCHREIBUNG  Gezielt einen persoenliche Mail loeschen.           */
  438. X/*     PARAMETER  arg  =  Nummer der Mail                                  */
  439. X/*     RUECKGABE  keine                                                       */
  440. X/***************************************************************************/
  441. X
  442. Xvoid loeschen(arg)
  443. Xchar arg[];
  444. X{
  445. X  FILE *fp;
  446. X  FILE *ff;
  447. X  char s[STRING];
  448. X  char entry[STRING];
  449. X  char index[STRING];
  450. X  char t[STRING];
  451. X  char ex[255];
  452. X  char c;
  453. X  int i, a = atoi(arg);
  454. X  int ok;
  455. X
  456. X
  457. X  if ((arg[0] < '1') || (arg[0] > '9')) {
  458. X    ansi("md");
  459. X    printf(" %s\n", MI201_MSG);
  460. X    ansi("me");
  461. X    return;
  462. X  }
  463. X  if (strcomp(BRETT, "PM") != 0) {
  464. X    if(arg[0] < 33) return;
  465. X    if(USER.level < ADMIN_LEV){
  466. X        ansi("md");
  467. X        printf(" %s %d ...\n", MI202_MSG, USER.level);
  468. X        ansi("me");
  469. X    }
  470. X    else{
  471. X        sprintf(entry, "%s/%s", BRETT, arg);
  472. X        unlink(entry);
  473. X        printf("\n\n%s\n", MI203_MSG);        
  474. X        sprintf(entry, "mb-daemon %s -X", NG);
  475. X        system(entry);
  476. X    }
  477. X    return;
  478. X  }
  479. X
  480. X  if(USER.level == GUEST_LEV){
  481. X    return;
  482. X  }
  483. X
  484. X  sprintf(entry, "%s/usr/%d/%s", HOME, USER.id, arg);
  485. X  sprintf(index, "%s/usr/%d/INDEX", HOME, USER.id);
  486. X
  487. X  sprintf(s, "%s/loe%d", TMP, getpid());
  488. X  ff = fopen(s, "w");
  489. X
  490. X  fp = fopen(index, "r");
  491. X  if (fp == NULL) {
  492. X    nerror("misc2.c", 109, "loeschen", "Datei-Lesefehler", index);
  493. X  }
  494. X  ok = 0;
  495. X
  496. X  while (fgets(ex, 250, fp) != NULL) {
  497. X    if (atoi(ex) != a)
  498. X        fputs(ex, ff);
  499. X    else
  500. X        ok = 1;
  501. X  }
  502. X  fclose(fp);
  503. X  fclose(ff);
  504. X
  505. X  sprintf(t, "cp %s %s", s, index);
  506. X  system(t);
  507. X  unlink(s);
  508. X  unlink(entry);
  509. X}
  510. X
  511. X
  512. X
  513. X/***************************************************************************/
  514. X/*      FUNKTION  brett()                           */
  515. X/*  BESCHREIBUNG  Wechselt das Brett, zeigt Bretter an etc. pp.        */
  516. X/*     PARAMETER  arg  =  '?'     =  Brettername ausgeben           */
  517. X/*          arg  =  ''      =  aktuelle Bretter ausgeben           */
  518. X/*          arg  =  '*'     =  alle Bretter ausgeben               */
  519. X/*          arg  =  '#'     =  Gruppen ausgeben                      */
  520. X/*          arg  =  '..'    =  eine Gruppe zurueck           */
  521. X/*          arg  = 'Brett'  =  ins Brett 'Brett' wechseln           */
  522. X/*     RUECKGABE  keine                                                       */
  523. X/***************************************************************************/
  524. X
  525. X/*
  526. Xvoid brett(arg)  Compiler Bug ???? 
  527. X*/
  528. Xbrett(arg)
  529. Xchar arg[];
  530. X{
  531. X  FILE *fp;
  532. X  FILE *ff;
  533. X  char s[STRING];
  534. X  char o[STRING];
  535. X  int a, b, h;
  536. X  char t[STRING];
  537. X  char org[STRING];
  538. X  char maybe[STRING];
  539. X  int this;
  540. X  int i, j;
  541. X  int subboard = 0;
  542. X  char c;
  543. X  int plus = 0;
  544. X  int zeile = 0;
  545. X  int swing = 1;  
  546. X  int fpid;
  547. X
  548. X  if (arg[0] == '!') {
  549. X    printf("\n\n");
  550. X    ansi( "md" );
  551. X    printf("%s ", MI204_MSG);
  552. X    ansi( "me" );
  553. X    printf("%s\n", NG);
  554. X    return;
  555. X  }
  556. X  if ((arg[0] == '+') || (arg[0] == '-')) {
  557. X    scanner(arg[0] + 255);
  558. X    return;
  559. X  }
  560. X  if (arg[0] == '\0') {
  561. X    maybe_locked(UGROUPS, "r");
  562. X    fp = fopen(UGROUPS, "r");
  563. X    if (fp == NULL) {
  564. X        nerror("misc.c", 908, "brett", "Datei-Lesefehler", UGROUPS);
  565. X    }
  566. X    arg[0] = '*';
  567. X  }
  568. X  else {
  569. X    maybe_locked(NGROUPS, "r");
  570. X    fp = fopen(NGROUPS, "r");
  571. X    if (fp == NULL) {
  572. X        nerror("misc.c", 916, "brett", "Datei-Lesefehler", NGROUPS);
  573. X    }
  574. X  }
  575. X
  576. X
  577. X  org[0] = '\0';
  578. X  strcat(org, arg);
  579. X
  580. X  if (arg[0] == '.') {
  581. X    i = 0;
  582. X    j = 0;
  583. X    strcpy(org, NG);
  584. X    while (org[i] != '\0') {
  585. X        if (org[i] == '.') j = i;
  586. X        i++;
  587. X    }
  588. X    if (j == 0) return;
  589. X    org[j] = '\0';
  590. X  }
  591. X  if (arg[0] == '#') subboard++;
  592. X
  593. X  zeile = 0;
  594. X
  595. X  show(NGROUPS, 99, 99); /* RESET */
  596. X
  597. X  if ((arg[0] == '*') || (arg[0] == '+') || (arg[0] == '#') || (arg[0] == '~')) {
  598. X    sprintf(s, "%s %d) ", MI205_MSG, USER.level);
  599. X    headline(s);
  600. X    i = 0;
  601. X    strcpy(o, (char *) "OOPS");
  602. X
  603. X    while (fscanf(fp, "%s %d %d %s", s, &a, &h, t) > 0) {
  604. X        if (arg[0] == '~') {
  605. X            if (strcomp(NG, s) != 0) continue;
  606. X        }
  607. X        if ((strcomp(o, s) != 0) || (subboard == 0)) {
  608. X            if (subboard != 0) {
  609. X                j = subb(s);
  610. X                if (j != 0) s[j] = '\0';
  611. X                o[0] = '\0'; strcat(o, s);
  612. X            }
  613. X            if (chk_newsgrp(s) == 0) {
  614. X                /*
  615. X                s[18] = '\0';
  616. X                */
  617. X                s[((80/USER.schluessel[1]) -2)] = '\0';
  618. X                strcat(s, "                                   ");
  619. X                /*
  620. X                s[19] = '\0';
  621. X                */
  622. X                s[((80/USER.schluessel[1]) -1)] = '\0';
  623. X                printf("%s", s);
  624. X                i++;
  625. X                plus++;
  626. X                if (i == USER.schluessel[1]) {
  627. X                    printf("\n");
  628. X                    i = 0;                
  629. X                    zeile++;
  630. X                    if (zeile >= MAX_SCR_LINES) {
  631. X                        zeile = 0;
  632. X                        if(USER.more != 0){
  633. X                            if (more() != 0) return (int) 1;
  634. X                        }
  635. X                    }
  636. X                }
  637. X            }
  638. X        }
  639. X    }
  640. X    if (plus == 0) {
  641. X        printf("%s", MI206_MSG);
  642. X    }
  643. X    printf("\n");
  644. X  }
  645. X  else {
  646. X    if (org[0] != '\0') {
  647. X
  648. X        SO_WHAT:
  649. X
  650. X        strcpy(o, (char *) org);
  651. X
  652. X        i = 0;
  653. X        while (org[i] != '\0') {
  654. X            t[i] = org[i];
  655. X            if (t[i] == '.') t[i] = '/';
  656. X            i++;
  657. X        }
  658. X        t[i] = '\0';
  659. X
  660. X        sprintf(s, "%s/%s", NEWS, t);
  661. X
  662. X        if (chdir(s) != 0) {
  663. X            sprintf(o, "%s.%s", NG, org);
  664. X            i = 0;
  665. X            while (o[i] != '\0') {
  666. X                t[i] = o[i];
  667. X                if (t[i] == '.') t[i] = '/';
  668. X                i++;
  669. X            }
  670. X            t[i] = '\0';
  671. X            sprintf(s, "%s/%s", NEWS, t);
  672. X        }
  673. X        if (chdir(s) != 0) {
  674. X            this = 9999;
  675. X            maybe_locked(NGROUPS, "r");
  676. X            ff = fopen(NGROUPS, "r");
  677. X            if (ff == NULL) {
  678. X                nerror("misc.c", 1001, "brett", "Datei-Lesefehler", NGROUPS);
  679. X            }
  680. X            while (fscanf(ff, "%s %d %d %s", s, &i, &i, t) > 0) {
  681. X                i = strcomp(org, s);
  682. X                if (i < this) {
  683. X                    this = i;
  684. X                    strcpy(maybe, s);
  685. X                }
  686. X            }
  687. X            fclose(ff);
  688. X            
  689. X            strcpy(org, maybe);
  690. X            printf("\n\n");
  691. X            ansi("mr");
  692. X            printf("%s \"%s\" [%c, %c] >", MI207_MSG, maybe, GBL06_MSG, GBL07_MSG);
  693. X            ansi("me");
  694. X
  695. X            c = yesno();
  696. X            
  697. X            if (c != GBL07_MSG) goto SO_WHAT;
  698. X
  699. X            printf("\n");
  700. X        }
  701. X        else {
  702. X
  703. X            if (chk_newsgrp(o) == 0) {
  704. X                strcpy(BRETT, s);
  705. X                printf("\n");
  706. X                sprintf(NG, "%s", o);
  707. X                if(length(o) > 14){
  708. X                    strcpy(s, o);
  709. X                    strcpy(o, shortname(s));
  710. X                }
  711. X#ifdef _NOINDEX
  712. X                printf("\n%s ..", MI211_MSG);
  713. X                switch( (fpid = fork()) ){
  714. X                    case -1 :
  715. X                        break;
  716. X                    case  0 :    while(1){
  717. X                                printf(".");
  718. X                                sleep(1);
  719. X                            }    
  720. X                        break;
  721. X                }
  722. X                sprintf(s, "%s %s -x", MB_DAEMON, NG);
  723. X                system( s );
  724. X                sprintf(s, "mv %s/%s/%s %s/inhalt.%d", HOME, LIB, o, TMP, getpid());
  725. X                system( s );
  726. X                sprintf(INHALT, "%s/inhalt.%d", TMP, getpid());
  727. X                kill( fpid, 9 );
  728. X                wait( fpid );
  729. X                printf("\n");                
  730. X#else                
  731. X                sprintf(INHALT, "%s/%s", LIB, o);
  732. X#endif
  733. X            } else {
  734. X                ansi("md");
  735. X                printf(" %s\n", MI210_MSG);
  736. X                ansi("me");
  737. X            }
  738. X        }
  739. X        chdir(HOME);
  740. X    }
  741. X  }
  742. X  fclose(fp);
  743. X  return;
  744. X}
  745. X
  746. END_OF_FILE
  747.   if test 8307 -ne `wc -c <'src/misc2.c'`; then
  748.     echo shar: \"'src/misc2.c'\" unpacked with wrong size!
  749.   fi
  750.   # end of 'src/misc2.c'
  751. fi
  752. if test -f 'src/pd.c' -a "${1}" != "-c" ; then 
  753.   echo shar: Will not clobber existing file \"'src/pd.c'\"
  754. else
  755.   echo shar: Extracting \"'src/pd.c'\" \(15299 characters\)
  756.   sed "s/^X//" >'src/pd.c' <<'END_OF_FILE'
  757. X/***************************************************************************/
  758. X/*        PROGRAMM  ix/Mbox                           */
  759. X/*             DATEI  pd.c                           */
  760. X/*        FUNKTIONEN  pd(), download(), status(), mkix(), statistik()       */
  761. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  762. X/*  LETZTE AENDERUNG  18.03.1992                       */
  763. X/***************************************************************************/
  764. X  
  765. X#include <stdio.h>
  766. X#include <sys/types.h>
  767. X#include <signal.h>
  768. X#include <sys/stat.h>
  769. X#include <time.h>
  770. X
  771. X#include "mbox.h"
  772. X
  773. X
  774. X/***************************************************************************/
  775. X/*      FUNKTION  pd()                               */
  776. X/*  BESCHREIBUNG  Eine Datei wird mit o. ohne Protokoll uebertragen.       */
  777. X/*          Diese Funktion wird von "lesen()" oder "pruefe()"        */
  778. X/*          aufgerufen, wenn die zu bearbeitende Datei den Kenn-     */
  779. X/*          zeichner "BINFILE" enthaelt.                             */
  780. X/*     PARAMETER  arg = Dateiname                                          */
  781. X/*     RUECKGABE  keine                               */
  782. X/***************************************************************************/
  783. X
  784. Xvoid pd(arg, keywds)
  785. Xchar arg[], keywds[];
  786. X{
  787. X  FILE *fp;
  788. X  FILE *ff;
  789. X
  790. X  char s[STRING];
  791. X  char tmp[STRING];
  792. X  char c;
  793. X  char protokoll;
  794. X  char cd[STRING];
  795. X  struct stat fst;
  796. X  long ts, tn;
  797. X
  798. X  int cps, bps, eff;
  799. X  int ok, i;
  800. X
  801. X  strcpy(cd, stripped(arg));
  802. X
  803. X  printf("\n\n");
  804. X  ansi("md");
  805. X  printf("%s\n\n", PD01_MSG);
  806. X  
  807. X  if(keywds[0] != '\0'){
  808. X    printf("%s ", PD02_MSG); 
  809. X    ansi("me");
  810. X    printf("%s\n\n", keywds);
  811. X  }
  812. X  else{
  813. X     ansi("me");
  814. X  }
  815. X
  816. X  ansi("mr");
  817. X  printf("%c%s [%c, %c, (%c)] >  ", CR, PD03_MSG, GBL06_MSG, GBL07_MSG, PD06_MSG);
  818. X  ansi("me");
  819. X
  820. X  do {
  821. X    c = getint();
  822. X    if (c >= 97) c -= 32;
  823. X    if ((c != GBL06_MSG) && (c != GBL07_MSG) && (c != PD06_MSG)) c = 0;
  824. X  } while (c == 0);
  825. X
  826. X  printf("%c", c);
  827. X
  828. X  if (c == PD06_MSG) {    /*  X  */
  829. X    printf("\n");
  830. X    sigcatch(SIGINT);    
  831. X  }
  832. X
  833. X  if (c != GBL06_MSG) {    /*  J  */
  834. X    printf("\n");
  835. X    return;
  836. X  }
  837. X  ansi("mr");
  838. X  printf("%c[%s] %c, %c, %c, %c ? > ", CR, PD07_MSG, PD08_MSG, PD09_MSG, PD10_MSG, PD11_MSG);
  839. X  ansi("me");
  840. X
  841. X
  842. X  do {
  843. X    protokoll = getint();
  844. X    if (protokoll >= 97) protokoll -= 32;
  845. X    if (protokoll == '?') {
  846. X        clearline();
  847. X        ansi("mr");
  848. X        printf("%c%s > ", CR, PD12_MSG);
  849. X        ansi("me");
  850. X    }
  851. X    if ((protokoll != PD08_MSG) && (protokoll != PD09_MSG) &&
  852. X        (protokoll != PD10_MSG) && (protokoll != PD11_MSG))
  853. X        protokoll = 0;
  854. X  } while (protokoll == 0);
  855. X
  856. X
  857. X  printf("%c", protokoll);
  858. X
  859. X  signal(SIGINT,  SIG_IGN);
  860. X  signal(SIGHUP,  SIG_IGN);
  861. X  signal(SIGQUIT, SIG_IGN);
  862. X  signal(SIGABRT, SIG_IGN);
  863. X  signal(SIGTERM, SIG_IGN);
  864. X
  865. X  printf("\n\n");
  866. X  ansi("md");
  867. X  printf("%s\n\n", PD13_MSG);
  868. X  ansi("me");
  869. X
  870. X  time(&ts);
  871. X
  872. X  switch (protokoll) {
  873. X      case PD08_MSG:
  874. X        sprintf(s, "exec cat %s", cd);
  875. X        break;
  876. X      case PD09_MSG:
  877. X        sprintf(s, "exec %s -b %s 2> /dev/null", SX, cd);
  878. X        break;
  879. X      case PD10_MSG:
  880. X        sprintf(s, "exec %s %s 2> /dev/null", SB, cd);
  881. X        break;
  882. X      case PD11_MSG:
  883. X        sprintf(s, "exec %s %s 2> /dev/null", SZ, cd);
  884. X        break;
  885. X  }
  886. X  system( s );
  887. X
  888. X  time(&tn); tn = tn - ts; 
  889. X
  890. X  stat(cd, &fst);
  891. X  USER.downratio += ((long) fst.st_size / 1024);
  892. X
  893. X  ansi( "md" );
  894. X  if(tn < 1) tn = 1;
  895. X  cps = fst.st_size / tn;
  896. X  bps = cps * 11;
  897. X
  898. X  BAUDRATE = baudrate( bps );
  899. X
  900. X  eff = ((100000 / BAUDRATE) * bps) / 1000;  
  901. X
  902. X  if(bps > BAUDRATE){
  903. X    printf("\n\n%s\n", PD14_MSG);
  904. X    ok = -1;
  905. X  }
  906. X  else{    
  907. X    printf("\n\n%ld %s.\n", fst.st_size, PD15_MSG);
  908. X    ok = 0;
  909. X  }
  910. X
  911. X  ansi( "me" );
  912. X  printf("%s %d cps (ca. %d bps).", PD16_MSG, cps, bps);
  913. X  sprintf(tmp, "%s/%d.pd", TMP, getpid());
  914. X  ff = fopen( tmp, "w" );
  915. X
  916. X
  917. X  if(ok == 0){
  918. X    fprintf(ff, "%s  %c  %-40.40s", mydate( 1 ), protokoll, cd); 
  919. X    if(bps < BAUDRATE){
  920. X        fprintf(ff, "  %6.d  %6.d  %2.d%% OK\n", cps, bps, eff);
  921. X    }
  922. X    else{
  923. X        fprintf(ff, "  %6.d  %6.d  %2.d%% BRK\n", cps, bps, eff);
  924. X    }
  925. X  }
  926. X  else{
  927. X    /*
  928. X    fprintf(ff, "%s  %c  %-40.40s", mydate( 1 ), protokoll, cd); 
  929. X    fprintf(ff, "  %6.6d  %6.6d  %s\n", cps, bps, PD17_MSG);
  930. X    */
  931. X  }
  932. X
  933. X  i = 0;
  934. X
  935. X  fp = fopen( PDLOG, "r" );
  936. X  if(fp != NULL){
  937. X    while((fgets(s, 80, fp) != NULL) && (i < PRO_ENTRIES)){
  938. X        fputs(s, ff);
  939. X        i++;
  940. X    }
  941. X    fclose(fp);
  942. X  }
  943. X
  944. X  fclose(ff);
  945. X
  946. X  sprintf(cd, "mv %s %s", tmp, PDLOG);
  947. X  system( cd );
  948. X
  949. X  printf("\n");
  950. X}
  951. X
  952. X
  953. X
  954. X
  955. X/***************************************************************************/
  956. X/*      FUNKTION  status                           */
  957. X/*  BESCHREIBUNG  Verschiedene (eigentlich fast alle) Eintraege aus den    */
  958. X/*          Teilnehmerdaten werden angezeigt.                        */
  959. X/*     PARAMETER  keine                                                       */
  960. X/*     RUECKGABE  keine                                 */
  961. X/***************************************************************************/
  962. X
  963. Xvoid status()
  964. X{
  965. X  char s[STRING];
  966. X  char t[STRING];
  967. X  char ex[255];
  968. X  int a, b;
  969. X  int i;
  970. X
  971. X
  972. X  sprintf(s, " %s %d ) %s ", PD18_MSG, USER.id, USER.name);
  973. X  headline(s);
  974. X  printf("\n");
  975. X
  976. X  ansi("md");
  977. X  printf("%s", PD19_MSG);
  978. X  ansi("me");
  979. X
  980. X  printf("\n");
  981. X
  982. X  sprintf(ex, "%s                                        ", USER.name);
  983. X  ex[27] = '\0';
  984. X  strcat(ex, USER.nick);
  985. X  strcat(ex, "                            ");
  986. X  ex[45] = '\0';
  987. X  strcat(ex, USER.geburtsdatum);
  988. X  strcat(ex, "                            ");
  989. X  ex[62] = '\0';
  990. X  strcat(ex, USER.telefon1);
  991. X  printf("%s\n", ex);
  992. X
  993. X  sprintf(ex, "%s                                        ", USER.strasse);
  994. X  ex[27] = '\0';
  995. X  strcat(ex, USER.sh_name);
  996. X  strcat(ex, "                            ");
  997. X  ex[45] = '\0';
  998. X  strcat(ex, "                            ");
  999. X  ex[62] = '\0';
  1000. X  strcat(ex, USER.telefon2);
  1001. X  printf("%s\n", ex);
  1002. X
  1003. X  printf("%s\n\n", USER.wohnort);
  1004. X  ansi("md");
  1005. X  printf("%s", PD20_MSG);  
  1006. X  ansi("me");
  1007. X  printf("\n");
  1008. X
  1009. X  s[0] = '\0'; strcat(s, datereconv( LASTLOG ));
  1010. X  strcat(s, "-"); strcat(s, timereconv( LASTTIME ));
  1011. X  s[16] = '\0';
  1012. X
  1013. X  sprintf(ex, "       %1d       %1d  %5d     %1d       %1d     %1d      %1d  %6d  %s",
  1014. X    USER.terminal, USER.editor, USER.level, USER.bell, USER.prompt, USER.more, USER.intro, USER.seq, s);
  1015. X  printf("%s\n\n", ex);
  1016. X
  1017. X  ansi("md");
  1018. X  printf("%s", PD21_MSG);  
  1019. X  ansi("me");
  1020. X  sprintf(ex, "\n%06.6d                      %06.6d                    %06.6d",
  1021. X    (USER.elapsed / 60), USER.upratio, USER.downratio);
  1022. X  printf("%s\n\n", ex);
  1023. X
  1024. X  ansi("md");
  1025. X  printf("%s", PD22_MSG);
  1026. X  ansi("me");
  1027. X
  1028. X  i = 0;
  1029. X  strcpy(s, (char *) USER.name);
  1030. X  while (s[i] != '\0') {
  1031. X    if (s[i] == ' ') s[i] = '.';
  1032. X    i++;
  1033. X  }
  1034. X
  1035. X  sprintf(t,  "%s: %s@%s", PD23_MSG, s, UUCPID);
  1036. X  strcpy(s, USER.account); s[10] = '\0';
  1037. X  sprintf(ex, "%-54.54s%s\n%s: %s%s", t, s, PD24_MSG, UUCPBANG, USER.nick);
  1038. X  printf("\n%s\n", ex);
  1039. X  if (USER.sh_name[0] != '\0')
  1040. X    printf("%s: %s!%s\n", PD25_MSG, UUCPSITE, USER.sh_name);
  1041. X
  1042. X  printf("\n");
  1043. X
  1044. X  ansi("md");
  1045. X  printf("%s\n", PD26_MSG);
  1046. X
  1047. X  ansi("me");
  1048. X
  1049. X  i = 1;
  1050. X  while(newsgrp[i][0] != '\0'){
  1051. X    if(i != 1) printf(", ");
  1052. X    printf("%s", newsgrp[i]);
  1053. X    i++;
  1054. X  }
  1055. X
  1056. X  printf("\n\n");  
  1057. X}
  1058. X
  1059. X
  1060. X
  1061. X/***************************************************************************/
  1062. X/*      FUNKTION  mkix()                           */
  1063. X/*  BESCHREIBUNG  Wandelt eine Datei ins UNIX-Format (CRs werden entfernt) */
  1064. X/*     PARAMETER  s  =  Dateiname                                          */
  1065. X/*     RUECKGABE  keine                                                    */
  1066. X/***************************************************************************/
  1067. X
  1068. Xvoid mkix( pfad )
  1069. Xchar pfad[];
  1070. X{
  1071. X  FILE *fp; 
  1072. X  FILE *ff;
  1073. X
  1074. X  char s[255];
  1075. X  char p[255];
  1076. X
  1077. X  int i, ok = 0;
  1078. X
  1079. X  
  1080. X  sprintf(p, "%sabc", pfad);
  1081. X
  1082. X  fp = fopen( pfad, "r" );
  1083. X  if(fp == NULL){
  1084. X    return;
  1085. X  }      
  1086. X
  1087. X  ff = fopen( p, "w" );
  1088. X  if(ff == NULL){
  1089. X    nerror("pd.c", 243, "mkix", "Datei-Erstellungsfehler", p);    
  1090. X  }
  1091. X
  1092. X  while((ok == 0) && (fgets(s, 254, fp) != NULL)){
  1093. X    i = 0;
  1094. X    while(s[i] != '\0'){
  1095. X        if(s[i] == CTRL_Z){
  1096. X            ok++;
  1097. X            break;
  1098. X        }
  1099. X        i++;
  1100. X    }
  1101. X    if(ok == 0){
  1102. X        i = strlen(s) -2;
  1103. X        if(s[i] == CR){
  1104. X            s[i]    = LF;
  1105. X            s[i +1] = '\0';
  1106. X        }
  1107. X        fputs(s, ff);
  1108. X    }
  1109. X  }
  1110. X  fclose(fp);
  1111. X  fclose(ff);
  1112. X
  1113. X  unlink(pfad);
  1114. X  rename(p, pfad);
  1115. X}
  1116. X
  1117. X
  1118. X
  1119. X/***************************************************************************/
  1120. X/*      FUNKTION  statitik()                           */
  1121. X/*  BESCHREIBUNG  Anrufer-Protokoll auswerten                    */
  1122. X/*     PARAMETER  keine                                                       */
  1123. X/*     RUECKGABE  keine                                                    */
  1124. X/***************************************************************************/
  1125. X
  1126. Xvoid statistik()
  1127. X{
  1128. X  FILE *fp;
  1129. X
  1130. X  struct tm *tp;
  1131. X  time_t tt;
  1132. X
  1133. X  char s[STRING];
  1134. X  char od[MAX_TAGE][STRING];
  1135. X  char t[STRING];
  1136. X  char r[STRING];
  1137. X
  1138. X  int v18u[MAX_TAGE];
  1139. X  int n18u[MAX_TAGE];
  1140. X  int v18g = 0;
  1141. X  int n18g = 0;
  1142. X
  1143. X  int zeit = 0;
  1144. X  int tage = 0;
  1145. X  int max  = 0;
  1146. X
  1147. X  int i, a;
  1148. X  int toggle = 0;
  1149. X  int sun;
  1150. X
  1151. X  fp = fopen( CALLS, "r" );
  1152. X  if(fp == NULL){
  1153. X    nerror("pd.c", 288, "statistik", "Datei-Lesefehler", CALLS);        
  1154. X  }
  1155. X
  1156. X  od[0][0] = '\0';
  1157. X
  1158. X  headline( PD27_MSG );
  1159. X  printf("%s\n", PD28_MSG);
  1160. X  printf("===============================================================================\n");
  1161. X
  1162. X  while((fgets(s, (STRING *2), fp) != NULL) && (tage < (MAX_SCR_LINES -7))){
  1163. X    strcpy(t, (char *) strcopy(s, 64, 71));
  1164. X
  1165. X    if(strcomp(t, od[tage]) != 0){
  1166. X        if(tage != 0){
  1167. X            if((v18u[tage] + n18u[tage]) > max){
  1168. X                max = v18u[tage] + n18u[tage];
  1169. X            }
  1170. X            v18g += v18u[tage];
  1171. X            n18g += n18u[tage];
  1172. X        }
  1173. X        tage++;
  1174. X        od[tage][0] = '\0'; strcat(od[tage], t);
  1175. X        v18u[tage] = 0;
  1176. X        n18u[tage] = 0;
  1177. X        }
  1178. X    zeit = atoi(strcopy(s, 74, 75));
  1179. X    if((zeit >   6) && (zeit < 18)) v18u[tage]++;
  1180. X    if((zeit >= 18) || (zeit <= 6)) n18u[tage]++;
  1181. X  }
  1182. X
  1183. X  sprintf(s, "%s", "ooooooooooooooooooooooooooooooooooooooooooooooooooooo");
  1184. X
  1185. X  time(&tt);
  1186. X  tp = localtime(&tt);
  1187. X  sun = tp->tm_wday;
  1188. X
  1189. X  for(i = 1; i < tage; i++){
  1190. X    sprintf(t, "%s", s);
  1191. X    a = (290 / max * (v18u[i] + n18u[i])) / 10;
  1192. X    t[a] = '\0';    
  1193. X    strcpy(r, "    ");    
  1194. X    if(sun == 0){
  1195. X        strcpy(r, PD29_MSG);
  1196. X        toggle++;    
  1197. X        ansi( "md" );
  1198. X    }
  1199. X    if(sun == 6) 
  1200. X        strcpy(r, PD30_MSG);
  1201. X    sun--;
  1202. X    if(sun == -1) sun = 6;
  1203. X
  1204. X    printf("%s %s %4.d        %5.d         %5.d      %s\n",
  1205. X                od[i], r, v18u[i], n18u[i], v18u[i]+n18u[i], t);
  1206. X    if(toggle != 0) ansi( "me" );
  1207. X    toggle = 0;
  1208. X  }
  1209. X
  1210. X  printf("-------------------------------------------------------------------------------\n");
  1211. X  printf("%s %5.d        %5.d         %5.d      %s\n",
  1212. X      PD31_MSG, v18g, n18g, v18g+n18g, PD32_MSG);
  1213. X  printf("===============================================================================\n");
  1214. X
  1215. X  printf("\n%s %d %s.\n", PD33_MSG, (tage -1), PD34_MSG);   
  1216. X
  1217. X  fclose(fp);
  1218. X}
  1219. X
  1220. X
  1221. X
  1222. X
  1223. X/***************************************************************************/
  1224. X/*      FUNKTION  download()                           */
  1225. X/*  BESCHREIBUNG  Text- und Binaerartikel uebertragen               */
  1226. X/*     PARAMETER  arg = artikel[-artikel]                                  */
  1227. X/*     RUECKGABE  keine                                                    */
  1228. X/***************************************************************************/
  1229. X
  1230. X#define MAX_DL_FILES 20
  1231. X
  1232. Xvoid download( arg )
  1233. Xchar arg[];
  1234. X{
  1235. X  int i, k, l, m;
  1236. X  int von, bis;
  1237. X  int ALLE;
  1238. X  int protokoll, ok;
  1239. X  int cps, bps, eff;
  1240. X
  1241. X  long ts, tn;
  1242. X  long bytes_total = 0L;
  1243. X
  1244. X  struct stat fst;
  1245. X
  1246. X  char s[STRING];
  1247. X  char cd[LONGSTRING];
  1248. X  char t[(LONGSTRING+STRING)];
  1249. X  char tmp[STRING];
  1250. X
  1251. X  char files[MAX_DL_FILES][STRING];
  1252. X  int mdlp = 1;
  1253. X
  1254. X  int art[MAX_PER_NG];
  1255. X  int artp = 0;
  1256. X
  1257. X
  1258. X  FILE *fp, *ff;
  1259. X
  1260. X  
  1261. X  tmp[0] = '\0';
  1262. X
  1263. X  i = 0;
  1264. X  k = -1;
  1265. X  l = -1;
  1266. X  m = -1;
  1267. X
  1268. X  while (arg[i] != '\0') {
  1269. X    if (arg[i] == '-') k = i;
  1270. X    if (arg[i] == '*') l = i;
  1271. X    if ((arg[i] > 48) && (arg[i] < 58) && (m == -1)) m = i;
  1272. X    i++;
  1273. X  }
  1274. X
  1275. X  von = 1;
  1276. X  bis = 32000;
  1277. X
  1278. X  if ((m == -1) && (l == -1) && (k == -1)) {
  1279. X    return;
  1280. X  }
  1281. X
  1282. X  if ((m != -1) && (l == -1) && (k == -1)) {
  1283. X    strcpy(s, (char *) strcopy(arg, m, length(arg)));
  1284. X    von = atoi(s);
  1285. X    bis = von;
  1286. X  }
  1287. X  if (k != -1) {
  1288. X    strcpy(s, (char *) strcopy(arg, 0, (k - 1)));
  1289. X    von = atoi(s);
  1290. X    strcpy(s, (char *) strcopy(arg, (k + 1), length(arg)));
  1291. X    bis = atoi(s);
  1292. X
  1293. X    if (von == 0) von = 1;
  1294. X    if (bis == 0) bis = 32000;
  1295. X  }
  1296. X  
  1297. X  if(von > bis){
  1298. X    i = bis;
  1299. X    bis = von;
  1300. X    von = i;
  1301. X  }
  1302. X
  1303. X  maybe_locked(INHALT, "r");
  1304. X  fp = fopen(INHALT, "r");
  1305. X  if (fp == NULL) {
  1306. X    nerror("pd.c", 504, "download", "Datei-Lesefehler", INHALT);
  1307. X  }
  1308. X  while (fgets(cd, 250, fp) != NULL){
  1309. X    i = atoi(cd);
  1310. X    if((i >= von) && (i <= bis)){
  1311. X        art[artp] = i;
  1312. X        artp++;
  1313. X        if(artp > MAX_PER_NG){
  1314. X            printf("SHIT!!!");
  1315. X            exit(0);
  1316. X        }        
  1317. X    }
  1318. X  }
  1319. X  fclose(fp);
  1320. X
  1321. X
  1322. X  printf("\n\n");
  1323. X
  1324. X  ansi("mr");
  1325. X  printf("%c[%s] %c, %c, %c, %c ? > ", CR, PD07_MSG, PD08_MSG, PD09_MSG, PD10_MSG, PD11_MSG);
  1326. X  ansi("me");
  1327. X
  1328. X
  1329. X  do {
  1330. X    protokoll = getint();
  1331. X    if (protokoll >= 97) protokoll -= 32;
  1332. X    if (protokoll == '?') {
  1333. X        clearline();
  1334. X        ansi("mr");
  1335. X        printf("%c%s > ", CR, PD12_MSG);
  1336. X        ansi("me");
  1337. X    }
  1338. X    if ((protokoll != PD08_MSG) && (protokoll != PD09_MSG) &&
  1339. X        (protokoll != PD10_MSG) && (protokoll != PD11_MSG))
  1340. X        protokoll = 0;
  1341. X  } while (protokoll == 0);
  1342. X
  1343. X
  1344. X  printf("%c", protokoll);
  1345. X
  1346. X  if (strcomp(BRETT, "PM") != 0) {
  1347. X           sprintf(s, "%s", BRETT); 
  1348. X  }
  1349. X  else {
  1350. X    sprintf(s, "%s/usr/%d", HOME, USER.id);
  1351. X  }
  1352. X  chdir( s );
  1353. X
  1354. X  cd[0] = '\0';
  1355. X  printf("\n\n%s .", PD36_MSG);
  1356. X  
  1357. X  for( i = 0; i < artp; i++){  
  1358. X
  1359. X    sprintf(s, "%d", art[i]); 
  1360. X    
  1361. X    fp = fopen(s, "r");
  1362. X    if(fp != 0){
  1363. X        printf(".");
  1364. X
  1365. X        while ((fgets(t, 250, fp) != NULL) && (t[0] > 32));
  1366. X        while ((fgets(t, 250, fp) != NULL) && (t[0] < 32));
  1367. X
  1368. X        ok = 0;
  1369. X
  1370. X        if (strcomp("BINFILE", t) == 0) {
  1371. X            fgets(t, 80, fp);
  1372. X            strcpy(s, (char *) stripped(t));
  1373. X            ok++;
  1374. X        }
  1375. X        if(((strlen(s) + strlen(cd)) < LONGSTRING) && (mdlp < MAX_DL_FILES)){
  1376. X            stat(s, &fst);
  1377. X            bytes_total += (long) fst.st_size;
  1378. X
  1379. X            if(ok != 0){
  1380. X                strcpy(files[mdlp], s);
  1381. X                mdlp++;                
  1382. X                USER.downratio += ((long) fst.st_size / 1024);
  1383. X            }
  1384. X
  1385. X            strcat(cd, s); 
  1386. X            strcat(cd, " ");
  1387. X            fclose(fp);
  1388. X        }
  1389. X    }
  1390. X  }
  1391. X
  1392. X  if(cd[0] == '\0'){
  1393. X    ansi("md");
  1394. X    printf("%c%s\n", CR, PD35_MSG);
  1395. X    ansi("me");
  1396. X    chdir( HOME );
  1397. X    return;
  1398. X  }
  1399. X
  1400. X  signal(SIGINT, SIG_IGN);
  1401. X  signal(SIGHUP, SIG_IGN);
  1402. X  signal(SIGQUIT, SIG_IGN);
  1403. X  signal(SIGABRT, SIG_IGN);
  1404. X  signal(SIGTERM, SIG_IGN);
  1405. X
  1406. X  printf("\n\n");
  1407. X  ansi("md");
  1408. X  printf("%s\n\n", PD13_MSG);
  1409. X  ansi("me");
  1410. X
  1411. X  time(&ts);
  1412. X  switch (protokoll) {
  1413. X      case PD08_MSG:
  1414. X        sprintf(t, "exec cat %s", cd);
  1415. X        break;
  1416. X      case PD09_MSG:
  1417. X        sprintf(t, "exec %s -b %s 2> /dev/null", SX, cd);
  1418. X        break;
  1419. X      case PD10_MSG:
  1420. X        sprintf(t, "exec %s %s 2> /dev/null", SB, cd);
  1421. X        break;
  1422. X      case PD11_MSG:
  1423. X        sprintf(t, "exec %s %s 2> /dev/null", SZ, cd);
  1424. X        break;
  1425. X  }    
  1426. X  system( t );
  1427. X
  1428. X  time(&tn); tn = tn - ts; 
  1429. X
  1430. X  chdir( HOME );
  1431. X
  1432. X  ansi( "md" );
  1433. X  if(tn < 1) tn = 1;
  1434. X  cps = bytes_total / tn;
  1435. X  bps = cps * 11;
  1436. X
  1437. X  BAUDRATE = baudrate( bps );
  1438. X
  1439. X  eff = ((100000 / BAUDRATE) * bps) / 1000;
  1440. X
  1441. X  if(bps > BAUDRATE){
  1442. X    printf("\n\n%s\n", PD14_MSG);
  1443. X    ok = -1;
  1444. X  }
  1445. X  else{    
  1446. X    printf("\n\n%ld %s.\n", fst.st_size, PD15_MSG);
  1447. X    ok = 0;
  1448. X  }
  1449. X
  1450. X  ansi( "me" );
  1451. X  printf("%s %d cps (ca. %d bps).", PD16_MSG, cps, bps);  
  1452. X
  1453. X  
  1454. X  if(ok != -1){
  1455. X      
  1456. X    sprintf(tmp, "%s/%d.pd", TMP, getpid());
  1457. X    ff = fopen( tmp, "w" );
  1458. X
  1459. X    for(i = 1; i < mdlp; i++){
  1460. X        fprintf(ff, "%s  %c  %-40.40s", mydate( 1 ), protokoll, files[i]); 
  1461. X        fprintf(ff, "  %6.d  %6.d  %2.d%% DNL\n", cps, bps, eff);        
  1462. X    }  
  1463. X
  1464. X    i = 0;
  1465. X
  1466. X    fp = fopen( PDLOG, "r" );
  1467. X    if(fp != NULL){
  1468. X        while((fgets(s, 80, fp) != NULL) && (i < PRO_ENTRIES)){
  1469. X            fputs(s, ff);
  1470. X            i++;
  1471. X        }
  1472. X        fclose(fp);
  1473. X    }
  1474. X
  1475. X    fclose(ff);
  1476. X
  1477. X    sprintf(cd, "mv %s %s", tmp, PDLOG);
  1478. X    system( cd );
  1479. X  }
  1480. X  else{
  1481. X    if(ff != 0) fclose(ff);
  1482. X    if(tmp[0] != '\0') unlink(tmp);
  1483. X  }
  1484. X
  1485. X  printf("\n\n");
  1486. X}
  1487. X
  1488. X
  1489. END_OF_FILE
  1490.   if test 15299 -ne `wc -c <'src/pd.c'`; then
  1491.     echo shar: \"'src/pd.c'\" unpacked with wrong size!
  1492.   fi
  1493.   # end of 'src/pd.c'
  1494. fi
  1495. if test -f 'src/portinfo.c' -a "${1}" != "-c" ; then 
  1496.   echo shar: Will not clobber existing file \"'src/portinfo.c'\"
  1497. else
  1498.   echo shar: Extracting \"'src/portinfo.c'\" \(14509 characters\)
  1499.   sed "s/^X//" >'src/portinfo.c' <<'END_OF_FILE'
  1500. X/***************************************************************************/
  1501. X/*        PROGRAMM  ix/Mbox                           */
  1502. X/*             DATEI  portinfo.c                       */
  1503. X/*        FUNKTIONEN  port(), show_level(), userliste(), finger()       */
  1504. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1505. X/*  LETZTE AENDERUNG  28.03.1992                       */
  1506. X/***************************************************************************/
  1507. X
  1508. X#include <sys/types.h>
  1509. X#include <sys/stat.h>
  1510. X#include <fcntl.h>
  1511. X#include <unistd.h>
  1512. X#include <stdio.h>
  1513. X#include <utmp.h>
  1514. X#include <time.h>
  1515. X
  1516. X#include <string.h>
  1517. X
  1518. X#include "mbox.h"
  1519. X
  1520. X
  1521. X
  1522. X
  1523. X/***************************************************************************/
  1524. X/*      FUNKTION  port()                           */
  1525. X/*  BESCHREIBUNG  Anzeigen was die Mbox- und die SH-User z. Zt. anstellen. */
  1526. X/*     PARAMETER  keine                                                       */
  1527. X/*     RUECKGABE  keine                                                       */
  1528. X/***************************************************************************/
  1529. X
  1530. Xvoid port(arg)
  1531. Xchar arg[];
  1532. X{
  1533. X  FILE *fp;
  1534. X  FILE *ff;
  1535. X  FILE *pp;
  1536. X  int fd;
  1537. X  char s[STRING];
  1538. X  char t[STRING];
  1539. X  char ks[STRING];
  1540. X  char ls[STRING];
  1541. X  char tmp[STRING];
  1542. X  char ex[255];
  1543. X  char terms[MAX_TERMINALS][STRING];
  1544. X  int termc = 0;
  1545. X  int a, b, k, l;
  1546. X  struct utmp US;
  1547. X  struct tm *tmt;
  1548. X  long ltime;
  1549. X  
  1550. X
  1551. X  if(arg[0] != '-'){
  1552. X    headline( POR01_MSG );
  1553. X  }
  1554. X  else printf("\n\n");
  1555. X
  1556. X  printf("%s\n", POR02_MSG);
  1557. X  printf("===============================================================================\n");
  1558. X
  1559. X  printf("%s ", POR03_MSG);
  1560. X
  1561. X  maybe_locked(WHO, "r");
  1562. X  fp = fopen(WHO, "r");
  1563. X  if (fp == NULL) {
  1564. X    nerror("portinfo.c", 56, "port", "Datei-Lesefehler", WHO);
  1565. X  }
  1566. X  while (fgets(s, 80, fp) != NULL) {
  1567. X    printf(".");
  1568. X    if(s[0] > 32){
  1569. X        strcpy(t, (char *) strcopy(s, 6, 80));
  1570. X        sprintf(terms[termc], "%s", t);
  1571. X        strcat(terms[termc], "          ");
  1572. X        terms[termc][56] = '\0';
  1573. X        sprintf(t, "%s", (char *) strcopy(s, 40, 49));
  1574. X        sprintf(s, "%s/etc/%s.", HOME, (char *) stripped(t));
  1575. X        ff = fopen(s, "r");
  1576. X        if (ff == NULL) {
  1577. X            continue;
  1578. X        }
  1579. X        fgets(s, 80, ff);
  1580. X        s[23] = '\0';
  1581. X        fclose(ff);
  1582. X        strcat(terms[termc], s);
  1583. X        strcat(terms[termc], "\n");
  1584. X        termc++;
  1585. X    }
  1586. X  }
  1587. X  fclose(fp);
  1588. X
  1589. X  sprintf(tmp, "%s/%dps", TMP, getpid());
  1590. X  sprintf(s, "ps -a > %s", tmp);
  1591. X  system( s );
  1592. X
  1593. X#ifdef _SYS7
  1594. X  maybe_locked(UTMP, "r");
  1595. X  fd = open(UTMP, O_RDONLY);
  1596. X#else
  1597. X  maybe_locked(UTMP_FILE, "r");
  1598. X  fd = open(UTMP_FILE, O_RDONLY);
  1599. X#endif
  1600. X
  1601. X  if (fd == -1) {
  1602. X
  1603. X#ifdef _SYS7
  1604. X    nerror("portinfo.c", 83, "port", "Datei-Lesefehler", UTMP);
  1605. X#else
  1606. X    nerror("portinfo.c", 83, "port", "Datei-Lesefehler", UTMP_FILE);
  1607. X#endif
  1608. X
  1609. X  }
  1610. X  while (read(fd, &US, sizeof(US)) == sizeof(US)) {
  1611. X
  1612. X    printf(".");
  1613. X    t[0] = '\0';
  1614. X    strcat(t, "[$] -\n");
  1615. X
  1616. X    if (US.ut_type == USER_PROCESS) {
  1617. X        terms[termc][0] = '\0';
  1618. X        sprintf(ex, "%.8s [SH-Account]                                                  ",
  1619. X            US.ut_user);
  1620. X        ex[33] = '\0';
  1621. X        strcat(terms[termc], ex);
  1622. X
  1623. X        sprintf(ex, " %s                ",
  1624. X            US.ut_line);
  1625. X        ex[11] = '\0';
  1626. X        strcat(terms[termc], ex);
  1627. X
  1628. X        ltime = US.ut_time;
  1629. X        tmt = localtime(<ime);
  1630. X        sprintf(ex, "%02.2d:%02.2d   ",
  1631. X            tmt->tm_hour, tmt->tm_min);
  1632. X        strcat(terms[termc], ex);
  1633. X
  1634. X        l = atoi(strcopy(US.ut_line, 3, 6));
  1635. X
  1636. X        pp = fopen(tmp, "r");
  1637. X        if (pp == NULL) {
  1638. X            nerror("portinfo.c", 113, "port", tmp, "???");
  1639. X        }
  1640. X        while (fgets(s, 80, pp) != NULL) {
  1641. X            k = atoi((char *) strcopy(s, 8, 10));
  1642. X            if ((k == l) && (s[17] != '-')) {
  1643. X                t[0] = '\0';
  1644. X                strcat(t, "[$] ");
  1645. X                strcat(t, (char *) strcopy(s, 17, 40));
  1646. X                s[0] = '\0';
  1647. X                strcat(s, t);
  1648. X                t[0] = '\0';
  1649. X                strcat(t, (char *) stripped(s));
  1650. X                t[27] = '\0';
  1651. X                strcat(t, "\n");
  1652. X            }
  1653. X        }
  1654. X        fclose(pp);
  1655. X
  1656. X        strcat(terms[termc], t);
  1657. X        termc++;
  1658. X    }
  1659. X  }
  1660. X  close(fd);
  1661. X
  1662. X  unlink(tmp);
  1663. X
  1664. X  printf("%c", CR);
  1665. X
  1666. X  for (a = 0; a < termc; a++) {
  1667. X    for (b = 0; b < termc; b++) {
  1668. X        sprintf(ks, "%s", (char *) strcopy(terms[a], 34, 40));
  1669. X        sprintf(ls, "%s", (char *) strcopy(terms[b], 34, 40));
  1670. X        if((strcomp(ks, ls) == 0) && (a != b)){
  1671. X            if (terms[a][53] == '$') terms[a][0] = '*';
  1672. X            if (terms[b][53] == '$') terms[b][0] = '*';
  1673. X        }
  1674. X        sprintf(s, "%d", ks); k = atoi(s);
  1675. X        sprintf(s, "%d", ls); l = atoi(s);
  1676. X        if (k < l) {
  1677. X            s[0] = '\0';
  1678. X            strcat(s, terms[a]);
  1679. X            terms[a][0] = '\0';
  1680. X            strcat(terms[a], terms[b]);
  1681. X            terms[b][0] = '\0';
  1682. X            strcat(terms[b], s);
  1683. X        }
  1684. X    }
  1685. X  }
  1686. X
  1687. X
  1688. X  for (a = 0; a < termc; a++) {
  1689. X    if (terms[a][0] != '*'){
  1690. X        if(terms[a][53] != '$') ansi( "md" );
  1691. X        printf("%s", terms[a]);
  1692. X        if(terms[a][53] != '$') ansi( "me" );
  1693. X    }
  1694. X  }
  1695. X
  1696. X  printf("\n");
  1697. X}
  1698. X
  1699. X
  1700. X
  1701. X
  1702. X
  1703. X/***************************************************************************/
  1704. X/*      FUNKTION  show_level()                           */
  1705. X/*  BESCHREIBUNG  Zuweisung der Userlevel anzeigen.               */
  1706. X/*     PARAMETER  keine                                                       */
  1707. X/*     RUECKGABE  keine                                                       */
  1708. X/***************************************************************************/
  1709. X
  1710. Xvoid show_level()
  1711. X{
  1712. X  headline( POR04_MSG );
  1713. X  printf("\n");
  1714. X
  1715. X  printf("%s\n", POR05_MSG);
  1716. X  printf("-----------------------------------------\n");
  1717. X  printf("%s (%d)\n", POR06_MSG, GUEST_LEV);
  1718. X  printf("%s (%d)\n", POR07_MSG, WRITE_IN_LEV);
  1719. X  printf("%s (%d)\n", POR08_MSG, MAILOUT_LEV);
  1720. X  printf("%s (%d)\n", POR09_MSG, WRITE_EX_LEV);
  1721. X  printf("%s (%d)\n", POR10_MSG, WRITE_INTERNAT);
  1722. X  printf("%s (%d)\n", POR11_MSG, PD_D_LEV);
  1723. X  printf("%s (%d)\n", POR12_MSG, PD_U_LEV);
  1724. X  printf("%s (%d)\n", POR13_MSG, EXE_LEV);
  1725. X  printf("%s (%d)\n", POR14_MSG, ADMIN_LEV);
  1726. X
  1727. X  printf("\n%s (%d), %s !\n\n", POR15_MSG, USER.level, USER.name);
  1728. X
  1729. X}
  1730. X
  1731. X
  1732. X
  1733. X/***************************************************************************/
  1734. X/*      FUNKTION  userliste()                           */
  1735. X/*  BESCHREIBUNG  Verschieden Formen der Userliste ausgeben.           */
  1736. X/*     PARAMETER  arg  =  ''   =  nur Username und ID                      */
  1737. X/*              '*'  =  Name, letzter Anruf etc.                 */
  1738. X/*              '#'  =  Name, Up- / Downloads               */
  1739. X/*              '%'  =  Gebuehren-Stand               */
  1740. X/*     RUECKGABE  keine                                                       */
  1741. X/***************************************************************************/
  1742. X
  1743. Xvoid userliste(arg)
  1744. Xchar arg[];
  1745. X{
  1746. X  FILE *fp;
  1747. X  int fd;
  1748. X  struct userdaten LOOSER;
  1749. X  char s[STRING];
  1750. X  char u[(STRING*2)];
  1751. X  char tmp[STRING];
  1752. X  int i = 0, l;
  1753. X  int mode = 0;
  1754. X  int totalusr = 0;
  1755. X  int totalact = 0;
  1756. X  int totalgas = 0;
  1757. X
  1758. X  char c;
  1759. X
  1760. X  if (arg[0] == '*') mode = 1;
  1761. X  if ((arg[0] == '#') && (USER.level >= ADMIN_LEV)) mode = 2;
  1762. X  if ((arg[0] == '%') && (USER.level >= ADMIN_LEV)) mode = 3;
  1763. X  if ((arg[0] > 47) && (mode == 0)){
  1764. X    finger(arg);
  1765. X    return;
  1766. X  }
  1767. X  headline( POR15aMSG );
  1768. X
  1769. X  show(UDBASE, 99, 99); /* RESET */
  1770. X
  1771. X  if (mode == 1) {
  1772. X    printf("%s\n", POR16_MSG);    
  1773. X    printf("===============================================================================\n");
  1774. X    printf("%s", POR17_MSG);
  1775. X  }
  1776. X  if (mode == 2) {
  1777. X    printf("%s\n", POR18_MSG);    
  1778. X    printf("===============================================================================\n");
  1779. X    printf("%s", POR17_MSG);
  1780. X  }
  1781. X  if (mode == 3) {
  1782. X        printf("%s\n", POR18aMSG);    
  1783. X    printf("===============================================================================\n");
  1784. X    printf("%s", POR17_MSG);
  1785. X  }
  1786. X
  1787. X  sprintf(tmp, "%s/%d", TMP, getpid());
  1788. X  fp = fopen(tmp, "w");
  1789. X  if (fp == NULL) {
  1790. X    nerror("portinfo.c", 231, "userliste", "Datei-Schreibfehler", tmp);
  1791. X  }
  1792. X  maybe_locked(UDBASE, "r");
  1793. X  fd = open(UDBASE, O_RDONLY);
  1794. X  if (fd == -1) {
  1795. X    nerror("admin.c", 254, "userliste", "Datei-Lesefehler", UDBASE);
  1796. X  }
  1797. X  while (read(fd, &LOOSER, sizeof(LOOSER)) == sizeof(LOOSER)) {
  1798. X    if (mode == 0) {
  1799. X        sprintf(u, "%s", LOOSER.name);
  1800. X        sprintf(s, " (%d) ", LOOSER.id);        
  1801. X        u[26 - strlen(s)] = '\0';
  1802. X        strcat(u, s); strcat(u, "                                ");    
  1803. X         u[26] = '\0';
  1804. X        fprintf(fp, "%s", u);
  1805. X        i++;
  1806. X        if (i == 3) {
  1807. X            i = 0;
  1808. X            fprintf(fp, "\n");
  1809. X        }
  1810. X    }
  1811. X    if (mode == 1) {
  1812. X        sprintf(s, "%s", "   ");
  1813. X        if ((LOOSER.elapsed / 60) > 2) {
  1814. X            if (LOOSER.wohnort[0] < 48) {
  1815. X                if (strcomp(GUEST, LOOSER.name) != 0)
  1816. X                    sprintf(s, "%s", "<?>");
  1817. X            }
  1818. X        }
  1819. X        else {
  1820. X            sprintf(s, "%s", "{-}");
  1821. X        }
  1822. X        fprintf(fp, "%-30.30s  %10s %s%6.6d   %6.6ld\"  %5.5d%10.10s\n",
  1823. X            LOOSER.name, LOOSER.lastlog, s, LOOSER.seq, (LOOSER.elapsed / 60), LOOSER.level, LOOSER.sh_name);
  1824. X
  1825. X    }
  1826. X    if (mode == 2) {
  1827. X        fprintf(fp, "%-30.30s  %8.8d kB  %10.10d kB %8.8d\"\n",
  1828. X            LOOSER.name, LOOSER.upratio, LOOSER.downratio, (LOOSER.elapsed / 60));
  1829. X    }
  1830. X        if (mode == 3) {
  1831. X        if(LOOSER.level >= WRITE_INTERNAT){
  1832. X            if(LOOSER.account[0] == '\0') strcpy(LOOSER.account, "00.00.0000");
  1833. X            strcpy(s, LOOSER.account);
  1834. X            s[10] = '\0';
  1835. X            c = ' ';
  1836. X            fprintf(fp, "%-30.30s  %5.5d   %c %s\n", 
  1837. X                LOOSER.name, LOOSER.id, c, s);
  1838. X        }
  1839. X        }
  1840. X    totalusr++;
  1841. X    sprintf(s, "%s", (char *) mydate( 0 )); 
  1842. X    if((strcomp(s, LOOSER.lastlog) < 3) && (LOOSER.seq > 10)) totalact++;
  1843. X    if(strcomp(GUEST, LOOSER.name) == 0) totalgas = LOOSER.seq;
  1844. X  }
  1845. X  close(fd);
  1846. X
  1847. X  fclose(fp);
  1848. X
  1849. X  if (mode != 0) {
  1850. X    printf("%c", CR);
  1851. X    sprintf(s, "sort -d -o %s %s", tmp, tmp);
  1852. X    system(s);
  1853. X    show(tmp, 9999, USER.more + 100);
  1854. X    if (mode == 1) {
  1855. X        printf("\n%s\n%s", POR19_MSG, POR20_MSG);
  1856. X    }
  1857. X  }
  1858. X  else{
  1859. X    show(tmp, 9999, USER.more);
  1860. X  }
  1861. X  if(mode == 0){
  1862. X    printf("\n\n%s %d %s %d %s", POR21_MSG, totalusr, POR22_MSG, totalact, POR23_MSG); 
  1863. X    printf("\n%s %d %s", POR24_MSG, totalgas, POR25_MSG);
  1864. X  }
  1865. X  printf("\n");
  1866. X  unlink(tmp);
  1867. X}
  1868. X
  1869. X
  1870. X
  1871. X
  1872. X/***************************************************************************/
  1873. X/*      FUNKTION  finger()                           */
  1874. X/*  BESCHREIBUNG  Informationen ueber einen Teilnehmer anzeigen.       */
  1875. X/*     PARAMETER  arg  =  User-Name/User-Id des Teilnehmers                */
  1876. X/*     RUECKGABE  keine                                                       */
  1877. X/***************************************************************************/
  1878. X
  1879. Xvoid finger(arg)
  1880. Xchar arg[];
  1881. X{
  1882. X  int fd;
  1883. X  struct userdaten DUMMY, LOOSER;
  1884. X  char s[STRING];
  1885. X  char t[STRING];
  1886. X  long ll = -1L;
  1887. X  size_t dummy = sizeof(DUMMY);
  1888. X  char c;
  1889. X  char ex[LONGSTRING];
  1890. X  int i, ok, a, b;
  1891. X  int uid = -1;
  1892. X  char name[STRING];
  1893. X  char domain[STRING];      
  1894. X
  1895. X
  1896. X  FILE *fp;
  1897. X
  1898. X  
  1899. X  if ((arg[0] > 47) && (arg[0] < 58)) {
  1900. X    uid = atoi(arg);
  1901. X  }
  1902. X  else{
  1903. X    a = 0; b = 0;
  1904. X    i = 0;
  1905. X    while(arg[i] != '\0'){    
  1906. X        if(arg[i] == '!') a = i;
  1907. X        if(arg[i] == '@') b = i;
  1908. X        i++;
  1909. X    }
  1910. X    if((a != 0) && (b == 0)){
  1911. X        if(a != 0){
  1912. X            strcpy(name, (char *) strcopy(arg, (a+1), length(arg)));
  1913. X            strcpy(domain, (char *) strcopy(arg, 0, (a-1)));
  1914. X        }
  1915. X        else{
  1916. X            strcpy(name, (char *) strcopy(arg, 0, (b-1)));
  1917. X            strcpy(domain, (char *) strcopy(arg, (b+1), length(arg)));
  1918. X        }
  1919. X        strcpy(t, USER.name);
  1920. X        i = 0;
  1921. X        while(t[i] != '\0'){
  1922. X            if(t[i] == ' ') t[i] = '.';
  1923. X            i++;
  1924. X        }
  1925. X        chdir( "/" );
  1926. X        sprintf(s, "%s %s!%s!\"finger %s\" \\| mail %s@%s", UUX, SMARTHOST, domain, name, t, UUCPID);
  1927. X        /*
  1928. X        printf("\n\n%s\n\n", s);
  1929. X        */
  1930. X        system( s );
  1931. X        chdir( HOME );
  1932. X        printf("\n\n%s \"%s\",\n%s \"%s\" %s.", POR25aMSG, name, POR25bMSG, domain, POR25cMSG);
  1933. X        ansi( "md" );
  1934. X        printf("\n%s\n", POR26_MSG);
  1935. X        ansi( "me" );
  1936. X        return;
  1937. X    }
  1938. X    else{
  1939. X        if(b != 0){
  1940. X            ansi( "md" );
  1941. X            printf(" <- Unzulaessige DOMAIN-Adresse!\n\n");
  1942. X            ansi( "me" );
  1943. X            return;
  1944. X        }
  1945. X    }
  1946. X  }
  1947. X
  1948. X  maybe_locked(UDBASE, "r"); lockf(UDBASE);
  1949. X  fd = open(UDBASE, O_RDONLY);
  1950. X  if (fd == -1) {
  1951. X    nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  1952. X  }
  1953. X  while (read(fd, &DUMMY, dummy) == dummy) {
  1954. X    if (uid == DUMMY.id) {
  1955. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  1956. X    } 
  1957. X    else{
  1958. X        if ((strcomp(arg, DUMMY.name) == 0) ||
  1959. X            (strcomp(arg, DUMMY.nick) == 0) ||
  1960. X            (strcomp(arg, DUMMY.sh_name) == 0)) {
  1961. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  1962. X        }
  1963. X    }
  1964. X  }
  1965. X  lseek(fd, ll, SEEK_SET);
  1966. X  read(fd, &LOOSER, sizeof(LOOSER));
  1967. X  close(fd);
  1968. X  unlockf(UDBASE);
  1969. X
  1970. X  if (ll == -1L) {
  1971. X    ansi( "md" );
  1972. X    printf(" <- %s\n\n", POR27_MSG);
  1973. X    ansi( "me" );
  1974. X    return;
  1975. X  }
  1976. X
  1977. X  sprintf(s, " %s: %s ", POR28_MSG, arg);
  1978. X  headline( s );
  1979. X
  1980. X  ansi( "md" );
  1981. X  printf("\n%s ", POR29_MSG);
  1982. X  ansi( "me" );
  1983. X  printf("%d\n", LOOSER.id);
  1984. X
  1985. X  ansi( "md" );
  1986. X  printf("%s ", POR30_MSG);
  1987. X  ansi( "me");
  1988. X  printf("%s\n", LOOSER.name);
  1989. X
  1990. X  if(LOOSER.sh_name[0] != '\0'){
  1991. X    ansi( "md" );
  1992. X    printf("%s ", POR31_MSG);
  1993. X    ansi( "me" );
  1994. X    printf("%s\n", LOOSER.sh_name);
  1995. X  }
  1996. X
  1997. X  if(LOOSER.nick[0] != '\0'){
  1998. X    ansi( "md" );
  1999. X      printf("%s ", POR32_MSG);
  2000. X    ansi( "me" );
  2001. X    printf("%s\n", LOOSER.nick);
  2002. X  }
  2003. X
  2004. X  ansi( "md" );
  2005. X  printf("%s ", POR33_MSG);
  2006. X  ansi( "me" );
  2007. X  strcpy(s, LOOSER.name);
  2008. X  i = 0;
  2009. X  while(s[i] != '\0'){
  2010. X    if(s[i] == ' ') s[i] = '.';
  2011. X    i++;
  2012. X  }
  2013. X  if(LOOSER.level >= WRITE_INTERNAT)
  2014. X    printf("%s@%s\n", s, UUCPID2);
  2015. X  else
  2016. X    printf("%s@%s\n", s, UUCPID1);
  2017. X
  2018. X  printf("\n"); ok = 0;
  2019. X
  2020. X  if(USER.level >= WRITE_EX_LEV){
  2021. X    if(LOOSER.wohnort[0] != '\0'){
  2022. X        ok++;
  2023. X        ansi( "md" );
  2024. X        printf("%s ", POR34_MSG);
  2025. X        ansi( "me" );
  2026. X        printf("%s\n", LOOSER.wohnort);
  2027. X    }
  2028. X  }
  2029. X
  2030. X  if(USER.level >= ADMIN_LEV){
  2031. X    if(LOOSER.strasse[0] != '\0'){
  2032. X        ok++;
  2033. X        ansi( "md" );
  2034. X        printf("%s ", POR35_MSG);
  2035. X        ansi( "me" );
  2036. X        printf("%s\n", LOOSER.strasse);
  2037. X    }
  2038. X    if(LOOSER.telefon1[0] != '\0'){
  2039. X        ok++;
  2040. X        ansi( "md" ); 
  2041. X        printf("%s ", POR36_MSG);
  2042. X        ansi( "me" );
  2043. X        printf("%s", LOOSER.telefon1);
  2044. X
  2045. X        if(LOOSER.telefon2[0] != '\0'){
  2046. X            printf(" // %s\n", LOOSER.telefon2);
  2047. X        }
  2048. X        else{
  2049. X            printf("\n");
  2050. X        }
  2051. X    }
  2052. X
  2053. X    if(ok != 0) printf("\n"); 
  2054. X    ok = 0;
  2055. X
  2056. X    if(LOOSER.geburtsdatum[0] != '\0'){
  2057. X        ok++;
  2058. X        ansi( "md" );
  2059. X        printf("%s ", POR37_MSG);
  2060. X        ansi( "me" );
  2061. X        printf("%s\n", LOOSER.geburtsdatum);
  2062. X    }
  2063. X  }
  2064. X
  2065. X  if(ok != 0) printf("\n");
  2066. X
  2067. X  if(USER.level >= WRITE_EX_LEV){
  2068. X    ansi( "md" );
  2069. X    printf("%s ", POR38_MSG);
  2070. X    ansi( "me" );
  2071. X    printf("%d\n", LOOSER.seq);
  2072. X      ansi( "md" );
  2073. X    printf("%s ", POR39_MSG);
  2074. X    ansi( "me" );
  2075. X    printf("%s // %s\n", LOOSER.lastlog, (char *) timereconv(LOOSER.lasttime));
  2076. X  }
  2077. X
  2078. X  ansi( "md" );
  2079. X  printf("%s ", POR45_MSG);
  2080. X  ansi( "me" );
  2081. X  b = 0;
  2082. X  sprintf(s, "%s/usr/%d/INDEX", HOME, LOOSER.id);  
  2083. X    
  2084. X  fp = fopen(s, "r");
  2085. X  if (fp == NULL) {
  2086. X    nerror("intro.c", 291, "intro", "Datei-Lesefehler", s);
  2087. X  }
  2088. X  while (fgets(ex, 200, fp) != NULL){
  2089. X    if(ex[0] < 65) b++;
  2090. X  }
  2091. X  fclose(fp);
  2092. X  printf("%d\n", b-1);
  2093. X
  2094. X  if(USER.level >= ADMIN_LEV){
  2095. X    ansi( "md" );
  2096. X    printf("%s ", POR40_MSG);
  2097. X    ansi( "me" );
  2098. X    printf("%d:%02.2d", (LOOSER.elapsed/3600), (LOOSER.elapsed - (LOOSER.elapsed/3600 * 3600))/360);
  2099. X    printf(" %s\n", POR41_MSG);
  2100. X        ansi( "md" );
  2101. X        printf("%s ", POR41aMSG);
  2102. X        ansi( "me" );
  2103. X        printf("%s\n", LOOSER.account);
  2104. X    ansi( "md" );
  2105. X    printf("%s ", POR42_MSG);
  2106. X    ansi( "me" );
  2107. X    printf("%ld %s\n", LOOSER.upratio, POR43_MSG);
  2108. X    ansi( "md" );
  2109. X    printf("%s ", POR44_MSG);
  2110. X    ansi( "me" );
  2111. X    printf("%ld %s\n", LOOSER.downratio, POR43_MSG);
  2112. X  }
  2113. X
  2114. X  printf("\n");
  2115. X}
  2116. X
  2117. END_OF_FILE
  2118.   if test 14509 -ne `wc -c <'src/portinfo.c'`; then
  2119.     echo shar: \"'src/portinfo.c'\" unpacked with wrong size!
  2120.   fi
  2121.   # end of 'src/portinfo.c'
  2122. fi
  2123. echo shar: End of archive 6 \(of 10\).
  2124. cp /dev/null ark6isdone
  2125. MISSING=""
  2126. for I in 1 2 3 4 5 6 7 8 9 10 ; do
  2127.     if test ! -f ark${I}isdone ; then
  2128.     MISSING="${MISSING} ${I}"
  2129.     fi
  2130. done
  2131. if test "${MISSING}" = "" ; then
  2132.     echo You have unpacked all 10 archives.
  2133.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2134. else
  2135.     echo You still must unpack the following archives:
  2136.     echo "        " ${MISSING}
  2137. fi
  2138. exit 0
  2139. exit 0 # Just in case...
  2140.