home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / comp / sources / misc / 4286 < prev    next >
Encoding:
Text File  |  1993-01-25  |  17.4 KB  |  579 lines

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