http:// support for the command line fetches; useful for the ports subsystem
authorderaadt <deraadt@openbsd.org>
Tue, 3 Sep 1996 18:00:05 +0000 (18:00 +0000)
committerderaadt <deraadt@openbsd.org>
Tue, 3 Sep 1996 18:00:05 +0000 (18:00 +0000)
and other scripts. written by brian@saturn.net (and then i clawed at it for
a bit..)

usr.bin/ftp/Makefile
usr.bin/ftp/extern.h
usr.bin/ftp/http.c [new file with mode: 0644]
usr.bin/ftp/main.c

index 02e84d7..ca0d202 100644 (file)
@@ -1,8 +1,8 @@
-#       $OpenBSD: Makefile,v 1.3 1996/06/26 05:33:32 deraadt Exp $
+#       $OpenBSD: Makefile,v 1.4 1996/09/03 18:00:05 deraadt Exp $
 #       $NetBSD: Makefile,v 1.6 1995/11/22 21:52:48 cgd Exp $
 
 PROG=  ftp
-SRCS=  cmds.c cmdtab.c ftp.c main.c ruserpass.c domacro.c
+SRCS=  cmds.c cmdtab.c ftp.c main.c ruserpass.c domacro.c http.c
 CFLAGS+= -Dunix
 
 .include <bsd.prog.mk>
