home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3416 < prev    next >
Encoding:
Internet Message Format  |  1991-05-25  |  41.2 KB

  1. From: mj@dfv.rwth-aachen.de (Martin Junius)
  2. Newsgroups: alt.sources
  3. Subject: FIDOGATE 06/06
  4. Message-ID: <mj.675078556@suntex>
  5. Date: 24 May 91 09:49:16 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.14 91/05/19 17:21:17 mj Exp Locker: mj $
  874. X *
  875. X * Address format is (domain style addresses for FIDO):
  876. X *     <name>@p<point>.f<node>.n<net>.z<zone>.FIDODOMAIN
  877. X * FIDODOMAIN is defined in config.h
  878. X *
  879. X * $Log:   address.c,v $
  880. X * Revision 1.14  91/05/19  17:21:17  mj
  881. X * Ignores case when looking for FIDO address.
  882. X * 
  883. X * Revision 1.13  91/05/07  23:55:59  mj
  884. X * Changed parsing of FIDO Internet addresses. The old style is no longer
  885. X * supported, p.f.n.z accepts lower and upper case, new FIDO domains
  886. X * p.f.n.z.HOSTNAME and p.f.n.z.HOSTNAME.DOMAIN.
  887. X * 
  888. X * Revision 1.12  91/03/29  18:07:56  mj
  889. X * Some changes. (what?)
  890. X * 
  891. X * Revision 1.11  90/12/13  20:04:41  mj
  892. X * Fixed a bug in parsefnetaddress().
  893. X * 
  894. X * Revision 1.10  90/12/02  21:21:07  mj
  895. X * Changed program header to mention both authors of the original
  896. X * software posted to alt.sources.
  897. X * 
  898. X * Revision 1.9  90/11/20  21:07:24  mj
  899. X * New function ascnoden(): convert node address to string, point not
  900. X * included.
  901. X * 
  902. X * Revision 1.8  90/11/05  20:48:49  mj
  903. X * Changed my signature in all program headers.
  904. X * 
  905. X * Revision 1.7  90/09/30  14:39:52  mj
  906. X * Better parsing for FIDO addresses including domain.
  907. X * (e.g. "2:242/6@fidonet")
  908. X * 
  909. X * Revision 1.6  90/09/16  17:35:07  mj
  910. X * Always output zone address in internode().
  911. X * 
  912. X * Revision 1.5  90/08/12  14:12:38  mj
  913. X * Output of ascnode() now <zone>:<net>/<node> for non-point addresses.
  914. X * 
  915. X * Revision 1.4  90/07/30  19:58:57  mj
  916. X * Added support for new style FIDO addresses:
  917. X *     p<point>.f<node>.n<net>.z<zone>.FIDODOMAIN
  918. X * FIDODOMAIN is defined in config.h
  919. X * 
  920. X * Revision 1.3  90/07/11  17:03:58  mj
  921. X * Removed a bug in address parsing, when address is of type
  922. X * `domain!name'.
  923. X * 
  924. X * Revision 1.2  90/07/01  13:27:11  mj
  925. X * Removed all calls to alloca(). All unsave malloc()'s without
  926. X * checking the returned pointer are now done via xmalloc().
  927. X * Fixed a malloc() error in rmail.
  928. X * 
  929. X * Revision 1.1  90/06/28  22:02:46  mj
  930. X * Much rework of the sources, no more hsu.h and other clean up.
  931. X * rmail improved, now handles special XENIX quirks.
  932. X * 
  933. X * Revision 1.0  90/06/19  18:31:45  mj
  934. X * Initial revision
  935. X * 
  936. X *
  937. X *****************************************************************************
  938. X * This version hacked and maintained by:
  939. X *    _____ _____
  940. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  941. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  942. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  943. X *
  944. X * Original version of these programs and files:
  945. X *
  946. X *   Teemu Torma
  947. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  948. X *
  949. X *****************************************************************************/
  950. X
  951. #include "fidogate.h"
  952. X
  953. #include "shuffle.h"
  954. X
  955. X
  956. X
  957. /*
  958. X * int parse_address()  ---  parse fidonet address to name, net/node
  959. X *
  960. X * Parameters: char *address   --- address string
  961. X *             char *name      --- pointer to return name
  962. X *             Node *node      --- pointer to return node address
  963. X *
  964. X * Return:     0 = o.k., -1 = error
  965. X *
  966. X * Two types of addresses are understood:
  967. X * Domain:     name@p.f.n.z[.FIDODOMAIN]
  968. X *             name%p.f.n.z[.FIDODOMAIN]
  969. X * Bang:       p.f.n.z[.FIDODOMAIN]!name
  970. X */
  971. X
  972. int parse_address(address, name, node)
  973. char *address, *name;
  974. Node *node;
  975. {
  976. static char error[64];
  977. register char *cp;
  978. register int cnt;
  979. char *p;
  980. X
  981. X   /* make address to lowercase */
  982. X   for (cp = address; *cp; cp++)
  983. X       if (isupper(*cp))
  984. X           *cp = tolower(*cp);
  985. X
  986. X   /* Get name. We assume that name has space at least 36 charcers (maximum
  987. X      length of name in fido). First check whether format is name@domain
  988. X      of domain!name format. */
  989. X   if(cp = strchr(address, '!')) {
  990. X       debug(2, "Fidonet address domain!name");
  991. X       for (cp++, cnt = 0; *cp && cnt < 35; cnt++, cp++)
  992. X           name[cnt] = *cp;
  993. X       name[cnt] = 0;
  994. X       cp = address;
  995. X       debug(3, "Name %s", name);
  996. X   }
  997. X   else {
  998. X       p = strrchr(address, '@');
  999. X       if(!p)
  1000. X           p = strrchr(address, '%');
  1001. X       if(!p)
  1002. X           return -1;
  1003. X           
  1004. X       debug(2, "Fidonet address name[@%]domain");
  1005. X       for (cp = address, cnt = 0; *cp && cnt<35 && cp!=p; cp++, cnt++)
  1006. X           name[cnt] = *cp;
  1007. X       name[cnt] = 0;
  1008. X       debug(3, "Name %s", name);
  1009. X
  1010. X       cp = p + 1;
  1011. X   }
  1012. X
  1013. X   debug(2, "Address %s, up to '!' or end", cp);
  1014. X
  1015. X   return parseinternode(cp, node);
  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. /***** isfido() --- Check for FIDO Internet address **************************/
  1034. X
  1035. int isfido(address)
  1036. char *address;
  1037. {
  1038. char name[128];
  1039. Node node;
  1040. X
  1041. X   return parse_address(address, name, &node) == 0;
  1042. }
  1043. X
  1044. X
  1045. X
  1046. /***** parseinternode() --- Convert FIDO Internet address to Node struct *****/
  1047. X
  1048. int parseinternode(address, node)
  1049. char *address;
  1050. Node *node;
  1051. {
  1052. char *p, *s;
  1053. char domain[128];
  1054. int len, dlen;
  1055. X
  1056. X   s = strsave(address);
  1057. X
  1058. X   /* Remove `!...' */
  1059. X   if(p = strrchr(s, '!'))
  1060. X       *p = 0;
  1061. X
  1062. X   /*
  1063. X    * Check for possible domains and remove them.
  1064. X    * Currently the following domains are recognized:
  1065. X    *         FIDODOMAIN
  1066. X    * e.g.    ".fidonet.org"
  1067. X    *         .MY_HOSTNAME
  1068. X    * e.g.    ".hippo"
  1069. X    *         .MY_HOSTNAME.MY_DOMAIN
  1070. X    * e.g.    ".hippo.dfv.rwth-aachen.de"
  1071. X    */
  1072. X   len  = strlen(s);
  1073. X   while(1) {
  1074. X       strcpy(domain, FIDODOMAIN);
  1075. X       dlen = strlen(domain);
  1076. X       if(len > dlen  &&  !stricmp(s + len - dlen, domain)) {
  1077. X           s[len - dlen] = 0;
  1078. X           break;
  1079. X       }
  1080. X
  1081. X       strcpy(domain, ".");
  1082. X       strcat(domain, MY_HOSTNAME);
  1083. X       dlen = strlen(domain);
  1084. X       if(len > dlen  &&  !stricmp(s + len - dlen, domain)) {
  1085. X           s[len - dlen] = 0;
  1086. X           break;
  1087. X       }
  1088. X
  1089. X       strcat(domain, MY_DOMAIN);
  1090. X       dlen = strlen(domain);
  1091. X       if(len > dlen  &&  !stricmp(s + len - dlen, domain))
  1092. X           s[len - dlen] = 0;
  1093. X       
  1094. X       break;
  1095. X   }
  1096. X
  1097. X   /*
  1098. X    * Address format: p<point>.f<node>.n<net>.z<zone>
  1099. X    */
  1100. X   node->zone  = REAL_ZONE;
  1101. X   node->net   = REAL_NET;
  1102. X   node->node  = REAL_NODE;
  1103. X   node->point = 0;
  1104. X   
  1105. X   for(p=strtok(s, "."); p; p = strtok(NULL, "."))
  1106. X       switch(*p) {
  1107. X           case 'p':
  1108. X           case 'P':
  1109. X               if(!isdigit(p[1])) {
  1110. X                   free(s);
  1111. X                   return -1;
  1112. X               }
  1113. X               node->point = atoi(p+1);
  1114. X               break;
  1115. X           case 'f':
  1116. X           case 'F':
  1117. X               if(!isdigit(p[1])) {
  1118. X                   free(s);
  1119. X                   return -1;
  1120. X               }
  1121. X               node->node  = atoi(p+1);
  1122. X               break;
  1123. X           case 'n':
  1124. X           case 'N':
  1125. X               if(!isdigit(p[1])) {
  1126. X                   free(s);
  1127. X                   return -1;
  1128. X               }
  1129. X               node->net   = atoi(p+1);
  1130. X               break;
  1131. X           case 'z':
  1132. X           case 'Z':
  1133. X               if(!isdigit(p[1])) {
  1134. X                   free(s);
  1135. X                   return -1;
  1136. X               }
  1137. X               node->zone  = atoi(p+1);
  1138. X               break;
  1139. X           default:
  1140. X               free(s);
  1141. X               return -1;
  1142. X               break;
  1143. X       }
  1144. X
  1145. X   return 0;
  1146. }
  1147. X
  1148. X
  1149. X
  1150. /*
  1151. X * Parse FIDO address  <zone>:<net>/<node>.<point> into
  1152. X * Node structure. Leading non-digits are ignored.
  1153. X */
  1154. X
  1155. parsefnetaddress(s, node)
  1156. char *s;
  1157. Node *node;
  1158. {
  1159. char *p, *lastnumber;
  1160. char nodenbuf[100];
  1161. int point_flag = 0;
  1162. X
  1163. X   strncpy(nodenbuf, s, 99);
  1164. X   nodenbuf[99] = 0;
  1165. X   s = nodenbuf;
  1166. X
  1167. X   node->zone  = 0;
  1168. X   node->net   = 0;
  1169. X   node->node  = 0;
  1170. X   node->point = 0;
  1171. X   p = s;
  1172. X
  1173. X   /* skip non-digits */
  1174. X   while (!isdigit(*p) && *p) p++;
  1175. X
  1176. X   lastnumber = NULL;
  1177. X
  1178. X   while (1) {
  1179. X       switch (*p) {
  1180. X           case '0':  case '1':  case '2': case '3':
  1181. X           case '4':  case '5':  case '6': case '7':
  1182. X           case '8':  case '9':
  1183. X               lastnumber = p;
  1184. X               while (isdigit(*++p));
  1185. X               continue;
  1186. X               break;
  1187. X           case ':':
  1188. X               /* Previous number is zone */
  1189. X               if (node->zone) return returnbad("two zones", s, node);
  1190. X               node->zone = atoi(lastnumber);
  1191. X               lastnumber = p + 1;
  1192. X               break;
  1193. X           case '/':
  1194. X               /* Previous number is net */
  1195. X               if (node->net) return returnbad("two nets", s, node);
  1196. X               node->net = atoi(lastnumber);
  1197. X               lastnumber = p + 1;
  1198. X               break;
  1199. X           case '.':
  1200. X               /* Previous number is node */
  1201. X               if (node->node) return returnbad("two nodes", s, node);
  1202. X               node->node = atoi(lastnumber);
  1203. X               lastnumber = p + 1;
  1204. X               point_flag = 1;
  1205. X               break;
  1206. X           case 0:                 /* Terminated by end of string or '@' */
  1207. X           case '@':               /* starting domain part of address    */
  1208. X               if(!lastnumber)
  1209. X                   return returnbad("empty address", s, node);
  1210. X               if(point_flag)
  1211. X                   node->point = atoi(lastnumber);
  1212. X               else
  1213. X                   node->node  = atoi(lastnumber);
  1214. X               if (node->zone == 0) node->zone = MY_ZONE;
  1215. X               if (node->net == 0) node->net = MY_NET;
  1216. X               return 0;
  1217. X               break;
  1218. X           default:
  1219. X               return returnbad("bad char", s, node);
  1220. X       }
  1221. X       p++;
  1222. X   }
  1223. X   if (node->zone == 0) node->zone = MY_ZONE;
  1224. X   if (node->net == 0) return returnbad("no net", s, node);
  1225. X   if (node->node == 0)
  1226. X       node->node = atoi(lastnumber);
  1227. X
  1228. X   return 0;
  1229. }
  1230. X
  1231. X
  1232. X
  1233. /* Return address in string format */
  1234. X
  1235. char *ascnode(node)
  1236. Node node;
  1237. {
  1238. X   SHUFFLEBUFFERS;
  1239. X
  1240. X   if(node.point)
  1241. X       sprintf(tcharp, "%d:%d/%d.%d", node.zone, node.net, node.node, node.point);
  1242. X   else
  1243. X       sprintf(tcharp, "%d:%d/%d", node.zone, node.net, node.node);
  1244. X   return tcharp;
  1245. }
  1246. X
  1247. X
  1248. char *ascnoden(node)
  1249. Node node;
  1250. {
  1251. X   SHUFFLEBUFFERS;
  1252. X
  1253. X   sprintf(tcharp, "%d:%d/%d", node.zone, node.net, node.node);
  1254. X   return tcharp;
  1255. }
  1256. X
  1257. X
  1258. X
  1259. /* Internet format */
  1260. char *internode(node)
  1261. Node node;
  1262. {
  1263. X   SHUFFLEBUFFERS;
  1264. X
  1265. X   if(node.point)
  1266. X       sprintf(tcharp, "p%d.f%d.n%d.z%d%s", node.point, node.node,
  1267. X                                            node.net,   node.zone,
  1268. X                                            FIDODOMAIN         );
  1269. X   else
  1270. X       sprintf(tcharp, "f%d.n%d.z%d%s", node.node, node.net,
  1271. X                                        node.zone, FIDODOMAIN );
  1272. X
  1273. X   return tcharp;
  1274. }
  1275. X
  1276. X
  1277. X
  1278. /***** Internet format without FIDODOMAIN ************************************/
  1279. X
  1280. char *internodex(node)
  1281. Node node;
  1282. {
  1283. X   SHUFFLEBUFFERS;
  1284. X   if(node.point)
  1285. X       sprintf(tcharp, "p%d.f%d.n%d.z%d", node.point, node.node,
  1286. X                                          node.net,   node.zone );
  1287. X   else
  1288. X       sprintf(tcharp, "f%d.n%d.z%d", node.node, node.net, node.zone);
  1289. X   return tcharp;
  1290. }
  1291. X
  1292. X
  1293. X
  1294. /* same for index node structure */
  1295. X
  1296. char *ascnodei(node)
  1297. NODEINDEX node;
  1298. {
  1299. X   SHUFFLEBUFFERS;
  1300. X
  1301. X   sprintf(tcharp, "%d:%d/%d", node.zone, node.net, node.node);
  1302. X   return tcharp;
  1303. }
  1304. SHAR_EOF
  1305. chmod 0644 address.c ||
  1306. echo 'restore of address.c failed'
  1307. Wc_c="`wc -c < 'address.c'`"
  1308. test 9687 -eq "$Wc_c" ||
  1309.     echo 'address.c: original size 9687, current size' "$Wc_c"
  1310. fi
  1311. # ============= sprintfs.c ==============
  1312. if test -f 'sprintfs.c' -a X"$1" != X"-c"; then
  1313.     echo 'x - skipping sprintfs.c (File already exists)'
  1314. else
  1315. echo 'x - extracting sprintfs.c (Text)'
  1316. sed 's/^X//' << 'SHAR_EOF' > 'sprintfs.c' &&
  1317. /*:ts=4*/
  1318. /*****************************************************************************
  1319. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1320. X *
  1321. X * $Id: sprintfs.c,v 1.2 90/12/02 21:22:41 mj Exp $
  1322. X *
  1323. X * Special printf() function
  1324. X *
  1325. X * $Log:   sprintfs.c,v $
  1326. X * Revision 1.2  90/12/02  21:22:41  mj
  1327. X * Changed program header to mention both authors of the original
  1328. X * software posted to alt.sources.
  1329. X * 
  1330. X * Revision 1.1  90/11/05  20:51:10  mj
  1331. X * Changed my signature in all program headers.
  1332. X * 
  1333. X * Revision 1.0  90/06/21  19:10:16  mj
  1334. X * Initial revision
  1335. X * 
  1336. X *
  1337. X *****************************************************************************
  1338. X * This version hacked and maintained by:
  1339. X *    _____ _____
  1340. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1341. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1342. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1343. X *
  1344. X * Original version of these programs and files:
  1345. X *
  1346. X *   Teemu Torma
  1347. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  1348. X *
  1349. X *****************************************************************************/
  1350. X
  1351. #include "fidogate.h"
  1352. X
  1353. #include <varargs.h>
  1354. #include "shuffle.h"
  1355. X
  1356. X
  1357. /* Strcat creating its own buffer */
  1358. X
  1359. char *sstrcat(d, s)
  1360. X     char *d, *s;
  1361. {
  1362. X  SHUFFLEBUFFERS;
  1363. X
  1364. X  (void) strncpy(tcharp, d, MAX_CONVERT_BUFLEN);
  1365. X  tcharp[MAX_CONVERT_BUFLEN - 1] = '\0';
  1366. X  (void) strncat(tcharp, s, MAX_CONVERT_BUFLEN);
  1367. X  return tcharp;
  1368. }
  1369. X
  1370. /* Sprintf with own buffer */
  1371. X
  1372. /*VARARGS1*/
  1373. char *sprintfs(fmt, va_alist)
  1374. X     char *fmt;
  1375. X     va_dcl
  1376. {
  1377. X  va_list pvar;
  1378. X
  1379. X  va_start(pvar);
  1380. X
  1381. X  SHUFFLEBUFFERS;
  1382. X
  1383. X  vsprintf(tcharp, fmt, pvar);
  1384. X
  1385. X  va_end(pvar);
  1386. X
  1387. X  return tcharp;
  1388. }
  1389. X
  1390. SHAR_EOF
  1391. chmod 0644 sprintfs.c ||
  1392. echo 'restore of sprintfs.c failed'
  1393. Wc_c="`wc -c < 'sprintfs.c'`"
  1394. test 1670 -eq "$Wc_c" ||
  1395.     echo 'sprintfs.c: original size 1670, current size' "$Wc_c"
  1396. fi
  1397. # ============= strempty.c ==============
  1398. if test -f 'strempty.c' -a X"$1" != X"-c"; then
  1399.     echo 'x - skipping strempty.c (File already exists)'
  1400. else
  1401. echo 'x - extracting strempty.c (Text)'
  1402. sed 's/^X//' << 'SHAR_EOF' > 'strempty.c' &&
  1403. /*:ts=4*/
  1404. /*****************************************************************************
  1405. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1406. X *
  1407. X * $Id: strempty.c,v 1.2 90/12/02 21:22:42 mj Exp $
  1408. X *
  1409. X * strempty(), strclean()
  1410. X *
  1411. X * $Log:   strempty.c,v $
  1412. X * Revision 1.2  90/12/02  21:22:42  mj
  1413. X * Changed program header to mention both authors of the original
  1414. X * software posted to alt.sources.
  1415. X * 
  1416. X * Revision 1.1  90/11/05  20:51:11  mj
  1417. X * Changed my signature in all program headers.
  1418. X * 
  1419. X * Revision 1.0  90/06/21  19:11:09  mj
  1420. X * Initial revision
  1421. X * 
  1422. X *
  1423. X *****************************************************************************
  1424. X * This version hacked and maintained by:
  1425. X *    _____ _____
  1426. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1427. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1428. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1429. X *
  1430. X * Original version of these programs and files:
  1431. X *
  1432. X *   Teemu Torma
  1433. X *   Heikki Suonsivu   FIDO: 2:504/1   UUCP: ...!mcsun!santra!hsu
  1434. X *
  1435. X *****************************************************************************/
  1436. X
  1437. #include "fidogate.h"
  1438. X
  1439. X
  1440. X
  1441. /* Check if string just consists of space (or is null). Return TRUE if so */
  1442. X
  1443. strempty(s)
  1444. X     char *s;
  1445. {
  1446. X  while (*s) if (!isspace(*s)) return FALSE; else s++;
  1447. X  return TRUE;
  1448. }
  1449. X
  1450. /* Clean up space from start and end */
  1451. X
  1452. char *strclean(s)
  1453. X     char *s;
  1454. {
  1455. X  char *d = s, *p = s;
  1456. X
  1457. X  /* Find first non-space char */
  1458. X  for (; *p; p++) if (!isspace(*p)) break;
  1459. X
  1460. X  /* Copy until end */
  1461. X  if (d != p) while (*d++ = *p++);
  1462. X
  1463. X  /* Strip space from end */
  1464. X  while (strlen(s) && isspace(s[strlen(s) - 1])) s[strlen(s) - 1] = 0;
  1465. X
  1466. X  return s;
  1467. }
  1468. X
  1469. /* Clean up whitespace from start */
  1470. char *strsclean(s)
  1471. X     char *s;
  1472. {
  1473. X  char *d = s, *p = s;
  1474. X
  1475. X  /* Find first non-space char */
  1476. X  for (; *p; p++) if (!isspace(*p)) break;
  1477. X
  1478. X  /* Copy until end */
  1479. X  if (d != p) while (*d++ = *p++);
  1480. X
  1481. X  return s;
  1482. }
  1483. SHAR_EOF
  1484. chmod 0644 strempty.c ||
  1485. echo 'restore of strempty.c failed'
  1486. Wc_c="`wc -c < 'strempty.c'`"
  1487. test 1919 -eq "$Wc_c" ||
  1488.     echo 'strempty.c: original size 1919, current size' "$Wc_c"
  1489. fi
  1490. # ============= xalloc.c ==============
  1491. if test -f 'xalloc.c' -a X"$1" != X"-c"; then
  1492.     echo 'x - skipping xalloc.c (File already exists)'
  1493. else
  1494. echo 'x - extracting xalloc.c (Text)'
  1495. sed 's/^X//' << 'SHAR_EOF' > 'xalloc.c' &&
  1496. /*:ts=4*/
  1497. /*****************************************************************************
  1498. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1499. X *
  1500. X * $Id: xalloc.c,v 1.4 90/11/05 20:51:14 mj Exp $
  1501. X *
  1502. X * Safe alloc routines.
  1503. X *
  1504. X * $Log:   xalloc.c,v $
  1505. X * Revision 1.4  90/11/05  20:51:14  mj
  1506. X * Changed my signature in all program headers.
  1507. X * 
  1508. X * Revision 1.3  90/09/08  18:49:31  mj
  1509. X * Move strsaveline() to xalloc.c
  1510. X * 
  1511. X * Revision 1.2  90/07/01  15:20:50  mj
  1512. X * Fixed some bugs in funpack caused by the removal of alloca().
  1513. X * No more core dumps, but heaven knows, why it works now. Strange.
  1514. X * 
  1515. X * Revision 1.1  90/07/01  13:46:30  mj
  1516. X * Removed all calls to alloca(). All unsave malloc()'s without
  1517. X * checking the returned pointer are now done via xmalloc().
  1518. X * Fixed a malloc() error in rmail.
  1519. X * 
  1520. X * Revision 1.0  90/06/28  21:25:56  mj
  1521. X * Initial revision
  1522. X * 
  1523. X *
  1524. X *****************************************************************************
  1525. X * This version hacked and maintained by:
  1526. X *    _____ _____
  1527. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1528. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1529. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1530. X *
  1531. X *****************************************************************************/
  1532. X
  1533. #include "fidogate.h"
  1534. X
  1535. char *malloc(), *realloc();
  1536. X
  1537. X
  1538. /*
  1539. X * xmalloc(), xrealloc()  ---  safe versions of malloc() and realloc()
  1540. X */
  1541. X
  1542. char *xmalloc(size)
  1543. int size;
  1544. {
  1545. char *p;
  1546. X
  1547. X   if(p = malloc(size))
  1548. X       return(p);
  1549. X   log("Memory exhausted.");
  1550. X   exit(EX_OSERR);
  1551. }
  1552. X
  1553. char *xrealloc(ptr, size)
  1554. char *ptr;
  1555. int size;
  1556. {
  1557. char *p;
  1558. X
  1559. X   if(p = realloc(ptr, size))
  1560. X       return(p);
  1561. X   log("Memory exhausted.");
  1562. X   exit(EX_OSERR);
  1563. }
  1564. X
  1565. X
  1566. X
  1567. /*
  1568. X * strsave()  ---  make a copy of a string
  1569. X */
  1570. X
  1571. char *strsave(s)
  1572. char *s;
  1573. {
  1574. char *p;
  1575. X
  1576. X   p = xmalloc(strlen(s) + 1);
  1577. X   strcpy(p, s);
  1578. X   return(p);
  1579. }
  1580. X
  1581. X
  1582. X
  1583. /*
  1584. X * strsaveline() --- like strsave(), but remove '\n' at end of line if any
  1585. X */
  1586. X
  1587. char *strsaveline(s)
  1588. char *s;
  1589. {
  1590. char *r;
  1591. int len;
  1592. X
  1593. X   r = strsave(s);
  1594. X   len = strlen(r);
  1595. X   if(r[len - 1] == '\n')
  1596. X       r[len - 1] = 0;
  1597. X   return(r);
  1598. }
  1599. SHAR_EOF
  1600. chmod 0644 xalloc.c ||
  1601. echo 'restore of xalloc.c failed'
  1602. Wc_c="`wc -c < 'xalloc.c'`"
  1603. test 2067 -eq "$Wc_c" ||
  1604.     echo 'xalloc.c: original size 2067, current size' "$Wc_c"
  1605. fi
  1606. # ============= msgidseq.c ==============
  1607. if test -f 'msgidseq.c' -a X"$1" != X"-c"; then
  1608.     echo 'x - skipping msgidseq.c (File already exists)'
  1609. else
  1610. echo 'x - extracting msgidseq.c (Text)'
  1611. sed 's/^X//' << 'SHAR_EOF' > 'msgidseq.c' &&
  1612. /*:ts=4*/
  1613. /*****************************************************************************
  1614. X * FIDOGATE --- Gateway software UNIX <-> FIDO
  1615. X *
  1616. X * $Id: msgidseq.c,v 1.1 90/11/05 20:50:47 mj Exp $
  1617. X *
  1618. X * Output new message id number from sequencer file. Stand alone program
  1619. X * for use by CNews. 
  1620. X *
  1621. X * Install this program in /u/lib/newsbin or similar directory. Then change
  1622. X * Message-ID: generating software to use msgidseq, e.g. last line of
  1623. X * inject/anne.jones for CNews.
  1624. X *
  1625. X * $Log:   msgidseq.c,v $
  1626. X * Revision 1.1  90/11/05  20:50:47  mj
  1627. X * Changed my signature in all program headers.
  1628. X * 
  1629. X * Revision 1.0  90/08/18  15:43:18  mj
  1630. X * Initial revision
  1631. X * 
  1632. X *
  1633. X *****************************************************************************
  1634. X * This version hacked and maintained by:
  1635. X *    _____ _____
  1636. X *   |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1637. X *   | | | |   | |   Republikplatz 3   DOMAIN:  mju@dfv.rwth-aachen.de
  1638. X *   |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1639. X *
  1640. X *****************************************************************************/
  1641. X
  1642. #include "fidogate.h"
  1643. X
  1644. X
  1645. X
  1646. int verbose = 0;
  1647. X
  1648. X
  1649. main()
  1650. {
  1651. long msgid;
  1652. X
  1653. X   msgid = sequencer(MSGIDSEQ);
  1654. X   printf("%ld\n", msgid);
  1655. }
  1656. SHAR_EOF
  1657. chmod 0644 msgidseq.c ||
  1658. echo 'restore of msgidseq.c failed'
  1659. Wc_c="`wc -c < 'msgidseq.c'`"
  1660. test 1206 -eq "$Wc_c" ||
  1661.     echo 'msgidseq.c: original size 1206, current size' "$Wc_c"
  1662. fi
  1663. exit 0
  1664.  
  1665. --
  1666.  _____ _____
  1667. |     |___  |   Martin Junius     FIDO:    2:242/6.1   2:242/6.0
  1668. | | | |   | |   Republikplatz 3   DOMAIN:  mj@dfv.rwth-aachen.de
  1669. |_|_|_|_____|   D-5100 Aachen     Tel. (Voice) 0241-86931
  1670.