home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume35 / mbox / part04 < prev    next >
Encoding:
Text File  |  1993-02-04  |  53.9 KB  |  2,052 lines

  1. Newsgroups: comp.sources.misc
  2. From: Volker.Schuermann@unnet.w.open.de (Volker Schuermann)
  3. Subject: v35i039:  mbox - ix/Mbox, A BBS for UNIX and MINIX v1.6 PL10j7, Part04/15
  4. Message-ID: <1993Feb5.185618.10071@sparky.imd.sterling.com>
  5. X-Md4-Signature: 28f57e5bf6d17e354be10958482268e8
  6. Date: Fri, 5 Feb 1993 18:56:18 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 39
  11. Archive-name: mbox/part04
  12. Environment: MINIX, ISC, ESIX, SVR3
  13. Supersedes: mbox: Volume 31, Issue 16-27
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # Contents:  src/admin.c wendy/tools.c
  20. # Wrapped by kent@sparky on Fri Feb  5 12:18:05 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 4 (of 15)."'
  24. if test -f 'src/admin.c' -a "${1}" != "-c" ; then 
  25.   echo shar: Will not clobber existing file \"'src/admin.c'\"
  26. else
  27.   echo shar: Extracting \"'src/admin.c'\" \(26246 characters\)
  28.   sed "s/^X//" >'src/admin.c' <<'END_OF_FILE'
  29. X/***************************************************************************/
  30. X/*        PROGRAMM  ix/Mbox                           */
  31. X/*             DATEI  admin.c                           */
  32. X/*        FUNKTIONEN  user_aendern(), user_anzeigen(), user_loeschen(),    */
  33. X/*              setup_get(), wait_until_keypressed(), admin(),       */
  34. X/*              setup()                               */
  35. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  36. X/*  LETZTE AENDERUNG  29.08.1992                       */
  37. X/***************************************************************************/
  38. X
  39. X#include <sys/types.h>
  40. X#include <sys/stat.h>
  41. X#include <unistd.h>
  42. X#include <stdio.h>
  43. X#include <fcntl.h>
  44. X
  45. X#include "mbox.h"
  46. X
  47. Xvoid wait_until_keypressed();
  48. X
  49. X/***************************************************************************/
  50. X/*      FUNKTION  user_aendern                           */
  51. X/*  BESCHREIBUNG  Aendern ALLER Teilnehmerparameter (von ADMIN aus)        */
  52. X/*     PARAMETER  keine                                                       */
  53. X/*     RUECKGABE  keine                                                       */
  54. X/***************************************************************************/
  55. X
  56. Xvoid user_aendern()
  57. X{
  58. X  int fd;
  59. X  struct userdaten DUMMY, LOOSER;
  60. X  unsigned char s[STRING];
  61. X  unsigned char t[STRING];
  62. X  long ll = -1L;
  63. X  size_t dummy = sizeof(DUMMY);
  64. X  unsigned char c;
  65. X  int i;
  66. X  int uid = -1;
  67. X
  68. X  headline( ADM01_MSG );
  69. X
  70. X  printf("%s ", ADM02_MSG);
  71. X  strcpy(s, (unsigned char *) getline(30, 11, '.', ""));
  72. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  73. X
  74. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  75. X  fd = open(UDBASE, O_RDONLY);
  76. X  if(fd == -1){
  77. X    nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  78. X  }
  79. X  while(read(fd, (unsigned char *) &DUMMY, dummy) == dummy){
  80. X    if(uid == DUMMY.id){
  81. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  82. X    }
  83. X    else{
  84. X        if((strcomp(s, DUMMY.name) == 0) ||
  85. X           (strcomp(s, DUMMY.nick) == 0) ||
  86. X           (strcomp(s, DUMMY.sh_name) == 0)){
  87. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  88. X        }
  89. X    }
  90. X  }
  91. X  lseek(fd, ll, SEEK_SET);
  92. X  read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER));
  93. X  close(fd);
  94. X  mbunlock(UDBASE);
  95. X
  96. X  if(ll == -1L) return;
  97. X
  98. X  printf("%c%s %d                                               ", CR, ADM03_MSG, LOOSER.id);
  99. X
  100. X  printf("\n%s ", ADM04_MSG);
  101. X  strcpy(s, (unsigned char *) getline(30, 1011, '.', LOOSER.name));
  102. X  if (s[0] > 32) sprintf(LOOSER.name, s);
  103. X  if (s[0] == 32) LOOSER.name[0] = '\0';
  104. X
  105. X  printf("\n%s ", ADM05_MSG);
  106. X  strcpy(s, (unsigned char *) getline(10, 1011, '.', LOOSER.passwort));
  107. X  if (s[0] > 32) sprintf(LOOSER.passwort, s);
  108. X  if (s[0] == 32) LOOSER.passwort[0] = '\0';
  109. X
  110. X  printf("\n%s ", ADM06_MSG);
  111. X  strcpy(s, (unsigned char *) getline(14, 1011, '.', LOOSER.sh_name));
  112. X  if (s[0] > 32) sprintf(LOOSER.sh_name, s);
  113. X  if (s[0] == 32) LOOSER.sh_name[0] = '\0';
  114. X
  115. X  printf("\n%s ", ADM07_MSG);
  116. X  strcpy(s, (unsigned char *) getline(30, 1011, '.', LOOSER.nick));
  117. X  if (s[0] > 32) sprintf(LOOSER.nick, s);
  118. X  if (s[0] == 32) LOOSER.nick[0] = '\0';
  119. X
  120. X  printf("\n%s ", ADM08_MSG);
  121. X  strcpy(s, (unsigned char *) getline(30, 1011, '.', LOOSER.wohnort));
  122. X  if (s[0] > 31) sprintf(LOOSER.wohnort, s);
  123. X
  124. X  printf("\n%s ", ADM09_MSG);
  125. X  strcpy(s, (unsigned char *) getline(30, 1011, '.', LOOSER.strasse));
  126. X  if (s[0] > 31) sprintf(LOOSER.strasse, s);
  127. X
  128. X  printf("\n%s ", ADM10_MSG);
  129. X  strcpy(s, (unsigned char *) getline(20, 1011, '.', LOOSER.telefon1));
  130. X  if (s[0] > 31) sprintf(LOOSER.telefon1, s);
  131. X
  132. X  printf("\n%s ", ADM11_MSG);
  133. X  strcpy(s, (unsigned char *) getline(20, 1011, '.', LOOSER.telefon2));
  134. X  if (s[0] > 31) sprintf(LOOSER.telefon2, s);
  135. X
  136. X  printf("\n%s ", ADM12_MSG);
  137. X  strcpy(s, (unsigned char *) getline(10, 1114, '?', LOOSER.geburtsdatum));
  138. X  if (s[0] > 31) sprintf(LOOSER.geburtsdatum, s);
  139. X
  140. X  printf("\n%s ", ADM13_MSG);
  141. X  sprintf(t, "%d", LOOSER.terminal);
  142. X  strcpy(s, (unsigned char *) getline(5, 1111, '.', t));
  143. X  if (s[0] > 31) LOOSER.terminal = atoi(s);
  144. X  if ((LOOSER.terminal < 1) || (LOOSER.terminal > 4)) LOOSER.terminal = 1;
  145. X
  146. X  printf("\n%s ", ADM14_MSG);
  147. X  sprintf(t, "%d", LOOSER.editor);
  148. X  strcpy(s, (unsigned char *) getline(5, 1111, '.', t));
  149. X  if (s[0] > 31) LOOSER.editor = atoi(s);
  150. X  if ((LOOSER.editor < 1) || (LOOSER.editor > OFFERED_EDITORS)) LOOSER.editor = 1;
  151. X
  152. X  printf("\n%s ", ADM15_MSG);
  153. X  sprintf(t, "%d", LOOSER.level);
  154. X  strcpy(s, (unsigned char *) getline(5, 1111, '.', t));
  155. X  if (s[0] > 31) LOOSER.level = atoi(s);
  156. X
  157. X  printf("\n%s ", ADM16_MSG);
  158. X  sprintf(t, "%d", LOOSER.more);
  159. X  strcpy(s, (unsigned char *) getline(5, 1111, '.', t));
  160. X  if (s[0] > 31) LOOSER.more = atoi(s);
  161. X  if ((LOOSER.more < 0) || (LOOSER.more > 3)) LOOSER.more = 1;
  162. X
  163. X  printf("\n%s ", ADM17_MSG);
  164. X  sprintf(t, "%d", LOOSER.bell);
  165. X  strcpy(s, (unsigned char *) getline(5, 1111, '.', t));
  166. X  if (s[0] > 31) LOOSER.bell = atoi(s);
  167. X  if ((LOOSER.bell < -1) || (LOOSER.bell > 1)) LOOSER.bell = 0;
  168. X
  169. X  printf("\n%s ", ADM18_MSG);
  170. X  sprintf(t, "%d", LOOSER.prompt);
  171. X  strcpy(s, (unsigned char *) getline(5, 1111, '.', t));
  172. X  if (s[0] > 31) LOOSER.prompt = atoi(s);
  173. X  if ((LOOSER.prompt < 1) || (LOOSER.prompt > 3)) LOOSER.prompt = 2;
  174. X
  175. X  printf("\n%s ", ADM19_MSG);
  176. X  LOOSER.tlines += 2;
  177. X  sprintf(t, "%d", LOOSER.tlines);
  178. X  strcpy(s, (unsigned char *) getline(5, 1111, '.', t));
  179. X  if (s[0] > 31) LOOSER.tlines = atoi(s);
  180. X  LOOSER.tlines -= 2;
  181. X  if ((LOOSER.tlines < 22) || (LOOSER.tlines > 23)) LOOSER.tlines = DEF_MAX_SCR_LINES;
  182. X  
  183. X  printf("\n%s ", ADM20_MSG);
  184. X  strcpy(s, (unsigned char *) getline(10, 1114, '?', LOOSER.lastlog));
  185. X  if (s[0] > 31) sprintf(LOOSER.lastlog, s);
  186. X
  187. X  printf("\n%s ", ADM21_MSG);
  188. X  strcpy(t, (unsigned char *) timereconv((long) LOOSER.lasttime));
  189. X  t[5] = '\0';
  190. X  strcpy(s, (unsigned char *) getline(5, 1113, '?', t));
  191. X  LOOSER.lasttime = timeconv(s);
  192. X
  193. X  printf("\n%s ", ADM21aMSG);
  194. X  strcpy(s, (unsigned char *) ttyname(0));
  195. X  if(strcomp(PMS_TTY, s) == 0){
  196. X    strcpy(s, (unsigned char *) getline(17, 1011, '.', LOOSER.account));
  197. X    if (s[0] > 31) sprintf(LOOSER.account, s);
  198. X  }
  199. X  else{
  200. X    printf("%s", LOOSER.account);
  201. X  }
  202. X
  203. X  printf("\n%s ", ADM22_MSG);
  204. X  strcpy(s, (unsigned char *) getline(58, 1011, '.', LOOSER.newsgrps));
  205. X  if (s[0] > 31) sprintf(LOOSER.newsgrps, s);
  206. X
  207. X  printf("\n%s ", ADM23_MSG);
  208. X  sprintf(t, "%d", LOOSER.seq);
  209. X  strcpy(s, (unsigned char *) getline(10, 1111, '.', t));
  210. X  if (s[0] > 31) LOOSER.seq = atoi(s);
  211. X
  212. X  wait_until_keypressed();
  213. X
  214. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  215. X  fd = open(UDBASE, O_WRONLY);
  216. X  if (fd == -1) {
  217. X    nerror("admin.c", 428, "aendern", "Datei-Schreibfehler", UDBASE);
  218. X  }
  219. X  if (lseek(fd, ll, SEEK_SET) == -1) {
  220. X    nerror("admin.c", 431, "aendern", "Positionierungsfehler", UDBASE);
  221. X  }
  222. X  write(fd, (unsigned char *) &LOOSER, sizeof(LOOSER));
  223. X  close(fd);
  224. X  mbunlock(UDBASE);
  225. X
  226. X  if (LOOSER.id == USER.id) {    /* Ich bin's !!! */
  227. X
  228. X    maybe_locked(UDBASE, "r");
  229. X    mblock(UDBASE);
  230. X    fd = open(UDBASE, O_RDONLY);
  231. X    if (fd == -1) {
  232. X        nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  233. X    }
  234. X    lseek(fd, ll, SEEK_SET);
  235. X    read(fd, (unsigned char *) &USER, sizeof(USER));
  236. X    close(fd);
  237. X    mbunlock(UDBASE);
  238. X  }
  239. X}
  240. X
  241. X
  242. X
  243. X/***************************************************************************/
  244. X/*      FUNKTION  user_anzeigen()                       */
  245. X/*  BESCHREIBUNG  ALLE Teilnehmerdaten anzeigen (von ADMIN aus)           */
  246. X/*     PARAMETER  keine                                                       */
  247. X/*     RUECKGABE  keine                                                       */
  248. X/***************************************************************************/
  249. X
  250. Xvoid user_anzeigen()
  251. X{
  252. X  int fd;
  253. X  struct userdaten DUMMY, LOOSER;
  254. X  unsigned char s[STRING];
  255. X  unsigned char t[STRING];
  256. X  long ll = -1L;
  257. X  size_t dummy = sizeof(DUMMY);
  258. X  unsigned char c;
  259. X  int i;
  260. X  int uid = -1;
  261. X
  262. X
  263. X  headline( ADM01_MSG );
  264. X
  265. X  printf("%s ", ADM02_MSG);
  266. X  strcpy(s, (unsigned char *) getline(30, 11, '.', ""));
  267. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  268. X
  269. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  270. X  fd = open(UDBASE, O_RDONLY);
  271. X  if (fd == -1) {
  272. X    nerror("admin.c", 324, "aendern", "Datei-Lesefehler", UDBASE);
  273. X  }
  274. X  while (read(fd, (unsigned char *) &DUMMY, dummy) == dummy) {
  275. X    if (uid == DUMMY.id) {
  276. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  277. X    } 
  278. X    else{
  279. X        if ((strcomp(s, DUMMY.name) == 0) ||
  280. X            (strcomp(s, DUMMY.nick) == 0) ||
  281. X            (strcomp(s, DUMMY.sh_name) == 0)) {
  282. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  283. X        }
  284. X    }
  285. X  }
  286. X  lseek(fd, ll, SEEK_SET);
  287. X  read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER));
  288. X  close(fd);
  289. X  mbunlock(UDBASE);
  290. X
  291. X  if (ll == -1L) return;
  292. X
  293. X  printf("%c  %s %d                                               ", CR, ADM03_MSG, LOOSER.id);
  294. X  printf("\n  %s %s",   ADM04_MSG, LOOSER.name);
  295. X  printf("\n  %s %s",   ADM05_MSG, LOOSER.passwort);
  296. X  printf("\n  %s %s",   ADM06_MSG, LOOSER.sh_name);
  297. X  printf("\n  %s %s",   ADM07_MSG, LOOSER.nick);
  298. X  printf("\n  %s %s",   ADM08_MSG, LOOSER.wohnort);
  299. X  printf("\n  %s %s",   ADM09_MSG, LOOSER.strasse);
  300. X  printf("\n  %s %s",   ADM10_MSG, LOOSER.telefon1);
  301. X  printf("\n  %s %s",   ADM11_MSG, LOOSER.telefon2);
  302. X  printf("\n  %s %s",   ADM12_MSG, LOOSER.geburtsdatum);
  303. X  printf("\n  %s %d",   ADM13_MSG, LOOSER.terminal);
  304. X  printf("\n  %s %d",   ADM14_MSG, LOOSER.editor);
  305. X  printf("\n  %s %d",   ADM15_MSG, LOOSER.level);
  306. X  printf("\n  %s %d",   ADM16_MSG, LOOSER.more);
  307. X  printf("\n  %s %d",   ADM17_MSG, LOOSER.bell);
  308. X  printf("\n  %s %d",   ADM18_MSG, LOOSER.prompt);
  309. X  printf("\n  %s %d",   ADM19_MSG, LOOSER.tlines += 2);
  310. X  printf("\n  %s %s",   ADM20_MSG, LOOSER.lastlog);
  311. X  printf("\n  %s %.5s", ADM21_MSG, (unsigned char *) timereconv((long) LOOSER.lasttime));
  312. X  printf("\n  %s %s",   ADM21aMSG, LOOSER.account);
  313. X  printf("\n  %s %s",   ADM22_MSG, LOOSER.newsgrps);
  314. X  printf("\n  %s %d",   ADM23_MSG, LOOSER.seq);
  315. X
  316. X  wait_until_keypressed();
  317. X}
  318. X
  319. X
  320. X
  321. X/***************************************************************************/
  322. X/*      FUNKTION  user_loeschen()                       */
  323. X/*  BESCHREIBUNG  Einen Teilnehmer einsch. persoenlicher Post etc. aus       */
  324. X/*          dem System entfernen.                                    */
  325. X/*     PARAMETER  keine                                                       */
  326. X/*     RUECKGABE  keine                                                       */
  327. X/***************************************************************************/
  328. X
  329. Xvoid user_loeschen()
  330. X{
  331. X  int fd;
  332. X  int gd;
  333. X  struct userdaten DUMMY, LOOSER;
  334. X  unsigned char s[STRING];
  335. X  unsigned char t[STRING];
  336. X  long ll = -1L;
  337. X  size_t dummy = sizeof(DUMMY);
  338. X  unsigned char c;
  339. X  int i;
  340. X  int uid = -1;
  341. X
  342. X
  343. X  headline( ADM25_MSG );
  344. X    
  345. X  printf("\n%s ", ADM02_MSG);
  346. X  strcpy(s, (unsigned char *) getline(30, 11, '.', ""));
  347. X  if ((s[0] > 47) && (s[0] < 58)) uid = atoi(s);
  348. X
  349. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  350. X  fd = open(UDBASE, O_RDONLY);
  351. X  if (fd == -1) {
  352. X    nerror("admin.c", 459, "loeschen", "Datei-Lesefehler", UDBASE);
  353. X  }
  354. X  while (read(fd, (unsigned char *) &DUMMY, dummy) == dummy) {
  355. X    if (uid == DUMMY.id) {
  356. X        ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  357. X    }
  358. X    else{
  359. X        if ((strcomp(s, DUMMY.name) == 0) ||
  360. X            (strcomp(s, DUMMY.nick) == 0) ||
  361. X            (strcomp(s, DUMMY.sh_name) == 0)) {
  362. X            ll = lseek(fd, 0L, SEEK_CUR) - dummy;
  363. X        }
  364. X    }
  365. X  }
  366. X  lseek(fd, ll, SEEK_SET);
  367. X  read(fd, (unsigned char *) &LOOSER, sizeof(LOOSER));
  368. X  close(fd);
  369. X  mbunlock(UDBASE);
  370. X
  371. X  if (ll == -1L) return;
  372. X
  373. X  printf("%c%s (%d)                                     ", CR, ADM26_MSG, LOOSER.id);
  374. X  printf("\n%s (%s) ", ADM27_MSG, LOOSER.name);
  375. X
  376. X  ansi("md");
  377. X  printf("\n\n%s [%c, %c] ? > ", ADM28_MSG, GBL06_MSG, GBL07_MSG);
  378. X  ansi("me");
  379. X
  380. X  c = yesno();
  381. X
  382. X  if (c != GBL06_MSG) return;
  383. X
  384. X  maybe_locked(UDBASE, "r"); mblock(UDBASE);
  385. X  fd = open(UDBASE, O_RDONLY);
  386. X  if (fd == -1) {
  387. X    nerror("admin.c", 490, "loeschen", "Datei-Lesefehler", UDBASE);
  388. X  }
  389. X  sprintf(s, "%s/%dbase", TMP, getpid());
  390. X
  391. X  gd = open(s, O_WRONLY | O_CREAT);
  392. X  if (gd == -1) {
  393. X    nerror("admin.c", 497, "loeschen", "Datei-Erstellungsfehler", s);
  394. X  }
  395. X  while (read(fd, (unsigned char *) &DUMMY, dummy) == dummy) {
  396. X    if (DUMMY.id != LOOSER.id) {
  397. X        write(gd, (unsigned char *) &DUMMY, dummy);
  398. X    }
  399. X  }
  400. X  close(gd);
  401. X  close(fd);
  402. X  mbunlock(UDBASE);
  403. X
  404. X  sprintf(t, "cp %s %s", s, UDBASE);
  405. X  system(t);
  406. X
  407. X  unlink(s);
  408. X
  409. X  sprintf(s, "rm -r %s/usr/%d", HOME, LOOSER.id);
  410. X  system(s);
  411. X}
  412. X
  413. X
  414. X
  415. X
  416. X/***************************************************************************/
  417. X/*      FUNKTION  setup_get()                           */
  418. X/*  BESCHREIBUNG  Die Ziffern 1-max einlesen und zurueckgeben.           */
  419. X/*     PARAMETER  max  =  groesste, zulaessige Ziffer                   */
  420. X/*     RUECKGABE  erfasste Ziffer (CHAR !!!)                   */
  421. X/***************************************************************************/
  422. X
  423. Xint setup_get(max)
  424. Xunsigned char max;
  425. X{
  426. X  unsigned char c;
  427. X
  428. X  ansi("md");
  429. X  printf("\n[1-%c] %s > ", max, ADM29_MSG);
  430. X  ansi("me");
  431. X
  432. X  do {
  433. X    c = getint();
  434. X    if ((c < '0') || (c > max)) c = 0;
  435. X  } while (c == 0);
  436. X  printf("%c", c);
  437. X
  438. X  return c;
  439. X}
  440. X
  441. X
  442. X
  443. X
  444. X/***************************************************************************/
  445. X/*      FUNKTION  wait_until_keypressed                       */
  446. X/*  BESCHREIBUNG  siehe FUNKTION                       */
  447. X/*     PARAMETER  keine                                                       */
  448. X/*     RUECKGABE  keine                                                       */
  449. X/***************************************************************************/
  450. X
  451. Xvoid wait_until_keypressed()
  452. X{
  453. X  unsigned char c;
  454. X
  455. X  ansi("md");
  456. X  printf("\n\n%s > ", ADM30_MSG);
  457. X  ansi("me");
  458. X  c = getint();
  459. X}
  460. X
  461. X
  462. X
  463. X
  464. X/***************************************************************************/
  465. X/*      FUNKTION  admin()                           */
  466. X/*  BESCHREIBUNG  Teilnehmerverwaltung fuer den Administrator/Sysop.       */
  467. X/*     PARAMETER  keine                                                       */
  468. X/*     RUECKGABE  keine                                                       */
  469. X/***************************************************************************/
  470. X
  471. Xvoid admin()
  472. X{
  473. X  unsigned char c;
  474. X
  475. XAGAIN:
  476. X
  477. X  headline( ADM31_MSG );
  478. X
  479. X  printf(  "\n  1 - %s", ADM32_MSG);
  480. X  printf("\n\n  2 - %s", ADM33_MSG);
  481. X  printf("\n\n  3 - %s", ADM34_MSG);
  482. X  printf("\n\n  4 - %s", ADM35_MSG);
  483. X  printf("\n\n  5 - %s", ADM36_MSG);
  484. X
  485. X  printf("\n");
  486. X  printf("\n\n  8 - %s", ADM37_MSG);
  487. X
  488. X  MEDIUM: printf("\n");
  489. X
  490. X  c = setup_get('8');
  491. X
  492. X  switch (c) {
  493. X      case '1':    
  494. X        postfach("*");
  495. X        logout();
  496. X        intro();
  497. X        break;
  498. X
  499. X      case '2':    
  500. X        user_aendern();
  501. X        break;
  502. X
  503. X      case '3':    
  504. X        user_loeschen();
  505. X        break;
  506. X
  507. X      case '4':    
  508. X        user_anzeigen();
  509. X        break;
  510. X
  511. X      case '5':
  512. X        userliste("");
  513. X        wait_until_keypressed();
  514. X        break;
  515. X
  516. X       default:
  517. X        printf("\n");
  518. X        return;
  519. X  }
  520. X  goto AGAIN;
  521. X
  522. X}
  523. X
  524. X
  525. X
  526. X
  527. X/***************************************************************************/
  528. X/*      FUNKTION  setup()                           */
  529. X/*  BESCHREIBUNG  Teilnehmerdaten/Parameter aendern (fuer die User)        */
  530. X/*     PARAMETER  keine                                                       */
  531. X/*     RUECKGABE  keine                                                       */
  532. X/***************************************************************************/
  533. X
  534. Xvoid setup()
  535. X{
  536. X  FILE *fp;
  537. X  int fd;
  538. X  unsigned char s[STRING];
  539. X  unsigned char t[STRING];
  540. X  unsigned char c;
  541. X  int i;
  542. X  int ok = 0;
  543. X  long ll;
  544. X  struct userdaten DUMMY;
  545. X  int dummy = sizeof(DUMMY);
  546. X  unsigned char *BLANKS = "                                               ";
  547. X
  548. X
  549. X  AGAIN:
  550. X
  551. X  headline( ADM38_MSG );
  552. X  printf("\n");
  553. X
  554. X  printf("  1 - %s\n\n", ADM39_MSG);
  555. X  printf("  2 - %s\n\n", ADM40_MSG);
  556. X  printf("  3 - %s\n\n", ADM41_MSG);
  557. X  printf("  4 - %s\n\n", ADM42_MSG);
  558. X  printf("  5 - %s\n\n", ADM43_MSG);
  559. X  printf("  6 - %s\n\n", ADM44_MSG);
  560. X  printf("  7 - %s\n\n", ADM45_MSG);
  561. X  printf("  8 - %s\n\n", ADM46_MSG);
  562. X  printf("\n");
  563. X  printf("  9 - %s\n\n", ADM47_MSG);
  564. X
  565. X  c = setup_get('9');
  566. X
  567. X  switch (c) {
  568. X      case '1':
  569. X        headline( ADM48_MSG );
  570. X        printf("\n");
  571. X        if (USER.terminal == 1)
  572. X            printf("*");
  573. X        else
  574. X            printf(" ");
  575. X        printf(" 1 - ANSI (X3.64 ... PC-BBS-ANSI)\n\n");
  576. X        if (USER.terminal == 2)
  577. X            printf("*");
  578. X        else
  579. X            printf(" ");
  580. X        printf(" 2 - VT100\n\n");
  581. X        if (USER.terminal == 3)
  582. X            printf("*");
  583. X        else
  584. X            printf(" ");
  585. X        printf(" 3 - VT52\n\n");
  586. X        if (USER.terminal == 4)
  587. X            printf("*");
  588. X        else
  589. X            printf(" ");
  590. X        printf(" 4 - Dump (%s)\n\n", ADM49_MSG);
  591. X        if (USER.terminal == 5)
  592. X            printf("*");
  593. X        else
  594. X            printf(" ");
  595. X        printf(" 5 - COLOR-ANSI (X3.64 & ISO 6429)\n\n");
  596. X        USER.terminal = setup_get('5') - 48;
  597. X        
  598. X        break;
  599. X
  600. X      case '2':
  601. X        headline( ADM50_MSG );
  602. X        printf("\n");
  603. X        fp = fopen(EDITORS, "r");
  604. X        if (fp == NULL) {
  605. X            nerror("admin.c", 563, "setup", "Datei-Lesefehler", EDITORS);
  606. X        }
  607. X        i = 0;
  608. X        while((fgets(s, 80, fp) != NULL) && (s[0] == '/'));
  609. X        while (fscanf(fp, "%s %s", s, t) > 0) {
  610. X            i++;
  611. X            if (USER.editor == i)
  612. X                printf("*");
  613. X            else
  614. X                printf(" ");
  615. X            printf(" %d - %s\n\n", i, s);
  616. X        }
  617. X        fclose(fp);
  618. X        USER.editor = setup_get((i + 48)) - 48;
  619. X    
  620. X        if ((USER.level < WRITE_INTERNAT) && (USER.editor > 2)) 
  621. X            USER.editor = 2;
  622. X        break;
  623. X
  624. X      case '3':
  625. X        headline( ADM51_MSG );
  626. X        printf("\n");
  627. X        strcpy(s, (unsigned char *) mytime(0));
  628. X        if ((USER.prompt == 1) && (USER.bell == 1))
  629. X            printf("*");
  630. X        else
  631. X            printf(" ");
  632. X        printf(" 1 - %s->     \"[%s] %s > \"\n\n", ADM52_MSG, s, LOP06_MSG);
  633. X        if ((USER.prompt == 1) && (USER.bell == 0))
  634. X            printf("*");             
  635. X        else
  636. X            printf(" ");
  637. X        printf(" 2 - %s->     \"[%s] %s > \"\n\n", ADM53_MSG, s, LOP06_MSG);
  638. X        if ((USER.prompt == 2) && (USER.bell == 1))
  639. X            printf("*");
  640. X        else
  641. X            printf(" ");
  642. X        printf(" 3 - %s->     \"[%s] %s > \"\n\n", ADM54_MSG, NG, LOP06_MSG);
  643. X        if ((USER.prompt == 2) && (USER.bell == 0))
  644. X            printf("*");
  645. X        else
  646. X            printf(" ");
  647. X        printf(" 4 - %s->     \"[%s] %s > \"\n\n", ADM55_MSG, NG, LOP06_MSG);
  648. X        if ((USER.prompt == 3) && (USER.bell == 1))
  649. X            printf("*");
  650. X        else
  651. X            printf(" ");
  652. X        printf(" 5 - %s->     \"[(Sec.) NZ, RZ, WZ] %s > \"\n\n", ADM56_MSG, LOP06_MSG);
  653. X        if ((USER.prompt == 3) && (USER.bell == 0))
  654. X            printf("*");
  655. X        else
  656. X            printf(" ");
  657. X        printf(" 6 - %s->     \"[(Sec.) NZ, RZ, WZ] %s > \"\n\n", ADM57_MSG, LOP06_MSG);
  658. X    
  659. X        c = setup_get('6');
  660. X        switch (c) {
  661. X                case '1':
  662. X                    USER.prompt = 1;
  663. X                    USER.bell = 1;
  664. X                    break;
  665. X                case '2':
  666. X                    USER.prompt = 1;
  667. X                    USER.bell = 0;
  668. X                    break;
  669. X                case '3':
  670. X                    USER.prompt = 2;
  671. X                    USER.bell = 1;
  672. X                    break;
  673. X                case '4':
  674. X                    USER.prompt = 2;
  675. X                    USER.bell = 0;
  676. X                    break;
  677. X                case '5':
  678. X                    USER.prompt = 3;
  679. X                    USER.bell = 1;
  680. X                    break;
  681. X                case '6':
  682. X                    USER.prompt = 3;
  683. X                    USER.bell = 0;
  684. X                    break;
  685. X        }
  686. X        break;
  687. X
  688. X      case '4':
  689. X        headline( ADM58_MSG );
  690. X        printf("\n");
  691. X        if (USER.more == 0)
  692. X            printf("*");
  693. X        else
  694. X            printf(" ");
  695. X        printf(" 1 - %s\n\n", ADM59_MSG);
  696. X        if (USER.more == 1)
  697. X            printf("*");
  698. X        else
  699. X            printf(" ");
  700. X        printf(" 2 - %s\n\n", ADM60_MSG);
  701. X        if (USER.more == 3)
  702. X            printf("*");
  703. X        else
  704. X            printf(" ");
  705. X        printf(" 3 - %s\n\n", ADM61_MSG);
  706. X        printf("\n");
  707. X        printf("  4 - %s\n\n", ADM62_MSG);
  708. X        printf("  5 - %s\n\n", ADM63_MSG);
  709. X        printf("  6 - %s\n\n", ADM64_MSG);        
  710. X        printf("  7 - %s\n\n", ADM64aMSG);
  711. X        printf("  8 - %s\n\n", ADM64bMSG);
  712. X
  713. X        i = setup_get('8') - 49;
  714. X
  715. X        if (i < 3) {
  716. X            USER.more = i;
  717. X            if (USER.more == 2) USER.more++;
  718. X        }
  719. X        else {
  720. X            headline( ADM58_MSG );
  721. X            printf("\n");
  722. X            
  723. X            if (i == 3) {
  724. X                if (USER.leserichtung == 1)
  725. X                    printf("*");
  726. X                else
  727. X                    printf(" ");
  728. X                printf(" 1 - %s\n\n", ADM65_MSG);
  729. X                if (USER.leserichtung == 2)
  730. X                    printf("*");
  731. X                else
  732. X                    printf(" ");
  733. X                printf(" 2 - %s\n\n", ADM66_MSG);
  734. X        
  735. X                USER.leserichtung = setup_get('2') - 48;
  736. X            }
  737. X            if (i == 4) {
  738. X                if (USER.tlines == 22)
  739. X                    printf("*");
  740. X                else
  741. X                    printf(" ");
  742. X                printf(" 1 - %s\n\n", ADM67_MSG);
  743. X                if (USER.tlines == 23)
  744. X                    printf("*");
  745. X                else
  746. X                    printf(" ");
  747. X                printf(" 2 - %s\n\n", ADM68_MSG);
  748. X                if (USER.tlines == 43)
  749. X                    printf("*");
  750. X                else
  751. X                    printf(" ");
  752. X                printf(" 3 - %s\n\n", ADM68aMSG);
  753. X
  754. X                USER.tlines = setup_get('3') - 48 + 21;
  755. X                if(USER.tlines == 24) USER.tlines = 43; /* 45 Zeilen !! */    
  756. X            }
  757. X            if (i == 5) {
  758. X                if (USER.schluessel[0] != 32)
  759. X                    printf("*");
  760. X                else
  761. X                    printf(" ");
  762. X                printf(" 1 - %s\n\n", ADM69_MSG);
  763. X                if (USER.schluessel[0] == 32)
  764. X                    printf("*");
  765. X                else
  766. X                    printf(" ");
  767. X                printf(" 2 - %s\n\n", ADM70_MSG);
  768. X        
  769. X                i = setup_get('2') - 48;
  770. X                if (i == 2){
  771. X                    USER.schluessel[0] = 32;
  772. X                }                
  773. X                else{
  774. X                    USER.schluessel[0] = 1;
  775. X                }
  776. X            }
  777. X            if (i == 6) {
  778. X                if (USER.schluessel[1] == 2)
  779. X                    printf("*");
  780. X                else
  781. X                    printf(" ");
  782. X                printf(" 1 - %s\n\n", ADM70aMSG);
  783. X                if (USER.schluessel[1] == 3)
  784. X                    printf("*");
  785. X                else
  786. X                    printf(" ");
  787. X                printf(" 2 - %s\n\n", ADM70bMSG);
  788. X        
  789. X                if (USER.schluessel[1] == 4)
  790. X                    printf("*");
  791. X                else
  792. X                    printf(" ");
  793. X                printf(" 3 - %s\n\n", ADM70cMSG);
  794. X    
  795. X                i = setup_get('3') - 48;
  796. X                USER.schluessel[1] = i + 1;
  797. X            }
  798. X            if (i == 7) {
  799. X                if (USER.schluessel[2] == 1)
  800. X                    printf("*");
  801. X                else
  802. X                    printf(" ");
  803. X                printf(" 1 - %s\n\n", ADM70dMSG);
  804. X                if (USER.schluessel[2] == 2)
  805. X                    printf("*");
  806. X                else
  807. X                    printf(" ");
  808. X                printf(" 2 - %s\n\n", ADM70eMSG);
  809. X                if (USER.schluessel[2] == 3)
  810. X                    printf("*");
  811. X                else
  812. X                    printf(" ");
  813. X                printf(" 3 - %s\n\n", ADM70fMSG);
  814. X                if (USER.schluessel[2] == 4)
  815. X                    printf("*");
  816. X                else
  817. X                    printf(" ");
  818. X                printf(" 4 - %s\n\n", ADM70gMSG);
  819. X
  820. X                i = setup_get('4') - 48;
  821. X                USER.schluessel[2] = i;
  822. X            }
  823. X        }
  824. X        break;
  825. X
  826. X    case '5':
  827. X        if (strcomp(GUEST, USER.name) == 0) break;
  828. X
  829. X        headline( ADM71_MSG );
  830. X        printf("\n");
  831. X
  832. X        ansi("md");
  833. X        printf("%s\n", ADM72_MSG);
  834. X        printf("%s\n", ADM73_MSG);
  835. X        printf("%s\n", ADM74_MSG);
  836. X        printf("\n");
  837. X        printf("%s\n", ADM75_MSG);
  838. X        printf("%s\n", ADM76_MSG);
  839. X        ansi("me");
  840. X
  841. X        maybe_locked(UDBASE, "r"); 
  842. X            fd = open(UDBASE, O_RDONLY);
  843. X        if (fd == -1) {
  844. X            nerror("admin.c", 747, "setup", "Datei-Lesefehler", UDBASE);
  845. X        }    
  846. X
  847. X        printf("\n%s ", ADM04_MSG);
  848. X        strcpy(s, (unsigned char *) getline(30, 1015, '.', USER.name));
  849. X        if(strcomp(GUEST, s) != 0){
  850. X            if (s[0] > 31){
  851. X                ok = 0;
  852. X                lseek(fd, 0L, SEEK_SET);
  853. X                while ((read(fd, (unsigned char *) &DUMMY, sizeof(DUMMY)) == sizeof(DUMMY)) && (ok == 0)) {
  854. X                    if (strcomp(s, DUMMY.name)    == 0) ok = 1;
  855. X                    if (strcomp(s, DUMMY.nick)    == 0) ok = 1;
  856. X                    if (strcomp(s, DUMMY.sh_name) == 0) ok = 1;
  857. X                }
  858. X                if(USER.level < ADMIN_LEV){
  859. X                    if ((strcomp("SYSOP", s) == 0) ||
  860. X                        (strcomp("POST",  s) == 0) ||
  861. X                        (strcomp("GAST",  s) == 0) ||
  862. X                        (strcomp("ADMIN", s) == 0) ||
  863. X                        (strcomp("COSYS", s) == 0)) ok++;
  864. X                }
  865. X
  866. X                if(ok == 0) sprintf(USER.name, s);
  867. X            }
  868. X        }
  869. X
  870. X        printf("\n%s ", ADM07_MSG);
  871. X        strcpy(s, (unsigned char *) getline(30, 1015, '.', USER.nick));
  872. X        if (s[0] > 31){    
  873. X            ok = 0;
  874. X            lseek(fd, 0L, SEEK_SET);
  875. X            while ((read(fd, (unsigned char *) &DUMMY, sizeof(DUMMY)) == sizeof(DUMMY)) && (ok == 0)) {
  876. X                if (strcomp(s, DUMMY.name)    == 0) ok = 1;
  877. X                if (strcomp(s, DUMMY.nick)    == 0) ok = 1;
  878. X                if (strcomp(s, DUMMY.sh_name) == 0) ok = 1;
  879. X            }
  880. X            if (USER.level < ADMIN_LEV){
  881. X                if ((strcomp("SYSOP", s) == 0) ||
  882. X                    (strcomp("POST",  s) == 0) ||
  883. X                    (strcomp("GAST",  s) == 0) ||
  884. X                    (strcomp("ADMIN", s) == 0) ||
  885. X                    (strcomp("COSYS", s) == 0)) ok++;
  886. X            }
  887. X
  888. X            if(ok == 0) sprintf(USER.nick, s);
  889. X        }
  890. X
  891. X        close(fd);
  892. X        mbunlock(UDBASE);
  893. X
  894. X        printf("\n%s ", ADM08_MSG);
  895. X        strcpy(s, (unsigned char *) getline(30, 1011, '.', USER.wohnort));
  896. X        if (s[0] > 31) sprintf(USER.wohnort, s);
  897. X
  898. X        printf("\n%s ", ADM09_MSG);
  899. X        strcpy(s, (unsigned char *) getline(30, 1011, '.', USER.strasse));
  900. X        if (s[0] > 31) sprintf(USER.strasse, s);
  901. X
  902. X        printf("\n%s ", ADM10_MSG);
  903. X        strcpy(s, (unsigned char *) getline(20, 1011, '.', USER.telefon1));
  904. X        if (s[0] > 31) sprintf(USER.telefon1, s);
  905. X
  906. X        printf("\n%s ", ADM11_MSG);
  907. X        strcpy(s, (unsigned char *) getline(20, 1011, '.', USER.telefon2));
  908. X        if (s[0] > 31) sprintf(USER.telefon2, s);
  909. X
  910. X        printf("\n%s ", ADM12_MSG);
  911. X        strcpy(s, (unsigned char *) getline(10, 1114, '?', USER.geburtsdatum));
  912. X        if (s[0] > 31) sprintf(USER.geburtsdatum, s);
  913. X
  914. X        break;
  915. X
  916. X
  917. X      case '6':
  918. X        if (strcomp(GUEST, USER.name) == 0) break;
  919. X
  920. X        headline( ADM77_MSG );
  921. X        
  922. X        NIX: printf("\n%s ", ADM78_MSG);
  923. X    
  924. X        strcpy(s, (unsigned char *) getline(10, 12, '.', ""));
  925. X        if (s[0] != '\0') {
  926. X            strcpy(USER.passwort, (unsigned char *) crypted(s));
  927. X            printf(" (%s)", USER.passwort);
  928. X        }
  929. X        if (length(USER.passwort) < 5) {
  930. X            ansi("md");
  931. X            printf("\n\n%s\n", ADM79_MSG);
  932. X            ansi("me");
  933. X            goto NIX;
  934. X        }
  935. X        printf("\n\n%s ", ADM80_MSG);
  936. X        strcpy(s, (unsigned char *) getline(10, 12, '.', ""));
  937. X        strcpy(t, (unsigned char *) crypted(s));
  938. X        printf(" (%s)", t);
  939. X        if ((strcomp(t, USER.passwort) != 0) || (strcomp(USER.passwort, t) != 0)) {
  940. X            ansi("md");
  941. X            printf(" %s         \n", ADM81_MSG);
  942. X            ansi("me");
  943. X            goto NIX;
  944. X        }
  945. X        break;
  946. X
  947. X    case '7':
  948. X        headline( ADM82_MSG );
  949. X        printf("\n");
  950. X        strcpy(s, (unsigned char *) mytime(0));
  951. X        if (USER.intro == 1)
  952. X            printf("*");
  953. X        else
  954. X            printf(" ");
  955. X        printf(" 1 - %s\n\n", ADM83_MSG);
  956. X        if (USER.intro == 2)
  957. X            printf("*");
  958. X        else
  959. X            printf(" ");
  960. X        printf(" 2 - %s\n\n", ADM84_MSG);
  961. X        if (USER.intro == 3)
  962. X            printf("*");
  963. X        else
  964. X            printf(" ");
  965. X        printf(" 3 - %s\n\n", ADM85_MSG);
  966. X        if (USER.intro == 4)
  967. X            printf("*");
  968. X        else
  969. X            printf(" ");
  970. X        printf(" 4 - %s\n\n", ADM86_MSG);
  971. X
  972. X        USER.intro = setup_get('4') - 48;
  973. X        break;
  974. X
  975. X      case '8':
  976. X        headline( ADM87_MSG );
  977. X        printf("\n");
  978. X        if (USER.lastmode == 1)
  979. X            printf("*");
  980. X        else
  981. X            printf(" ");
  982. X        printf(" 1 - %s\n\n", ADM88_MSG);
  983. X        if (USER.lastmode == 2)
  984. X            printf("*");
  985. X        else
  986. X            printf(" ");
  987. X        printf(" 2 - %s\n\n", ADM89_MSG);
  988. X        printf("\n");
  989. X        printf("  3 - %s\n\n", ADM90_MSG);
  990. X    
  991. X        i = setup_get('3') - 48;
  992. X
  993. X        switch (i) {
  994. X            case 1:
  995. X                USER.lastmode = 1;
  996. X                LASTTIME = USER.lasttime;
  997. X                break;
  998. X            case 2:
  999. X                USER.lastmode = 2;
  1000. X                LASTTIME = (int) 0;
  1001. X                break;
  1002. X            case 3:
  1003. X                headline( ADM87_MSG );
  1004. X                ansi("md");
  1005. X                printf("\n%s\n", ADM91_MSG);
  1006. X                printf("%s\n", ADM92_MSG);
  1007. X                printf("%s\n", ADM93_MSG);
  1008. X                printf("%s\n", ADM94_MSG);
  1009. X                ansi("me");
  1010. X
  1011. X                printf("\n%s ", ADM95_MSG);
  1012. X                strcpy(t, (unsigned char *) datereconv(LASTLOG));
  1013. X                strcpy(s, (unsigned char *) getline(10, 1114, '?', t));
  1014. X                LASTLOG = (long) dateconv(s);
  1015. X
  1016. X                printf("\n%s ", ADM96_MSG);
  1017. X                strcpy(t, (unsigned char *) timereconv(LASTTIME));
  1018. X                strcpy(s, (unsigned char *) getline(8, 1113, '?', t));
  1019. X                LASTTIME = timeconv(s);
  1020. X
  1021. X                break;
  1022. X        }
  1023. X        break;
  1024. X
  1025. X      case '9':    
  1026. X        goto ENDE;
  1027. X        break;
  1028. X  }
  1029. X  printf("\n\n");
  1030. X  init_user( ADM97_MSG );
  1031. X  goto AGAIN;
  1032. X
  1033. X  ENDE:
  1034. X
  1035. X  printf("\n");
  1036. X  return;
  1037. X}
  1038. END_OF_FILE
  1039.   if test 26246 -ne `wc -c <'src/admin.c'`; then
  1040.     echo shar: \"'src/admin.c'\" unpacked with wrong size!
  1041.   fi
  1042.   # end of 'src/admin.c'
  1043. fi
  1044. if test -f 'wendy/tools.c' -a "${1}" != "-c" ; then 
  1045.   echo shar: Will not clobber existing file \"'wendy/tools.c'\"
  1046. else
  1047.   echo shar: Extracting \"'wendy/tools.c'\" \(24683 characters\)
  1048.   sed "s/^X//" >'wendy/tools.c' <<'END_OF_FILE'
  1049. X/***************************************************************************/
  1050. X/*        PROGRAMM  ix/Mbox                           */
  1051. X/*             DATEI  tools.c                           */
  1052. X/*        FUNKTIONEN  whoami(), tty(), stripped(), upcased(), length(),    */
  1053. X/*              strcopy(), strcomp(), ansi2(), mydate(), mytime(),   */
  1054. X/*                  crypted(), dateconv(), datereconv(), timeconv(),     */
  1055. X/*              timereconv(), maybe_locked(), num_stripped(),        */
  1056. X/*              rename(), headline(), ttyna(), bigcopy(), mblock(),  */
  1057. X/*              mbunlock(), shortname(), clearline(), isin()       */
  1058. X/*              termansi(), sgrep()                   */
  1059. X/*             AUTOR  vs (Volker Schuermann/MINIX-Version)           */
  1060. X/*  LETZTE AENDERUNG  18.12.1992                       */
  1061. X/***************************************************************************/
  1062. X
  1063. X#include <sys/types.h>
  1064. X#include <sys/stat.h>
  1065. X#include <stdio.h>
  1066. X#include <unistd.h>
  1067. X#include <time.h>
  1068. X#include <pwd.h>
  1069. X
  1070. X#ifdef _SYS7
  1071. X#include <termcap.h>
  1072. X#endif
  1073. X
  1074. X
  1075. X#ifdef _MBOX
  1076. X#define EXTERN
  1077. X#include "mbox.h"
  1078. X#else
  1079. X#define VERSION "TOOLS.C"
  1080. X#define CR 13
  1081. X#define TOL01_MSG    "Sonntag"
  1082. X#define TOL02_MSG    "Montag"
  1083. X#define TOL03_MSG    "Dienstag"
  1084. X#define TOL04_MSG    "Mittwoch"
  1085. X#define TOL05_MSG    "Donnerstag"
  1086. X#define TOL06_MSG    "Freitag"
  1087. X#define TOL07_MSG    "Samstag"
  1088. X#define TOL08_MSG    "Momentchen"
  1089. X#endif
  1090. X#ifdef STRING
  1091. X#undef STRING
  1092. X#endif
  1093. X
  1094. X#ifdef LONGSTRING
  1095. X#undef LONGSTRING
  1096. X#endif
  1097. X
  1098. X#define STRING 81
  1099. X#define LONGSTRING 256
  1100. X
  1101. Xunsigned char headinfo[STRING];
  1102. X
  1103. X
  1104. X/***************************************************************************/
  1105. X/*      FUNKTION  whoami()                           */
  1106. X/*  BESCHREIBUNG  Name des eigenen SH-Accounts.                    */
  1107. X/*     PARAMETER  keine                                                       */
  1108. X/*     RUECKGABE  siehe BESCHREIBUNG                                       */
  1109. X/***************************************************************************/
  1110. X
  1111. Xunsigned char *whoami()
  1112. X{
  1113. X  struct passwd *pw_entry;
  1114. X
  1115. X  pw_entry = getpwuid(getuid());
  1116. X
  1117. X  if (pw_entry->pw_uid < 0) return (unsigned char *) "OOPS";
  1118. X
  1119. X  return (unsigned char *) (pw_entry->pw_name);
  1120. X}
  1121. X
  1122. X
  1123. X
  1124. X
  1125. X/***************************************************************************/
  1126. X/*      FUNKTION  stripped()                           */
  1127. X/*  BESCHREIBUNG  STRING von fuehrenden und folgenden Leerzeichen be-      */
  1128. X/*          freien.                                                  */
  1129. X/*     PARAMETER  st  =  STRING inclusive Leerzeichen                      */
  1130. X/*     RUECKGABE  STRING exclusive Leerzeichen                             */
  1131. X/***************************************************************************/
  1132. X
  1133. Xunsigned char *stripped(st)
  1134. Xunsigned char st[];
  1135. X{
  1136. X  static unsigned char s[STRING];
  1137. X
  1138. X  int i = 0, a = 0, b = 0, c = 0;
  1139. X
  1140. X  if (st[0] == '\0') return (unsigned char *) '\0';
  1141. X  if ((st[0] == 10) || (st[0] == 13)) return (unsigned char *) " ";
  1142. X
  1143. X  strcpy(s, st);
  1144. X
  1145. X  while ((s[i] < 33) && (s[i] != '\0')) i++;
  1146. X  a = i;
  1147. X  while (s[a] != '\0') a++;
  1148. X  a--;
  1149. X  while (s[a] < 33) a--;
  1150. X
  1151. X  for (c = i; c <= a; c++) {
  1152. X    s[b] = s[c];
  1153. X    b++;
  1154. X  }
  1155. X  s[b] = '\0';
  1156. X
  1157. X  return (unsigned char *) s;
  1158. X}
  1159. X
  1160. X
  1161. X
  1162. X
  1163. X
  1164. X/***************************************************************************/
  1165. X/*      FUNKTION  upcased()                           */
  1166. X/*  BESCHREIBUNG  Zeichen eines STRING auf Grossbuchstaben umstellen.       */
  1167. X/*     PARAMETER  st  =  STRING mit Gross-/Kleinbuchstaben           */
  1168. X/*     RUECKGABE  STRING in Grossbuchstaben                                */
  1169. X/***************************************************************************/
  1170. X
  1171. Xunsigned char *upcased(st)
  1172. Xunsigned char st[];
  1173. X{
  1174. X  static unsigned char s[STRING];
  1175. X
  1176. X  int i = 0;
  1177. X
  1178. X
  1179. X  strcpy(s, st);
  1180. X
  1181. X  while (s[i] != '\0') {
  1182. X    if (s[i] > 96) s[i] -= 32;
  1183. X    i++;
  1184. X  }
  1185. X
  1186. X  return (unsigned char *) s;
  1187. X}
  1188. X
  1189. X
  1190. X
  1191. X
  1192. X
  1193. X/***************************************************************************/
  1194. X/*      FUNKTION  length()                           */
  1195. X/*  BESCHREIBUNG  Laenge eines STRING ermitteln (ja, ja, "strlen" ...)       */
  1196. X/*     PARAMETER  st  =  STRING                                            */
  1197. X/*     RUECKGABE  Laenge des STRING                                        */
  1198. X/***************************************************************************/
  1199. X
  1200. Xint length(st)
  1201. Xunsigned char st[];
  1202. X{
  1203. X  int i = 0;
  1204. X
  1205. X  while (st[i] != '\0') i++;
  1206. X
  1207. X  return i;
  1208. X}
  1209. X
  1210. X
  1211. X
  1212. X
  1213. X/***************************************************************************/
  1214. X/*      FUNKTION  strcopy()                           */
  1215. X/*  BESCHREIBUNG  Einen TeilSTRING aus einem STRING herausschneiden.       */
  1216. X/*     PARAMETER  st  =  STRING                                            */
  1217. X/*          v   =  von Zeichen (1. Zeichen = 0 !!!)           */
  1218. X/*          b   =  bis Zeichen                           */
  1219. X/*     RUECKGABE  TeilSTRING                                               */
  1220. X/***************************************************************************/
  1221. X
  1222. Xunsigned char *strcopy(st, v, b)
  1223. Xunsigned char st[];
  1224. Xint v, b;
  1225. X{
  1226. X  static unsigned char s[STRING];
  1227. X
  1228. X  int i = 0, j;
  1229. X
  1230. X
  1231. X  strcpy(s, st);
  1232. X
  1233. X  if (length(s) < b) b = length(s);
  1234. X
  1235. X  for (j = v; j <= b; j++) {
  1236. X    s[i] = s[j];
  1237. X    i++;
  1238. X  }
  1239. X  s[i] = '\0';
  1240. X
  1241. X  return (unsigned char *) s;
  1242. X}
  1243. X
  1244. X
  1245. X/***************************************************************************/
  1246. X/*      FUNKTION  bigcopy()                           */
  1247. X/*  BESCHREIBUNG  Einen TeilLONGSTRING aus LONGSTRING herausschneiden.     */
  1248. X/*     PARAMETER  st  =  LONGSTRING                                        */
  1249. X/*          v   =  von Zeichen (1. Zeichen = 0 !!!)           */
  1250. X/*          b   =  bis Zeichen                           */
  1251. X/*     RUECKGABE  TeilLONGSTRING                                           */
  1252. X/***************************************************************************/
  1253. X
  1254. Xunsigned char *bigcopy(st, v, b)
  1255. Xunsigned char st[];
  1256. Xint v, b;
  1257. X{
  1258. X  static unsigned char s[LONGSTRING];
  1259. X
  1260. X  int i = 0, j;
  1261. X
  1262. X
  1263. X  strcpy(s, st);
  1264. X
  1265. X  if (length(s) < b) b = length(s);
  1266. X
  1267. X  for (j = v; j <= b; j++) {
  1268. X    s[i] = s[j];
  1269. X    i++;
  1270. X  }
  1271. X  s[i] = '\0';
  1272. X
  1273. X  return (unsigned char *) s;
  1274. X}
  1275. X
  1276. X
  1277. X
  1278. X
  1279. X/***************************************************************************/
  1280. X/*      FUNKTION  strcomp()                           */
  1281. X/*  BESCHREIBUNG  Zwei STRINGs vergleichen. Und zwar genau solange, bis    */
  1282. X/*          bei STRING1 das Ende ('\0') erreicht ist !!!             */
  1283. X/*                Gross-/Kleinschreibung wird dabei IGNORIERT !!!          */
  1284. X/*     PARAMETER  st  =  STRING1                                           */
  1285. X/*              tt  =  STRING2                                           */
  1286. X/*     RUECKGABE  Anzahl der UNGLEICHEN Zeichen                            */
  1287. X/***************************************************************************/
  1288. X
  1289. Xint strcomp(s, t)
  1290. Xunsigned char s[], t[];
  1291. X{
  1292. X  int i = 0, a = 0;
  1293. X  int s1, t1;
  1294. X
  1295. X  while (s[i] != '\0') {
  1296. X    s1 = s[i];
  1297. X    t1 = t[i];
  1298. X    if ((t1 > 96) && (t1 < 123)) t1 -= 32;
  1299. X    if ((s1 > 96) && (s1 < 123)) s1 -= 32;
  1300. X    if (t1 != s1) a++;
  1301. X    i++;
  1302. X  }
  1303. X  return a;
  1304. X}
  1305. X
  1306. X
  1307. X/***************************************************************************/
  1308. X/*      FUNKTION  ansi2()                           */
  1309. X/*  BESCHREIBUNG  TERMCAP-Eintrag fuer ein Terminal in "buf" einlesen,     */
  1310. X/*          und angeforderte Sequenzen finden & ausgeben.            */
  1311. X/*     PARAMETER  code  =  'INIT'  =  Eintrag holen und speichern       */
  1312. X/*                         =  Sequenz finden & ausgeben            */
  1313. X/*     RUECKGABE  -1  =  Terminal nicht gefunden                           */
  1314. X/*           1  =  Sequenz nicht gefunden                   */
  1315. X/***************************************************************************/
  1316. X
  1317. Xstatic unsigned char buf[1024];
  1318. X
  1319. Xint ansi(code)
  1320. Xunsigned char code[];
  1321. X{
  1322. X  ansi2(code, 0, 0);
  1323. X}
  1324. X
  1325. Xint ansi2(code, x, y)
  1326. Xunsigned char code[];
  1327. Xint x, y;
  1328. X{
  1329. X  unsigned char *getenv();
  1330. X  static unsigned char s[STRING];
  1331. X  unsigned char *p = s;
  1332. X  unsigned char *term;
  1333. X
  1334. X#ifdef _MBOX
  1335. X  term = TERMINAL;
  1336. X#else
  1337. X  term = getenv("TERM");
  1338. X#endif
  1339. X
  1340. X  if ((x == -1) && (y == -1)) {
  1341. X    if (tgetent(buf, code) != 1) return -1;
  1342. X  }
  1343. X  if (strcomp("INIT", code) == 0) {
  1344. X    if (tgetent(buf, term) != 1) return -1;
  1345. X  }
  1346. X  if (strcomp("cm", code) == 0) {
  1347. X    if (tgetstr(code, &p) == 0) return 1;
  1348. X    printf("%s", (unsigned char *) tgoto( s, (x -1), (y -1) ));
  1349. X    return 0;
  1350. X  }
  1351. X  else{
  1352. X    if (tgetstr(code, &p) == 0) return 1;
  1353. X  }
  1354. X
  1355. X  printf("%s", s);
  1356. X
  1357. X  return 0;
  1358. X}
  1359. X
  1360. Xunsigned char *termansi(code)
  1361. Xunsigned char code[];
  1362. X{
  1363. X  unsigned char *getenv();
  1364. X  unsigned char s[STRING];
  1365. X  unsigned char *p = s;
  1366. X  unsigned char *term;
  1367. X
  1368. X#ifdef _MBOX
  1369. X  term = TERMINAL;
  1370. X#else
  1371. X  term = getenv("TERM");
  1372. X#endif
  1373. X
  1374. X  if (strcomp("INIT", code) == 0) {
  1375. X    if (tgetent(buf, term) != 1) return (unsigned char *) '\0';
  1376. X  }
  1377. X  if (tgetstr(code, &p) == 0) return (unsigned char *) '\0';
  1378. X
  1379. X  return (unsigned char *) s;
  1380. X}
  1381. X
  1382. X
  1383. X
  1384. X/***************************************************************************/
  1385. X/*      FUNKTION  mydate()                           */
  1386. X/*  BESCHREIBUNG  Tagesdatum liefern.                         */
  1387. X/*     PARAMETER  mode  =  0  =  tt.mm.yyyy                   */
  1388. X/*               1  =  tt.mm.yy                   */
  1389. X/*               2  =  ttt                       */    
  1390. X/*     RUECKGABE  Datum                                                    */
  1391. X/***************************************************************************/
  1392. X
  1393. X#define TZS      1
  1394. X
  1395. Xunsigned char *mydate(mode)
  1396. Xint mode;
  1397. X{
  1398. X  struct tm *tp;
  1399. X  time_t tt;
  1400. X  unsigned char wt[8][11];
  1401. X
  1402. X  static unsigned char s[STRING];
  1403. X
  1404. X#ifndef _MBOX
  1405. X  strcpy(wt[0], "Sonntag");
  1406. X  strcpy(wt[1], "Montag");
  1407. X  strcpy(wt[2], "Dienstag");
  1408. X  strcpy(wt[3], "Mittwoch");
  1409. X  strcpy(wt[4], "Donnerstag");
  1410. X  strcpy(wt[5], "Freitag");
  1411. X  strcpy(wt[6], "Samstag");
  1412. X#else
  1413. X  strcpy(wt[0], TOL01_MSG);
  1414. X  strcpy(wt[1], TOL02_MSG);
  1415. X  strcpy(wt[2], TOL03_MSG);
  1416. X  strcpy(wt[3], TOL04_MSG);
  1417. X  strcpy(wt[4], TOL05_MSG);
  1418. X  strcpy(wt[5], TOL06_MSG);
  1419. X  strcpy(wt[6], TOL07_MSG);
  1420. X#endif
  1421. X
  1422. X  time(&tt);
  1423. X  tp = localtime(&tt);
  1424. X  if (mode == 0) {
  1425. X    sprintf(s, "%02.2d.%02.2d.%04.4d", tp->tm_mday, tp->tm_mon + TZS, 1900 + tp->tm_year);
  1426. X  }
  1427. X  if (mode == 1) {
  1428. X    sprintf(s, "%02.2d.%02.2d.%02.2d", tp->tm_mday, tp->tm_mon + TZS, tp->tm_year);
  1429. X  }
  1430. X  if (mode == 2) {
  1431. X    sprintf(s, "%s", wt[tp->tm_wday]);
  1432. X  }
  1433. X  return (unsigned char *) s;
  1434. X}
  1435. X
  1436. X
  1437. X
  1438. X
  1439. X/***************************************************************************/
  1440. X/*      FUNKTION  mytime()                           */
  1441. X/*  BESCHREIBUNG  Tageszeit liefern.                         */
  1442. X/*     PARAMETER  mode  =  0  =  hh:mm:ss                   */
  1443. X/*               1  =  hh:mm                        */
  1444. X/*     RUECKGABE  Zeit                                                     */
  1445. X/***************************************************************************/
  1446. X
  1447. Xunsigned char *mytime(mode)
  1448. Xint mode;
  1449. X{
  1450. X  struct tm *tp;
  1451. X  time_t tt;
  1452. X
  1453. X  static unsigned char s[STRING];
  1454. X
  1455. X  time(&tt);
  1456. X  tp = localtime(&tt);
  1457. X  sprintf(s, "%02.2d:%02.2d:%02.2d", tp->tm_hour, tp->tm_min, tp->tm_sec);
  1458. X
  1459. X  if (mode == 1) s[5] = '\0';
  1460. X
  1461. X  return (unsigned char *) s;
  1462. X}
  1463. X
  1464. X
  1465. X
  1466. X
  1467. X/***************************************************************************/
  1468. X/*      FUNKTION  crypted()                           */
  1469. X/*  BESCHREIBUNG  STRING verschluesseln und zurueckgeben.           */
  1470. X/*     PARAMETER  s  =  STRING                                             */
  1471. X/*     RUECKGABE  Verschluesselter STRING                                  */
  1472. X/***************************************************************************/
  1473. X
  1474. Xunsigned char *crypted(s)
  1475. Xunsigned char s[];
  1476. X{
  1477. X  static unsigned char t[STRING];
  1478. X  int i, a;
  1479. X
  1480. X
  1481. X  strcpy(t, s);
  1482. X  i = 0;
  1483. X  a = 2;
  1484. X  while (t[i] != '\0') {
  1485. X    t[i] = (t[i] / a) + 32;
  1486. X    i++;
  1487. X    a++;
  1488. X    if (a > 5) a = 2;
  1489. X  }
  1490. X
  1491. X  return (unsigned char *) t;
  1492. X}
  1493. X
  1494. X
  1495. X
  1496. X
  1497. X/***************************************************************************/
  1498. X/*      FUNKTION  dateconv()                            */
  1499. X/*  BESCHREIBUNG  Datum (STRING) in Datum (LONG) wandeln.           */
  1500. X/*     PARAMETER  d  =  Datum (STRING)                                     */
  1501. X/*     RUECKGABE  Datum (LONG)                                             */
  1502. X/***************************************************************************/
  1503. X
  1504. Xlong dateconv(d)
  1505. Xunsigned char d[];
  1506. X{
  1507. X  unsigned char s[STRING];
  1508. X  int a, b, i;
  1509. X
  1510. X
  1511. X  strcpy(s, (unsigned char *) strcopy(d, 0, 1));
  1512. X  a = atoi(s);
  1513. X  strcpy(s, (unsigned char *) strcopy(d, 3, 4));
  1514. X  b = atoi(s);
  1515. X  strcpy(s, (unsigned char *) strcopy(d, 6, 9));
  1516. X  i = atoi(s);
  1517. X  if (i < 1900) i += 1900;
  1518. X
  1519. X  sprintf(s, "%4.4d%02.2d%02.2d", i, b, a);
  1520. X
  1521. X  return atol(s);
  1522. X}
  1523. X
  1524. X
  1525. X
  1526. X/***************************************************************************/
  1527. X/*      FUNKTION  datereconv()                            */
  1528. X/*  BESCHREIBUNG  Datum (LONG) in Datum (STRING) wandeln.           */
  1529. X/*     PARAMETER  l  =  Datum (LONG)                                       */
  1530. X/*     RUECKGABE  Datum (STRING)                                           */
  1531. X/***************************************************************************/
  1532. X
  1533. Xunsigned char *datereconv(l)
  1534. Xlong l;
  1535. X{
  1536. X  static unsigned char s[STRING];
  1537. X  static unsigned char t[STRING];
  1538. X
  1539. X
  1540. X  if (l < 19000000)
  1541. X    sprintf(s, "%ld", 1900000L + l);
  1542. X  else
  1543. X    sprintf(s, "%ld", l);
  1544. X
  1545. X  strcpy(t, (unsigned char *) strcopy(s, 6, 7));
  1546. X  strcat(t, ".");
  1547. X  strcat(t, (unsigned char *) strcopy(s, 4, 5));
  1548. X  strcat(t, ".");
  1549. X  strcat(t, (unsigned char *) strcopy(s, 0, 3));
  1550. X
  1551. X  return (unsigned char *) t;
  1552. X}
  1553. X
  1554. X
  1555. X
  1556. X/***************************************************************************/
  1557. X/*      FUNKTION  timeconv()                            */
  1558. X/*  BESCHREIBUNG  Zeit (STRING) in Zeit (LONG) wandeln.               */
  1559. X/*     PARAMETER  t  =  Zeit (STRING)                                      */
  1560. X/*     RUECKGABE  Zeit (LONG)                                              */
  1561. X/***************************************************************************/
  1562. X
  1563. Xint timeconv(t)
  1564. Xunsigned char t[];
  1565. X{
  1566. X  unsigned char s[STRING];
  1567. X  int i = 0;
  1568. X
  1569. X
  1570. X  strcpy(s, (unsigned char *) strcopy(t, 0, 1));
  1571. X  i = 100 * atoi(s);
  1572. X  strcpy(s, (unsigned char *) strcopy(t, 3, 4));
  1573. X  i += atoi(s);
  1574. X
  1575. X  return i;
  1576. X}
  1577. X
  1578. X
  1579. X
  1580. X
  1581. X/***************************************************************************/
  1582. X/*      FUNKTION  timereconv()                            */
  1583. X/*  BESCHREIBUNG  Zeit (LONG) in Zeit (STRING) wandeln.               */
  1584. X/*     PARAMETER  i  =  Zeit (LONG)                                        */
  1585. X/*     RUECKGABE  Zeit (STRING)                                            */
  1586. X/***************************************************************************/
  1587. X
  1588. Xunsigned char *timereconv(i)
  1589. Xint i;
  1590. X{
  1591. X  static unsigned char s[STRING];
  1592. X  static unsigned char t[STRING];
  1593. X
  1594. X
  1595. X  if (i < 10000)
  1596. X    sprintf(s, "%04.4d00", i);
  1597. X  else
  1598. X    sprintf(s, "%06.6d", i);
  1599. X
  1600. X  strcpy(t, (unsigned char *) strcopy(s, 0, 1));
  1601. X  strcat(t, ":");
  1602. X  strcat(t, (unsigned char *) strcopy(s, 2, 3));
  1603. X  strcat(t, ":");
  1604. X  strcat(t, (unsigned char *) strcopy(s, 4, 5));
  1605. X
  1606. X  return (unsigned char *) t;
  1607. X}
  1608. X
  1609. X
  1610. X
  1611. X/***************************************************************************/
  1612. X/*      FUNKTION  shortname()                            */
  1613. X/*  BESCHREIBUNG  Wandelt lange Namen (NGs) ins 14-Zeichenformat, um Ver-  */
  1614. X/*                Wechslungen zu vermeiden:                   */
  1615. X/*                                       */
  1616. X/*              comp.protocols.tcp-ip.sources.wanted           */
  1617. X/*                =>  com0ces.wanted                       */
  1618. X/*                                               */
  1619. X/*     PARAMETER  longname : langer Name                                   */
  1620. X/*                                       */
  1621. X/*                                          */
  1622. X/*     RUECKGABE  s : kurzer Name                                          */
  1623. X/***************************************************************************/
  1624. X
  1625. Xunsigned char *shortname( longname )
  1626. Xunsigned char longname[];
  1627. X{
  1628. X  unsigned char s[STRING];
  1629. X  unsigned char t[STRING];
  1630. X
  1631. X  int i = 0, j = 0;
  1632. X
  1633. X  strcpy(s, longname);
  1634. X
  1635. X  strcpy(t, longname);
  1636. X
  1637. X  while(s[i] != '\0'){
  1638. X    if(s[i] == '/') j = i + 1;
  1639. X    i++;
  1640. X  }
  1641. X
  1642. X  i = strlen(t);
  1643. X
  1644. X  if((i - j) < 15) return (unsigned char *) s;
  1645. X
  1646. X  s[j + 3] = '0'; s[j + 4] = '\0';
  1647. X  strcat(s, (unsigned char *) strcopy(t, (i-10), i));
  1648. X
  1649. X  return (unsigned char *) s;
  1650. X}
  1651. X
  1652. X
  1653. X
  1654. X
  1655. X
  1656. X/***************************************************************************/
  1657. X/*      FUNKTION  maybe_locked()                       */
  1658. X/*  BESCHREIBUNG  Um sicherzustellen das eine Datei, die eigentlich vor-   */
  1659. X/*          handen sein MUSS, wirklich nicht da ist (und nicht nur   */
  1660. X/*          gerade von einem anderen Task benutzt wird), verzoegert  */
  1661. X/*          diese Funktion die Fehlermeldung um eine festgelegte     */
  1662. X/*          Zeitspanne.                                              */
  1663. X/*     PARAMETER  name  =  Dateiname                           */
  1664. X/*          mode  =  Zugriffsmodus (sollte NICHT verwendet werden !) */
  1665. X/*     RUECKGABE   0    =  Datei erreichbar                   */
  1666. X/*          -1    =  Datei nicht verfuegbar               */
  1667. X/***************************************************************************/
  1668. X
  1669. Xint maybe_locked(name, mode)
  1670. Xunsigned char name[], mode[];
  1671. X{
  1672. X  FILE *fp;
  1673. X  int i = 0, LCK = 0;
  1674. X  unsigned char s[STRING];
  1675. X
  1676. X  sprintf(s, "%s.LCK", name);
  1677. X
  1678. X#ifndef _LONGNAMES
  1679. X  strcpy(s, (unsigned char *) shortname(s));
  1680. X#endif
  1681. X
  1682. X  TRY_TWICE:
  1683. X
  1684. X  fp = NULL;
  1685. X
  1686. X  do {
  1687. X    if(fp != NULL) fclose(fp);
  1688. X    fp = fopen(s, "r");
  1689. X    i++;
  1690. X    if (fp != NULL) {
  1691. X        if(i == 1) printf("%c%s ", CR, TOL08_MSG);
  1692. X        printf(".");
  1693. X        sleep(3);
  1694. X    }
  1695. X  } while ((i < 8) && (fp != 0));
  1696. X
  1697. X  if(fp != 0){
  1698. X    fclose(fp);
  1699. X#ifdef _MBOX
  1700. X    mbunlock(name);  /* <--- DAS IST NATUERLICH NICHT KORREKT !!! */
  1701. X    goto TRY_TWICE;  /* <--- DAS AUCH NICHT !!! */
  1702. X    nerror("tools.c", 566, "maybe_locked", "Datei gesperrt", name);    
  1703. X#else
  1704. X    printf("\n\nDatei >>%s<< gesperrt !!!\n\n", name);
  1705. X#endif
  1706. X    exit( -1 );
  1707. X  }
  1708. X
  1709. X  i = 0;
  1710. X
  1711. X  do {
  1712. X    fp = fopen(name, "r");    /* "r" => "mode", aber VORSICHT ! */
  1713. X    i++;
  1714. X    if (fp == NULL) {
  1715. X        if(i == 1) printf("%c%s ", CR, TOL08_MSG);    
  1716. X        printf(".");
  1717. X        sync();
  1718. X        sleep(3);
  1719. X    }
  1720. X  } while ((i < 5) && (fp == NULL));
  1721. X
  1722. X  if (fp == NULL) return -1;
  1723. X
  1724. X  fclose(fp);
  1725. X  return 0;
  1726. X}
  1727. X
  1728. X
  1729. X
  1730. X
  1731. X
  1732. X/***************************************************************************/
  1733. X/*      FUNKTION  num_stripped()                       */
  1734. X/*  BESCHREIBUNG  Entfernt alle Ziffern aus STRING.               */
  1735. X/*     PARAMETER  s  =  STRING (incl. Ziffern)                   */
  1736. X/*     RUECKGABE  STRING (excl. Ziffern)                   */
  1737. X/***************************************************************************/
  1738. X
  1739. Xunsigned char *numstripped(s)
  1740. Xunsigned char s[];
  1741. X{
  1742. X  static unsigned char t[STRING];
  1743. X  int i = 0, a = 0;
  1744. X
  1745. X  while (s[i] != '\0') {
  1746. X    if (((s[i] > 64) && (s[i] < 127)) || (s[i] == ' ') || (s[i] == '-')) {
  1747. X        t[a] = s[i];
  1748. X        a++;
  1749. X    }
  1750. X    i++;
  1751. X  }
  1752. X  t[a] = '\0';
  1753. X
  1754. X  return (unsigned char *) t;
  1755. X}
  1756. X
  1757. X
  1758. X
  1759. X
  1760. X/***************************************************************************/
  1761. X/*      FUNKTION  rename()                           */
  1762. X/*  BESCHREIBUNG  Benennt Datei1 in Datei2 um (ok, gelogen ... Datei1 wird */
  1763. X/*          in Datei2 kopiert).                                      */
  1764. X/*     PARAMETER  alt  =  Datei1                                           */
  1765. X/*          neu  =  Datei2                                           */
  1766. X/*     RUECKGABE   0   =  ok                                               */
  1767. X/*          -1   =  Datei1 nicht gefunden                   */
  1768. X/***************************************************************************/
  1769. X
  1770. X#ifndef _ANSI
  1771. X
  1772. Xint rename(alt, neu)
  1773. Xunsigned char *alt[], *neu[];
  1774. X{
  1775. X  FILE *fp;
  1776. X  FILE *ff;
  1777. X
  1778. X  unsigned char s[250];
  1779. X
  1780. X  fp = fopen(neu, "w");
  1781. X  if (fp == NULL) {
  1782. X    return -1;
  1783. X  }
  1784. X  ff = fopen(alt, "r");
  1785. X  if (ff == NULL) {
  1786. X    return -2;
  1787. X  }
  1788. X  while (fgets(s, 250, ff) != NULL) {
  1789. X    fputs(s, fp);
  1790. X  }
  1791. X
  1792. X  fclose(fp);
  1793. X  fclose(ff);
  1794. X
  1795. X  unlink(alt);
  1796. X
  1797. X  return 0;
  1798. X}
  1799. X
  1800. X#endif
  1801. X
  1802. X
  1803. X
  1804. X
  1805. X/***************************************************************************/
  1806. X/*      FUNKTION  headline()                           */
  1807. X/*  BESCHREIBUNG  Ueberschrift mit Ansage-Text ausgeben. Vorher wird der   */
  1808. X/*          der Bildschirm geloescht (falls moegliche) und auf       */
  1809. X/*          negative Darstellung umgeschaltet.                       */
  1810. X/*     PARAMETER  line  =  Ansage-Text                       */
  1811. X/*     RUECKGABE  keine                                                    */
  1812. X/***************************************************************************/
  1813. X
  1814. Xvoid headline(line)
  1815. Xunsigned char line[];
  1816. X{
  1817. X  unsigned char ex[255];
  1818. X  int i;
  1819. X
  1820. X
  1821. X  strcpy(ex, line);
  1822. X  i = 0;
  1823. X  while(line[i] != '\0'){
  1824. X    if(line[i] == '^'){
  1825. X        strcpy(ex, (unsigned char *) strcopy(line, 0, (i-1)));
  1826. X        line[i] = ' ';
  1827. X    }
  1828. X    i++;
  1829. X  }
  1830. X  strcpy(headinfo, ex);
  1831. X  sprintf(ex, "%s                                                                          ", line);
  1832. X  ex[79] = '\0';
  1833. X  if (ansi("cl") != -1) {
  1834. X    if (ansi("mr") == 1) {
  1835. X        if (ansi("so") == 1) { 
  1836. X            printf("\n\n------  %s  ------\n\n", line);
  1837. X            return;
  1838. X        }
  1839. X    }
  1840. X    printf("%s\n", ex);
  1841. X    if (ansi("me") == 1) {
  1842. X        ansi("se");
  1843. X    }
  1844. X  }
  1845. X  else {
  1846. X    printf("\n\n\n\n\n------  %s  ------\n\n", line);
  1847. X  }
  1848. X}
  1849. X
  1850. X
  1851. X/***************************************************************************/
  1852. X/*      FUNKTION  mblock()                           */
  1853. X/*  BESCHREIBUNG  Schuetzt eine Datei vor ALLEN Zugriffen           */
  1854. X/*     PARAMETER  path  =  Datei                       */
  1855. X/*     RUECKGABE  keine                                                    */
  1856. X/***************************************************************************/
  1857. X
  1858. Xvoid mblock( path )
  1859. Xunsigned char path[];
  1860. X{
  1861. X  FILE *fp;
  1862. X  unsigned char s[STRING];
  1863. X
  1864. X  sprintf(s, "%s.LCK", path); 
  1865. X
  1866. X#ifndef _LONGNAMES
  1867. X  strcpy(s, (unsigned char *) shortname(s));
  1868. X#endif
  1869. X
  1870. X  fp = fopen( s, "w" );
  1871. X  fputs(VERSION, fp);
  1872. X  fclose(fp);
  1873. X}
  1874. X
  1875. X
  1876. X/***************************************************************************/
  1877. X/*      FUNKTION  unmblock()                           */
  1878. X/*  BESCHREIBUNG  Erlaubt Zugriffe auf eine Datei               */
  1879. X/*     PARAMETER  path  =  Datei                       */
  1880. X/*     RUECKGABE  keine                                                    */
  1881. X/***************************************************************************/
  1882. X
  1883. Xvoid mbunlock( path )
  1884. Xunsigned char path[];
  1885. X{
  1886. X  unsigned char s[STRING];
  1887. X  
  1888. X  sprintf(s, "%s.LCK", path); 
  1889. X
  1890. X#ifndef _LONGNAMES
  1891. X  strcpy(s, (unsigned char *) shortname(s));
  1892. X#endif
  1893. X
  1894. X  unlink(s);
  1895. X}
  1896. X
  1897. X
  1898. X/***************************************************************************/
  1899. X/*      FUNKTION  tty()                               */
  1900. X/*  BESCHREIBUNG  Name des eigenen Terminal-Anschlusses.            */
  1901. X/*     PARAMETER  keine                                                       */
  1902. X/*     RUECKGABE  siehe BESCHREIBUNG                                       */
  1903. X/***************************************************************************/
  1904. X
  1905. Xint tty()
  1906. X{
  1907. X  unsigned char s[STRING];
  1908. X  unsigned char t[STRING];
  1909. X  int i, l, a, b;
  1910. X
  1911. X
  1912. X  strcpy(s, (unsigned char *) ttyname(0));
  1913. X  l = length(s);
  1914. X  i = l;
  1915. X
  1916. X  while ((s[l] != 'y') && (l > 0)) l--;
  1917. X
  1918. X  l++;
  1919. X  a = 0;
  1920. X
  1921. X  for (b = l; b < i; b++) {
  1922. X    t[a] = s[b];
  1923. X    a++;
  1924. X  }
  1925. X  t[a] = '\0';
  1926. X
  1927. X  return atoi(t);
  1928. X}
  1929. X
  1930. X
  1931. X/***************************************************************************/
  1932. X/*      FUNKTION  ttyna()                           */
  1933. X/*  BESCHREIBUNG  Name des eigenen Terminal-Anschlusses.            */
  1934. X/*     PARAMETER  keine                                                       */
  1935. X/*     RUECKGABE  siehe BESCHREIBUNG                                       */
  1936. X/***************************************************************************/
  1937. X
  1938. Xunsigned char *ttyna()
  1939. X{
  1940. X  static unsigned char s[STRING];
  1941. X  static unsigned char t[STRING];
  1942. X  int i, j, l;
  1943. X
  1944. X
  1945. X  strcpy(s, (unsigned char *) ttyname(0));
  1946. X
  1947. X  l = length(s) + 1;
  1948. X
  1949. X  i = 0; 
  1950. X  while(s[i] != '\0'){
  1951. X    if(s[i] == '/') j = i + 1;
  1952. X    i++;
  1953. X  }
  1954. X  (void) strcpy(t, (unsigned char *) strcopy(s, j, l));
  1955. X  
  1956. X  return (unsigned char *) t;
  1957. X}
  1958. X
  1959. X
  1960. X
  1961. X/***************************************************************************/
  1962. X/*      FUNKTION  clearline()                           */
  1963. X/*  BESCHREIBUNG  Bildschirmzeile loeschen.                    */
  1964. X/*     PARAMETER  keine                                                       */
  1965. X/*     RUECKGABE  keine                                               */
  1966. X/***************************************************************************/
  1967. X
  1968. Xvoid clearline()
  1969. X{
  1970. X  printf("%c", CR);
  1971. X  if (ansi("ce") == 1) {
  1972. X    printf("                                                               ");
  1973. X  }
  1974. X  printf("%c", CR);
  1975. X}
  1976. X
  1977. X
  1978. X/***************************************************************************/
  1979. X/*      FUNKTION  isin()                           */
  1980. X/*  BESCHREIBUNG  Prueft ob ein Zeichen in einer Zeichenkette vorkommt.       */
  1981. X/*     PARAMETER  pattern = Zeichenkette mit den moegl. Uebereinstimmungen */
  1982. X/*          c       = Zeichen                       */
  1983. X/*     RUECKGABE  0       = Zeichen ist NICHT in Zeichenkette enthalten       */
  1984. X/***************************************************************************/
  1985. X
  1986. Xint isin( pattern, c )
  1987. Xunsigned char pattern[];
  1988. Xint c;
  1989. X{
  1990. X  int i = 0;
  1991. X  int ok = 0;
  1992. X
  1993. X  while((pattern[i] != '\0') && (ok == 0)){
  1994. X    if(pattern[i] == c) ok++;    
  1995. X    i++;
  1996. X  }
  1997. X  
  1998. X  return (int) ok;  
  1999. X}
  2000. X
  2001. X
  2002. X/***************************************************************************/
  2003. X/*      FUNKTION  sgrep()                           */
  2004. X/*  BESCHREIBUNG  Prueft ob Muster in einer Zeichenkette vorkommt.       */
  2005. X/*     PARAMETER  pattern = Zeichenkette mit den moegl. Uebereinstimmungen */
  2006. X/*          source  = Zeichenkette                   */
  2007. X/*     RUECKGABE  0       = Muster ist NICHT in Zeichenkette enthalten       */
  2008. X/***************************************************************************/
  2009. X
  2010. Xint sgrep( source, pattern )
  2011. Xunsigned char source[];
  2012. Xunsigned char pattern[];
  2013. X{
  2014. X  unsigned char t[STRING];
  2015. X  int i = 0;
  2016. X  while(source[i] != 0){
  2017. X    if(source[i] == pattern[0]){
  2018. X        strcpy(t, (unsigned char *) strcopy(source, i, strlen(source)));
  2019. X        if(strcomp(pattern, t) == 0) return (int) i;
  2020. X    }
  2021. X    i++;
  2022. X  }
  2023. X
  2024. X  return (int) 0;
  2025. X}
  2026. X
  2027. END_OF_FILE
  2028.   if test 24683 -ne `wc -c <'wendy/tools.c'`; then
  2029.     echo shar: \"'wendy/tools.c'\" unpacked with wrong size!
  2030.   fi
  2031.   # end of 'wendy/tools.c'
  2032. fi
  2033. echo shar: End of archive 4 \(of 15\).
  2034. cp /dev/null ark4isdone
  2035. MISSING=""
  2036. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2037.     if test ! -f ark${I}isdone ; then
  2038.     MISSING="${MISSING} ${I}"
  2039.     fi
  2040. done
  2041. if test "${MISSING}" = "" ; then
  2042.     echo You have unpacked all 15 archives.
  2043.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2044. else
  2045.     echo You still must unpack the following archives:
  2046.     echo "        " ${MISSING}
  2047. fi
  2048. exit 0
  2049. exit 0 # Just in case...
  2050.