home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2641 < prev    next >
Internet Message Format  |  1991-01-30  |  42KB

  1. From: mj@dfv.rwth-aachen.de (Martin Junius)
  2. Newsgroups: alt.sources
  3. Subject: FIDOGATE Part 6/6
  4. Message-ID: <mj.665055383@suntex>
  5. Date: 28 Jan 91 09:36:23 GMT
  6.  
  7. ---- Cut Here and feed the following to sh ----
  8. #!/bin/sh
  9. # This is part 06 of a multipart archive
  10. # ============= nodelist.c ==============
  11. if test -f 'nodelist.c' -a X"$1" != X"-c"; then
  12.     echo 'x - skipping nodelist.c (File already exists)'
  13. else
  14. echo 'x - extracting nodelist.c (Text)'
  15. sed 's/^X//' << 'SHAR_EOF' > 'nodelist.c' &&
  16. /*:ts=4*/
  17. /*****************************************************************************
  18. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  19. X *
  20. X * $Id: nodelist.c,v 1.8 90/12/13 20:05:57 mj Exp $
  21. X *
  22. X * Routines to get and translate information in nodelist.
  23. X *
  24. X * $Log:    nodelist.c,v $
  25. X * Revision 1.8  90/12/13  20:05:57  mj
  26. X * Removed some unused functions.
  27. X * 
  28. X * Revision 1.7  90/12/02  21:22:12  mj
  29. X * Changed program header to mention both authors of the original
  30. X * software posted to alt.sources.
  31. X * 
  32. X * Revision 1.6  90/11/05  20:50:48  mj
  33. X * Changed my signature in all program headers.
  34. X * 
  35. X * Revision 1.5  90/09/03  17:57:25  mj
  36. X * Moved function stripbad() to funpack.c
  37. X * 
  38. X * Revision 1.4  90/08/02  19:09:16  mj
  39. X * Fixed a bug in stripbad(). Digit are now allowed in user
  40. X * names.
  41. X * 
  42. X * Revision 1.3  90/07/01  15:20:26  mj
  43. X * Fixed some bugs in funpack caused by the removal of alloca().
  44. X * No more core dumps, but heaven knows, why it works now. Strange.
  45. X * 
  46. X * Revision 1.2  90/07/01  13:45:58  mj
  47. X * Removed all calls to alloca(). All unsave malloc()'s without
  48. X * checking the returned pointer are now done via xmalloc().
  49. X * Fixed a malloc() error in rmail.
  50. X * 
  51. X * Revision 1.1  90/06/28  22:04:29  mj
  52. X * Much rework of the sources, no more hsu.h and other clean up.
  53. X * rmail improved, now handles special XENIX quirks.
  54. X * 
  55. X * Revision 1.0  90/06/19  18:32:43  mj
  56. X * Initial revision
  57. X * 
  58. X *
  59. X *****************************************************************************
  60. X * This version hacked and maintained by:
  61. X *    _____ _____
  62. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  63. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  64. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  65. X *
  66. X * Original version of these programs and files:
  67. X *
  68. X *   Teemu Torma
  69. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  70. X *
  71. X *****************************************************************************/
  72. X
  73. /*
  74. X  Sat Oct  8 17:36:11 1988
  75. X  Rewrote nodelist index handling and reading. Now index is kept
  76. X  in memory, and has zones also.
  77. X  */
  78. X
  79. #include "fidogate.h"
  80. X
  81. #include <values.h>
  82. #include <sys/stat.h>
  83. X
  84. X
  85. X
  86. #ifndef SEEK_SET
  87. #define SEEK_SET 0
  88. #endif
  89. #ifndef SEEK_CUR
  90. #define SEEK_CUR 1
  91. #endif
  92. #ifndef SEEK_END
  93. #define SEEK_END 2
  94. #endif
  95. X
  96. extern long atol();
  97. Node originnode;
  98. NODEINDEX *nodeindex = NULL;
  99. NAMEINDEX *nameindex = NULL;
  100. int nodes, names, compile_zone, compile_region, compile_net;
  101. X
  102. /* Compare two strings, considering '_' and ' ', and converting
  103. X   {|}[\] to aoaAOA instead, and ignoring case.
  104. X
  105. X   ascii_convert(string) does conversion.
  106. X   */
  107. X
  108. char *ascii_convert(s)
  109. X     char *s;
  110. {
  111. X  char *p;
  112. X
  113. X  p = s;
  114. X  while (*s) {
  115. X    switch (*s) {
  116. X     case '_':
  117. X      *s = ' ';
  118. X      break;
  119. #if 0
  120. X     case '{':
  121. X     case '}':
  122. X     case '[':
  123. X     case ']':
  124. X      *s = 'a';
  125. X      break;
  126. X     case '|':
  127. X     case '\\':
  128. X      *s = 'o';
  129. X      break;
  130. X     default:
  131. X      *s = tolower(*s);
  132. #endif
  133. X    }
  134. X    s++;
  135. X  }
  136. X  return p;
  137. }
  138. X
  139. X
  140. X
  141. /* Compare nodelist index entry (for qsort) */
  142. cmpnodeindex(node1, node2)
  143. X     NODEINDEX *node1, *node2;
  144. {
  145. X  if (node1->zone < node2->zone) return -1;
  146. X  if (node1->zone > node2->zone) return 1;
  147. X  if (node1->net < node2->net) return -1;
  148. X  if (node1->net > node2->net) return 1;
  149. X  if (node1->node < node2->node) return -1;
  150. X  if (node1->node > node2->node) return 1;
  151. X  return 0; /* Same node */
  152. }
  153. X
  154. cmpnameindex(name1, name2)
  155. X     NAMEINDEX *name1, *name2;
  156. {
  157. X  int n;
  158. X  n = strcmp(name1->name, name2->name);
  159. X  /* debug(9, "name1 %s name2 %s = %d", name1->name, name2->name, n); */
  160. X  return n;
  161. }
  162. X
  163. X
  164. X
  165. #ifdef NODELIST_SUPPORT
  166. /* Read file in to a buffer allocating buffer for it */
  167. X
  168. long read_file(buffer, name)
  169. char **buffer, *name;
  170. {
  171. FILE *fp;
  172. long size = 0;
  173. X
  174. X  if (fp = fopen(name, "r")) {
  175. X    fseek(fp, 0L, SEEK_END);
  176. X    size = ftell(fp);
  177. X
  178. X    /* Apparently we are on 16-bit? */
  179. X    if (size > MAXINT)
  180. X      {
  181. X    log("Brain damaged CPU architecture reading file?");
  182. X    size = 0;
  183. X    goto out;
  184. X      }
  185. X
  186. X    fseek(fp, 0L, SEEK_SET);
  187. X
  188. X    if (*buffer)
  189. X      *buffer = xrealloc( *buffer, (unsigned) size);
  190. X    else
  191. X      *buffer = xmalloc( (unsigned) size);
  192. X
  193. X    debug(2, "Reading %d bytes from %s", size, name);
  194. X    if (fread( *buffer, 1, (int) size, fp) != size) size = 0;
  195. X    fclose(fp);
  196. X  }
  197. X
  198. X out:
  199. X  return size;
  200. }
  201. X
  202. write_file(buffer, name, size)
  203. X     char *buffer, *name;
  204. X     int size;
  205. {
  206. X  FILE *fp;
  207. X  int rvalue = 0;
  208. X
  209. X  if (fp = fopen(name, "w+"))
  210. X    {
  211. X      debug(2, "Writing %d bytes to %s", size, name);
  212. X      if (fwrite(buffer, 1, size, fp) != size) rvalue = -1;
  213. X      fclose(fp);
  214. X    }
  215. X
  216. X  return rvalue;
  217. }
  218. X
  219. read_nodeindex()
  220. {
  221. X  nodes = read_file( (char **) &nodeindex,
  222. X            sprintfs("%s/%s", LIBDIR, INODELIST)) / sizeof(NODEINDEX);
  223. X  return nodes == 0L;
  224. }
  225. X
  226. read_nameindex()
  227. {
  228. X  names = read_file( (char **) &nameindex,
  229. X            sprintfs("%s/%s", LIBDIR, NAMELIST)) / sizeof(NAMEINDEX);
  230. X  return names == 0L;
  231. }
  232. X
  233. write_nodeindex()
  234. {
  235. X  return write_file( (char *) nodeindex,
  236. X            sprintfs("%s/%s", LIBDIR, INODELIST),
  237. X            (int) (nodes * sizeof(NODEINDEX)));
  238. }
  239. X
  240. write_nameindex()
  241. {
  242. X  return write_file( (char *) nameindex,
  243. X            sprintfs("%s/%s", LIBDIR, NAMELIST),
  244. X            (int) (names * sizeof(NAMEINDEX)));
  245. }
  246. X
  247. /* Make nodelist's index-file. That index-file will be used to search
  248. X   desired net/region from nodelist.
  249. X   Return NULL if everything was fine, otherwise error-message string. */
  250. X
  251. char *
  252. update_index()
  253. {
  254. X  struct stat nlstat, inlstat;
  255. X  FILE *nl = NULL, *nlidx = NULL, *namefp = NULL;
  256. X  char nodelist[BUFLEN], inodelist[BUFLEN], namelist[BUFLEN];
  257. X  char buffer[BUFSIZ];
  258. X  long offset;
  259. X  char *error;
  260. X  Node node;
  261. X  NODEINDEX nodei;
  262. X  NAMEINDEX namei;
  263. X  extern void qsort();
  264. X
  265. X  /* generate nodelist and index-file names */
  266. X  (void) sprintf(nodelist, "%s/%s", LIBDIR, NODELIST);
  267. X  (void) sprintf(inodelist, "%s/%s", LIBDIR, INODELIST);
  268. X  (void) sprintf(namelist, "%s/%s", LIBDIR, NAMELIST);
  269. X
  270. X  /* get statuses of nodelist and index */
  271. X  if (stat(nodelist, &nlstat) == -1)
  272. X    return "$Error in getting nodelist status";
  273. X
  274. X  errno = 0;
  275. X  if (stat(inodelist, &inlstat) == -1 && errno != ENOENT)
  276. X    return "$Error in getting status of existing nodelist-index";
  277. X
  278. X  /* If index-file does exists then check modification times and
  279. X     first lines. If nodelist is older and first lines are the same,
  280. X     no update is needed. If index-file should be rebuild, assume
  281. X     also rebuilding namelist. */
  282. X
  283. X  if (errno == 0 && nlstat.st_mtime <= inlstat.st_mtime)
  284. X    {
  285. X      error = NULL;
  286. X      goto done;
  287. X    }
  288. X  else
  289. X    log("Update nodelist-index: nodelist is newer than index");
  290. X
  291. X  /* open index-file for writing */
  292. X  if (nlidx != NULL)
  293. X    (void) fclose(nlidx);
  294. X  if ((nlidx = fopen(inodelist, "w")) == NULL)
  295. X    {
  296. X      error = "$Unable to open nodelist-index for writing";
  297. X      goto done;
  298. X    }
  299. X  if (namefp)
  300. X    (void) fclose(namefp);
  301. X  if ((namefp = fopen(namelist, "w")) == NULL)
  302. X    {
  303. X      error = "$Unable to open namelist-index for writing";
  304. X      goto done;
  305. X    }
  306. X
  307. X  if (!nl)
  308. X    if ((nl = fopen(nodelist, "r")) == NULL)
  309. X      return "$Unable to open nodelist";
  310. X
  311. X  (void) rewind(nl);
  312. X
  313. X  compile_zone = MY_ZONE;
  314. X  compile_region = MY_REGION;
  315. X  compile_net = MY_NET;
  316. X  nodes = 0;
  317. X  names = 0;
  318. X
  319. X  /* save host/region offsets */
  320. X  for (offset = ftell(nl); fgets(buffer, BUFSIZ, nl); offset = ftell(nl))
  321. X    {
  322. X      if (*buffer == '\n' || *buffer == ';') continue;
  323. X
  324. X      parse_entry(&node, buffer);
  325. X
  326. X      nodei.zone = node.zone;
  327. X      nodei.net = node.net;
  328. X      nodei.node = node.node;
  329. X      nodei.offset = offset;
  330. X
  331. #ifdef NEEDED
  332. X      debug(8, "%s", buffer);
  333. X      debug(8, "writing %d:%d/%d", node.zone, node.net, node.node);
  334. #endif
  335. X      fwrite( (char *) &nodei, sizeof(NODEINDEX), 1, nlidx);
  336. X      if (ferror(nlidx))
  337. X    {
  338. X      error = "$Cannot write index, no space?";
  339. X      goto done;
  340. X    }
  341. X
  342. X      if (node.type != REGION && node.type != HOST &&
  343. X      node.type != ZONE && node.type != KENL && node.type != HUB)
  344. X    {
  345. X      strcpy(namei.name, node.sysop);
  346. X      namei.offset = offset;
  347. X      namei.zone = compile_zone;
  348. X      namei.net = compile_net;
  349. X      names++;
  350. X      fwrite( (char *) &namei, sizeof(NAMEINDEX), 1, namefp);
  351. X      if (ferror(namefp))
  352. X        {
  353. X          error = "$Cannot write name index, no space?";
  354. X          goto done;
  355. X        }
  356. X    }
  357. X
  358. X      nodes++;
  359. X    }
  360. X  error = NULL;
  361. X
  362. X  /* Ok, now get both indices back and qsort them */
  363. X
  364. X  (void) fclose(nl);
  365. X  nl = NULL;
  366. X  (void) fclose(nlidx);
  367. X  nlidx = NULL;
  368. X  (void) fclose(namefp);
  369. X  namefp = NULL;
  370. X
  371. X  if (read_nodeindex())
  372. X    {
  373. X      error = "$Cannot read nodelist index";
  374. X      goto done;
  375. X    }
  376. X  if (read_nameindex())
  377. X    {
  378. X      error = "$Cannot read name index";
  379. X      goto done;
  380. X    }
  381. X
  382. X  log("Sorting nodelist index");
  383. X  (void) qsort( (char *) nodeindex, (unsigned) nodes,
  384. X           sizeof(NODEINDEX), cmpnodeindex);
  385. X  log("Sorting name index");
  386. X  (void) qsort( (char *) nameindex, (unsigned) names,
  387. X           sizeof(NAMEINDEX), cmpnameindex);
  388. X  log("Sorted indices");
  389. X
  390. X  if (write_nodeindex())
  391. X    {
  392. X      error = "$Cannot write nodelist index";
  393. X      goto done;
  394. X    }
  395. X  if (write_nameindex())
  396. X    {
  397. X      error = "$Cannot write name index";
  398. X      goto done;
  399. X    }
  400. X
  401. X  /* done, close files and return error message */
  402. X done:
  403. X  if (nl)
  404. X    (void) fclose(nl);
  405. X  if (nlidx)
  406. X    (void) fclose(nlidx);
  407. X  if (namefp)
  408. X    (void) fclose(namefp);
  409. X  return error;
  410. }
  411. X
  412. X
  413. X
  414. /* Convert underscores in string to spaces. In nodelist there is always
  415. X   underscore insted of space (flags is special case). */
  416. X
  417. void
  418. convert_space(s)
  419. X     register char *s;
  420. {
  421. X  while (*s)
  422. X    {
  423. X      if (*s == '_')
  424. X        *s = ' ';
  425. X      s++;
  426. X    }
  427. }
  428. X
  429. /* Get one comma-terminated field from buffer, retrun pointer to right
  430. X   after terminating comma. Convert underscores to spaces in string. */
  431. X
  432. char *
  433. parse_field(buffer, entry, size)
  434. X     char *buffer, *entry;
  435. X     int size;
  436. {
  437. X  char *np = entry;
  438. X
  439. X  /* copy string */
  440. X  while (--size >= 0 && *buffer && *buffer != ',')
  441. X    *entry++ = *buffer++;
  442. X  *entry = 0;
  443. X
  444. X  switch (*buffer)
  445. X    {
  446. X    case 0:
  447. X      /* end of buffer */
  448. X      log("No closing comma in field");
  449. X      return (char *) 0;
  450. X    case ',':
  451. X      /* succesful copy */
  452. X      convert_space(np);
  453. X      return buffer + 1;
  454. X    default:
  455. X      /* buffer too long, find comma */
  456. X      while (*buffer && *buffer != ',')
  457. X        buffer++;
  458. X      if (*buffer)
  459. X        {
  460. X          convert_space(np);
  461. X          return buffer + 1;
  462. X        }
  463. X      else
  464. X        {
  465. X          log("Missing comma in field");
  466. X          return (char *) 0;
  467. X        }
  468. X    }
  469. X  /* NOTREACHED */
  470. }
  471. X
  472. /* Parse one line of nodelist to node structure. Return NULL is there
  473. X   was error's in that line or missing fields. */
  474. X
  475. Node *
  476. parse_entry(entry, buffer)
  477. X     Node *entry;
  478. X     char *buffer;
  479. {
  480. X  char *cp;
  481. X  int n;
  482. X
  483. X  /* strip newline if exists */
  484. X  if (cp = strchr(buffer, '\n'))
  485. X    *cp = 0;
  486. X
  487. X  /* get type of entry */
  488. X  if (!strncmp("Zone,", buffer, 5))
  489. X    entry->type = ZONE;
  490. X  else if (!strncmp("Region,", buffer, 7))
  491. X    entry->type = REGION;
  492. X  else if (!strncmp("Host,", buffer, 5))
  493. X    entry->type = HOST;
  494. X  else if (!strncmp("Hub,", buffer, 4))
  495. X    entry->type = HUB;
  496. X  else if (!strncmp("Pvt,", buffer, 4))
  497. X    entry->type = PVT;
  498. X  else if (!strncmp("Hold,", buffer, 5))
  499. X    entry->type = HOLD;
  500. X  else if (!strncmp("Down,", buffer, 5))
  501. X    entry->type = DOWN;
  502. X  else if (!strncmp("Kenl,", buffer, 5))
  503. X    entry->type = KENL;
  504. X  else if (*buffer == ',')
  505. X    entry->type = NORMAL;
  506. X  else
  507. X    {
  508. X      log("Unknown type in line '%s'", buffer);
  509. X      return (Node *) 0;
  510. X    }
  511. X
  512. X  /* get net/region/node number */
  513. X  if ((cp = strchr(buffer, ',')) == NULL)
  514. X    {
  515. X      log("Missing zone/net/node/region in line '%s'", buffer);
  516. X      return (Node *) 0;
  517. X    }
  518. X  if ((n = atoi(++cp)) == 0)
  519. X    {
  520. X      log("Value of zone/net/node/region is 0 in line '%s'", buffer);
  521. X      return (Node *) 0;
  522. X    }
  523. X  if (entry->type == ZONE)
  524. X    {
  525. X      entry->zone = n;
  526. X      entry->net = 0;
  527. X      entry->node = 0;
  528. X      entry->point = 0;
  529. X      compile_zone = n;
  530. X      debug(8, "Zone %d", compile_zone);
  531. X    }
  532. X  else if (entry->type == REGION)
  533. X    {
  534. X      entry->zone = compile_zone;
  535. X      entry->region = n;
  536. X      entry->net = n;    /* For compatibility with old version */
  537. X      entry->node = 0;
  538. X      entry->point = 0;
  539. X      compile_region = n;
  540. X      compile_net = n;    /* For compatibility with old version */
  541. X      debug(8, "Region %d", compile_region);
  542. X    }
  543. X  else if (entry->type == HOST)
  544. X    {
  545. X      entry->zone = compile_zone;
  546. X      entry->region = compile_region;
  547. X      entry->net = n;
  548. X      entry->node = 0;
  549. X      entry->point = 0;
  550. X      compile_net = n;
  551. X      debug(8, "Net %d", compile_net);
  552. X    }
  553. X  else
  554. X    {
  555. X      entry->zone = compile_zone;
  556. X      entry->region = compile_region;
  557. X      entry->net = compile_net;
  558. X      entry->node = n;
  559. X      entry->point = 0;
  560. X    }
  561. X  while (*cp && *cp++ != ',');
  562. X
  563. X  /* get node/net/region name */
  564. X  if ((cp = parse_field(cp, entry->name, sizeof(entry->name))) == NULL)
  565. X    {
  566. X      log("Invalid name in line '%s'", buffer);
  567. X      return (Node *) 0;
  568. X    }
  569. X
  570. X  /* get city */
  571. X  if ((cp = parse_field(cp, entry->city, sizeof(entry->city))) == NULL)
  572. X    {
  573. X      log("Invalid city in line '%s'", buffer);
  574. X      return (Node *) 0;
  575. X    }
  576. X
  577. X  /* get sysop */
  578. X  if ((cp = parse_field(cp, entry->sysop, sizeof(entry->sysop))) == NULL)
  579. X    {
  580. X      log("Invalid sysop in line '%s'", buffer);
  581. X      return (Node *) 0;
  582. X    }
  583. X
  584. X  /* get phone number */
  585. X  if ((cp = parse_field(cp, entry->phone, sizeof(entry->phone))) == NULL)
  586. X    {
  587. X      log("Invalid phone-number in line '%s'", buffer);
  588. X      return (Node *) 0;
  589. X    }
  590. X
  591. X  /* get maximum baud rate */
  592. X  if ((n = atoi(cp)) == 0)
  593. X    {
  594. X      log("Baud rate is 0 in line '%s'", buffer);
  595. X      return (Node *) 0;
  596. X    }
  597. X  entry->speed = n;
  598. X  while (*cp && *cp++ != ',');
  599. X
  600. X  /* get flags */
  601. X  (void) strncpy(entry->flags, cp, sizeof(entry->flags));
  602. X  entry->flags[sizeof(entry->flags) - 1] = 0;
  603. X
  604. X  /* all done */
  605. X  return entry;
  606. }
  607. X
  608. /* Get entry for one node from nodelist. Return NULL, if there is no
  609. X   entry for that node. */
  610. X
  611. Node *
  612. node_entry(node)
  613. X     Node node;
  614. {
  615. X  static Node entry;
  616. X  FILE *fp;
  617. X  char buffer[BUFSIZ];
  618. X  extern char *bsearch();
  619. X  long offset;
  620. X  NODEINDEX *nodeip, nodei;
  621. X
  622. X  /* Read index file into memory */
  623. X
  624. X  if (!nodeindex)
  625. X    if (read_nodeindex())
  626. X      {
  627. X    log("$Unable to read nodelist");
  628. X    return (Node *) 0;
  629. X      }
  630. X
  631. X  nodei.zone = node.zone;
  632. X  nodei.net = node.net;
  633. X  nodei.node = node.node;
  634. X
  635. X  debug(2, "Searching %s from %d nodes", ascnodei(nodei), nodes);
  636. X  nodeip = (NODEINDEX *) bsearch( (char *) &nodei, (char *) nodeindex,
  637. X                 (unsigned) nodes, sizeof(NODEINDEX),
  638. X                 cmpnodeindex);
  639. X
  640. X  if (nodeip) {
  641. X    offset = nodeip->offset;
  642. X
  643. X    /* open nodelist */
  644. X    (void) sprintf(buffer, "%s/%s", LIBDIR, NODELIST);
  645. X    if ((fp = fopen(buffer, "r")) == NULL)
  646. X      {
  647. X    log("$Unable to open %s", buffer);
  648. X    return (Node *) 0;
  649. X      }
  650. X
  651. X    if (fseek(fp, offset, 0))
  652. X      {
  653. X    log("$Seek error on nodelist");
  654. X    (void) fclose(fp);
  655. X    return (Node *) 0;
  656. X      }
  657. X
  658. X    fgets(buffer, BUFSIZ, fp);
  659. X    fclose(fp);
  660. X
  661. X    compile_zone = nodeip->zone;
  662. X    compile_net = nodeip->net;
  663. X    return parse_entry(&entry, buffer);
  664. X  }
  665. X
  666. X  log("Could not find node %s", ascnodei(nodei));
  667. X
  668. X  /* we didn't find net/region */
  669. X  (void) fclose(fp);
  670. X  return (Node *) 0;
  671. }
  672. X
  673. char *dialtable[] = { DIALTABLE };
  674. X
  675. dial_translation(dest, source)
  676. X     char *dest, *source;
  677. {
  678. X  register int count = 0;
  679. X
  680. X  for (;;) {
  681. X    if (!*dialtable[count] ||
  682. X    !strncmp(dialtable[count], source, strlen(dialtable[count]))) {
  683. X
  684. X      /* Matched, take prefix, */
  685. X      strcpy(dest, dialtable[count + 1]);
  686. X
  687. X      /* Then add phone number */
  688. X      strcat(dest, source + strlen(dialtable[count]));
  689. X      return;
  690. X    }
  691. X    count += 2;
  692. X  }
  693. }
  694. X
  695. static char **aliastable = NULL;
  696. static allocated = 0;
  697. static aliases = 0;
  698. X
  699. expand_aliastable()
  700. {
  701. X  if (!aliastable)
  702. X    {
  703. X      aliastable = (char **) xmalloc(sizeof(char *) * 20);
  704. X      if (aliastable) allocated = 20;
  705. X    }
  706. X
  707. X  if (aliases == allocated) /* Need more pointers */
  708. X    {
  709. X      allocated += 20;
  710. X      aliastable = (char **) xrealloc( (char *) aliastable,
  711. X                     sizeof(char *) * allocated);
  712. X      if (!aliastable)
  713. X    {
  714. X      log("Cannot realloc %d bytes", sizeof(char *) * allocated);
  715. X      return -1;
  716. X    }
  717. X    }
  718. X  return 0;
  719. }
  720. X
  721. #define FILENAME_SIZE 256
  722. X
  723. search_name(name)
  724. X     char *name;
  725. {
  726. X  Node entry;
  727. X  FILE *fp;
  728. X  char buffer[BUFSIZ];
  729. X  extern char *bsearch();
  730. X  char *nlname;
  731. X  long offset;
  732. X  NAMEINDEX *nameip, namei;
  733. X
  734. X  if (!nameindex)
  735. X    if (read_nameindex())
  736. X      {
  737. X    log("$Unable to read namelist");
  738. X    return -1;
  739. X      }
  740. X
  741. X  strncpy(namei.name, name, 36);
  742. X  namei.name[35] = 0;
  743. X
  744. X  nameip = (NAMEINDEX *) bsearch( (char *) &namei, (char *) nameindex,
  745. X                 (unsigned) names, sizeof(NAMEINDEX),
  746. X                 cmpnameindex);
  747. X
  748. X  if (nameip)
  749. X    {
  750. X      offset = nameip->offset;
  751. X
  752. X      /* Open nodelist */
  753. X      if ((fp =
  754. X       fopen(nlname = sprintfs("%s/%s", LIBDIR, NODELIST), "r")) == NULL)
  755. X    {
  756. X      log("$Unable to open nodelist %s", nlname);
  757. X      return -1;
  758. X    }
  759. X
  760. X      if (fseek(fp, offset, 0))
  761. X    {
  762. X      log("$Seek error on nodelist");
  763. X      (void) fclose(fp);
  764. X      return -1;
  765. X    }
  766. X
  767. X      fgets(buffer, BUFSIZ, fp);
  768. X      fclose(fp);
  769. X
  770. X      compile_zone = nameip->zone;
  771. X      compile_net = nameip->net;
  772. X      if (parse_entry(&entry, buffer) == NULL) return -1;
  773. X
  774. X      debug(1, "Search name %s returns %d:%d/%d.%d", name,
  775. X        entry.zone, entry.net, entry.node, entry.point);
  776. X      memcpy( (char *) &originnode, (char *) &entry, sizeof(Node));
  777. X      return 0;
  778. X    }
  779. X
  780. X  debug(1, "Search name %s return no node", name);
  781. X  return -1;
  782. }
  783. #endif /**NODELIST_SUPPORT**/
  784. SHAR_EOF
  785. chmod 0644 nodelist.c ||
  786. echo 'restore of nodelist.c failed'
  787. Wc_c="`wc -c < 'nodelist.c'`"
  788. test 17722 -eq "$Wc_c" ||
  789.     echo 'nodelist.c: original size 17722, current size' "$Wc_c"
  790. fi
  791. # ============= gethost.c ==============
  792. if test -f 'gethost.c' -a X"$1" != X"-c"; then
  793.     echo 'x - skipping gethost.c (File already exists)'
  794. else
  795. echo 'x - extracting gethost.c (Text)'
  796. sed 's/^X//' << 'SHAR_EOF' > 'gethost.c' &&
  797. /*:ts=4*/
  798. /*****************************************************************************
  799. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  800. X *
  801. X * $Id: gethost.c,v 1.2 90/12/02 21:22:08 mj Exp $
  802. X *
  803. X * gethostname()
  804. X *
  805. X * $Log:    gethost.c,v $
  806. X * Revision 1.2  90/12/02  21:22:08  mj
  807. X * Changed program header to mention both authors of the original
  808. X * software posted to alt.sources.
  809. X * 
  810. X * Revision 1.1  90/11/05  20:50:42  mj
  811. X * Changed my signature in all program headers.
  812. X * 
  813. X * Revision 1.0  90/06/19  18:35:36  mj
  814. X * Initial revision
  815. X * 
  816. X *
  817. X *****************************************************************************
  818. X * This version hacked and maintained by:
  819. X *    _____ _____
  820. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  821. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  822. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  823. X *
  824. X * Original version of these programs and files:
  825. X *
  826. X *   Teemu Torma
  827. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  828. X *
  829. X *****************************************************************************/
  830. X
  831. #include "fidogate.h"
  832. X
  833. #include <sys/utsname.h>
  834. X
  835. /* Get name of this uucp-node. Name is stored in buffer. Len in maximum
  836. X   length of buffer. Return -1 if can not do uname(2), otherwise 0. */
  837. X
  838. int
  839. gethostname(buffer, len)
  840. X     char *buffer;
  841. X     int len;
  842. {
  843. #ifdef MY_HOSTNAME
  844. X    strncpy(buffer, MY_HOSTNAME, len);
  845. X    buffer[len - 1] = 0;
  846. #else
  847. struct utsname name;
  848. X
  849. X    if (uname(&name) == -1)
  850. X        return -1;
  851. X    (void) strncpy(buffer, name.nodename, len);
  852. X    buffer[len - 1] = 0;
  853. #endif
  854. X    return 0;
  855. }
  856. SHAR_EOF
  857. chmod 0644 gethost.c ||
  858. echo 'restore of gethost.c failed'
  859. Wc_c="`wc -c < 'gethost.c'`"
  860. test 1592 -eq "$Wc_c" ||
  861.     echo 'gethost.c: original size 1592, current size' "$Wc_c"
  862. fi
  863. # ============= address.c ==============
  864. if test -f 'address.c' -a X"$1" != X"-c"; then
  865.     echo 'x - skipping address.c (File already exists)'
  866. else
  867. echo 'x - extracting address.c (Text)'
  868. sed 's/^X//' << 'SHAR_EOF' > 'address.c' &&
  869. /*:ts=4*/
  870. /*****************************************************************************
  871. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  872. X *
  873. X * $Id: address.c,v 1.11 90/12/13 20:04:41 mj Exp $
  874. X *
  875. X * Address format is (domain style addresses for FIDO):
  876. X *     <name>@<point>.<node>.<net>.<zone>.FIDODOMAIN
  877. X * or (new)
  878. X *     <name>@p<point>.f<node>.n<net>.z<zone>.FIDODOMAIN
  879. X * FIDODOMAIN is defined config.h
  880. X *
  881. X * $Log:    address.c,v $
  882. X * Revision 1.11  90/12/13  20:04:41  mj
  883. X * Fixed a bug in parsefnetaddress().
  884. X * 
  885. X * Revision 1.10  90/12/02  21:21:07  mj
  886. X * Changed program header to mention both authors of the original
  887. X * software posted to alt.sources.
  888. X * 
  889. X * Revision 1.9  90/11/20  21:07:24  mj
  890. X * New function ascnoden(): convert node address to string, point not
  891. X * included.
  892. X * 
  893. X * Revision 1.8  90/11/05  20:48:49  mj
  894. X * Changed my signature in all program headers.
  895. X * 
  896. X * Revision 1.7  90/09/30  14:39:52  mj
  897. X * Better parsing for FIDO addresses including domain.
  898. X * (e.g. "2:242/6@fidonet")
  899. X * 
  900. X * Revision 1.6  90/09/16  17:35:07  mj
  901. X * Always output zone address in internode().
  902. X * 
  903. X * Revision 1.5  90/08/12  14:12:38  mj
  904. X * Output of ascnode() now <zone>:<net>/<node> for non-point addresses.
  905. X * 
  906. X * Revision 1.4  90/07/30  19:58:57  mj
  907. X * Added support for new style FIDO addresses:
  908. X *     p<point>.f<node>.n<net>.z<zone>.FIDODOMAIN
  909. X * FIDODOMAIN is defined in config.h
  910. X * 
  911. X * Revision 1.3  90/07/11  17:03:58  mj
  912. X * Removed a bug in address parsing, when address is of type
  913. X * `domain!name'.
  914. X * 
  915. X * Revision 1.2  90/07/01  13:27:11  mj
  916. X * Removed all calls to alloca(). All unsave malloc()'s without
  917. X * checking the returned pointer are now done via xmalloc().
  918. X * Fixed a malloc() error in rmail.
  919. X * 
  920. X * Revision 1.1  90/06/28  22:02:46  mj
  921. X * Much rework of the sources, no more hsu.h and other clean up.
  922. X * rmail improved, now handles special XENIX quirks.
  923. X * 
  924. X * Revision 1.0  90/06/19  18:31:45  mj
  925. X * Initial revision
  926. X * 
  927. X *
  928. X *****************************************************************************
  929. X * This version hacked and maintained by:
  930. X *    _____ _____
  931. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  932. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  933. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  934. X *
  935. X * Original version of these programs and files:
  936. X *
  937. X *   Teemu Torma
  938. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  939. X *
  940. X *****************************************************************************/
  941. X
  942. #include "fidogate.h"
  943. X
  944. #include "shuffle.h"
  945. X
  946. X
  947. X
  948. /*
  949. X * char *parse_address()  ---  parse fidonet address to name, net/node
  950. X *
  951. X * Parameters:    char *address    --- address string
  952. X *                char *name        --- pointer to return name
  953. X *                Node *node        --- pointer to return node address
  954. X *
  955. X * Return:        (char *) error string or NULL.
  956. X *
  957. X * Two types of addresses are understood:
  958. X *    Domain:        name@P.N.N.Z.fidonet
  959. X *    Bang:        P.N.N.Z.fidonet!name
  960. X */
  961. X
  962. char *
  963. parse_address(address, name, node)
  964. char *address, *name;
  965. Node *node;
  966. {
  967. static char error[64];
  968. register char *cp;
  969. register int cnt;
  970. X
  971. X    /* make address to lowercase */
  972. X    for (cp = address; *cp; cp++)
  973. X        if (isupper(*cp))
  974. X            *cp = tolower(*cp);
  975. X
  976. X    /* Get name. We assume that name has space at least 36 charcers (maximum
  977. X       length of name in fido). First check wheather format is name@domain
  978. X       of domain!name format. */
  979. X    if ((cp = strchr(address, '!')) != NULL) {
  980. X        debug(2, "Fidonet address domain!name");
  981. X        for (cp++, cnt = 0; *cp && cnt < 35; cnt++, cp++)
  982. X            name[cnt] = *cp;
  983. X        name[cnt] = 0;
  984. X        cp = address;
  985. X        debug(3, "Name %s", name);
  986. X    }
  987. X    else {
  988. X        debug(2, "Fidonet address name@domain");
  989. X        for (cp = address, cnt = 0; *cp && cnt < 35 && *cp != '@'; cp++, cnt++)
  990. X            name[cnt] = *cp;
  991. X        name[cnt] = 0;
  992. X        debug(3, "Name %s", name);
  993. X
  994. X        if (*cp != '@') {
  995. X            /* name is too long or address is invalid */
  996. X            while (*cp && *cp != '@')
  997. X                cp++;
  998. X            if (*cp == 0) {
  999. X                debug(1, "Invalid address: %s: missing @", address);
  1000. X                (void) sprintf(error, "No @ in address %s", address);
  1001. X                return error;
  1002. X            }
  1003. X        }
  1004. X        cp++;
  1005. X    }
  1006. X
  1007. X    debug(2, "Address %s, up to '!' or end", cp);
  1008. X
  1009. X    if (parseinternode(cp, node)) {
  1010. X        sprintf(error, "Bad address %s", cp);
  1011. X        return error;
  1012. X    }
  1013. X
  1014. X    /* we're done */
  1015. X    return NULL;
  1016. }
  1017. X
  1018. X
  1019. X
  1020. returnbad(errtype, s, node)
  1021. char *errtype, *s;
  1022. Node *node;
  1023. {
  1024. X    node->zone = MY_ZONE;
  1025. X    node->net = MY_NET;
  1026. X    node->node = MY_NODE;
  1027. X    node->point = MY_POINT;
  1028. X    return -1;
  1029. }
  1030. X
  1031. X
  1032. X
  1033. /* Parse internet format fidonet address */
  1034. X
  1035. parseinternode(address, node)
  1036. char *address;
  1037. Node *node;
  1038. {
  1039. char *p, *s;
  1040. int numbers[4], count;
  1041. X
  1042. X    s = xmalloc(strlen(address) + 1);
  1043. X    strcpy(s, address);
  1044. X    numbers[0] = numbers[1] = numbers[2] = numbers[3] = -1;
  1045. X
  1046. X    /* Remove `!...' */
  1047. X    if(p = strrchr(s, '!'))
  1048. X        *p = 0;
  1049. X
  1050. X    /* Remove FIDODOMAIN */
  1051. X    if (strlen(s) > strlen(FIDODOMAIN))
  1052. X        if (!strcmp(s + strlen(s) - strlen(FIDODOMAIN), FIDODOMAIN))
  1053. X            s[strlen(s) - strlen(FIDODOMAIN)] = 0;
  1054. X
  1055. X    if(isdigit(*s)) {
  1056. X        /*
  1057. X         * Assume old style address: <point>.<node>.<net>.<zone>
  1058. X         */
  1059. X        /* convert ascii numbers to integer */
  1060. X        for (count=0, p=strtok(s, "."); p && count<4; p = strtok(NULL, "."))
  1061. X            numbers[count++] = isdigit(*p) ? atoi(p) : -1 ;
  1062. X
  1063. X        free(s);
  1064. X
  1065. X        if (!count) 
  1066. X            return returnbad("empty fidonet address", address, node);
  1067. X
  1068. X        if (count == 4) {
  1069. X            node->zone  = numbers[3];
  1070. X            node->net   = numbers[2];
  1071. X            node->node  = numbers[1];
  1072. X            node->point = numbers[0];
  1073. X            return 0;
  1074. X        }
  1075. X
  1076. X        if (numbers[0] == -1)
  1077. X            return returnbad("no node", address, node);
  1078. X        if (numbers[1] == -1)
  1079. X            numbers[1] = REAL_NET;
  1080. X        if (numbers[2] == -1)
  1081. X            numbers[2] = REAL_ZONE;
  1082. X
  1083. X        node->zone = numbers[2];
  1084. X        node->net = numbers[1];
  1085. X        node->node = numbers[0];
  1086. X        node->point = 0;
  1087. X    
  1088. X    }
  1089. X    else {
  1090. X        /*
  1091. X         * New address format: p<point>.f<node>.n<net>.z<zone>
  1092. X         */
  1093. X        node->zone  = REAL_ZONE;
  1094. X        node->net   = REAL_NET;
  1095. X        node->node  = REAL_NODE;
  1096. X        node->point = 0;
  1097. X        
  1098. X        for(count=0, p=strtok(s, "."); p && count<4; p = strtok(NULL, "."))
  1099. X            switch(*p) {
  1100. X                case 'p':
  1101. X                    if(!isdigit(p[1]))
  1102. X                        goto address_error;
  1103. X                    node->point = atoi(p+1);
  1104. X                    break;
  1105. X                case 'f':
  1106. X                    if(!isdigit(p[1]))
  1107. X                        goto address_error;
  1108. X                    node->node  = atoi(p+1);
  1109. X                    break;
  1110. X                case 'n':
  1111. X                    if(!isdigit(p[1]))
  1112. X                        goto address_error;
  1113. X                    node->net   = atoi(p+1);
  1114. X                    break;
  1115. X                case 'z':
  1116. X                    if(!isdigit(p[1]))
  1117. X                        goto address_error;
  1118. X                    node->zone  = atoi(p+1);
  1119. X                    break;
  1120. X                default:
  1121. address_error:
  1122. X                    return returnbad("address syntax error", address, node);
  1123. X                    break;
  1124. X            }
  1125. X    
  1126. X    }
  1127. X
  1128. X    return 0;
  1129. }
  1130. X
  1131. X
  1132. X
  1133. /*
  1134. X * Parse FIDO address  <zone>:<net>/<node>.<point> into
  1135. X * Node structure. Leading non-digits are ignored.
  1136. X */
  1137. X
  1138. parsefnetaddress(s, node)
  1139. char *s;
  1140. Node *node;
  1141. {
  1142. char *p, *lastnumber;
  1143. char nodenbuf[100];
  1144. int point_flag = 0;
  1145. X
  1146. X    strncpy(nodenbuf, s, 99);
  1147. X    nodenbuf[99] = 0;
  1148. X    s = nodenbuf;
  1149. X
  1150. X    node->zone  = 0;
  1151. X    node->net   = 0;
  1152. X    node->node  = 0;
  1153. X    node->point = 0;
  1154. X    p = s;
  1155. X
  1156. X    /* skip non-digits */
  1157. X    while (!isdigit(*p) && *p) p++;
  1158. X
  1159. X    lastnumber = NULL;
  1160. X
  1161. X    while (1) {
  1162. X        switch (*p) {
  1163. X            case '0':  case '1':  case '2': case '3':
  1164. X            case '4':  case '5':  case '6': case '7':
  1165. X            case '8':  case '9':
  1166. X                lastnumber = p;
  1167. X                while (isdigit(*++p));
  1168. X                continue;
  1169. X                break;
  1170. X            case ':':
  1171. X                /* Previous number is zone */
  1172. X                if (node->zone) return returnbad("two zones", s, node);
  1173. X                node->zone = atoi(lastnumber);
  1174. X                lastnumber = p + 1;
  1175. X                break;
  1176. X            case '/':
  1177. X                /* Previous number is net */
  1178. X                if (node->net) return returnbad("two nets", s, node);
  1179. X                node->net = atoi(lastnumber);
  1180. X                lastnumber = p + 1;
  1181. X                break;
  1182. X            case '.':
  1183. X                /* Previous number is node */
  1184. X                if (node->node) return returnbad("two nodes", s, node);
  1185. X                node->node = atoi(lastnumber);
  1186. X                lastnumber = p + 1;
  1187. X                point_flag = 1;
  1188. X                break;
  1189. X            case 0:                    /* Terminated by end of string or '@' */
  1190. X            case '@':                /* starting domain part of address    */
  1191. X                if(!lastnumber)
  1192. X                    return returnbad("empty address", s, node);
  1193. X                if(point_flag)
  1194. X                    node->point = atoi(lastnumber);
  1195. X                else
  1196. X                    node->node  = atoi(lastnumber);
  1197. X                if (node->zone == 0) node->zone = MY_ZONE;
  1198. X                if (node->net == 0) node->net = MY_NET;
  1199. X                return 0;
  1200. X                break;
  1201. X            default:
  1202. X                return returnbad("bad char", s, node);
  1203. X        }
  1204. X        p++;
  1205. X    }
  1206. X    if (node->zone == 0) node->zone = MY_ZONE;
  1207. X    if (node->net == 0) return returnbad("no net", s, node);
  1208. X    if (node->node == 0)
  1209. X        node->node = atoi(lastnumber);
  1210. X
  1211. X    return 0;
  1212. }
  1213. X
  1214. X
  1215. X
  1216. /* Return address in string format */
  1217. X
  1218. char *ascnode(node)
  1219. Node node;
  1220. {
  1221. X    SHUFFLEBUFFERS;
  1222. X
  1223. X    if(node.point)
  1224. X        sprintf(tcharp, "%d:%d/%d.%d", node.zone, node.net, node.node, node.point);
  1225. X    else
  1226. X        sprintf(tcharp, "%d:%d/%d", node.zone, node.net, node.node);
  1227. X    return tcharp;
  1228. }
  1229. X
  1230. X
  1231. char *ascnoden(node)
  1232. Node node;
  1233. {
  1234. X    SHUFFLEBUFFERS;
  1235. X
  1236. X    sprintf(tcharp, "%d:%d/%d", node.zone, node.net, node.node);
  1237. X    return tcharp;
  1238. }
  1239. X
  1240. X
  1241. X
  1242. /* Internet format */
  1243. char *internode(node)
  1244. Node node;
  1245. {
  1246. X    SHUFFLEBUFFERS;
  1247. X
  1248. #ifdef NEW_STYLE_ADDRESS
  1249. X    if(node.point)
  1250. X        sprintf(tcharp, "p%d.f%d.n%d.z%d%s", node.point, node.node,
  1251. X                                             node.net,   node.zone,
  1252. X                                             FIDODOMAIN            );
  1253. X    else
  1254. X        sprintf(tcharp, "f%d.n%d.z%d%s", node.node, node.net,
  1255. X                                         node.zone, FIDODOMAIN );
  1256. #else
  1257. X    if (node.point)
  1258. X        sprintf(tcharp, "%d.%d.%d.%d.fidonet", node.point, node.node, node.net,
  1259. X                        node.zone);
  1260. X    else
  1261. X        sprintf(tcharp, "%d.%d.%d.fidonet", node.node, node.net, node.zone);
  1262. #endif
  1263. X    return tcharp;
  1264. }
  1265. X
  1266. X
  1267. X
  1268. /* same for index node structure */
  1269. X
  1270. char *ascnodei(node)
  1271. NODEINDEX node;
  1272. {
  1273. X    SHUFFLEBUFFERS;
  1274. X
  1275. X    sprintf(tcharp, "%d:%d/%d", node.zone, node.net, node.node);
  1276. X    return tcharp;
  1277. }
  1278. SHAR_EOF
  1279. chmod 0644 address.c ||
  1280. echo 'restore of address.c failed'
  1281. Wc_c="`wc -c < 'address.c'`"
  1282. test 9474 -eq "$Wc_c" ||
  1283.     echo 'address.c: original size 9474, current size' "$Wc_c"
  1284. fi
  1285. # ============= sprintfs.c ==============
  1286. if test -f 'sprintfs.c' -a X"$1" != X"-c"; then
  1287.     echo 'x - skipping sprintfs.c (File already exists)'
  1288. else
  1289. echo 'x - extracting sprintfs.c (Text)'
  1290. sed 's/^X//' << 'SHAR_EOF' > 'sprintfs.c' &&
  1291. /*:ts=4*/
  1292. /*****************************************************************************
  1293. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1294. X *
  1295. X * $Id: sprintfs.c,v 1.2 90/12/02 21:22:41 mj Exp $
  1296. X *
  1297. X * Special printf() function
  1298. X *
  1299. X * $Log:    sprintfs.c,v $
  1300. X * Revision 1.2  90/12/02  21:22:41  mj
  1301. X * Changed program header to mention both authors of the original
  1302. X * software posted to alt.sources.
  1303. X * 
  1304. X * Revision 1.1  90/11/05  20:51:10  mj
  1305. X * Changed my signature in all program headers.
  1306. X * 
  1307. X * Revision 1.0  90/06/21  19:10:16  mj
  1308. X * Initial revision
  1309. X * 
  1310. X *
  1311. X *****************************************************************************
  1312. X * This version hacked and maintained by:
  1313. X *    _____ _____
  1314. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1315. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1316. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1317. X *
  1318. X * Original version of these programs and files:
  1319. X *
  1320. X *   Teemu Torma
  1321. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  1322. X *
  1323. X *****************************************************************************/
  1324. X
  1325. #include "fidogate.h"
  1326. X
  1327. #include <varargs.h>
  1328. #include "shuffle.h"
  1329. X
  1330. X
  1331. /* Strcat creating its own buffer */
  1332. X
  1333. char *sstrcat(d, s)
  1334. X     char *d, *s;
  1335. {
  1336. X  SHUFFLEBUFFERS;
  1337. X
  1338. X  (void) strncpy(tcharp, d, MAX_CONVERT_BUFLEN);
  1339. X  tcharp[MAX_CONVERT_BUFLEN - 1] = '\0';
  1340. X  (void) strncat(tcharp, s, MAX_CONVERT_BUFLEN);
  1341. X  return tcharp;
  1342. }
  1343. X
  1344. /* Sprintf with own buffer */
  1345. X
  1346. /*VARARGS1*/
  1347. char *sprintfs(fmt, va_alist)
  1348. X     char *fmt;
  1349. X     va_dcl
  1350. {
  1351. X  va_list pvar;
  1352. X
  1353. X  va_start(pvar);
  1354. X
  1355. X  SHUFFLEBUFFERS;
  1356. X
  1357. X  vsprintf(tcharp, fmt, pvar);
  1358. X
  1359. X  va_end(pvar);
  1360. X
  1361. X  return tcharp;
  1362. }
  1363. X
  1364. SHAR_EOF
  1365. chmod 0644 sprintfs.c ||
  1366. echo 'restore of sprintfs.c failed'
  1367. Wc_c="`wc -c < 'sprintfs.c'`"
  1368. test 1670 -eq "$Wc_c" ||
  1369.     echo 'sprintfs.c: original size 1670, current size' "$Wc_c"
  1370. fi
  1371. # ============= strempty.c ==============
  1372. if test -f 'strempty.c' -a X"$1" != X"-c"; then
  1373.     echo 'x - skipping strempty.c (File already exists)'
  1374. else
  1375. echo 'x - extracting strempty.c (Text)'
  1376. sed 's/^X//' << 'SHAR_EOF' > 'strempty.c' &&
  1377. /*:ts=4*/
  1378. /*****************************************************************************
  1379. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1380. X *
  1381. X * $Id: strempty.c,v 1.2 90/12/02 21:22:42 mj Exp $
  1382. X *
  1383. X * strempty(), strclean()
  1384. X *
  1385. X * $Log:    strempty.c,v $
  1386. X * Revision 1.2  90/12/02  21:22:42  mj
  1387. X * Changed program header to mention both authors of the original
  1388. X * software posted to alt.sources.
  1389. X * 
  1390. X * Revision 1.1  90/11/05  20:51:11  mj
  1391. X * Changed my signature in all program headers.
  1392. X * 
  1393. X * Revision 1.0  90/06/21  19:11:09  mj
  1394. X * Initial revision
  1395. X * 
  1396. X *
  1397. X *****************************************************************************
  1398. X * This version hacked and maintained by:
  1399. X *    _____ _____
  1400. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1401. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1402. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1403. X *
  1404. X * Original version of these programs and files:
  1405. X *
  1406. X *   Teemu Torma
  1407. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  1408. X *
  1409. X *****************************************************************************/
  1410. X
  1411. #include "fidogate.h"
  1412. X
  1413. X
  1414. X
  1415. /* Check if string just consists of space (or is null). Return TRUE if so */
  1416. X
  1417. strempty(s)
  1418. X     char *s;
  1419. {
  1420. X  while (*s) if (!isspace(*s)) return FALSE; else s++;
  1421. X  return TRUE;
  1422. }
  1423. X
  1424. /* Clean up space from start and end */
  1425. X
  1426. char *strclean(s)
  1427. X     char *s;
  1428. {
  1429. X  char *d = s, *p = s;
  1430. X
  1431. X  /* Find first non-space char */
  1432. X  for (; *p; p++) if (!isspace(*p)) break;
  1433. X
  1434. X  /* Copy until end */
  1435. X  if (d != p) while (*d++ = *p++);
  1436. X
  1437. X  /* Strip space from end */
  1438. X  while (strlen(s) && isspace(s[strlen(s) - 1])) s[strlen(s) - 1] = 0;
  1439. X
  1440. X  return s;
  1441. }
  1442. X
  1443. /* Clean up whitespace from start */
  1444. char *strsclean(s)
  1445. X     char *s;
  1446. {
  1447. X  char *d = s, *p = s;
  1448. X
  1449. X  /* Find first non-space char */
  1450. X  for (; *p; p++) if (!isspace(*p)) break;
  1451. X
  1452. X  /* Copy until end */
  1453. X  if (d != p) while (*d++ = *p++);
  1454. X
  1455. X  return s;
  1456. }
  1457. SHAR_EOF
  1458. chmod 0644 strempty.c ||
  1459. echo 'restore of strempty.c failed'
  1460. Wc_c="`wc -c < 'strempty.c'`"
  1461. test 1919 -eq "$Wc_c" ||
  1462.     echo 'strempty.c: original size 1919, current size' "$Wc_c"
  1463. fi
  1464. # ============= listscan.c ==============
  1465. if test -f 'listscan.c' -a X"$1" != X"-c"; then
  1466.     echo 'x - skipping listscan.c (File already exists)'
  1467. else
  1468. echo 'x - extracting listscan.c (Text)'
  1469. sed 's/^X//' << 'SHAR_EOF' > 'listscan.c' &&
  1470. /*:ts=4*/
  1471. /*****************************************************************************
  1472. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1473. X *
  1474. X * $Id: listscan.c,v 1.2 90/12/02 21:22:09 mj Exp $
  1475. X *
  1476. X * Searches char * table for string
  1477. X *
  1478. X * $Log:    listscan.c,v $
  1479. X * Revision 1.2  90/12/02  21:22:09  mj
  1480. X * Changed program header to mention both authors of the original
  1481. X * software posted to alt.sources.
  1482. X * 
  1483. X * Revision 1.1  90/11/05  20:50:43  mj
  1484. X * Changed my signature in all program headers.
  1485. X * 
  1486. X * Revision 1.0  90/06/21  19:07:00  mj
  1487. X * Initial revision
  1488. X * 
  1489. X *
  1490. X *****************************************************************************
  1491. X * This version hacked and maintained by:
  1492. X *    _____ _____
  1493. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1494. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1495. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1496. X *
  1497. X * Original version of these programs and files:
  1498. X *
  1499. X *   Teemu Torma
  1500. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  1501. X *
  1502. X *****************************************************************************/
  1503. X
  1504. #include "fidogate.h"
  1505. X
  1506. X
  1507. X
  1508. int listscan(list,search)
  1509. char **list;
  1510. char *search;
  1511. {
  1512. X  register int i;
  1513. X  static char *p1, *p2;
  1514. X
  1515. X  i = 0;
  1516. X  p1 = *list++;
  1517. X  while (*p1 != '\0') {
  1518. X    p2 = search;
  1519. X    while (*p1 == *p2) {
  1520. X      if (*p1++ == '\0')
  1521. X    return(i);
  1522. X      p2++;
  1523. X    }
  1524. X    if (*p2 == ' ') return i;
  1525. X    i++;
  1526. X    p1 = *list++;
  1527. X  }
  1528. X  return -1;
  1529. }
  1530. SHAR_EOF
  1531. chmod 0644 listscan.c ||
  1532. echo 'restore of listscan.c failed'
  1533. Wc_c="`wc -c < 'listscan.c'`"
  1534. test 1474 -eq "$Wc_c" ||
  1535.     echo 'listscan.c: original size 1474, current size' "$Wc_c"
  1536. fi
  1537. # ============= xalloc.c ==============
  1538. if test -f 'xalloc.c' -a X"$1" != X"-c"; then
  1539.     echo 'x - skipping xalloc.c (File already exists)'
  1540. else
  1541. echo 'x - extracting xalloc.c (Text)'
  1542. sed 's/^X//' << 'SHAR_EOF' > 'xalloc.c' &&
  1543. /*:ts=4*/
  1544. /*****************************************************************************
  1545. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1546. X *
  1547. X * $Id: xalloc.c,v 1.4 90/11/05 20:51:14 mj Exp $
  1548. X *
  1549. X * Safe alloc routines.
  1550. X *
  1551. X * $Log:    xalloc.c,v $
  1552. X * Revision 1.4  90/11/05  20:51:14  mj
  1553. X * Changed my signature in all program headers.
  1554. X * 
  1555. X * Revision 1.3  90/09/08  18:49:31  mj
  1556. X * Move strsaveline() to xalloc.c
  1557. X * 
  1558. X * Revision 1.2  90/07/01  15:20:50  mj
  1559. X * Fixed some bugs in funpack caused by the removal of alloca().
  1560. X * No more core dumps, but heaven knows, why it works now. Strange.
  1561. X * 
  1562. X * Revision 1.1  90/07/01  13:46:30  mj
  1563. X * Removed all calls to alloca(). All unsave malloc()'s without
  1564. X * checking the returned pointer are now done via xmalloc().
  1565. X * Fixed a malloc() error in rmail.
  1566. X * 
  1567. X * Revision 1.0  90/06/28  21:25:56  mj
  1568. X * Initial revision
  1569. X * 
  1570. X *
  1571. X *****************************************************************************
  1572. X * This version hacked and maintained by:
  1573. X *    _____ _____
  1574. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1575. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1576. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1577. X *
  1578. X *****************************************************************************/
  1579. X
  1580. #include "fidogate.h"
  1581. X
  1582. char *malloc(), *realloc();
  1583. X
  1584. X
  1585. /*
  1586. X * xmalloc(), xrealloc()  ---  safe versions of malloc() and realloc()
  1587. X */
  1588. X
  1589. char *xmalloc(size)
  1590. int size;
  1591. {
  1592. char *p;
  1593. X
  1594. X    if(p = malloc(size))
  1595. X        return(p);
  1596. X    log("Memory exhausted.");
  1597. X    exit(EX_OSERR);
  1598. }
  1599. X
  1600. char *xrealloc(ptr, size)
  1601. char *ptr;
  1602. int size;
  1603. {
  1604. char *p;
  1605. X
  1606. X    if(p = realloc(ptr, size))
  1607. X        return(p);
  1608. X    log("Memory exhausted.");
  1609. X    exit(EX_OSERR);
  1610. }
  1611. X
  1612. X
  1613. X
  1614. /*
  1615. X * strsave()  ---  make a copy of a string
  1616. X */
  1617. X
  1618. char *strsave(s)
  1619. char *s;
  1620. {
  1621. char *p;
  1622. X
  1623. X    p = xmalloc(strlen(s) + 1);
  1624. X    strcpy(p, s);
  1625. X    return(p);
  1626. }
  1627. X
  1628. X
  1629. X
  1630. /*
  1631. X * strsaveline() --- like strsave(), but remove '\n' at end of line if any
  1632. X */
  1633. X
  1634. char *strsaveline(s)
  1635. char *s;
  1636. {
  1637. char *r;
  1638. int len;
  1639. X
  1640. X    r = strsave(s);
  1641. X    len = strlen(r);
  1642. X    if(r[len - 1] == '\n')
  1643. X        r[len - 1] = 0;
  1644. X    return(r);
  1645. }
  1646. SHAR_EOF
  1647. chmod 0644 xalloc.c ||
  1648. echo 'restore of xalloc.c failed'
  1649. Wc_c="`wc -c < 'xalloc.c'`"
  1650. test 2067 -eq "$Wc_c" ||
  1651.     echo 'xalloc.c: original size 2067, current size' "$Wc_c"
  1652. fi
  1653. # ============= msgidseq.c ==============
  1654. if test -f 'msgidseq.c' -a X"$1" != X"-c"; then
  1655.     echo 'x - skipping msgidseq.c (File already exists)'
  1656. else
  1657. echo 'x - extracting msgidseq.c (Text)'
  1658. sed 's/^X//' << 'SHAR_EOF' > 'msgidseq.c' &&
  1659. /*:ts=4*/
  1660. /*****************************************************************************
  1661. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1662. X *
  1663. X * $Id: msgidseq.c,v 1.1 90/11/05 20:50:47 mj Exp $
  1664. X *
  1665. X * Output new message id number from sequencer file. Stand alone program
  1666. X * for use by CNews. 
  1667. X *
  1668. X * Install this program in /u/lib/newsbin or similar directory. Then change
  1669. X * Message-ID: generating software to use msgidseq, e.g. last line of
  1670. X * inject/anne.jones for CNews.
  1671. X *
  1672. X * $Log:    msgidseq.c,v $
  1673. X * Revision 1.1  90/11/05  20:50:47  mj
  1674. X * Changed my signature in all program headers.
  1675. X * 
  1676. X * Revision 1.0  90/08/18  15:43:18  mj
  1677. X * Initial revision
  1678. X * 
  1679. X *
  1680. X *****************************************************************************
  1681. X * This version hacked and maintained by:
  1682. X *    _____ _____
  1683. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1684. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1685. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1686. X *
  1687. X *****************************************************************************/
  1688. X
  1689. #include "fidogate.h"
  1690. X
  1691. X
  1692. X
  1693. int verbose = 0;
  1694. X
  1695. X
  1696. main()
  1697. {
  1698. long msgid;
  1699. X
  1700. X    msgid = sequencer(MSGIDSEQ);
  1701. X    printf("%ld\n", msgid);
  1702. }
  1703. SHAR_EOF
  1704. chmod 0644 msgidseq.c ||
  1705. echo 'restore of msgidseq.c failed'
  1706. Wc_c="`wc -c < 'msgidseq.c'`"
  1707. test 1206 -eq "$Wc_c" ||
  1708.     echo 'msgidseq.c: original size 1206, current size' "$Wc_c"
  1709. fi
  1710. exit 0
  1711.  
  1712. --
  1713.  _____ _____
  1714. |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1715. | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1716. |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1717.