diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1996-09-03 18:00:07 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1996-09-03 18:00:07 +0000 |
commit | b144f6e5cfc95f3486ac25047d67372e40adbaed (patch) | |
tree | 14410b1ea376d03c802ab50fcbca10a3403205a7 /usr.bin/ftp | |
parent | d6631cc24a4fcf56093ab90bdf2a08692a471d50 (diff) |
http:// support for the command line fetches; useful for the ports subsystem
and other scripts. written by brian@saturn.net (and then i clawed at it for
a bit..)
Diffstat (limited to 'usr.bin/ftp')
-rw-r--r-- | usr.bin/ftp/Makefile | 4 | ||||
-rw-r--r-- | usr.bin/ftp/extern.h | 3 | ||||
-rw-r--r-- | usr.bin/ftp/http.c | 165 | ||||
-rw-r--r-- | usr.bin/ftp/main.c | 15 |
4 files changed, 180 insertions, 7 deletions
diff --git a/usr.bin/ftp/Makefile b/usr.bin/ftp/Makefile index 02e84d7da1e..ca0d202f7ae 100644 --- a/usr.bin/ftp/Makefile +++ b/usr.bin/ftp/Makefile @@ -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> diff --git a/usr.bin/ftp/extern.h b/usr.bin/ftp/extern.h index e24b4458d61..8b6eda3e1ef 100644 --- a/usr.bin/ftp/extern.h +++ b/usr.bin/ftp/extern.h @@ -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 index 00000000000..36be1d9bdd1 --- /dev/null +++ b/usr.bin/ftp/http.c @@ -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); +} diff --git a/usr.bin/ftp/main.c b/usr.bin/ftp/main.c index e0c8b51925e..df9eb3c5732 100644 --- a/usr.bin/ftp/main.c +++ b/usr.bin/ftp/main.c @@ -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; |