index e24b445..8b6eda3 100644 (file)
@@ -1,4 +1,4 @@
-/*      $OpenBSD: extern.h,v 1.2 1996/06/26 05:33:35 deraadt Exp $      */
+/*      $OpenBSD: extern.h,v 1.3 1996/09/03 18:00:05 deraadt Exp $      */
 /*      $NetBSD: extern.h,v 1.4 1995/09/08 01:06:19 tls Exp $      */
 
 /*-
@@ -142,6 +142,7 @@ void        status __P((int, char **));
 void   syst __P((int, char **));
 void    tvsub __P((struct timeval *, struct timeval *, struct timeval *));
 void   user __P((int, char **));
+int    http_fetch __P((char *));
 
 extern jmp_buf abortprox;
 extern int     abrtflag;
diff --git a/usr.bin/ftp/http.c b/usr.bin/ftp/http.c
new file mode 100644 (file)
index 0000000..36be1d9
--- /dev/null
@@ -0,0 +1,165 @@
+/*     $OpenBSD: http.c,v 1.1 1996/09/03 18:00:06 deraadt Exp $        */
+
+/*
+ * Copyright (c) 1996 Theo de Raadt
+ * Copyright (c) 1996 Brian Mitchell
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <netdb.h>
+#include <pwd.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/*
+ * This function lets you retrieve files from the WWW. It will accept
+ * any http:// url. It conects and retrieves the file, saving it in
+ * the current directory.
+ *
+ * Limitations:
+ * http://host does not work, nor http://host/ - you have to specifically
+ * specify the filename you want to transfer.
+ */
+int
+http_fetch(url)
+       char *url;
+{
+       char *hostname, *filename, basename[MAXPATHLEN] = "/";
+       char buf[8192], *bufp, *req = NULL;
+       struct sockaddr_in addr;
+       struct hostent *he;
+       FILE *write_to;
+       char *s, *p;
+       int bytes, c, d;
+       int sock = -1, file = -1, ret = 1;
+
+       s = url + strlen("http://");
+       p = strchr(s, '/');
+       if (p)
+               *p = '\0';
+       else
+               p = s + strlen(s);
+       if (p - s > MAXHOSTNAMELEN-1) {
+               warn("hostname too long");
+               return (1);
+       }
+       hostname = s;
+       filename = p + 1;
+
+       p = strrchr(filename, '/');
+       if (p == NULL) {
+               if (strlen(s) > MAXPATHLEN-1) {
+                       warn("filename too long");
+                       return (1);
+               }
+               strcpy(basename, filename);
+       } else {
+               p++;
+               if (strlen(p) > MAXPATHLEN-1) {
+                       warn("filename too long");
+                       return (1);
+               }
+               strcpy(basename, p);
+       }
+       if (strlen(basename) == 0)
+               strcpy(basename, "index.html");
+
+       req = (char *)malloc(sizeof("GET ") + strlen(filename) +3);
+       if (!req) {
+               warn("no memory");
+               return (1);
+       }
+       sprintf(req, "GET /%s\n", filename);
+
+       he = gethostbyname(hostname);
+       if (!he) {
+               perror("gethostbyname");
+               goto die;
+       }
+
+       sock = socket(AF_INET, SOCK_STREAM, 0);
+       if (sock == -1) {
+               perror("socket");
+               goto die;
+       }
+
+       memset(&addr, 0, sizeof addr);
+       addr.sin_family = he->h_addrtype;
+       addr.sin_port = htons(80);
+       memcpy(&addr.sin_addr, he->h_addr, he->h_length);
+
+       if (connect(sock, (struct sockaddr *)&addr, sizeof addr) == -1) {
+               perror("connect");
+               goto die;
+       }
+       printf("Connected to %s.\n", hostname);
+
+       printf("Retrieving using: %s", req);
+       for (bufp = req, c = strlen(bufp); c > 0; c -= d, bufp += d) {
+               if ((d = write(sock, bufp, c)) <= 0)
+                       break;
+       }
+       if (d == -1) {
+               perror("sending command");
+               goto die;
+       }
+
+       file = open(basename, O_CREAT|O_WRONLY|O_TRUNC, 0666);
+       if (!file) {
+               perror("fopen");
+               goto die;
+       }
+
+       bytes = 0;
+       while ((c = read(sock, buf, sizeof (buf))) > 0) {
+               bytes += c;
+               for (bufp = buf; c > 0; c -= d, bufp += d)
+                       if ((d = write(file, bufp, c)) <= 0)
+                               break;
+       }
+       if (d == -1) {
+               perror("failed to receive correctly");
+               goto die;
+       }
+       printf("Success, closing connection.\n"); 
+       ret = 0;
+die:
+       if (sock != -1)
+               close(sock);
+       if (file != -1)
+               close(file);
+       if (req)
+               free(req);
+       return (ret);
+}   
index e0c8b51..df9eb3c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: main.c,v 1.5 1996/06/26 05:33:38 deraadt Exp $        */
+/*     $OpenBSD: main.c,v 1.6 1996/09/03 18:00:06 deraadt Exp $        */
 
 /*
  * Copyright (c) 1985, 1989, 1993, 1994
@@ -43,7 +43,7 @@ static char copyright[] =
 #if 0
 static char sccsid[] = "@(#)main.c     8.6 (Berkeley) 10/9/94";
 #else
-static char rcsid[] = "$OpenBSD: main.c,v 1.5 1996/06/26 05:33:38 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: main.c,v 1.6 1996/09/03 18:00:06 deraadt Exp $";
 #endif
 #endif /* not lint */
 
@@ -52,7 +52,9 @@ static char rcsid[] = "$OpenBSD: main.c,v 1.5 1996/06/26 05:33:38 deraadt Exp $"
  */
 /*#include <sys/ioctl.h>*/
 #include <sys/types.h>
+#include <sys/file.h>
 #include <sys/socket.h>
+#include <netinet/in.h>
 
 #include <arpa/ftp.h>
 
@@ -168,7 +170,10 @@ main(argc, argv)
                                ret = 1;
                                goto bail;
                        }
-
+                       if (!strncmp(host, "http://", strlen("http://"))) {
+                               http_fetch(host);
+                               goto bail;
+                       }
                        if (strncmp(host, "ftp://", sizeof("ftp://")-1) == 0) {
                                host += sizeof("ftp://") - 1;
                                p = strchr(host, '/');
@@ -218,8 +223,10 @@ main(argc, argv)
 
                        /* get ready for the next file */
 bail:
-                       if (bufp)
+                       if (bufp) {
                                free(bufp);
+                               bufp = NULL;
+                       }
                        if (connected)
                                disconnect(1, xargv);
                        --argc;