home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume35 / ncftp / part04 < prev    next >
Encoding:
Text File  |  1993-01-24  |  17.2 KB  |  573 lines

  1. Newsgroups: comp.sources.misc
  2. From: mgleason@cse.unl.edu (Michael Gleason)
  3. Subject: v35i007:  ncftp - Alternative User Interface for FTP, Part04/04
  4. Message-ID: <1993Jan25.155527.13802@sparky.imd.sterling.com>
  5. X-Md4-Signature: 2fce51c05ceb8c8c59cb91cd292650fa
  6. Date: Mon, 25 Jan 1993 15:55:27 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: mgleason@cse.unl.edu (Michael Gleason)
  10. Posting-number: Volume 35, Issue 7
  11. Archive-name: ncftp/part04
  12. Environment: UNIX, ANSI-C, getopt
  13. Supersedes: ncftp: Volume 34, Issue 14-16
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # Contents:  Blurb Install copyright.h ftpdefs.h ftprc.h getpass.c
  20. #   getpass.h glob.h main.h patchlevel.h
  21. # Wrapped by kent@sparky on Mon Jan 25 09:48:06 1993
  22. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  23. echo If this archive is complete, you will see the following message:
  24. echo '          "shar: End of archive 4 (of 4)."'
  25. if test -f 'Blurb' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'Blurb'\"
  27. else
  28.   echo shar: Extracting \"'Blurb'\" \(2837 characters\)
  29.   sed "s/^X//" >'Blurb' <<'END_OF_FILE'
  30. XSubject:  ncftp - Alternative User Interface for FTP, Part01/01
  31. X
  32. XArchive-name: ncftp/part01
  33. XEnvironment: UNIX, ANSI-C, getopt
  34. X
  35. Xncftp - Alternative user interface for FTP
  36. Xversion 1.0 PL 2 by Mike Gleason, NCEMRSoft.
  37. X
  38. XChanges from 1.0 PL 1:
  39. X
  40. X  * ls is more flexible, so now you can do things like "ls -flags directory."
  41. X    Previous versions of ncftp (and ftp) only allowed "ls -flags" or
  42. X    "ls directory."
  43. X
  44. X  * Some new progress meters, a fancy bargraph and another similar to the
  45. X    original % meter that shows how many kilobytes have been transferred.
  46. X    This meter is also used when the remote site doesn't support the SIZE
  47. X    command, so you can always have a progress meter.
  48. X
  49. X  * If you don't want ftp and ncftp to share an rc, you can use a '.ncftprc'
  50. X    for ncftp and a '.netrc' for ftp.
  51. X
  52. X  * Better portability; in addition to support for DG/UX, NeXT, and DYNIX,
  53. X    the getpass2() function which was causing problems has been replaced
  54. X    by a more portable version.  Also using a private getopt which can be
  55. X    called more than once.
  56. X
  57. X  * Syslog'ging capability added for system administrators.
  58. X
  59. X  * So many small enhancements and bug fixes that the patch is almost as
  60. X    large as the shar-chive.  See patchlevel.h for the gory details.
  61. X
  62. X
  63. Xncftp was created out of disgust with using the regular 'ftp'
  64. Xcommand found on many brands of Unix.  People who spend a lot
  65. Xof time in ftp will want to install ncftp.
  66. X
  67. XFeatures:
  68. X
  69. X * No more typing 'anonymous' and your email address every time
  70. X   you want to ftp anonymously.  You don't need to have the
  71. X   site in your .netrc.
  72. X   
  73. X * No more typing complete site names.  Sites in your .netrc
  74. X   can be abbreviated.  Type 'o wuar' to call wuarchive.wustl.edu.
  75. X * Use your pager (like 'more') to read remote files (and also
  76. X   compressed files).
  77. X
  78. X * Use your pager to view remote directory listings.
  79. X
  80. X * Transfers feature a progress meter.
  81. X * Implicit cd.
  82. X * Fancy prompts.
  83. X * You can keep a log of your actions.  See what the path was of
  84. X   that file you downloaded yesterday so you don't have to
  85. X   look for it today.
  86. X * Built-in mini-nslookup.
  87. X * The 'ls' command is ls -CF.  Some ftp's ls was identical to 'dir.'
  88. X * You can 'redial' a remote host until you connect.
  89. X
  90. X * Don't need to 'close' a site, just open a new one.
  91. X * Don't feel like typing a long filename?  Use a wildcard in single
  92. X   file commands like get and page.
  93. X * You can create empty remote files.
  94. X
  95. X * Supports 'colon mode', so you can type 'ncftp cse.unl.edu:/pub/foo',
  96. X   to copy foo into your current directory.
  97. X
  98. X * You can re-display the last directory listing without getting it
  99. X   across the network.
  100. X
  101. X * Detects when new mail arrives.
  102. X
  103. X * ncftp is quieter by default -- who cares if the PORT command was
  104. X   successful (if you do, turn verbose on :-).
  105. X
  106. X * It can be compiled to log transfers, etc., to the system log.
  107. X
  108. END_OF_FILE
  109.   if test 2837 -ne `wc -c <'Blurb'`; then
  110.     echo shar: \"'Blurb'\" unpacked with wrong size!
  111.   fi
  112.   # end of 'Blurb'
  113. fi
  114. if test -f 'Install' -a "${1}" != "-c" ; then 
  115.   echo shar: Will not clobber existing file \"'Install'\"
  116. else
  117.   echo shar: Extracting \"'Install'\" \(647 characters\)
  118.   sed "s/^X//" >'Install' <<'END_OF_FILE'
  119. XThe 'Makefile', 'sys.h' and 'defaults.h' may need to be modified.
  120. XRead 'sys.h' first; it will tell you how to configure the program
  121. Xfor you particular system.  Then edit the Makefile.  You can also
  122. Xchange the program's default behavior by editing defaults.h (optional).
  123. X
  124. XIf you have problems, you can mail me, but please try your best to install
  125. Xit without my help, because I don't want my mailbox flooded.  I do want
  126. Xto hear from you if you have comments or bug reports/fixes.  I would also
  127. Xlike to hear from you if you had a system that wasn't covered in sys.h,
  128. Xso I can add an entry for other users of your system.
  129. X
  130. X--mg (mgleason@cse.unl.edu)
  131. END_OF_FILE
  132.   if test 647 -ne `wc -c <'Install'`; then
  133.     echo shar: \"'Install'\" unpacked with wrong size!
  134.   fi
  135.   # end of 'Install'
  136. fi
  137. if test -f 'copyright.h' -a "${1}" != "-c" ; then 
  138.   echo shar: Will not clobber existing file \"'copyright.h'\"
  139. else
  140.   echo shar: Extracting \"'copyright.h'\" \(1333 characters\)
  141.   sed "s/^X//" >'copyright.h' <<'END_OF_FILE'
  142. X/* copyright.h */
  143. X
  144. X/*
  145. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  146. X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  147. X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  148. X *
  149. X * Copyright (c) 1992, 1993 Mike Gleason, NCEMRSoft.
  150. X * Copyright (c) 1985, 1989 Regents of the University of California.
  151. X * All rights reserved.
  152. X *
  153. X * Redistribution and use in source and binary forms are permitted provided
  154. X * that: (1) source distributions retain this entire copyright notice and
  155. X * comment, and (2) distributions including binaries display the following
  156. X * acknowledgement:  ``This product includes software developed by the
  157. X * University of California, Berkeley and its contributors'' in the
  158. X * documentation or other materials provided with the distribution and in
  159. X * all advertising materials mentioning features or use of this software.
  160. X * Neither the name of the University nor the names of its contributors may
  161. X * be used to endorse or promote products derived from this software without
  162. X * specific prior written permission.
  163. X */
  164. X
  165. X#ifndef lint
  166. X#ifdef _main_c_
  167. Xstatic char copyright[] = "@(#) Copyright (c) 1992, 1993 by NCEMRSoft and Copyright (c) 1985, 1989 Regents of the University of California.\n All rights reserved.\n";
  168. X#endif
  169. X#endif /* not lint */
  170. X
  171. X/* eof copyright.h */
  172. END_OF_FILE
  173.   if test 1333 -ne `wc -c <'copyright.h'`; then
  174.     echo shar: \"'copyright.h'\" unpacked with wrong size!
  175.   fi
  176.   # end of 'copyright.h'
  177. fi
  178. if test -f 'ftpdefs.h' -a "${1}" != "-c" ; then 
  179.   echo shar: Will not clobber existing file \"'ftpdefs.h'\"
  180. else
  181.   echo shar: Extracting \"'ftpdefs.h'\" \(807 characters\)
  182.   sed "s/^X//" >'ftpdefs.h' <<'END_OF_FILE'
  183. X/* ftpdefs.h */
  184. X
  185. X#ifndef _ftpdefs_h_
  186. X#define _ftpdefs_h_
  187. X
  188. X#define FTP_VERSION "NcFTP 1.0 PL2 (20 Jan 93)"
  189. X
  190. Xtypedef char string[128], str32[32];
  191. X
  192. Xstruct userinfo {
  193. X    str32   username;
  194. X    string  homedir;
  195. X    string  shell;
  196. X    string  hostname;
  197. X    int        uid;
  198. X};
  199. X
  200. X/*
  201. X * Your compiler may not like the 'const' directives.  If it chokes
  202. X * here, add -DCONST to your SDEFS line in the Makefile.
  203. X */
  204. X#if defined(CONST) || defined(const)
  205. X#define Strncpy(a,b) strncpy((a), (const char *) (b), (size_t) sizeof (a))
  206. X#define Strncat(a,b) strncat((a), (const char *) (b), (size_t) sizeof (a))
  207. X#else
  208. X#define Strncpy(a,b) strncpy((a), (char *) (b), (size_t) sizeof (a))
  209. X#define Strncat(a,b) strncat((a), (char *) (b), (size_t) sizeof (a))
  210. X#endif
  211. X
  212. X#define FGets(a,b) fgets((a), sizeof(a) - 1, (b))
  213. X
  214. X#endif /* _ftpdefs_h_ */
  215. X/* eof */
  216. END_OF_FILE
  217.   if test 807 -ne `wc -c <'ftpdefs.h'`; then
  218.     echo shar: \"'ftpdefs.h'\" unpacked with wrong size!
  219.   fi
  220.   # end of 'ftpdefs.h'
  221. fi
  222. if test -f 'ftprc.h' -a "${1}" != "-c" ; then 
  223.   echo shar: Will not clobber existing file \"'ftprc.h'\"
  224. else
  225.   echo shar: Extracting \"'ftprc.h'\" \(424 characters\)
  226.   sed "s/^X//" >'ftprc.h' <<'END_OF_FILE'
  227. X/* ftprc.h */
  228. X
  229. X#ifndef _ftprc_h_
  230. X#define _ftprc_h_
  231. X
  232. X#define NETRC "netrc"
  233. X#define FTPRC "ncftprc"
  234. X
  235. X#define RC_DELIM " \n\t,"
  236. X
  237. Xtypedef struct site *siteptr;
  238. Xtypedef struct site {
  239. X    char *name;            /* name (or IP address) of site */
  240. X    siteptr next;
  241. X} site;
  242. X
  243. Xint thrash_rc(void);
  244. Xvoid AddNewSitePtr(char *word);
  245. Xint ruserpass2(char *host, char **user, char **pass, char **acct);
  246. Xvoid GetFullSiteName(char *host);
  247. X
  248. X#endif
  249. X/* eof */
  250. END_OF_FILE
  251.   if test 424 -ne `wc -c <'ftprc.h'`; then
  252.     echo shar: \"'ftprc.h'\" unpacked with wrong size!
  253.   fi
  254.   # end of 'ftprc.h'
  255. fi
  256. if test -f 'getpass.c' -a "${1}" != "-c" ; then 
  257.   echo shar: Will not clobber existing file \"'getpass.c'\"
  258. else
  259.   echo shar: Extracting \"'getpass.c'\" \(2472 characters\)
  260.   sed "s/^X//" >'getpass.c' <<'END_OF_FILE'
  261. X/* Getpass.c */
  262. X
  263. X#define    PASSWD_LEN    127
  264. X
  265. X#include "sys.h"
  266. X#include <stdio.h>
  267. X#include <signal.h>
  268. X
  269. X#include "cmds.h"
  270. X#include "getpass.h"
  271. X#include "copyright.h"
  272. X
  273. X#ifndef GETPASS
  274. X
  275. X#ifndef NO_UNISTDH
  276. X#    include <unistd.h>
  277. X#endif
  278. X
  279. X#ifdef BSD
  280. X#    include <sys/ioctl.h>
  281. X#endif
  282. X
  283. X#ifdef TERMIOS
  284. X#        include <termios.h>
  285. X#else
  286. X#    ifdef SGTTYB
  287. X#        include <sgtty.h>
  288. X#    else
  289. X#        include <termio.h>
  290. X#    endif
  291. X#endif /* !TERMIOS */
  292. X
  293. Xint ioctl(int, int, ...);
  294. X
  295. X#endif    /* GETPASS */
  296. X
  297. X
  298. X
  299. X
  300. Xvoid echo(FILE *fp, int on)
  301. X{
  302. X#ifndef GETPASS        /* Otherwise just do nothing which is ok. */
  303. X
  304. X#ifdef TERMIOS
  305. X    static struct termios orig, noecho, *tp;
  306. X#else
  307. X#    ifdef SGTTYB
  308. X    static struct sgttyb orig, noecho, *tp;
  309. X#    else
  310. X    static struct termio orig, noecho, *tp;
  311. X#    endif
  312. X#endif
  313. X    static int state = 0;
  314. X    int fd = fileno(fp);
  315. X
  316. X    if (state == 0) {
  317. X#ifdef TERMIOS
  318. X        if (tcgetattr(fd, &orig) < 0)
  319. X            Perror("tcgetattr");
  320. X        noecho = orig;
  321. X        noecho.c_lflag &= ~ECHO;
  322. X#else
  323. X#    ifdef SGTTYB
  324. X        if (ioctl(fd, TIOCGETP, &orig) < 0)
  325. X            Perror("ioctl");
  326. X        noecho = orig;
  327. X        noecho.sg_flags &= ~ECHO;
  328. X#    else
  329. X        if (ioctl(fd, TCGETA, &orig) < 0)
  330. X            Perror("ioctl");
  331. X        noecho = orig;
  332. X        noecho.c_lflag &= ~ECHO;
  333. X#    endif
  334. X#endif
  335. X        state = 1;
  336. X    }
  337. X    tp = NULL;
  338. X    if (on && state == 2) {
  339. X        /* Turn echo back on. */
  340. X        tp = &orig;
  341. X        state = 1;
  342. X    } else if (!on && state == 1) {
  343. X        /* Turn echo off. */
  344. X        tp = &noecho;
  345. X        state = 2;
  346. X    }
  347. X    if (tp != NULL) {
  348. X#ifdef TERMIOS
  349. X        if (tcsetattr(fd, TCSAFLUSH, tp) < 0)
  350. X            Perror("tcsetattr");
  351. X#else
  352. X#    ifdef SGTTYB
  353. X        if (ioctl(fd, TIOCSETP, tp) < 0)
  354. X            Perror("ioctl");
  355. X#    else
  356. X        if (ioctl(fd, TCSETA, tp) < 0)
  357. X            Perror("ioctl");
  358. X#    endif
  359. X#endif    /* !TERMIOS */
  360. X    }
  361. X
  362. X#endif    /* GETPASS */
  363. X}    /* echo */
  364. X
  365. X
  366. X
  367. X#ifndef GETPASS
  368. X
  369. Xchar *Getpass(char *promptstr)
  370. X{
  371. X    register int ch;
  372. X    register char *p;
  373. X    FILE *fp, *outfp;
  374. X    void (*oldintr)(int);
  375. X    static char buf[PASSWD_LEN + 1];
  376. X
  377. X    /*
  378. X     * read and write to /dev/tty if possible; else read from
  379. X     * stdin and write to stderr.
  380. X     */
  381. X    if ((outfp = fp = fopen("/dev/tty", "w+")) == NULL) {
  382. X        outfp = stderr;
  383. X        fp = stdin;
  384. X    }
  385. X    oldintr = signal(SIGINT, SIG_IGN);
  386. X    echo(fp, 0);        /* Turn echoing off. */
  387. X    (void) fputs(promptstr, outfp);
  388. X    (void) rewind(outfp);            /* implied flush */
  389. X    for (p = buf; (ch = getc(fp)) != EOF && ch != '\n';)
  390. X        if (p < buf + PASSWD_LEN)
  391. X            *p++ = ch;
  392. X    *p = '\0';
  393. X    (void)write(fileno(outfp), "\n", 1);
  394. X    echo(fp, 1);
  395. X    (void) signal(SIGINT, oldintr);
  396. X    if (fp != stdin)
  397. X        (void)fclose(fp);
  398. X    return(buf);
  399. X}    /* Getpass */
  400. X
  401. X#endif /* GETPASS */
  402. X
  403. X/* eof Getpass.c */
  404. END_OF_FILE
  405.   if test 2472 -ne `wc -c <'getpass.c'`; then
  406.     echo shar: \"'getpass.c'\" unpacked with wrong size!
  407.   fi
  408.   # end of 'getpass.c'
  409. fi
  410. if test -f 'getpass.h' -a "${1}" != "-c" ; then 
  411.   echo shar: Will not clobber existing file \"'getpass.h'\"
  412. else
  413.   echo shar: Extracting \"'getpass.h'\" \(188 characters\)
  414.   sed "s/^X//" >'getpass.h' <<'END_OF_FILE'
  415. X/* Getpass.h */
  416. X
  417. X#ifndef _getpass_h_
  418. X#define _getpass_h_
  419. X
  420. X#define PASSWD_LEN        127
  421. X
  422. Xchar *Getpass(char *prompt);
  423. Xvoid echo(FILE *fp, int on);
  424. X
  425. X#endif    /* _getpass_h_ */
  426. X
  427. X/* eof Getpass.h */
  428. END_OF_FILE
  429.   if test 188 -ne `wc -c <'getpass.h'`; then
  430.     echo shar: \"'getpass.h'\" unpacked with wrong size!
  431.   fi
  432.   # end of 'getpass.h'
  433. fi
  434. if test -f 'glob.h' -a "${1}" != "-c" ; then 
  435.   echo shar: Will not clobber existing file \"'glob.h'\"
  436. else
  437.   echo shar: Extracting \"'glob.h'\" \(240 characters\)
  438.   sed "s/^X//" >'glob.h' <<'END_OF_FILE'
  439. X/* glob.h */
  440. Xchar **glob(char *v);
  441. Xint letter(char c);
  442. Xint digit(char c);
  443. Xint any(int c, char *s);
  444. Xint blklen(char **av);
  445. Xchar **blkcpy(char **oav, char **bv);
  446. Xint blkfree(char **av0);
  447. Xchar **copyblk(char **v);
  448. Xint gethdir(char *home_dir);
  449. END_OF_FILE
  450.   if test 240 -ne `wc -c <'glob.h'`; then
  451.     echo shar: \"'glob.h'\" unpacked with wrong size!
  452.   fi
  453.   # end of 'glob.h'
  454. fi
  455. if test -f 'main.h' -a "${1}" != "-c" ; then 
  456.   echo shar: Will not clobber existing file \"'main.h'\"
  457. else
  458.   echo shar: Extracting \"'main.h'\" \(519 characters\)
  459.   sed "s/^X//" >'main.h' <<'END_OF_FILE'
  460. X/* main.h */
  461. X
  462. X#ifndef _main_h_
  463. X#define _main_h_
  464. X
  465. Xvoid intr(int unused);
  466. Xint getuserinfo(void);
  467. Xint init_arrays(void);
  468. Xvoid init_transfer_buffer(void);
  469. Xvoid init_prompt(void);
  470. Xvoid lostpeer(int unused);
  471. Xvoid cmdscanner(int top);
  472. Xchar *strprompt(void);
  473. Xchar *Strpcpy(char *dst, char *src);
  474. Xstruct cmd *getcmd(char *name);
  475. Xvoid makeargv(void);
  476. Xchar *slurpstring(void);
  477. Xint help(int argc, char **argv);
  478. Xvoid trim_log(void);
  479. Xint CheckNewMail(void);
  480. Xvoid tcap_put(char *cap);
  481. Xvoid termcap_init(void);
  482. X
  483. X#endif    /* _main_h_ */
  484. X
  485. END_OF_FILE
  486.   if test 519 -ne `wc -c <'main.h'`; then
  487.     echo shar: \"'main.h'\" unpacked with wrong size!
  488.   fi
  489.   # end of 'main.h'
  490. fi
  491. if test -f 'patchlevel.h' -a "${1}" != "-c" ; then 
  492.   echo shar: Will not clobber existing file \"'patchlevel.h'\"
  493. else
  494.   echo shar: Extracting \"'patchlevel.h'\" \(2689 characters\)
  495.   sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE'
  496. X/* patchlevel.h */
  497. X
  498. X/*
  499. X * v1.0.0 - December 6, 1992.
  500. X *    Initial release.
  501. X *
  502. X * v1.0.1 - December 8, 1992.
  503. X *  Added default value for NCARGS in glob.c for systems that don't define it.
  504. X *  Fixed pdir bug which was caused by me mistakenly adding the page-a-
  505. X *  compressed-file feature to ls instead of page.  Fixed bug in documentation,
  506. X *  which had the same error!  Added spec for Ultrix in sys.h.  Fixed error
  507. X *  in sys.h that recommended -Dconst instead of -Dconst="".  Added GETPASS
  508. X *  compile flag to use getpass() instead of getpass2(), which make compiling
  509. X *  easier if the compiler choked in cmds.c.  Added GETCWDSIZET for systems
  510. X *  whose getcwd() takes a size_t instead of an int.
  511. X *
  512. X * v1.0.2 - Jan 17, 1993.
  513. X *  Using the cpp symbol CONST instead of const to tell
  514. X *  the compiler not to use the 'const' directive.  Checking for __sgi as
  515. X *  well as sgi in sys.h.  Added #ifndef __GNUC__ block to make SunOS users
  516. X *  use gcc.  You can avoid trying to include <unistd.h> by defining
  517. X *  NO_UNISTDH.  Added DG/UX entry in sys.h.  Also added still another cpp
  518. X *  symbol, BAD_INETADDR, which is used if inet_addr returns a structure
  519. X *  instead of a u_long (this is only for DG/UX so far).  Changed long to
  520. X *  int in wait().  Added default value for NCARGS in glob.c.  Added cpp
  521. X *  symbol NO_STDLIBH for systems without <stdlib.h>.  Fixed 'quote.'
  522. X *  Fixed 'size.'  Set all's string variable are printed in double quotes.
  523. X *  Ansi-escapes is init'd to 1 if TERM==xterm.  Fixed 'type tenex.'  Set
  524. X *  verbose makes sure verbose is within bounds and prints messages now.
  525. X *  Better getpass2.  Tries .ncftprc before .netrc.  @N adds a \n to prompt.
  526. X *  ls() is more flexible.  Macdef and $ print current macros if no arg
  527. X *  is given.  getpass2 is now Getpass, and accompanying this are
  528. X *  more cpp symbols SGTTYB and TERMIOS.  Better SCO support.  No longer using
  529. X *  gets(), instead using own Gets() which is safer.  Better termcap support,
  530. X *  or actually curses support, to get ansi-escape sequences.  Using -FC
  531. X *  instead of -CF for ls flags, do avoid a rare conflict.  Progress meters
  532. X *  work better.  Phil Dietz added a cool bar graph one, and I added another
  533. X *  similar to the default percentage meter that shows the # KB transferred,
  534. X *  which will work on systems not supporting SIZE.  Fixed floating point
  535. X *  exception bug in put/mput.  Fixed implicit_cd to work with wuarchive-ish
  536. X *  cd messages.  Added NeXT and DYNIX blocks in sys.h.  
  537. X *  Fixed bug in _cd, that was trying to use wildcards when it
  538. X *  shouldn't.  Fixed bug in macdef.  Fixed small bug in getreply.  Turned
  539. X *  off echoing during the progress-meter.  Added syslogging capability.
  540. X */
  541. END_OF_FILE
  542.   if test 2689 -ne `wc -c <'patchlevel.h'`; then
  543.     echo shar: \"'patchlevel.h'\" unpacked with wrong size!
  544.   fi
  545.   # end of 'patchlevel.h'
  546. fi
  547. echo shar: End of archive 4 \(of 4\).
  548. cp /dev/null ark4isdone
  549. MISSING=""
  550. for I in 1 2 3 4 ; do
  551.     if test ! -f ark${I}isdone ; then
  552.     MISSING="${MISSING} ${I}"
  553.     fi
  554. done
  555. if test "${MISSING}" = "" ; then
  556.     echo You have unpacked all 4 archives.
  557.     rm -f ark[1-9]isdone
  558. else
  559.     echo You still must unpack the following archives:
  560.     echo "        " ${MISSING}
  561. fi
  562. exit 0
  563. exit 0 # Just in case...
  564.