home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / de / comp / sources / os9 / 6 < prev    next >
Encoding:
Internet Message Format  |  1992-12-23  |  44.3 KB

  1. Xref: sparky de.comp.sources.os9:6 comp.os.os9:1548
  2. Path: sparky!uunet!zaphod.mps.ohio-state.edu!cs.utexas.edu!sun-barr!news2me.EBay.Sun.COM!seven-up.East.Sun.COM!sungy!stasys!stasys!not-for-mail
  3. From: frank.kaefer@stasys.sta.sub.org (Frank Kaefer)
  4. Newsgroups: de.comp.sources.os9,comp.os.os9
  5. Subject: MNews Prerelease Part08/09
  6. Message-ID: <1hafdpINNptp@stasys.sta.sub.org>
  7. Date: 23 Dec 92 19:41:45 GMT
  8. Sender: news@stasys.sta.sub.org
  9. Followup-To: de.comp.sources.d
  10. Organization: Stasys News Server, Starnberg, Germany
  11. Lines: 1958
  12. Approved: frank.kaefer@stasys.sta.sub.org (Frank Kaefer)
  13. NNTP-Posting-Host: stasys.sta.sub.org
  14.  
  15. Submitted-by: Ulrich Dessauer <ud@Nightmare.ddt.sub.org>
  16. Archive-name: mnews/part08
  17.  
  18. : ----- Cut here ----- Cut here ----- Cut here ----- Cut here -----
  19. : Use  sh filename  to extract shell archive
  20. : This shell archive contains following files:
  21. :     'RNEWS/compr7.c                               3373 bytes'
  22. :     'RNEWS/conv.c                                 2289 bytes'
  23. :     'RNEWS/logit.c                                 940 bytes'
  24. :     'RNEWS/mail.c                                  779 bytes'
  25. :     'RNEWS/rnews.c                                5196 bytes'
  26. :     'RNEWS/rnews.h                                 624 bytes'
  27. :     'RNEWS/send.c                                 2835 bytes'
  28. :     'SBATCH/Makefile                               589 bytes'
  29. :     'SBATCH/batch.c                               2157 bytes'
  30. :     'SBATCH/com.c                                 2736 bytes'
  31. :     'SBATCH/com7.c                                1777 bytes'
  32. :     'SBATCH/conv.c                                3579 bytes'
  33. :     'SBATCH/exec.c                                 859 bytes'
  34. :     'SBATCH/file.c                                1820 bytes'
  35. :     'SBATCH/none.c                                1136 bytes'
  36. :     'SBATCH/sbatch.c                              7077 bytes'
  37. if test -f 'RNEWS/compr7.c' ; then
  38.   echo 'File RNEWS/compr7.c already exists, overwriting it'
  39.   del 'RNEWS/compr7.c'
  40. fi
  41. echo Extracting \"'RNEWS/compr7.c'\"
  42. sed "s/^X//" >'RNEWS/compr7.c' <<'__END__OF__THIS__FILE__'
  43. X/*
  44. X * $Log:    compr7.c_v $
  45. X * Revision 1.1  90/08/31  15:38:01  ud
  46. X * Initial revision
  47. X * 
  48. X */
  49. X# ifndef    LINT
  50. Xstatic char rcsid[] = "$Id: compr7.c_v 1.1 90/08/31 15:38:01 ud Exp $";
  51. X# endif        LINT
  52. X# include <stdio.h>
  53. X# include <ctype.h>
  54. X# include <modes.h>
  55. X# include "rnews.h"
  56. X
  57. Xextern void    free ();
  58. Xextern void    logit ();
  59. Xextern void    start_rnews ();
  60. Xextern long    lseek ();
  61. Xextern char    *findmod ();
  62. Xextern char    *index ();
  63. Xextern char    *mktemp ();
  64. Xextern char    *strcpy ();
  65. X
  66. Xint
  67. Xexec (cmd)
  68. Xchar *cmd;
  69. X{
  70. X    extern int os9forkc ();
  71. X    extern char **environ;
  72. X    char *newcmd;
  73. X    register char *x;
  74. X    char *arg[10];
  75. X    int t,pid;
  76. X    
  77. X    if ((newcmd = (char *) malloc ((unsigned int) (strlen (cmd) + 2))) == (char *) NULL)
  78. X        return (-1);
  79. X    t = 0;
  80. X    (void) strcpy (newcmd,cmd);
  81. X    x = newcmd;
  82. X    while (*x && (t < 9)) {
  83. X        arg[t++] = x;
  84. X        while (*x && (!isspace (*x)))
  85. X            ++x;
  86. X        if (*x) {
  87. X            *x++ = '\0';
  88. X            while (isspace (*x))
  89. X                ++x;
  90. X        }
  91. X    }
  92. X    arg[t] = NULL;
  93. X    logit (4,"Fork: '%s'\n",arg[0]);
  94. X    pid = os9exec (os9forkc,findmod (arg[0],arg[0]),arg,environ,0,0,3);
  95. X    logit ((pid < 0) ? 2 : 4,"pid of '%s' is %d\n",arg[0],pid);
  96. X    free (newcmd);
  97. X    return (pid);
  98. X}
  99. X
  100. Xvoid    
  101. Xcompr7 (fd,scratch,cmd)
  102. Xint fd;
  103. Xint scratch;
  104. Xchar *cmd;
  105. X{
  106. X    int        old0, old1;
  107. X    int        pid1, pid2;
  108. X    int        pip;
  109. X    int        o, t, status;
  110. X    char        tmp[40 + sizeof (TEMPDIR)];
  111. X    unsigned int    siz, temp;
  112. X    register char    *x;
  113. X    register int    n;
  114. X    char        *buf;
  115. X    
  116. X    if ((pip = create ("/pipe",S_IREAD | S_IWRITE,03, 0)) < 0) {
  117. X        error |= FATAL;
  118. X        return;
  119. X    }
  120. X    (void) sprintf (tmp, "%s/dec.XXXXXX", TEMPDIR);
  121. X    (void) mktemp (tmp);
  122. X    if ((o = create (tmp,S_IREAD | S_IWRITE,03, 0)) < 0) {
  123. X        logit (2,"ERROR:  Can't create tmpfile '%s'\n",tmp);
  124. X        (void) close (pip);
  125. X        error |= FATAL;
  126. X        return;
  127. X    }
  128. X    old0 = dup (0);
  129. X    old1 = dup (1);
  130. X    if (fd != 0) {
  131. X        (void) close (0);
  132. X        (void) dup (fd);
  133. X    }
  134. X    (void) close (1);
  135. X    (void) dup (pip);
  136. X    if ((pid1 = exec (decode)) < 0) {
  137. X        (void) close (1);
  138. X        (void) dup (old1);
  139. X        if (fd != 0) {
  140. X            (void) close (0);
  141. X            (void) dup (old0);
  142. X        }
  143. X        (void) close (pip);
  144. X        (void) close (o);
  145. X        _unlink (tmp);
  146. X        error |= FATAL;
  147. X        return;
  148. X    }
  149. X    (void) close (1);
  150. X    (void) close (0);
  151. X    if (fd != 0)
  152. X        (void) close (fd);
  153. X    else {
  154. X        (void) close (old0);
  155. X        old0 = -1;
  156. X    }
  157. X    (void) dup (pip);
  158. X    (void) close (pip);
  159. X    (void) dup (o);
  160. X    if ((pid2 = exec (cmd)) < 0) {
  161. X        (void) close (1);
  162. X        (void) dup (old1);
  163. X        (void) close (0);
  164. X        if (old0 != -1)
  165. X            (void) dup (old0);
  166. X        (void) close (o);
  167. X        _unlink (tmp);
  168. X        error |= FATAL;
  169. X        return;
  170. X    }
  171. X    (void) close (0);
  172. X    if (old0 != -1) {
  173. X        (void) dup (old0);
  174. X        (void) close (old0);
  175. X    }
  176. X    (void) close (1);
  177. X    (void) dup (old1);
  178. X    (void) close (old1);
  179. X    while (((t = wait (&status)) != -1) && ((pid1 != -1) || (pid2 != -1))) {
  180. X        logit (status ? 2 : 4,"%d returns %d\n",t,status);
  181. X        if (t == pid1) {
  182. X            if (status)
  183. X                error |= FATAL;
  184. X            pid1 = -1;
  185. X        }
  186. X        if (t == pid2) {
  187. X            if (status)
  188. X                error |= FATAL;
  189. X            pid2 = -1;
  190. X        }
  191. X    }
  192. X    (void) lseek (o,0,0);
  193. X    siz = 20000;
  194. X    while (siz && ((buf = (char *) malloc (siz + 5)) == (char *) NULL))
  195. X        siz -= 1000;
  196. X    if (!siz) {
  197. X        (void) close (o);
  198. X        _unlink (tmp);
  199. X        error |= FATAL;
  200. X        return;
  201. X    }
  202. X    while ((n = read (o,buf,siz)) > 0) {
  203. X        temp = n;
  204. X        (void) lseek (o,(long) 0-n,1);
  205. X        x = buf;
  206. X        while (n-- > 0) {
  207. X            if (*x && index ("\l\r",*x))
  208. X                *x = *x == '\l' ? '\r' : '\l';
  209. X            ++x;
  210. X        }
  211. X        (void) write (o,buf,temp);
  212. X    }
  213. X    (void) lseek (o,0,0);
  214. X    start_rnews (o,scratch);
  215. X    (void) close (o);
  216. X    free (buf);
  217. X    _unlink (tmp);
  218. X}
  219. __END__OF__THIS__FILE__
  220. if test -f 'RNEWS/conv.c' ; then
  221.   echo 'File RNEWS/conv.c already exists, overwriting it'
  222.   del 'RNEWS/conv.c'
  223. fi
  224. echo Extracting \"'RNEWS/conv.c'\"
  225. sed "s/^X//" >'RNEWS/conv.c' <<'__END__OF__THIS__FILE__'
  226. X/*
  227. X * $Log:    conv.c_v $
  228. X * Revision 1.1  90/08/31  15:38:06  ud
  229. X * Initial revision
  230. X * 
  231. X */
  232. X# ifndef    LINT
  233. Xstatic char rcsid[] = "$Id: conv.c_v 1.1 90/08/31 15:38:06 ud Exp $";
  234. X# endif        LINT
  235. X# include    <stdio.h>
  236. X# include    "rnews.h"
  237. X
  238. Xextern char    *malloc ();
  239. Xextern char    *strdup ();
  240. X
  241. Xtypedef struct _keymap {
  242. X    char        *seq;
  243. X    int        len;
  244. X    unsigned char    map;
  245. X    struct _keymap    *next;
  246. X} keymap;
  247. X
  248. Xstatic keymap    *kmap[256];
  249. X
  250. Xstatic int    isinit = FALSE;
  251. X
  252. Xstatic keymap kdefault[] = {
  253. X#ifdef    ISO
  254. X    "\\\"A",    3,    0xc4,        NULL,
  255. X    "\\\"O",    3,    0xd6,        NULL,
  256. X    "\\\"U",    3,    0xdc,        NULL,
  257. X    "\\\"a",    3,    0xe4,        NULL,
  258. X    "\\\"o",    3,    0xf6,        NULL,
  259. X    "\\\"u",    3,    0xfc,        NULL,
  260. X    "\\\"s",    3,    0xdf,        NULL,
  261. X
  262. X    "A\\\"",    3,    0xc4,        NULL,
  263. X    "O\\\"",    3,    0xd6,        NULL,
  264. X    "U\\\"",    3,    0xdc,        NULL,
  265. X    "a\\\"",    3,    0xe4,        NULL,
  266. X    "o\\\"",    3,    0xf6,        NULL,
  267. X    "u\\\"",    3,    0xfc,        NULL,
  268. X    "s\\\"",    3,    0xdf,        NULL,
  269. X#endif    ISO
  270. X#ifdef    CUMANA_ST
  271. X    "\\\"A",    3,    0x8e,        NULL,
  272. X    "\\\"O",    3,    0x99,        NULL,
  273. X    "\\\"U",    3,    0x9a,        NULL,
  274. X    "\\\"a",    3,    0x84,        NULL,
  275. X    "\\\"o",    3,    0x94,        NULL,
  276. X    "\\\"u",    3,    0x81,        NULL,
  277. X    "\\\"s",    3,    0xe1,        NULL,
  278. X
  279. X    "A\\\"",    3,    0x8e,        NULL,
  280. X    "O\\\"",    3,    0x99,        NULL,
  281. X    "U\\\"",    3,    0x9a,        NULL,
  282. X    "a\\\"",    3,    0x84,        NULL,
  283. X    "o\\\"",    3,    0x94,        NULL,
  284. X    "u\\\"",    3,    0x81,        NULL,
  285. X    "s\\\"",    3,    0xe1,        NULL,
  286. X#endif    CUMANA_ST
  287. X    NULL,        0,    0,        NULL
  288. X};
  289. X
  290. Xstatic void
  291. Xinit_conv ()
  292. X{
  293. X    register int    t;
  294. X    keymap        *tmp, *t2;
  295. X
  296. X    for (t = 0; t < 256; ++t)
  297. X        kmap[t] = NULL;
  298. X    for (t = 0; kdefault[t].seq; ++t)
  299. X        if (tmp = (keymap *) malloc (sizeof (keymap)))
  300. X            if (tmp->seq = strdup (kdefault[t].seq)) {
  301. X                tmp->len = kdefault[t].len;
  302. X                tmp->map = kdefault[t].map;
  303. X                tmp->next = 0;
  304. X                if (t2 = kmap[tmp->seq[0] & 0xff]) {
  305. X                    while (t2->next)
  306. X                        t2 = t2->next;
  307. X                    t2->next = tmp;
  308. X                } else
  309. X                    kmap[tmp->seq[0] & 0xff] = tmp;
  310. X            } else
  311. X                free ((char *) tmp);
  312. X    isinit = TRUE;
  313. X}
  314. X
  315. Xvoid
  316. Xconv_8bit (s, n, fp)
  317. Xregister char *s;
  318. Xregister int n;
  319. Xregister FILE *fp;
  320. X{
  321. X    unsigned char    c;
  322. X    register keymap    *tmp;
  323. X
  324. X    if (!isinit)
  325. X        init_conv ();
  326. X    while (n-- > 0)
  327. X        if (tmp = kmap[((unsigned char) *s) & 0xff]) {
  328. X            while (tmp)
  329. X                if ((n >= tmp->len) && (!strncmp (s, tmp->seq, tmp->len)))
  330. X                    break;
  331. X                else
  332. X                    tmp = tmp->next;
  333. X            if (tmp) {
  334. X                n -= tmp->len - 1;
  335. X                s += tmp->len;
  336. X                putc (tmp->map, fp);
  337. X            } else
  338. X                putc (*s++, fp);
  339. X        } else
  340. X            putc (*s++, fp);
  341. X}
  342. __END__OF__THIS__FILE__
  343. if test -f 'RNEWS/logit.c' ; then
  344.   echo 'File RNEWS/logit.c already exists, overwriting it'
  345.   del 'RNEWS/logit.c'
  346. fi
  347. echo Extracting \"'RNEWS/logit.c'\"
  348. sed "s/^X//" >'RNEWS/logit.c' <<'__END__OF__THIS__FILE__'
  349. X/*
  350. X * $Log:    logit.c_v $
  351. X * Revision 1.1  90/08/31  15:38:12  ud
  352. X * Initial revision
  353. X * 
  354. X */
  355. X# ifndef    LINT
  356. Xstatic char rcsid[] = "$Id: logit.c_v 1.1 90/08/31 15:38:12 ud Exp $";
  357. X# endif        LINT
  358. X# include <stdio.h>
  359. X# include <time.h>
  360. X# include "rnews.h"
  361. X
  362. Xextern time_t        time ();
  363. Xextern char        *asctime ();
  364. Xextern struct tm    *localtime ();
  365. X
  366. X /*VARARGS2*/
  367. Xvoid
  368. Xlogit (nr,a,b,c,d,e,f)
  369. Xint nr;
  370. Xchar *a,*b,*c,*d,*e,*f;
  371. X{
  372. X    static int    first = TRUE;
  373. X    time_t        t;
  374. X    struct tm    *tt;
  375. X    static char    tbuf[32];
  376. X
  377. X    if (first) {
  378. X        (void) time (&t);
  379. X        if (tt = localtime (& t))
  380. X            sprintf (tbuf, "%02d/%02d/%02d  %02d:%02d:%02d",
  381. X                tt -> tm_year, tt -> tm_mon + 1, tt -> tm_mday,
  382. X                tt -> tm_hour, tt -> tm_min, tt -> tm_sec);
  383. X        else
  384. X            tbuf[0] = '\0';
  385. X        (void) fprintf (stderr,"Start: %s", tbuf);
  386. X        first = FALSE;
  387. X    }
  388. X    (void) fprintf (stderr,a,b,c,d,e,f);
  389. X    if ((!lp) || (Debug < nr))
  390. X        return;
  391. X    (void) fprintf (lp,"%s: ", tbuf);
  392. X    (void) fprintf (lp,a,b,c,d,e,f);
  393. X}
  394. __END__OF__THIS__FILE__
  395. if test -f 'RNEWS/mail.c' ; then
  396.   echo 'File RNEWS/mail.c already exists, overwriting it'
  397.   del 'RNEWS/mail.c'
  398. fi
  399. echo Extracting \"'RNEWS/mail.c'\"
  400. sed "s/^X//" >'RNEWS/mail.c' <<'__END__OF__THIS__FILE__'
  401. X/*
  402. X * $Log:    mail.c_v $
  403. X * Revision 1.1  90/08/31  15:38:14  ud
  404. X * Initial revision
  405. X * 
  406. X */
  407. X# ifndef    LINT
  408. Xstatic char rcsid[] = "$Id: mail.c_v 1.1 90/08/31 15:38:14 ud Exp $";
  409. X# endif        LINT
  410. X# include    <stdio.h>
  411. X
  412. Xextern char    *cuserid ();
  413. Xextern FILE    *popen ();
  414. X
  415. Xvoid
  416. Xsend_mail (lost, articles)
  417. Xint lost;
  418. Xint articles;
  419. X{
  420. X    char    cmd[128];
  421. X    char    *name;
  422. X    FILE    *fp;
  423. X    
  424. X    if ((name = cuserid ()) == (char *) NULL)
  425. X        name = "postmaster";
  426. X    (void) sprintf (cmd, "%s %s", findmod ("/h0/ETC/CMDS/rmail", "rmail"), name);
  427. X    if ((fp = popen (cmd, "w")) == (FILE *) NULL) {
  428. X        logit (2, "ERROR: Can't fork rmail\n");
  429. X        return;
  430. X    }
  431. X    (void) fprintf (fp, "Subject: Failed articles\n\n");
  432. X    (void) fprintf (fp, "Spooled: %d\n", articles);
  433. X    (void) fprintf (fp, "Failed:  %d\n", lost);
  434. X    (void) pclose (fp);
  435. X}
  436. __END__OF__THIS__FILE__
  437. if test -f 'RNEWS/rnews.c' ; then
  438.   echo 'File RNEWS/rnews.c already exists, overwriting it'
  439.   del 'RNEWS/rnews.c'
  440. fi
  441. echo Extracting \"'RNEWS/rnews.c'\"
  442. sed "s/^X//" >'RNEWS/rnews.c' <<'__END__OF__THIS__FILE__'
  443. X/*
  444. X * $Log:    main.c_v $
  445. X * Revision 1.1  90/08/31  15:38:17  ud
  446. X * Initial revision
  447. X * 
  448. X */
  449. X# ifndef    LINT
  450. Xstatic char rcsid[] = "$Id: main.c_v 1.1 90/08/31 15:38:17 ud Exp $";
  451. Xstatic char copyright[] = "Copyright (C) 1989, 1990 by Ulrich Dessauer, Germering, Germany.\n";
  452. X# endif        LINT
  453. X# include <stdio.h>
  454. X# include <modes.h>
  455. X# define EXTERN
  456. X# include "rnews.h"
  457. X
  458. Xextern void     compr ();
  459. Xextern void    compr7 ();
  460. Xextern void    exit ();
  461. Xextern void    logit ();
  462. Xextern void    send_mail ();
  463. Xextern long    lseek ();
  464. Xextern char    *info_str ();
  465. Xextern char    *malloc ();
  466. Xextern char    *mktemp ();
  467. Xextern char    *strcpy ();
  468. Xextern FILE    *fopen ();
  469. X
  470. Xvoid        start_rnews ();
  471. X
  472. Xextern int    errno;
  473. X
  474. Xstatic int yet;
  475. X
  476. Xstatic char *help[] = {
  477. X    "Syntax: rnews [<opts>] [<file>] [<opts>]\n",
  478. X    "Function: reading standard input or file and parsing batched news\n",
  479. X    "Options:\n",
  480. X    "     -d<=>num      Debuglevel\n",
  481. X    NULL
  482. X};
  483. X
  484. Xvoid
  485. Xusage ()
  486. X{
  487. X    int t;
  488. X    
  489. X    for (t=0;help[t];++t)
  490. X        (void) fputs (help[t],stderr);
  491. X}
  492. X
  493. Xvoid
  494. Xparse_args (ac,av)
  495. Xint ac;
  496. Xchar *av[];
  497. X{
  498. X    int t;
  499. X    char *x;
  500. X    int i;
  501. X
  502. X    Debug = 0;
  503. X    i = -1;
  504. X    for (t=1;t<ac;++t)
  505. X        if (*av[t] == '-') {
  506. X            x = av[t] + 1;
  507. X            while (*x) {
  508. X                switch (*x) {
  509. X                    case 'd':
  510. X                        x += (*(x+1) == '=' ? 2 : 1);
  511. X                        Debug = atoi (x);
  512. X                        while (*x)
  513. X                            ++x;
  514. X                        break;
  515. X                    case '?':
  516. X                    default:
  517. X                        usage ();
  518. X                        exit (1);
  519. X                }
  520. X                if (*x)
  521. X                    ++x;
  522. X            }
  523. X        } else
  524. X            if (i == -1)
  525. X                if ((i = open (av[t],S_IREAD)) != -1) {
  526. X                    (void) close (0);
  527. X                    (void) dup (i);
  528. X                    (void) close (i);
  529. X                    i = 0;
  530. X                }
  531. X}
  532. X
  533. Xmain (argc,argv)
  534. Xint argc;
  535. Xchar *argv[];
  536. X{
  537. X    char    tmp[40 + sizeof (TEMPDIR)];
  538. X    char    s[512];
  539. X    int    i;
  540. X    
  541. X    parse_args (argc,argv);
  542. X    (void) sprintf (tmp, "%s/rn.XXXXXX", TEMPDIR);
  543. X    (void) mktemp (tmp);
  544. X    unlink (tmp);
  545. X    if ((i = create (tmp,S_IWRITE | S_IREAD,03, 0)) < 0)
  546. X        exit (_errmsg (1,"Can't create temp-file!\n"));
  547. X
  548. X    if ((info_str (INEWS,s,512) == (char *) NULL) || ((inews= (char *) malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  549. X        inews = INEWS;
  550. X    else
  551. X        (void) strcpy (inews, s);
  552. X    if ((info_str (UNCOMPRESS,s,512) == (char *) NULL) || ((uncompress = (char *) malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  553. X        uncompress = UNCOMPRESS;
  554. X    else
  555. X        (void) strcpy (uncompress,s);
  556. X    if ((info_str (MELT,s,512) == (char *) NULL) || ((melt = (char *) malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  557. X        melt = MELT;
  558. X    else
  559. X        (void) strcpy (melt,s);
  560. X    if ((info_str (DECODE,s,512) == (char *) NULL) || ((decode = (char *) malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  561. X        decode = DECODE;
  562. X    else
  563. X        (void) strcpy (decode,s);
  564. X
  565. X    if ((info_str (RNEWSLOG,s,512) == (char *) NULL) || ((lpfn = (char *) malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  566. X        lpfn = LPFN;
  567. X    else
  568. X        (void) strcpy (lpfn,s);
  569. X
  570. X    if ((info_str (RNEWS_SPOOL, s, 512) == (char *) NULL) || ((rnews_spool = malloc ((unsigned int) strlen (s) + 2)) == (char *) NULL))
  571. X        rnews_spool = RNEWS_SPOOLDIR;
  572. X    else
  573. X        (void) strcpy (rnews_spool, s);
  574. X
  575. X    if (access (lpfn,S_IWRITE) < 0)
  576. X        lp = NULL;
  577. X    else
  578. X        lp = fopen (lpfn,"a");
  579. X
  580. X    logit (0,"=== Started (Level %d) ===\n",Debug);
  581. X    error = 0;
  582. X    lost = 0;
  583. X    yet = 0;
  584. X    articles = 0;
  585. X    start_rnews (0,i);
  586. X    (void) close (i);
  587. X    _unlink (tmp);
  588. X    logit (0,"Exits with error %d (Received %d articles)\n",error, articles);
  589. X
  590. X    if (lp) {
  591. X        (void) fclose (lp);
  592. X        lp = NULL;
  593. X    }
  594. X    if (lost)
  595. X        send_mail (lost, articles);
  596. X    exit (error & FATAL ? error : 0);
  597. X}
  598. X
  599. Xvoid
  600. Xstart_rnews (fd,i)
  601. Xint fd;
  602. Xint i;
  603. X{
  604. X    char s[512], sav;
  605. X    int len,mode;
  606. X    int n;
  607. X
  608. X    len = -1;
  609. X    mode = NONE;
  610. X    while ((n = readln (fd,s,512)) > 0) {
  611. X        sav = s[n-1];
  612. X        s[n-1] = '\0';
  613. X        logit (6,"Start_rnews reads '%s'\n",s);
  614. X        if (*s == '#')
  615. X            if (!strncmp (s,BATCHHEAD,BATCHLEN)) {
  616. X                len = get_len (s);
  617. X                logit (1,"Receive batched, len = %d\n",len);
  618. X                mode = BATCH;
  619. X                break;
  620. X            } else if (!strncmp (s,COMHEAD,COMLEN)) {
  621. X                logit (1,"Receive batch/compr\n");
  622. X                mode = COM;
  623. X                break;
  624. X            } else if (!strncmp (s,COM7HEAD,COM7LEN)) {
  625. X                logit (1,"Receive batch/compr/encode\n");
  626. X                mode = COM7;
  627. X                break;
  628. X            } else if (!strncmp (s,FREHEAD,FRELEN)) {
  629. X                logit (1,"Receive batch/freeze\n");
  630. X                mode = FRE;
  631. X                break;
  632. X            } else if (!strncmp (s,FRE7HEAD,FRE7LEN)) {
  633. X                logit (1,"Receive batch/freeze/encode\n");
  634. X                mode = FRE7;
  635. X                break;
  636. X            } else {
  637. X                (void) writeln (i,s,(unsigned int) (n - 1));
  638. X                (void) writeln (i, &sav, 1);
  639. X            }
  640. X        else {
  641. X            (void) writeln (i,s,(unsigned int) (n - 1));
  642. X            (void) writeln (i, &sav, 1);
  643. X        }
  644. X    }
  645. X    if (yet & (1<<mode)) {
  646. X        logit (2,"ERROR: This batch already done\n");
  647. X        error |= SIMPLE;
  648. X        return;
  649. X    } else
  650. X        yet |= 1<<mode;
  651. X    switch (mode) {
  652. X        case NONE:
  653. X            (void) lseek (i,0,0);
  654. X            n = _gs_size (i);
  655. X            logit (3,"Send single File, size = %d\n",n);
  656. X            (void) send_to_inews (i,n);
  657. X            break;
  658. X        case BATCH:
  659. X            logit (3,"Send batch to inews\n");
  660. X            while ((len = send_to_inews (fd,len)) != -1)
  661. X                logit (3,"Sent, next len = %d\n",len);
  662. X            logit (3,"Finished sending batch to inews\n");
  663. X            break;
  664. X        case COM:
  665. X        case FRE:
  666. X            logit (3,"Send compress\n");
  667. X            compr (fd,i,mode == COM ? uncompress : melt);
  668. X            break;
  669. X        case COM7:
  670. X        case FRE7:
  671. X            logit (3,"Send compress/encode\n");
  672. X            compr7 (fd,i,mode == COM7 ? uncompress : melt);
  673. X            break;
  674. X    }
  675. X}
  676. __END__OF__THIS__FILE__
  677. if test -f 'RNEWS/rnews.h' ; then
  678.   echo 'File RNEWS/rnews.h already exists, overwriting it'
  679.   del 'RNEWS/rnews.h'
  680. fi
  681. echo Extracting \"'RNEWS/rnews.h'\"
  682. sed "s/^X//" >'RNEWS/rnews.h' <<'__END__OF__THIS__FILE__'
  683. X/*
  684. X * $Log:    rnews.h_v $
  685. X * Revision 1.1  90/08/31  15:38:22  ud
  686. X * Initial revision
  687. X * 
  688. X */
  689. X# include    "news.h"
  690. X
  691. X# define    RNEWSLOG    "rnews.logfile"
  692. X# define    LPFN        MNEWS_RNEWS_LOGFILE
  693. X
  694. X# define    RNEWS_SPOOL    "RNEWS.DIR"
  695. X# define    RNEWS_SPOOLDIR    MNEWS_RNEWS_SPOOLDIR
  696. X# define    RNEWS_SPOOLSEQ    ".seq"
  697. X
  698. X# ifndef    EXTERN
  699. X# define    EXTERN        extern
  700. X# endif        EXTERN
  701. X
  702. XEXTERN char    *inews;
  703. XEXTERN char    *uncompress;
  704. XEXTERN char    *melt;
  705. XEXTERN char    *decode;
  706. XEXTERN int    error;
  707. X
  708. XEXTERN FILE    *lp;
  709. XEXTERN char    *lpfn;
  710. XEXTERN char    *rnews_spool;
  711. XEXTERN int    Debug;
  712. XEXTERN int    articles;
  713. XEXTERN int    lost;
  714. X
  715. X# define    _unlink(s)    if (Debug < 3) (void) unlink(s)
  716. __END__OF__THIS__FILE__
  717. if test -f 'RNEWS/send.c' ; then
  718.   echo 'File RNEWS/send.c already exists, overwriting it'
  719.   del 'RNEWS/send.c'
  720. fi
  721. echo Extracting \"'RNEWS/send.c'\"
  722. sed "s/^X//" >'RNEWS/send.c' <<'__END__OF__THIS__FILE__'
  723. X/*
  724. X * $Log:    send.c_v $
  725. X * Revision 1.1  90/08/31  15:38:45  ud
  726. X * Initial revision
  727. X * 
  728. X */
  729. X# ifndef    LINT
  730. Xstatic char rcsid[] = "$Id: send.c_v 1.1 90/08/31 15:38:45 ud Exp $";
  731. X# endif        LINT
  732. X# include <stdio.h>
  733. X# include <ctype.h>
  734. X# include <modes.h>
  735. X# include "rnews.h"
  736. X
  737. Xextern void    logit ();
  738. Xextern char    *realloc ();
  739. Xextern FILE    *xpopen ();
  740. X
  741. Xvoid        save_it ();
  742. X
  743. Xint
  744. Xget_len (s)
  745. Xregister char *s;
  746. X{
  747. X    if (strlen (s) <= BATCHLEN)
  748. X        return (-1);
  749. X    s += BATCHLEN;
  750. X    while (*s && (!isdigit (*s)))
  751. X        ++s;
  752. X    if (!*s)
  753. X        return (-1);
  754. X    else
  755. X        return (atoi (s));
  756. X}
  757. X
  758. Xint
  759. Xsend_to_inews (fd,len)
  760. Xint fd,len;
  761. X{
  762. X    static char *buf = NULL;
  763. X    static int csiz = 0;
  764. X    char s[512];
  765. X    int n;
  766. X    int asone;
  767. X    FILE *fp;
  768. X    int nlen;
  769. X    
  770. X    if (!(fp = xpopen (inews,"w"))) {
  771. X        logit (1,"Can't execute '%s'\n", inews);
  772. X        error |= FATAL;
  773. X        return (FALSE);
  774. X    }
  775. X    asone = FALSE;
  776. X    if (len > csiz) {
  777. X        while (len > csiz)
  778. X            csiz += 2048;
  779. X        if (!(buf = (char *) realloc (buf,(unsigned int) (csiz + 5)))) {
  780. X            csiz = 0;
  781. X            while ((len > 0) && ((n = readln (fd,s,512)) > 0)) {
  782. X                s[n] = '\0';
  783. X                logit (6,"Send line '%s' to %s\n", s, inews);
  784. X                (void) fputs (s,fp);
  785. X                len -= n;
  786. X            }
  787. X            asone = FALSE;
  788. X        }
  789. X    }
  790. X    if (len <= csiz)
  791. X        if ((n = read (fd,buf,(unsigned int) len)) == len) {
  792. X            logit (4,"Send article with %d Bytes to %s\n", len, inews);
  793. X            (void) fwrite (buf,n,1,fp);
  794. X            asone = TRUE;
  795. X        } else
  796. X            logit (2,"ERROR: Can't send to %s (reached eof, errno = %d)\n", inews, errno);
  797. X    nlen = -1;
  798. X    while ((n = readln (fd,s,512)) > 0) {
  799. X        s[n] = '\0';
  800. X        if (!strncmp (s,BATCHHEAD,BATCHLEN)) {
  801. X            nlen = get_len (s);
  802. X            logit (3,"Got next batchentry, len = %d\n",nlen);
  803. X            break;
  804. X        } else
  805. X            logit (6,"Skiping junk '%s'\n",s);
  806. X    }
  807. X    n = pclose (fp);
  808. X    logit (n ? 2 : 3,"Pclose returns %d\n",n);
  809. X    if (n)
  810. X        if (asone) {
  811. X            save_it (buf, len);
  812. X            ++lost;
  813. X            error |= SIMPLE;
  814. X        } else
  815. X            error |= FATAL;
  816. X    ++articles;
  817. X    return (nlen);
  818. X}
  819. X
  820. Xvoid
  821. Xsave_it (buf, len)
  822. Xchar *buf;
  823. Xint len;
  824. X{
  825. X    char    seq[128];
  826. X    char    fn[128];
  827. X    int    fd;
  828. X    int    nr;
  829. X    int    t;
  830. X    
  831. X    (void) sprintf (seq, "%s/%s", rnews_spool, RNEWS_SPOOLSEQ);
  832. X    t = 20;
  833. X    do {
  834. X        if (access (seq, S_IREAD | S_IWRITE) < 0) {
  835. X            fd = create (seq, S_IWRITE | S_ISHARE, 03 | S_ISHARE);
  836. X            nr = 1;
  837. X        } else {
  838. X            fd = open (seq, S_IREAD | S_IWRITE | S_ISHARE);
  839. X            if (fd > 0) {
  840. X                (void) read (fd, &nr, 4);
  841. X                (void) lseek (fd, 0, 0L);
  842. X            }
  843. X        }
  844. X        if (fd < 0)
  845. X            sleep (1);
  846. X    } while ((fd < 0) && (t-- > 0));
  847. X    if (fd < 0) {
  848. X        logit (2, "Can't get spool-seq (errno = %d)\n", errno);
  849. X        error |= FATAL;
  850. X        return;
  851. X    }
  852. X    (void) sprintf (fn, "%s/%05d", rnews_spool, nr++);
  853. X    (void) write (fd, &nr, 4);
  854. X    (void) close (fd);
  855. X    while (access (fn, 0) == 0)
  856. X        (void) strcat (fn, "a");
  857. X    if ((fd = create (fn, S_IWRITE, 03)) < 0) {
  858. X        logit (2, "Can't create spoolfile '%s'\n", fn);
  859. X        error |= FATAL;
  860. X        return;
  861. X    }
  862. X    (void) write (fd, buf, (unsigned int) len);
  863. X    (void) close (fd);
  864. X}
  865. __END__OF__THIS__FILE__
  866. if test -f 'SBATCH/Makefile' ; then
  867.   echo 'File SBATCH/Makefile already exists, overwriting it'
  868.   del 'SBATCH/Makefile'
  869. fi
  870. echo Extracting \"'SBATCH/Makefile'\"
  871. sed "s/^X//" >'SBATCH/Makefile' <<'__END__OF__THIS__FILE__'
  872. X# $Id: Makefile_v 1.1 90/08/31 15:40:27 ud Exp $
  873. X# $Log:    Makefile_v $
  874. X# Revision 1.1  90/08/31  15:40:27  ud
  875. X# Initial revision
  876. X# 
  877. X#
  878. XCC=    cc
  879. XG=    -g
  880. XCFLAGS=    -qt=/dd/TMP $G -v=.. -v=../8BIT
  881. XLIBS=    -l=/dd/LIB/os9lib.l -l=/h3/LIB/8bit.l
  882. XLFLAGS=    -q $(LIBS) $G
  883. XODIR=    /h0/ETC/CMDS
  884. X
  885. XBATCHC=    sbatch.c batch.c none.c com.c com7.c file.c exec.c conv.c
  886. XBATCHR=    sbatch.r batch.r none.r com.r com7.r file.r exec.r conv.r
  887. X
  888. X$(ODIR)/sbatch:    $(BATCHR)
  889. X    $(CC) $(LFLAGS) $(BATCHR) -f=$(ODIR)/sbatch
  890. X    fixmod -uo2.39 -ua8002 $(ODIR)/sbatch
  891. X
  892. Xtags:    $(BATCHC)
  893. X    echo "Ctags:" $?
  894. X    ctags $?
  895. X
  896. Xsbatch.r:    sbatch.c sbatch.h
  897. __END__OF__THIS__FILE__
  898. if test -f 'SBATCH/batch.c' ; then
  899.   echo 'File SBATCH/batch.c already exists, overwriting it'
  900.   del 'SBATCH/batch.c'
  901. fi
  902. echo Extracting \"'SBATCH/batch.c'\"
  903. sed "s/^X//" >'SBATCH/batch.c' <<'__END__OF__THIS__FILE__'
  904. X/*
  905. X * $Log:    batch.c_v $
  906. X * Revision 1.1  90/08/31  15:40:10  ud
  907. X * Initial revision
  908. X * 
  909. X */
  910. X# ifndef    LINT
  911. Xstatic char rcsid[] = "$Id: batch.c_v 1.1 90/08/31 15:40:10 ud Exp $";
  912. X# endif        LINT
  913. X# include <stdio.h>
  914. X# include <modes.h>
  915. X# include <dir.h>
  916. X# include "sbatch.h"
  917. X
  918. Xextern void        closedir ();
  919. Xextern void        send_file ();
  920. Xextern void        free ();
  921. Xextern long        lseek ();
  922. Xextern char        *conv_8bit ();
  923. Xextern char        *malloc ();
  924. Xextern char        *mktemp ();
  925. Xextern char        *strcat ();
  926. Xextern char        *strcpy ();
  927. Xextern DIR        *opendir ();
  928. Xextern struct direct    *readdir ();
  929. X
  930. Xvoid
  931. Xsend_batch (fd, sys)
  932. Xint fd;
  933. Xchar *sys;
  934. X{
  935. X    char    tmp[40 + sizeof (TEMPDIR)];
  936. X    int    i;
  937. X
  938. X    (void) sprintf (tmp, "%s/s_bt.XXXXXX", TEMPDIR);
  939. X    (void) mktemp (tmp);
  940. X    while ((i = make_batch (fd, tmp)) != -1) {
  941. X        send_file (sys, i);
  942. X        (void) unlink (tmp);
  943. X    }
  944. X    if (!access (tmp,0))
  945. X        (void) unlink (tmp);
  946. X}
  947. X
  948. Xvoid
  949. X_copy (in,out)
  950. Xregister int in, out;
  951. X{
  952. X    static char    *_bufptr = NULL;
  953. X    static char    sbuf[130];
  954. X    static int    siz;
  955. X    register int    n;
  956. X    register char    *buf;
  957. X
  958. X    if (!_bufptr) {
  959. X        siz = 20000;
  960. X        while (siz && (!(_bufptr = malloc (siz + 16))))
  961. X            siz -= 1000;
  962. X        if (!siz) {
  963. X            siz = 128;
  964. X            _bufptr = sbuf;
  965. X        }
  966. X    }
  967. X    buf = _bufptr;
  968. X    while ((n = read (in,buf,siz)) > 0)
  969. X        (void) write (out,buf,(unsigned int) n);
  970. X}
  971. X
  972. Xint
  973. Xmake_batch (fd, tmp)
  974. Xint fd;
  975. Xchar *tmp;
  976. X{
  977. X    int    found;
  978. X    char    s[128];
  979. X    int    o,i,siz,fsiz;
  980. X    char    *fn;
  981. X    int    n;
  982. X
  983. X    if ((o = create (tmp,S_IWRITE | S_IREAD,03,0)) < 0) {
  984. X        (void) fprintf (stderr,"Can't create '%s' (errno = %d)\n",tmp,errno);
  985. X        error = TRUE;
  986. X        return (-1);
  987. X    }
  988. X    found = FALSE;
  989. X    fsiz = 0;
  990. X    while ((n = readln (fd, buffer, 500)) > 0) {
  991. X        buffer[n-1] = '\0';
  992. X        fprintf (stderr, "Spooling %s\n", buffer);
  993. X        if (!(fn = conv_8bit (buffer)))
  994. X            continue;
  995. X        if ((i = open (fn, S_IREAD)) < 0) {
  996. X            fprintf (stderr, "File %s doesn't exists?!?\n", fn);
  997. X            continue;
  998. X        }
  999. X        siz = _gs_size (i);
  1000. X        (void) sprintf (s,"%s %d\n",BATCHHEAD,siz);
  1001. X        (void) write (o,s,(unsigned int) strlen (s));
  1002. X        _copy (i,o);
  1003. X        (void) close (i);
  1004. X        unlink (fn);
  1005. X        found = TRUE;
  1006. X        fsiz += siz;
  1007. X        if (fsiz > maxsiz)
  1008. X            break;
  1009. X    }
  1010. X    if (found) {
  1011. X        lseek (o, 0, 0);
  1012. X        return (o);
  1013. X    } else {
  1014. X        close (o);
  1015. X        return (-1);
  1016. X    }
  1017. X}
  1018. X
  1019. X
  1020. __END__OF__THIS__FILE__
  1021. if test -f 'SBATCH/com.c' ; then
  1022.   echo 'File SBATCH/com.c already exists, overwriting it'
  1023.   del 'SBATCH/com.c'
  1024. fi
  1025. echo Extracting \"'SBATCH/com.c'\"
  1026. sed "s/^X//" >'SBATCH/com.c' <<'__END__OF__THIS__FILE__'
  1027. X/*
  1028. X * $Log:    com.c_v $
  1029. X * Revision 1.1  90/08/31  15:40:13  ud
  1030. X * Initial revision
  1031. X * 
  1032. X */
  1033. X# ifndef    LINT
  1034. Xstatic char rcsid[] = "$Id: com.c_v 1.1 90/08/31 15:40:13 ud Exp $";
  1035. X# endif        LINT
  1036. X# include    <stdio.h>
  1037. X# include    <types.h>
  1038. X# include    <modes.h>
  1039. X# include    "sbatch.h"
  1040. X
  1041. Xextern void    free ();
  1042. Xextern void    send_file ();
  1043. Xextern long    lseek ();
  1044. Xextern char    *index ();
  1045. Xextern char    *malloc ();
  1046. Xextern char    *mktemp ();
  1047. Xextern char    *strcpy ();
  1048. X
  1049. Xvoid
  1050. Xlfcr (fd)
  1051. Xregister int fd;
  1052. X{
  1053. X    static char    *_bufptr = NULL;
  1054. X    static char    sbuf[130];
  1055. X    static u_int    siz;
  1056. X    register char    *buf;
  1057. X    register char    *x;
  1058. X    register u_int    temp;
  1059. X    register int    n;
  1060. X    
  1061. X    if (!_bufptr) {
  1062. X        siz = 20000;
  1063. X        while (siz && (!(_bufptr = malloc (siz + 5))))
  1064. X            siz -= 1000;
  1065. X        if (!siz) {
  1066. X            siz = 128;
  1067. X            _bufptr = sbuf;
  1068. X        }
  1069. X    }
  1070. X    buf = _bufptr;
  1071. X    while ((n = read (fd,buf,siz)) > 0) {
  1072. X        (void) lseek (fd,(long) -n,1);
  1073. X        temp = (u_int) n;
  1074. X        x = buf;
  1075. X        while (n-- > 0) {
  1076. X            if (*x && (index ("\l\r",*x) != (char *) NULL))
  1077. X                *x = *x == '\l' ? '\r' : '\l';
  1078. X            ++x;
  1079. X        }
  1080. X        (void) write (fd,buf,temp);
  1081. X    }
  1082. X}
  1083. X
  1084. Xvoid
  1085. Xsend_com (fd, sys, mode)
  1086. Xint fd;
  1087. Xchar *sys;
  1088. Xint mode;
  1089. X{
  1090. X    char    tmp[40 + sizeof (TEMPDIR)];
  1091. X    int    i;
  1092. X    
  1093. X    (void) sprintf (tmp, "%s/s_bt.XXXXXX", TEMPDIR);
  1094. X    (void) mktemp (tmp);
  1095. X    while ((i = make_batch (fd, tmp)) != -1) {
  1096. X        lfcr (i);
  1097. X        (void) lseek (i,0,0);
  1098. X        i = compress_it (i,tmp,mode == COM ? compress : freeze, TRUE);
  1099. X        if (i != -1)
  1100. X            send_file (sys,i);
  1101. X        (void) unlink (tmp);
  1102. X    }
  1103. X    if (!access (tmp,0))
  1104. X        (void) unlink (tmp);
  1105. X}
  1106. X
  1107. Xvoid
  1108. Xexec_cprs (cmd)
  1109. Xchar *cmd;
  1110. X{
  1111. X    int t,pid,status;
  1112. X    
  1113. X    pid = _exec (cmd);
  1114. X    if (pid < 0) {
  1115. X        (void) fprintf (stderr,"Can't fork '%s' (errno = %d)\n", cmd, errno);
  1116. X        error = TRUE;
  1117. X        return;
  1118. X    } else
  1119. X        while (((t = wait (&status)) != pid) && (t != -1))
  1120. X            ;
  1121. X    if (status) {
  1122. X        (void) fprintf (stderr,"'%s' returns %d (errno = %d)\n",cmd,status,errno);
  1123. X        error = TRUE;
  1124. X    }
  1125. X    return;
  1126. X}    
  1127. X
  1128. Xint
  1129. Xcompress_it (fd,sf,cmd,header)
  1130. Xint fd;
  1131. Xchar *sf;
  1132. Xchar *cmd;
  1133. Xint header;
  1134. X{
  1135. X    char    tmp[40 + sizeof (TEMPDIR)];
  1136. X    int    o0, o1;
  1137. X    int    o;
  1138. X    
  1139. X    fprintf (stderr, "Compress %d bytes\n", _gs_size (fd));
  1140. X    (void) sprintf (tmp, "%s/cpr.XXXXXX", TEMPDIR);
  1141. X    (void) mktemp (tmp);
  1142. X    if ((o = create (tmp,S_IREAD | S_IWRITE,03, 0)) < 0) {
  1143. X        (void) fprintf (stderr,"Can't create '%s' (errno = %d)\n",tmp,errno);
  1144. X        error = TRUE;
  1145. X        return (-1);
  1146. X    }
  1147. X    if (header) {
  1148. X        (void) write (o,COMHEAD,COMLEN);
  1149. X        (void) write (o,"\l",1);
  1150. X    }
  1151. X    o0 = dup (0);
  1152. X    o1 = dup (1);
  1153. X    (void) close (0);
  1154. X    (void) dup (fd);
  1155. X    (void) close (fd);
  1156. X    (void) close (1);
  1157. X    (void) dup (o);
  1158. X    exec_cprs (cmd);
  1159. X    (void) close (0);
  1160. X    (void) dup (o0);
  1161. X    (void) close (1);
  1162. X    (void) dup (o1);
  1163. X    (void) close (o0);
  1164. X    (void) close (o1);
  1165. X    (void) lseek (o,0,0);
  1166. X    lfcr (o);
  1167. X    (void) lseek (o,0,0);
  1168. X    (void) unlink (sf);
  1169. X    (void) strcpy (sf,tmp);
  1170. X    return (o);
  1171. X}
  1172. __END__OF__THIS__FILE__
  1173. if test -f 'SBATCH/com7.c' ; then
  1174.   echo 'File SBATCH/com7.c already exists, overwriting it'
  1175.   del 'SBATCH/com7.c'
  1176. fi
  1177. echo Extracting \"'SBATCH/com7.c'\"
  1178. sed "s/^X//" >'SBATCH/com7.c' <<'__END__OF__THIS__FILE__'
  1179. X/*
  1180. X * $Log:    com7.c_v $
  1181. X * Revision 1.1  90/08/31  15:40:17  ud
  1182. X * Initial revision
  1183. X * 
  1184. X */
  1185. X# ifndef    LINT
  1186. Xstatic char rcsid[] = "$Id: com7.c_v 1.1 90/08/31 15:40:17 ud Exp $";
  1187. X# endif        LINT
  1188. X# include    <stdio.h>
  1189. X# include    <modes.h>
  1190. X# include    "sbatch.h"
  1191. X
  1192. Xextern void    lfcr ();
  1193. Xextern void    send_file ();
  1194. Xextern long    lseek ();
  1195. Xextern char    *mktemp ();
  1196. Xextern char    *strcpy ();
  1197. X
  1198. Xvoid
  1199. Xsend_com7 (fd, sys, mode)
  1200. Xint fd;
  1201. Xchar *sys;
  1202. Xint mode;
  1203. X{
  1204. X    char    tmp[40 + sizeof (TEMPDIR)],
  1205. X        tmp2[40 + sizeof (TEMPDIR)];
  1206. X    int    i, status, t;
  1207. X    int    o, o0, o1;
  1208. X    int    pid;
  1209. X    
  1210. X    (void) sprintf (tmp, "%s/s_bt.XXXXXX", TEMPDIR);
  1211. X    (void) mktemp (tmp);
  1212. X    while ((i = make_batch (fd, tmp)) != -1) {
  1213. X        lfcr (i);
  1214. X        (void) lseek (i,0,0);
  1215. X        i = compress_it (i,tmp,mode == COM7 ? compress : freeze, FALSE);
  1216. X        (void) sprintf (tmp2, "%s/enc.XXXXXX", TEMPDIR);
  1217. X        (void) mktemp (tmp2);
  1218. X        if ((o = create (tmp2,S_IREAD | S_IWRITE,03, 0)) < 0) {
  1219. X            (void) fprintf (stderr,"Can't create tmp2 '%s' (errno = %d)\n",tmp2,errno);
  1220. X            (void) close (i);
  1221. X            (void) unlink (tmp);
  1222. X            error = TRUE;
  1223. X            return;
  1224. X        }
  1225. X        (void) write (o,COM7HEAD,COM7LEN);
  1226. X        (void) write (o,"\n",1);
  1227. X        o0 = dup (0);
  1228. X        (void) close (0);
  1229. X        (void) dup (i);
  1230. X        (void) close (i);
  1231. X        o1 = dup (1); 
  1232. X        (void) close (1);
  1233. X        (void) dup (o);
  1234. X        pid = _exec (encode);
  1235. X        (void) close (1); 
  1236. X        (void) dup (o1);
  1237. X        (void) close (0); 
  1238. X        (void) dup (o0);
  1239. X        if (pid < 0) {
  1240. X            (void) fprintf (stderr,"Can't fork '%s' (errno = %d)\n",encode,errno);
  1241. X            error = TRUE;
  1242. X        }
  1243. X        while (((t = wait (&status)) != pid) && (t != -1))
  1244. X            ;
  1245. X        if (status) {
  1246. X            (void) fprintf (stderr,"'%s' retuns %d (errno = %d)\n",encode,status,errno);
  1247. X            error = TRUE;
  1248. X        }
  1249. X        (void) unlink (tmp);
  1250. X        (void) lseek (o,0,0);
  1251. X        send_file (sys,o);
  1252. X        (void) unlink (tmp2);
  1253. X    }
  1254. X    if (!access (tmp,0))
  1255. X        (void) unlink (tmp);
  1256. X}
  1257. __END__OF__THIS__FILE__
  1258. if test -f 'SBATCH/conv.c' ; then
  1259.   echo 'File SBATCH/conv.c already exists, overwriting it'
  1260.   del 'SBATCH/conv.c'
  1261. fi
  1262. echo Extracting \"'SBATCH/conv.c'\"
  1263. sed "s/^X//" >'SBATCH/conv.c' <<'__END__OF__THIS__FILE__'
  1264. X/*
  1265. X * $Log:    conv.c_v $
  1266. X * Revision 1.1  90/08/31  15:41:09  ud
  1267. X * Initial revision
  1268. X * 
  1269. X */
  1270. X# ifndef    LINT
  1271. Xstatic char rcsid[] = "$Id: conv.c_v 1.1 90/08/31 15:41:09 ud Exp $";
  1272. X# endif        LINT
  1273. X# include    <stdio.h>
  1274. X# include    <c8type.h>
  1275. X# include    <types.h>
  1276. X# include    <modes.h>
  1277. X# include    "sbatch.h"
  1278. X
  1279. Xextern char    *strdup ();
  1280. X
  1281. Xstatic char    *ext_tab[256];
  1282. X
  1283. Xchar *
  1284. Xconv_8bit (ofn)
  1285. Xchar *ofn;
  1286. X{
  1287. X    static char    tmpfn[40 + sizeof (TEMPDIR)];
  1288. X    FILE        *ifp, *ofp;
  1289. X    int        fd;
  1290. X    int        siz;
  1291. X    char        buf[258];
  1292. X    int        rconv;
  1293. X    int        sizlimit;
  1294. X    register char    *text;
  1295. X    register int    n, t;
  1296. X    register char    *ptr;
  1297. X
  1298. X    sprintf (tmpfn, "%s/convXXXXXX", TEMPDIR);
  1299. X    mktemp (tmpfn);
  1300. X    rconv = convmode;
  1301. X    sizlimit = maxartsiz;
  1302. X    if (index (ofn, '|')) {
  1303. X        while (*ofn != '|')
  1304. X            switch (to8lower (*ofn++)) {
  1305. X                case 'n':
  1306. X                    rconv = FALSE;
  1307. X                    break;
  1308. X                case 'c':
  1309. X                    rconv = TRUE;
  1310. X                    break;
  1311. X                case 's':
  1312. X                    sizlimit = atoi (*ofn == '=' ? ofn + 1 : ofn) << 10;
  1313. X                    break;
  1314. X            }
  1315. X            while ((*ofn != '|') && (*ofn != ','))
  1316. X                ++ofn;
  1317. X        ++ofn;
  1318. X    }
  1319. X    if (! (ifp = fopen (ofn, "r"))) {
  1320. X        fprintf (stderr, "Can't open %s\n", ofn);
  1321. X        return (NULL);
  1322. X    }
  1323. X    if ((siz = _gs_size (fileno (ifp))) < 0)
  1324. X        siz = 4096;
  1325. X    if ((sizlimit != -1) && (siz > sizlimit)) {
  1326. X        fprintf (stderr, "File exceeds limit of %d kByte (article %s has %d kBytes)\n",
  1327. X            (sizlimit >> 10) + 1, ofn, (siz >> 10) + 1);
  1328. X        fclose (ifp);
  1329. X        return (NULL);
  1330. X    }
  1331. X    if ((fd = create (tmpfn, S_IWRITE | S_ISIZE, 03, siz)) != -1) {
  1332. X        if (! (ofp = fdopen (fd, "w")))
  1333. X            close (fd);
  1334. X    } else
  1335. X        ofp = NULL;
  1336. X    if (! ofp) {
  1337. X        fprintf (stderr, "Can't create tempfile %s\n", tmpfn);
  1338. X        fclose (ifp);
  1339. X        return (NULL);
  1340. X    }
  1341. X    while (fgets (buf, 256, ifp)) {
  1342. X        n = strlen (buf);
  1343. X        if (rconv) {
  1344. X            ptr = buf;
  1345. X            t = n;
  1346. X            while (t-- > 0)
  1347. X                if (!(text = ext_tab[((unsigned char) *ptr++)]))
  1348. X                    putc (*(ptr - 1), ofp);
  1349. X                else
  1350. X                    fputs (text, ofp);
  1351. X        } else
  1352. X            fputs (buf, ofp);
  1353. X    }
  1354. X    fclose (ifp);
  1355. X    fclose (ofp);
  1356. X    return (tmpfn);
  1357. X}
  1358. X
  1359. Xstatic char *
  1360. Xget_tab (s, c)
  1361. Xchar *s;
  1362. Xunsigned char *c;
  1363. X{
  1364. X    char    *ptr;
  1365. X
  1366. X    ptr = s;
  1367. X    while (*s && (!is8space (*s)))
  1368. X        ++s;
  1369. X    if (!*s)
  1370. X        return (NULL);
  1371. X    *s++ = '\0';
  1372. X    while (is8space (*s))
  1373. X        ++s;
  1374. X    if (*s == '\\')
  1375. X        ++s;
  1376. X    *c = 0;
  1377. X    switch (*ptr) {
  1378. X        case '#':
  1379. X            ++ptr;
  1380. X            /* Fall through ... */
  1381. X        case '1': case '2': case '3': case '4': case '5':
  1382. X        case '6': case '7': case '8': case '9':
  1383. X            while (*ptr && index ("0123456789", *ptr)) {
  1384. X                *c *= 10;
  1385. X                *c += *ptr++ - '0';
  1386. X            }
  1387. X            break;
  1388. X        case '0':
  1389. X            ++ptr;
  1390. X            if (*ptr != 'x') {
  1391. X                while (*ptr && index ("01234567", *ptr)) {
  1392. X                    *c *= 8;
  1393. X                    *c += *ptr++ - '0';
  1394. X                }
  1395. X                break;
  1396. X            }
  1397. X            /* Fall through ... */
  1398. X        case '$':
  1399. X            ++ptr;
  1400. X            while (*ptr && index ("01234567890abcdefABCDEF", *ptr)) {
  1401. X                *c *= 16;
  1402. X                *c += (((*ptr >= '0' && *ptr <= '9')) ? (*ptr - '0') :
  1403. X                      (((*ptr >= 'a' && *ptr <= 'f')) ? (*ptr - 'a' + 10) :
  1404. X                      (*ptr - 'A' + 10)));
  1405. X                ++ptr;
  1406. X            }
  1407. X            break;
  1408. X        case '\\':
  1409. X            ++ptr;
  1410. X            /* Fall through ... */
  1411. X        default:
  1412. X            *c = *ptr;
  1413. X            break;
  1414. X    }
  1415. X    return (s);
  1416. X}
  1417. X
  1418. Xvoid
  1419. Xsetup_8bit ()
  1420. X{
  1421. X    register int    t;
  1422. X    char        *buf;
  1423. X    int        fd, n;
  1424. X    char        *ptr;
  1425. X    unsigned char    c;
  1426. X
  1427. X    for (t = 0; t < 256; ++t)
  1428. X        ext_tab[t] = NULL;
  1429. X    if (!(buf = malloc (strlen (newslib) + 64)))
  1430. X        exit (_errmsg (1, "Can't alloc in setup_8bit for buffer.\n"));
  1431. X    sprintf (buf, "%s/%s", newslib, EXT_TAB);
  1432. X    if ((fd = open (buf, S_IREAD)) != -1) {
  1433. X        while ((n = readln (fd, buf, 64)) > 0) {
  1434. X            if ((n == 1) || (buf[0] == '#'))
  1435. X                continue;
  1436. X            buf[n - 1] = '\0';
  1437. X            if (ptr = get_tab (buf, &c))
  1438. X                if (!(ext_tab[c] = strdup (ptr)))
  1439. X                    exit (_errmsg (1, "Can't alloc for conv-table.\n"));
  1440. X        }
  1441. X        close (fd);
  1442. X    }
  1443. X    free (buf);
  1444. X}
  1445. __END__OF__THIS__FILE__
  1446. if test -f 'SBATCH/exec.c' ; then
  1447.   echo 'File SBATCH/exec.c already exists, overwriting it'
  1448.   del 'SBATCH/exec.c'
  1449. fi
  1450. echo Extracting \"'SBATCH/exec.c'\"
  1451. sed "s/^X//" >'SBATCH/exec.c' <<'__END__OF__THIS__FILE__'
  1452. X/*
  1453. X * $Log:    exec.c_v $
  1454. X * Revision 1.1  90/08/31  15:40:25  ud
  1455. X * Initial revision
  1456. X * 
  1457. X */
  1458. X# ifndef    LINT
  1459. Xstatic char rcsid[] = "$Id: exec.c_v 1.1 90/08/31 15:40:25 ud Exp $";
  1460. X# endif        LINT
  1461. X# include <stdio.h>
  1462. X# include "sbatch.h"
  1463. X
  1464. Xextern void    free ();
  1465. Xextern char    *malloc ();
  1466. Xextern char    *findmod ();
  1467. Xextern char    *strcpy ();
  1468. X
  1469. Xint
  1470. X_exec (lcmd)
  1471. Xchar *lcmd;
  1472. X{
  1473. X    char        **arg;
  1474. X    int        pid, t;
  1475. X    register char    *x;
  1476. X    char        *cmd;
  1477. X    
  1478. X    if ((cmd = malloc ((unsigned int) (strlen (lcmd) + 5))) == (char *) NULL) {
  1479. X        (void) fprintf (stderr,"Can't malloc (errno = %d)\n",errno);
  1480. X        error = TRUE;
  1481. X        return (-1);
  1482. X    }
  1483. X    (void) strcpy (cmd, lcmd);
  1484. X    if (getargs (cmd, &arg) <= 0) {
  1485. X        fprintf (stderr, "Can't split off %s\n", cmd);
  1486. X        error = TRUE;
  1487. X        return (-1);
  1488. X    }
  1489. X    pid = os9exec (os9forkc,findmod (arg[0], arg[0]),arg,environ,0,0,3);
  1490. X    free (cmd);
  1491. X    free ((char *) arg);
  1492. X    return (pid);
  1493. X}
  1494. __END__OF__THIS__FILE__
  1495. if test -f 'SBATCH/file.c' ; then
  1496.   echo 'File SBATCH/file.c already exists, overwriting it'
  1497.   del 'SBATCH/file.c'
  1498. fi
  1499. echo Extracting \"'SBATCH/file.c'\"
  1500. sed "s/^X//" >'SBATCH/file.c' <<'__END__OF__THIS__FILE__'
  1501. X/*
  1502. X * $Log:    file.c_v $
  1503. X * Revision 1.1  90/08/31  15:40:22  ud
  1504. X * Initial revision
  1505. X * 
  1506. X */
  1507. X# ifndef    LINT
  1508. Xstatic char rcsid[] = "$Id: file.c_v 1.1 90/08/31 15:40:22 ud Exp $";
  1509. X# endif        LINT
  1510. X# include <stdio.h>
  1511. X# include "sbatch.h"
  1512. X
  1513. Xextern void    free ();
  1514. Xextern char    *index ();
  1515. X
  1516. Xint
  1517. Xexec_xmit (sys)
  1518. Xchar *sys;
  1519. X{
  1520. X    char        *cmd;
  1521. X    int        pid;
  1522. X    register char    *p1, *p2, *p3;
  1523. X    int        siz;
  1524. X    int        t;
  1525. X
  1526. X    for (t = 0; t < 2; ++t) {
  1527. X        if (!t) {
  1528. X            siz = 0;
  1529. X            p1 = command;
  1530. X        } else {
  1531. X            if (!(cmd = malloc (siz + 32)))
  1532. X                return (-1);
  1533. X            p1 = command;
  1534. X            p2 = cmd;
  1535. X        }
  1536. X        while (*p1)
  1537. X            if (*p1 == '%') {
  1538. X                ++p1;
  1539. X                switch (*p1) {
  1540. X                    case 'G':
  1541. X                        if (!t)
  1542. X                            ++siz;
  1543. X                        else {
  1544. X                            if (grade)
  1545. X                                *p2++ = grade;
  1546. X                            else
  1547. X                                *p2++ = DEF_GRADE;
  1548. X                        }
  1549. X                        ++p1;
  1550. X                        break;
  1551. X                    case 'S':
  1552. X                        if (!t)
  1553. X                            siz += strlen (sys);
  1554. X                        else {
  1555. X                            p3 = sys;
  1556. X                            while (*p3)
  1557. X                                *p2++ = *p3++;
  1558. X                        }
  1559. X                        ++p1;
  1560. X                        break;
  1561. X                    default:
  1562. X                        if (!t)
  1563. X                            siz += 2;
  1564. X                        else {
  1565. X                            *p2++ = '%';
  1566. X                            *p2++ = *p1;
  1567. X                        }
  1568. X                        ++p1;
  1569. X                        break;
  1570. X                }
  1571. X            } else {
  1572. X                if (!t)
  1573. X                    ++siz, ++p1;
  1574. X                else
  1575. X                    *p2++ = *p1++;
  1576. X            }
  1577. X    }
  1578. X    *p2 = '\0';
  1579. X    pid = _exec (cmd);
  1580. X    free (cmd);
  1581. X    return (pid);
  1582. X}
  1583. X
  1584. Xvoid
  1585. Xsend_file (sys,fd)
  1586. Xchar *sys;
  1587. Xint fd;
  1588. X{
  1589. X    int old0;
  1590. X    int pid,status,ret;
  1591. X
  1592. X    fprintf (stderr, "Sending %d bytes\n", _gs_size (fd));
  1593. X    old0 = dup (0);
  1594. X    (void) close (0);
  1595. X    (void) dup (fd);
  1596. X    (void) close (fd);
  1597. X    pid = exec_xmit (sys);
  1598. X    if (pid < 0)
  1599. X        (void) fprintf (stderr,"Can't fork '%s' (errno = %d)\n",command,errno);
  1600. X    (void) close (0);
  1601. X    (void) dup (old0);
  1602. X    (void) close (old0);
  1603. X    if (pid < 0)
  1604. X        error = TRUE;
  1605. X    else
  1606. X        while (((ret = wait (&status)) != -1) && (ret != pid))
  1607. X            ;
  1608. X    if (status) {
  1609. X        (void) fprintf (stderr,"'%s' returns %d (errno = %d)\n",command,status,errno);
  1610. X        error = TRUE;
  1611. X    }
  1612. X}
  1613. __END__OF__THIS__FILE__
  1614. if test -f 'SBATCH/none.c' ; then
  1615.   echo 'File SBATCH/none.c already exists, overwriting it'
  1616.   del 'SBATCH/none.c'
  1617. fi
  1618. echo Extracting \"'SBATCH/none.c'\"
  1619. sed "s/^X//" >'SBATCH/none.c' <<'__END__OF__THIS__FILE__'
  1620. X/*
  1621. X * $Log:    none.c_v $
  1622. X * Revision 1.1  90/08/31  15:40:19  ud
  1623. X * Initial revision
  1624. X * 
  1625. X */
  1626. X# ifndef    LINT
  1627. Xstatic char rcsid[] = "$Id: none.c_v 1.1 90/08/31 15:40:19 ud Exp $";
  1628. X# endif        LINT
  1629. X# include <stdio.h>
  1630. X# include <modes.h>
  1631. X# include "sbatch.h"
  1632. X
  1633. Xextern void        free ();
  1634. Xextern char        *conv_8bit ();
  1635. Xextern char        *malloc ();
  1636. Xextern char        *strcat ();
  1637. Xextern char        *strcpy ();
  1638. X
  1639. Xint
  1640. Xsend_single (fd, sys)
  1641. Xint fd;
  1642. Xchar *sys;
  1643. X{
  1644. X    int    i,old0,t,status,pid;
  1645. X    int    n;
  1646. X    char    *fn;
  1647. X
  1648. X    while ((n = readln (fd, buffer, 500)) > 0) {
  1649. X        buffer[n-1] = '\0';
  1650. X        if (!(fn = conv_8bit (buffer)))
  1651. X            continue;
  1652. X        if ((i = open (fn,  S_IREAD)) < 0)
  1653. X            continue;
  1654. X        old0 = dup (0); 
  1655. X        (void) close (0);
  1656. X        (void) dup (i);
  1657. X        (void) close (i);
  1658. X        if ((pid = exec_xmit (sys)) < 0) {
  1659. X            (void) fprintf (stderr,"Can't fork '%s' (errno = %d)\n",command,errno);
  1660. X            error = TRUE;
  1661. X        } else {
  1662. X            while (((t = wait (&status)) != pid) && (t != -1))
  1663. X                ;
  1664. X            if (status) {
  1665. X                (void) fprintf (stderr,"'%s' returns %d (errno = %d)\n",command,status,errno);
  1666. X                error = TRUE;
  1667. X            }
  1668. X        }
  1669. X        (void) close (0);
  1670. X        (void) dup (old0);
  1671. X        (void) close (old0);
  1672. X        unlink (fn);
  1673. X    }
  1674. X    return (0);
  1675. X}
  1676. __END__OF__THIS__FILE__
  1677. if test -f 'SBATCH/sbatch.c' ; then
  1678.   echo 'File SBATCH/sbatch.c already exists, overwriting it'
  1679.   del 'SBATCH/sbatch.c'
  1680. fi
  1681. echo Extracting \"'SBATCH/sbatch.c'\"
  1682. sed "s/^X//" >'SBATCH/sbatch.c' <<'__END__OF__THIS__FILE__'
  1683. X/*
  1684. X * $Log:    sbatch.c_v $
  1685. X * Revision 1.1  90/08/31  15:40:05  ud
  1686. X * Initial revision
  1687. X * 
  1688. X */
  1689. X# ifndef    LINT
  1690. Xstatic char rcsid[] = "$Id: sbatch.c_v 1.1 90/08/31 15:40:05 ud Exp $";
  1691. Xstatic char copyright[] = "Copyright (C) 1989, 1990 by Ulrich Dessauer, Germering, Germany.\n";
  1692. X# endif        LINT
  1693. X# include <stdio.h>
  1694. X# include <c8type.h>
  1695. X# include <modes.h>
  1696. X# define EXTERN
  1697. X# include "sbatch.h"
  1698. X
  1699. Xextern char        *info_str ();
  1700. Xextern char        *malloc ();
  1701. Xextern char        *rindex ();
  1702. Xextern char        *strcpy ();
  1703. Xextern char        *strdup ();
  1704. X
  1705. Xvoid            get_info ();
  1706. X
  1707. Xchar *help[] = {
  1708. X    "Syntax: sbatch [<opts>] <system> [<opts>]\n",
  1709. X    "Function: sends spoolt newsarticle to <system>\n",
  1710. X    "Options:\n",
  1711. X    "     -c         Send articles compressed\n",
  1712. X    "     -c7        Send articles compressed and encoded\n",
  1713. X    "     -cf        Use freeze as the compression program\n",
  1714. X    "     -cf7       Like c7 but use freeze\n",
  1715. X    "     -B=<bits>  Number of bits for compress (12 - 16)\n",
  1716. X    "     -G=<grade> A grading character for the transport mechanism\n",
  1717. X    "     -b         Send articles batched (default)\n",
  1718. X    "     -s         Send articles as single files\n",
  1719. X    "     -C=<cmd>   command to be used when sending articles\n",
  1720. X    "     -f=<nr>    sets the maximum spoolfile size to <nr> kByte\n",
  1721. X    "     -a=<nr>    sets the maximum size of a single article to <nr> kByte\n",
  1722. X    "     -n=<sys>   if systemname for command differs from systemname in filename\n",
  1723. X    "     -t         transform 8 bit characters into equivalent 7 bit replacements\n",
  1724. X    NULL
  1725. X};
  1726. X
  1727. Xstatic void
  1728. Xusage ()
  1729. X{
  1730. X    int t;
  1731. X    
  1732. X    for (t=0;help[t];++t)
  1733. X        (void) fputs (help[t],stderr);
  1734. X}
  1735. X
  1736. Xstatic int
  1737. Xhand (sig)
  1738. Xint sig;
  1739. X{
  1740. X    ++error;
  1741. X}
  1742. X
  1743. Xint
  1744. Xmain (argc,argv)
  1745. Xint argc;
  1746. Xchar *argv[];
  1747. X{
  1748. X    register char    *ptr;
  1749. X    int        mode;
  1750. X    int        freeze_it;
  1751. X    char        *system;
  1752. X    char        *sysfn;
  1753. X    char        *x;
  1754. X    int        t, u, st;
  1755. X    char         *spfn;
  1756. X    int        fd;
  1757. X    char        batchtmp[40 + sizeof (BATCH_TMP)];
  1758. X
  1759. X    setuid (getmuid ());
  1760. X    system = NULL;
  1761. X    sysfn = NULL;
  1762. X    mode = BATCH;
  1763. X    command = NULL;
  1764. X    maxsiz = DEF_MAXSIZ;
  1765. X    maxartsiz = DEF_MAXARTSIZ;
  1766. X    bitsize = DEF_BITSIZE;
  1767. X    grade = DEF_GRADE;
  1768. X    convmode = FALSE;
  1769. X    error = FALSE;
  1770. X    intercept (hand);
  1771. X    for (t=1;t<argc;++t)
  1772. X        if (*argv[t] == '-') {
  1773. X            x = argv[t] + 1;
  1774. X            while (*x) {
  1775. X                switch (*x) {
  1776. X                    case 'b':
  1777. X                        ++x;
  1778. X                        mode = BATCH;
  1779. X                        break;
  1780. X                    case 'c':
  1781. X                        ++x;
  1782. X                        if (*x == 'f') {
  1783. X                            freeze_it = TRUE;
  1784. X                            ++x;
  1785. X                        } else
  1786. X                            freeze_it = FALSE;
  1787. X                        if (*x == '7') {
  1788. X                            mode = freeze_it ? FRE7 : COM7;
  1789. X                            ++x;
  1790. X                        } else
  1791. X                            mode = freeze_it ? FRE : COM;
  1792. X                        break;
  1793. X                    case 's':
  1794. X                        ++x;
  1795. X                        mode = NONE;
  1796. X                        break;
  1797. X                    case 'f':
  1798. X                        x += (*(x+1) == '=') ? 2 : 1;
  1799. X                        /* in kByte, so mult with  1024 */
  1800. X                        maxsiz = atoi (x) << 10;
  1801. X                        while (*x)
  1802. X                            ++x;
  1803. X                        break;
  1804. X                    case 'a':
  1805. X                        x += (*(x+1) == '=') ? 2 : 1;
  1806. X                        maxartsiz = atoi (x) << 10;
  1807. X                        while (*x)
  1808. X                            ++x;
  1809. X                        break;
  1810. X                    case 'B':
  1811. X                        x += (*(x+1) == '=') ? 2 : 1;
  1812. X                        u = atoi (x);
  1813. X                        if ((u >= 12) && (u <= 16))
  1814. X                            bitsize = u;
  1815. X                        while (*x)
  1816. X                            ++x;
  1817. X                        break;
  1818. X                    case 'G':
  1819. X                        x += (*(x+1) == '=') ? 2 : 1;
  1820. X                        grade = *x++;
  1821. X                        break;
  1822. X                    case 'C':
  1823. X                        x += (*(x+1) == '=') ? 2 : 1;
  1824. X                        command = x;
  1825. X                        while (*x)
  1826. X                            ++x;
  1827. X                        break;
  1828. X                    case 'n':
  1829. X                        x += (*(x+1) == '=') ? 2 : 1;
  1830. X                        sysfn = strdup (x);
  1831. X                        while (*x)
  1832. X                            ++x;
  1833. X                        break;
  1834. X                    case 't':
  1835. X                        ++x;
  1836. X                        convmode = TRUE;
  1837. X                        break;
  1838. X                    case '?':
  1839. X                    default:
  1840. X                        usage ();
  1841. X                        if (*x != '?')
  1842. X                            (void) fprintf (stderr,"Unknown Option '%c'\n",*x);
  1843. X                        exit (*x == '?');
  1844. X                        break;
  1845. X                }
  1846. X            }
  1847. X        } else
  1848. X            if (system)
  1849. X                exit (_errmsg (1,"Can't send to more than one system at a time\n"));
  1850. X            else
  1851. X                system = argv[t];
  1852. X    if (!system)
  1853. X        exit (_errmsg (1, "Missing system\n"));
  1854. X    get_info ();
  1855. X    setup_8bit ();
  1856. X    if (!command)
  1857. X        command = transport;
  1858. X    if (!sysfn)
  1859. X        if (!(sysfn = strdup (system)))
  1860. X            exit (_errmsg (1, "Can't alloc memory\n"));
  1861. X    ptr = sysfn;
  1862. X    while (*ptr)
  1863. X        if (is8ascii (*ptr) && is8alnum (*ptr))
  1864. X            ++ptr;
  1865. X        else
  1866. X            *ptr++ = '_';
  1867. X    if (!(spfn = malloc (strlen (batchdir) + 40)))
  1868. X        exit (_errmsg (1, "Can't alloc memory\n"));
  1869. X    sprintf (spfn, "%s/%s", batchdir, sysfn);
  1870. X    if (access (spfn, 0) < 0)
  1871. X        exit (_errmsg (0, "No aritcle spooled\n"));
  1872. X    if (chdir (newsdir) < 0)
  1873. X        exit (_errmsg (1, "Can't chdir to %s\n", newsdir));
  1874. X    sprintf (batchtmp, "%s.%d.%.24s", BATCH_TMP, getpid (), sysfn);
  1875. X    batchtmp[28] = '\0';
  1876. X# if    0
  1877. X    t = 20;
  1878. X    while (((st = info_lock (BATCHLOCK,-1)) < 0) && (t-- > 0))
  1879. X        (void) sleep (1);
  1880. X    if (st < 0)
  1881. X        exit (_errmsg (1,"Unable to lock '%s'\n", BATCHLOCK));
  1882. X# endif
  1883. X    error = rename (spfn, batchtmp);
  1884. X# if    0
  1885. X    info_unlock (BATCHLOCK);
  1886. X# endif
  1887. X    if (error)
  1888. X        exit (_errmsg (1, "Can't rename %s to %s\n", spfn, batchtmp));
  1889. X    fprintf (stderr, "Spooling news for %s\n", system);
  1890. X    sprintf (spfn, "%s/%s", batchdir, batchtmp);
  1891. X    if ((fd = open (spfn, S_IREAD)) < 0)
  1892. X        exit (_errmsg (1, "Can't open %s\n", spfn));
  1893. X    switch (mode) {
  1894. X        case NONE:
  1895. X            (void) send_single (fd, system);
  1896. X            break;
  1897. X        case BATCH:
  1898. X            send_batch (fd, system);
  1899. X            break;
  1900. X        case COM:
  1901. X        case FRE:
  1902. X            /* increase maxsiz by 80% */
  1903. X            maxsiz = (maxsiz * 180) / 100;
  1904. X            send_com (fd, system, mode);
  1905. X            break;
  1906. X        case COM7:
  1907. X        case FRE7:
  1908. X            /* increase maxsiz by 40% */
  1909. X            maxsiz = (maxsiz * 140) / 100;
  1910. X            send_com7 (fd, system, mode);
  1911. X            break;
  1912. X        default:
  1913. X            exit (_errmsg (1,"Unknown mode %d\n",mode));
  1914. X            break;
  1915. X    }
  1916. X    close (fd);
  1917. X    if (!error)
  1918. X        unlink (spfn);
  1919. X    else
  1920. X        rename (spfn, sysfn);
  1921. X    if (error)
  1922. X        (void) fprintf (stderr,"Error = %d\n",error);
  1923. X    exit (error);
  1924. X}
  1925. X
  1926. Xvoid
  1927. Xget_info ()
  1928. X{
  1929. X    char s[256];
  1930. X    
  1931. X    if ((info_str (COMPRESS,s,250) == (char *) NULL) || ((compress = malloc ((unsigned int) (strlen (s) + 10))) == (char *) NULL)) {
  1932. X        if (!(compress = malloc (sizeof (COMPRESS) + 10)))
  1933. X            exit (_errmsg (1, "Can't alloc memory.\n"));
  1934. X        strcpy (compress, COMPRESS);
  1935. X    } else
  1936. X        (void) strcpy (compress,s);
  1937. X    if (bitsize != DEF_BITSIZE) {
  1938. X        sprintf (s, "-b%d", bitsize);
  1939. X        strcat (compress, s);
  1940. X    }
  1941. X    if ((info_str (FREEZE,s,250) == (char *) NULL) || ((freeze = malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  1942. X        freeze = FREEZE;
  1943. X    else
  1944. X        (void) strcpy (freeze,s);
  1945. X    if ((info_str (ENCODE,s,250) == (char *) NULL) || ((encode = malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  1946. X        encode = ENCODE;
  1947. X    else
  1948. X        (void) strcpy (encode,s);
  1949. X    if ((info_str (TRANSPORT, s, 250) == (char *) NULL) || ((transport = malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  1950. X        transport = TRANSPORT_DFLT;
  1951. X    else
  1952. X        (void) strcpy (transport, s);
  1953. X    if ((info_str (BATCHDIR,s,250) == (char *) NULL) || ((batchdir = malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  1954. X        batchdir = DEF_BATCHDIR;
  1955. X    else
  1956. X        (void) strcpy (batchdir,s);
  1957. X    if ((info_str (NEWSDIR,s,250) == (char *) NULL) || ((newsdir = malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  1958. X        newsdir = DEF_NEWSDIR;
  1959. X    else
  1960. X        (void) strcpy (newsdir,s);
  1961. X    if ((info_str (LIBDIR,s,250) == (char *) NULL) || ((newslib = malloc ((unsigned int) (strlen (s) + 2))) == (char *) NULL))
  1962. X        newslib = DEF_LIBDIR;
  1963. X    else
  1964. X        (void) strcpy (newslib,s);
  1965. X}
  1966. __END__OF__THIS__FILE__
  1967. exit 0
  1968. : end of shell archive
  1969.  
  1970. -- 
  1971. Frank Kaefer # fkk@stasys.sta.sub.org # Starnberg, Germany
  1972.