Added all of the MH sources, including RCS files, in
[mmh] / docs / historical / mh-6.8.5 / uip / RCS / ftpsbr.c,v
1 head    1.13;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
6
7
8 1.13
9 date    93.08.25.17.25.27;      author jromine; state Exp;
10 branches;
11 next    1.12;
12
13 1.12
14 date    93.08.20.15.49.47;      author jromine; state Exp;
15 branches;
16 next    1.11;
17
18 1.11
19 date    93.03.17.00.18.56;      author jromine; state Exp;
20 branches;
21 next    1.10;
22
23 1.10
24 date    92.12.03.16.50.27;      author jromine; state Exp;
25 branches;
26 next    1.9;
27
28 1.9
29 date    92.12.03.16.28.56;      author jromine; state Exp;
30 branches;
31 next    1.8;
32
33 1.8
34 date    92.11.24.18.24.30;      author jromine; state Exp;
35 branches;
36 next    1.7;
37
38 1.7
39 date    92.11.12.00.41.28;      author jromine; state Exp;
40 branches;
41 next    1.6;
42
43 1.6
44 date    92.11.11.20.56.53;      author jromine; state Exp;
45 branches;
46 next    1.5;
47
48 1.5
49 date    92.11.02.21.35.10;      author jromine; state Exp;
50 branches;
51 next    1.4;
52
53 1.4
54 date    92.11.02.17.01.49;      author jromine; state Exp;
55 branches;
56 next    1.3;
57
58 1.3
59 date    92.10.20.16.31.05;      author jromine; state Exp;
60 branches;
61 next    1.2;
62
63 1.2
64 date    92.05.19.21.03.01;      author jromine; state Exp;
65 branches;
66 next    1.1;
67
68 1.1
69 date    92.01.31.16.28.15;      author jromine; state Exp;
70 branches;
71 next    ;
72
73
74 desc
75 @multimedia MH
76 @
77
78
79 1.13
80 log
81 @off_t fixes for BSD44
82 @
83 text
84 @/* ftpsbr.c - simple FTP client library (why doesn't BSD have one?!?) */
85
86 #ifndef lint
87 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.12 1993/08/20 15:49:47 jromine Exp jromine $";
88 #endif
89
90 #include "../h/mh.h"
91 #include "../h/mhn.h"
92 #ifdef  FTP
93 #include <ctype.h>
94 #ifdef SVR4
95 #undef NULLVP          /* stdio.h */
96 #endif
97 #include <stdio.h>
98 #include <arpa/ftp.h>
99 #ifdef __STDC__
100 #include <stdarg.h>
101 #else
102 #include <varargs.h>
103 #endif
104
105 #ifdef __STDC__
106 static int      command(int arg1, ...);
107 #else
108 static int      command();
109 #endif
110
111 static int  ftp_quit(), ftp_read(), initconn(),
112             dataconn(), _command(), getreply();
113
114 /* \f   DATA */
115
116 #define v_debug         debugsw
117 #define v_verbose       verbosw
118
119
120 static  int     ftp_fd = NOTOK;
121 static  int     data_fd = NOTOK;
122
123 static  int     v_noise;
124
125 extern  int     v_debug;
126 extern  int     v_verbose;
127
128 /* \f */
129
130 #if     defined(SYS5) && defined(AUX)
131 #define u_short ushort
132 #define u_long  ulong
133 #endif
134
135 #include <sys/types.h>
136 #include <sys/socket.h>
137 #include <netinet/in.h>
138 #include <netdb.h>
139
140 #if     defined(BIND) && !defined(h_addr)
141 #define h_addr  h_addr_list[0]
142 #endif
143
144 #define inaddr_copy(hp,sin) \
145     bcopy ((hp) -> h_addr, (char *) &((sin) -> sin_addr), (hp) -> h_length)
146
147
148 struct hostent *gethostbystring ();
149
150 /* \f */
151
152 extern  int     errno;
153 #ifndef BSD44
154 extern  int     sys_nerr;
155 extern  char   *sys_errlist[];
156 #endif
157
158
159 #define start_tcp_client(sock,priv) \
160         socket (AF_INET, SOCK_STREAM, 0)
161
162 #define join_tcp_server(fd, sock) \
163         connect ((fd), (struct sockaddr *) (sock), sizeof *(sock))
164
165
166 /* ARGSUSED */
167
168 static int  start_tcp_server (sock, backlog, opt1, opt2)
169 struct sockaddr_in *sock;
170 int     backlog,
171         opt1,
172         opt2;
173 {
174     int     eindex,
175             sd;
176
177     if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK)
178         return NOTOK;
179
180     if (bind (sd, (struct sockaddr *) sock, sizeof *sock) == NOTOK) {
181         eindex = errno;
182         (void) close (sd);
183         errno = eindex;
184     }
185     else
186         (void) listen (sd, backlog);
187
188     return sd;
189 }
190
191 static  int     __len__;
192 #define join_tcp_client(fd,sock) \
193         accept ((fd), (struct sockaddr *) (sock), \
194                 (__len__ = sizeof *(sock), &__len__))
195
196
197 #define read_tcp_socket         read
198 #define write_tcp_socket        write
199 #define close_tcp_socket        close
200
201 /* \f */
202
203 static void  _asprintf (bp, what, ap)   /* fmt, args, ... */
204 register char *bp;
205 char   *what;
206 va_list ap;
207 {
208     register int    eindex;
209     char   *fmt;
210
211     eindex = errno;
212
213     *bp = '\0';
214     fmt = va_arg (ap, char *);
215
216     if (fmt) {
217 #ifndef VSPRINTF
218         struct _iobuf iob;
219 #endif
220
221 #ifndef VSPRINTF
222 #ifdef  pyr
223         bzero ((char *) &iob, sizeof iob);
224         iob._file = _NFILE;
225 #endif
226         iob._flag = _IOWRT | _IOSTRG;
227 #if     !defined(vax) && !defined(pyr) && !defined(sequent)
228         iob._ptr = (unsigned char *) bp;
229 #else
230         iob._ptr = bp;
231 #endif
232         iob._cnt = BUFSIZ;
233         _doprnt (fmt, ap, &iob);
234         (void) putc ('\0', &iob);
235 #else
236         (void) vsprintf (bp, fmt, ap);
237 #endif
238         bp += strlen (bp);
239
240     }
241
242     if (what) {
243         if (*what) {
244             (void) sprintf (bp, " %s: ", what);
245             bp += strlen (bp);
246         }
247         if (0 < eindex && eindex < sys_nerr)
248             (void) strcpy (bp, sys_errlist[eindex]);
249         else
250             (void) sprintf (bp, "Error %d", eindex);
251         bp += strlen (bp);
252     }
253
254     errno = eindex;
255 }
256
257 /* \f */
258
259 int     ftp_get (host, user, password, cwd, remote, local, ascii, stayopen)
260 char   *host,
261        *user,
262        *password,
263        *cwd,
264        *remote,
265        *local;
266 int     ascii,
267         stayopen;
268 {
269     return ftp_trans (host, user, password, cwd, remote, local, "RETR", ascii,
270                       stayopen);
271 }
272
273 /* \f */
274
275 int     ftp_trans (host, user, password, cwd, remote, local, cmd, ascii,
276                    stayopen)
277 char   *host,
278        *user,
279        *password,
280        *cwd,
281        *remote,
282        *local,
283        *cmd;
284 int     ascii,
285         stayopen;
286 {
287     int     result;
288
289     if (stayopen <= 0) {
290         result = ftp_quit ();
291         if (host == NULL)
292             return result;
293     }
294
295     if (ftp_fd == NOTOK) {
296         struct sockaddr_in in_socket;
297         register struct hostent *hp;
298         register struct servent *sp;
299
300         if ((sp = getservbyname ("ftp", "tcp")) == NULL) {
301             fprintf (stderr, "tcp/ftp: unknown service");
302             return NOTOK;
303         }
304         if ((hp = gethostbystring (host)) == NULL) {
305             fprintf (stderr, "%s: unknown host\n", host);
306             return NOTOK;
307         }
308         in_socket.sin_family = hp -> h_addrtype;
309         inaddr_copy (hp, &in_socket);
310         in_socket.sin_port = sp -> s_port;
311
312         if ((ftp_fd = start_tcp_client ((struct sockaddr_in *) NULL, 0))
313                 == NOTOK) {
314             perror (host);
315             return NOTOK;
316         }
317         if (join_tcp_server (ftp_fd, &in_socket) == NOTOK) {
318             perror (host);
319             (void) close_tcp_socket (ftp_fd), ftp_fd = NOTOK;
320             return NOTOK;
321         }
322         (void) getreply (1, 0);
323
324         if (v_verbose) {
325             fprintf (stdout, "Connected to %s\n", host);
326             (void) fflush (stdout);
327         }
328
329         if (user) {
330             if ((result = command (0, "USER %s", user)) == CONTINUE)
331                 result = command (1, "PASS %s", password);
332             if (result != COMPLETE) {
333                 result = NOTOK;
334                 goto out;
335             }
336         }
337
338         if (remote == NULL)
339             return OK;
340     }
341
342     if (cwd && ((result = command (0, "CWD %s", cwd)) != COMPLETE
343                     && result != CONTINUE)) {
344         result = NOTOK;
345         goto out;
346     }
347
348     if (command (1, ascii ? "TYPE A" : "TYPE I") != COMPLETE) {
349         result = NOTOK;
350         goto out;
351     }
352
353     result = ftp_read (remote, local, cmd, ascii);
354
355 out: ;
356     if (result != OK || !stayopen)
357         (void) ftp_quit ();
358
359     return result;
360 }
361
362 /* \f */
363
364 static int  ftp_quit ()
365 {
366     int     n;
367
368     if (ftp_fd == NOTOK)
369         return OK;
370
371     n = command (1, "QUIT");
372
373     (void) close_tcp_socket (ftp_fd), ftp_fd = NOTOK;
374
375     return (n == 0 || n == COMPLETE ? OK : NOTOK);
376 }
377
378 /* \f */
379
380 static int  ftp_read (remote, local, cmd, ascii)
381 char    *remote,
382         *local,
383         *cmd;
384 int     ascii;
385 {
386     int     istdio = 0,
387             istore;
388     register int    cc;
389     int     expectingreply = 0;
390     char    buffer[BUFSIZ];
391     FILE   *fp = NULL;
392
393     if (initconn () == NOTOK)
394         goto bad;
395
396     v_noise = v_verbose;
397     if (command (-1, *remote ? "%s %s" : "%s", cmd, remote) != PRELIM)
398         goto bad;
399
400     expectingreply++;
401     if (dataconn () == NOTOK) {
402 bad: ;
403         if (fp && !istdio)
404             (void) fclose (fp);
405         if (data_fd != NOTOK)
406             (void) close_tcp_socket (data_fd), data_fd = NOTOK;
407         if (expectingreply)
408             (void) getreply (-2, 0);
409
410         return NOTOK;
411     }
412
413     istore = !strcmp (cmd, "STOR");
414
415     if (istdio = !strcmp (local, "-"))
416         fp = istore ? stdin : stdout;
417     else
418         if ((fp = fopen (local, istore ? "r" : "w")) == NULL) {
419             perror (local);
420             goto bad;
421         }
422
423     if (istore) {
424         if (ascii) {
425             int     c;
426             FILE   *out;
427
428             if (!(out = fdopen (data_fd, "w"))) {
429                 perror ("fdopen");
430                 goto bad;
431             }
432
433             while ((c = getc (fp)) != EOF) {
434                 if (c == '\n')
435                     (void) putc ('\r', out);
436                 if (putc (c, out) == EOF) {
437                     perror ("putc");
438                     (void) fclose (out);
439                     data_fd = NOTOK;
440                     goto bad;
441                 }
442             }
443
444             (void) fclose (out);
445             data_fd = NOTOK;
446         }
447         else {
448             while ((cc = fread (buffer, sizeof *buffer, sizeof buffer, fp)) >0)
449                 if (write_tcp_socket (data_fd, buffer, cc) != cc) {
450                     perror ("write_tcp_socket");
451                     goto bad;
452                 }
453
454             (void) close_tcp_socket (data_fd), data_fd = NOTOK;
455         }
456     }
457     else {
458         if (ascii) {
459             int     c;
460             FILE   *in;
461
462             if (!(in = fdopen (data_fd, "r"))) {
463                 perror ("fdopen");
464                 goto bad;
465             }
466
467             while ((c = getc (in)) != EOF) {
468                 if (c == '\r')
469                     switch (c = getc (in)) {
470                         case EOF:
471                         case '\0':
472                             c = '\r';
473                             break;
474
475                         case '\n':
476                             break;
477
478                         default:
479                             (void) putc ('\r', fp);
480                             break;
481                         }
482
483                 if (putc (c, fp) == EOF) {
484                     perror ("putc");
485                     (void) fclose (in);
486                     data_fd = NOTOK;
487                     goto bad;
488                 }
489             }
490
491             (void) fclose (in);
492             data_fd = NOTOK;
493         }
494         else {
495             while ((cc = read_tcp_socket (data_fd, buffer, sizeof buffer)) > 0)
496                 if (fwrite (buffer, sizeof *buffer, cc, fp) == 0) {
497                     perror ("fwrite");
498                     goto bad;
499                 }
500             if (cc < 0) {
501                 perror ("read_tcp_socket");
502                 goto bad;
503             }
504
505             (void) close_tcp_socket (data_fd), data_fd = NOTOK;
506         }
507     }
508
509     if (!istdio)
510         (void) fclose (fp);
511
512     v_noise = v_verbose;
513     return (getreply (1, 0) == COMPLETE ? OK : NOTOK);
514 }
515
516 /* \f */
517
518 static int  initconn ()
519 {
520     int     len;
521     register char  *a,
522                    *p;
523     struct sockaddr_in in_socket;
524
525     if (getsockname (ftp_fd, (struct sockaddr *) &in_socket,
526                      (len = sizeof in_socket, &len)) == NOTOK) {
527         perror ("getsockname");
528         return NOTOK;
529     }
530     in_socket.sin_port = 0;
531     if ((data_fd = start_tcp_server (&in_socket, 1, 0, 0)) == NOTOK) {
532         perror ("start_tcp_server");
533         return NOTOK;
534     }
535
536     if (getsockname (data_fd, (struct sockaddr *) &in_socket,
537                      (len = sizeof in_socket, &len)) == NOTOK) {
538         perror ("getsockname");
539         return NOTOK;
540     }
541
542     a = (char *) &in_socket.sin_addr;
543     p = (char *) &in_socket.sin_port;
544
545 #define UC(b)   (((int) b) & 0xff)
546     if (command (1, "PORT %d,%d,%d,%d,%d,%d",
547                       UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
548                       UC(p[0]), UC(p[1])) == COMPLETE)
549         return OK;
550
551     return NOTOK;
552 }
553
554 /* \f */
555
556 static int  dataconn ()
557 {
558     int     fd;
559     struct sockaddr_in in_socket;
560     
561     if ((fd = join_tcp_client (data_fd, &in_socket)) == NOTOK) {
562         perror ("join_tcp_client");
563         return NOTOK;
564     }
565     (void) close_tcp_socket (data_fd);
566     data_fd = fd;
567
568     return OK;
569 }
570
571 /* \f */
572
573 #ifndef lint
574 #ifdef __STDC__
575 static int  command (int arg1, ...)
576 {
577     int     val;
578     va_list ap;
579
580     va_start (ap, arg1);
581
582     val = _command (arg1, ap);
583
584     va_end (ap);
585
586     return val;
587 }
588 #else
589 static int  command (va_alist)
590 va_dcl
591 {
592     int     val;
593     va_list ap;
594
595     va_start (ap);
596
597     val = va_arg (ap, int);
598     val = _command (val, ap);
599
600     va_end (ap);
601
602     return val;
603 }
604 #endif
605
606 static int  _command (complete, ap)
607 int complete;
608 va_list ap;
609 {
610     int     len;
611     char    buffer[BUFSIZ];
612
613     if (ftp_fd == NOTOK)
614         return NOTOK;
615
616     _asprintf (buffer, NULLCP, ap);
617     if (v_debug)
618         fprintf (stderr, "<--- %s\n", buffer);
619
620     (void) strcat (buffer, "\r\n");
621     len = strlen (buffer);
622
623     if (write_tcp_socket (ftp_fd, buffer, len) != len) {
624         perror ("write_tcp_socket");
625         return NOTOK;
626     }
627
628     return (getreply (complete, !strcmp (buffer, "QUIT")));
629 }
630 #else
631 /* VARARGS2 */
632
633 static int  command (complete, fmt)
634 int     complete;
635 char   *fmt;
636 {
637     return command (complete, fmt);
638 }
639 #endif
640
641 /* \f */
642
643 static int  getreply (complete, expecteof)
644 int     complete,
645         expecteof;
646 {
647     for (;;) {
648         register int code,
649                      dig,
650                      n;
651         int     continuation;
652         register char *bp;
653         char    buffer[BUFSIZ];
654
655         code = dig = n = continuation = 0;
656         bp = buffer;
657
658         for (;;) {
659             char    c;
660
661             if (read_tcp_socket (ftp_fd, &c, 1) < 1) {
662                 if (expecteof)
663                     return OK;
664
665                 perror ("read_tcp_socket");
666                 return DONE;
667             }
668             if (c == '\n')
669                 break;
670             *bp++ = c != '\r' ? c : '\0';
671
672             dig++;
673             if (dig < 4) {
674                 if (isdigit(c))
675                     code = code * 10 + (c - '0');
676                 else                            /* XXX: naughty FTP... */
677                     if (isspace (c))
678                         continuation++;
679             }
680             else
681                 if (dig == 4 && c == '-')
682                     continuation++;
683             if (n == 0)
684                 n = c;
685         }
686
687         if (v_debug)
688             fprintf (stderr, "---> %s\n", buffer);
689         if (continuation)
690             continue;
691
692         n -= '0';
693
694         if (v_noise) {
695             fprintf (stdout, "%s\n", buffer);
696             (void) fflush (stdout);
697             v_noise = 0;
698         }
699         else
700             if ((complete == -1 && n != PRELIM)
701                     || (complete == 0 && n != CONTINUE && n != COMPLETE)
702                     || (complete == 1 && n != COMPLETE))
703                 fprintf (stderr, "%s\n", buffer);
704
705         return n;
706     }
707 }
708 #endif
709 @
710
711
712 1.12
713 log
714 @added gethostbystring() routine (deals with numbers and names)
715 added support for writing files, etc.
716 /mtr
717 @
718 text
719 @d4 1
720 a4 1
721 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.11 1993/03/17 00:18:56 jromine Exp jromine $";
722 d70 1
723 d73 1
724 @
725
726
727 1.11
728 log
729 @fix varargs - argument passing order is not defined in C
730 @
731 text
732 @d4 1
733 a4 1
734 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.10 1992/12/03 16:50:27 jromine Exp jromine $";
735 a51 3
736
737 /* taken from ISODE's compat/internet.c */
738
739 a63 5
740 #ifndef DG
741 u_long  inet_addr ();
742 #else
743 struct in_addr inet_addr ();
744 #endif
745 d65 1
746 a66 38
747 static char *empty = NULL;
748 #ifdef  h_addr
749 static char *addrs[2] = { NULL };
750 #endif
751
752 static struct hostent *gethostbystring (s)
753 char   *s;
754 {
755     register struct hostent *h;
756 #ifndef DG
757     static u_long iaddr;
758 #else
759     static struct in_addr iaddr;
760 #endif
761     static struct hostent   hs;
762
763     iaddr = inet_addr (s);
764 #ifndef DG
765     if (iaddr == NOTOK && strcmp (s, "255.255.255.255"))
766 #else
767     if (iaddr.s_addr == NOTOK && strcmp (s, "255.255.255.255"))
768 #endif
769         return gethostbyname (s);
770
771     h = &hs;
772     h -> h_name = s;
773     h -> h_aliases = &empty;
774     h -> h_addrtype = AF_INET;
775     h -> h_length = sizeof (iaddr);
776 #ifdef  h_addr
777     h -> h_addr_list = addrs;
778     bzero ((char *) addrs, sizeof addrs);
779 #endif
780     h -> h_addr = (char *) &iaddr;
781
782     return h;
783 }
784
785 d184 18
786 d268 1
787 a268 1
788     result = ftp_read (remote, local, ascii);
789 d295 1
790 a295 1
791 static int  ftp_read (remote, local, ascii)
792 d297 2
793 a298 1
794         *local;
795 d301 2
796 d306 1
797 a306 1
798     FILE   *fp;
799 d312 1
800 a312 1
801     if (command (-1, "RETR %s", remote) != PRELIM)
802 d318 2
803 d328 1
804 a328 4
805     if ((fp = fopen (local, "w")) == NULL) {
806         perror (local);
807         goto bad;
808     }
809 d330 5
810 a334 6
811     if (ascii) {
812         int     c;
813         FILE   *in;
814
815         if (!(in = fdopen (data_fd, "r"))) {
816             perror ("fdopen");
817 a336 7
818         while ((c = getc (in)) != EOF) {
819             if (c == '\r')
820                 switch (c = getc (in)) {
821                     case EOF:
822                     case '\0':
823                         c = '\r';
824                         break;
825 d338 4
826 a341 2
827                     case '\n':
828                         break;
829 d343 13
830 a355 3
831                     default:
832                         (void) putc ('\r', fp);
833                         break;
834 d357 1
835 d359 2
836 a360 6
837             if (putc (c, fp) == EOF) {
838                 perror ("putc");
839                 (void) fclose (in);
840                 data_fd = NOTOK;
841                 goto bad;
842             }
843 d362 6
844 d369 2
845 a370 2
846         (void) fclose (in);
847         data_fd = NOTOK;
848 d373 6
849 a378 3
850         while ((cc = read_tcp_socket (data_fd, buffer, sizeof buffer)) > 0)
851             if (fwrite (buffer, sizeof *buffer, cc, fp) == 0) {
852                 perror ("fwrite");
853 d381 27
854 a407 3
855         if (cc < 0) {
856             perror ("read_tcp_socket");
857             goto bad;
858 d409 10
859 d420 2
860 a421 1
861         (void) close_tcp_socket (data_fd), data_fd = NOTOK;
862 d424 2
863 a425 1
864     (void) fclose (fp);
865 @
866
867
868 1.10
869 log
870 @put u_short ifdef under #if AUX
871 @
872 text
873 @d4 1
874 a4 1
875 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.9 1992/12/03 16:28:56 jromine Exp jromine $";
876 d491 2
877 a492 1
878     val = _command (va_arg (ap, int), ap);
879 @
880
881
882 1.9
883 log
884 @u_short AUX changes from Jim Guyton
885 @
886 text
887 @d4 1
888 a4 1
889 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.8 1992/11/24 18:24:30 jromine Exp jromine $";
890 d47 1
891 a47 1
892 #ifdef  SYS5
893 @
894
895
896 1.8
897 log
898 @fix decl
899 @
900 text
901 @d4 1
902 a4 1
903 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.7 1992/11/12 00:41:28 jromine Exp jromine $";
904 d46 6
905 @
906
907
908 1.7
909 log
910 @__STDC__ ifdef
911 put iob back
912 @
913 text
914 @d4 1
915 a4 1
916 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.6 1992/11/11 20:56:53 jromine Exp jromine $";
917 d27 3
918 @
919
920
921 1.6
922 log
923 @VSPRINTF fixups for aix
924 @
925 text
926 @d4 1
927 a4 1
928 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.5 1992/11/02 21:35:10 jromine Exp jromine $";
929 d11 3
930 d22 6
931 d169 1
932 a169 4
933         FP iob;
934
935         if ((iob = malloc(sizeof iob)) == NULL)
936           adios(NULLCP, "unable to allocate buffer");
937 @
938
939
940 1.5
941 log
942 @iob->_ptr ifdef sequent (type problem)
943 @
944 text
945 @d1 1
946 a1 1
947 /* ftp.c - simple FTP client library (why doesn't BSD have one?!?) */
948 d4 1
949 a4 1
950 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.4 1992/11/02 17:01:49 jromine Exp jromine $";
951 d160 4
952 a163 1
953         struct _iobuf iob;
954 @
955
956
957 1.4
958 log
959 @fix from mtr
960 @
961 text
962 @d4 1
963 a4 1
964 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.3 1992/10/20 16:31:05 jromine Exp jromine $";
965 d169 1
966 a169 1
967 #if     !defined(vax) && !defined(pyr)
968 @
969
970
971 1.3
972 log
973 @fixes from mtr
974 @
975 text
976 @d4 1
977 a4 1
978 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.2 1992/05/19 21:03:01 jromine Exp $";
979 d551 3
980 @
981
982
983 1.2
984 log
985 @AIX
986 @
987 text
988 @d4 1
989 a4 1
990 static char ident[] = "@@(#)$Id: ftpsbr.c,v 1.1 1992/01/31 16:28:15 jromine Exp jromine $";
991 a521 10
992     register int code,
993                  dig,
994                  n;
995     int     originalcode,
996             continuation;
997     register char *bp;
998     char    buffer[BUFSIZ];
999
1000     originalcode = continuation = 0;
1001     bp = buffer;
1002 d523 6
1003 a528 1
1004         dig = n = code = 0;
1005 d530 3
1006 d548 7
1007 a554 4
1008             if (dig < 4 && isdigit(c))
1009                 code = code * 10 + (c - '0');
1010             if (dig == 4 && c == '-')
1011                 continuation++;
1012 a558 5
1013         if (continuation && code != originalcode) {
1014             if (originalcode == 0)
1015                 originalcode = code;
1016             continue;
1017         }
1018 d561 2
1019 @
1020
1021
1022 1.1
1023 log
1024 @Initial revision
1025 @
1026 text
1027 @d4 1
1028 a4 1
1029 static char ident[] = "@@(#)$Id$";
1030 d13 3
1031 d17 1
1032 d155 1
1033 a155 1
1034     *bp = NULL;
1035 d176 1
1036 a176 1
1037         (void) putc (NULL, &iob);
1038 d349 1
1039 a349 1
1040                     case NULL:
1041 d450 15
1042 d473 1
1043 a473 1
1044     val = _command (ap);
1045 d479 1
1046 d481 2
1047 a482 1
1048 static int  _command (ap)
1049 d485 1
1050 a485 3
1051     int     cc,
1052             complete,
1053             len;
1054 a490 2
1055     complete = va_arg (ap, int);
1056
1057 d547 1
1058 a547 1
1059             *bp++ = c != '\r' ? c : NULL;
1060 @