]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/uip/RCS/ftpsbr.c,v
sbr/mts.c: Delete mmdlm2; use same-valued mmdlm1 instead.
[nmh] / 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 @