From: Ben Gras Date: Fri, 18 Nov 2011 11:19:50 +0000 (+0100) Subject: remove ftpd200 X-Git-Tag: v3.2.0~245 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/zlib_tech.html?a=commitdiff_plain;h=f379b3eecb4d11d321de69849d4a66b1ef6ef62e;p=minix.git remove ftpd200 --- diff --git a/commands/Makefile b/commands/Makefile index 234d57169..7ef211f58 100644 --- a/commands/Makefile +++ b/commands/Makefile @@ -12,7 +12,7 @@ SUBDIR= aal add_route arp ash at autil awk \ dhrystone diff dirname dis386 dis88 diskctl du dumpcore \ ed eject elle elvis env expand factor file \ find finger fingerd fix fold format fortune fsck.mfs \ - ftp101 ftpd200 gcov-pull getty grep head hexdump host \ + ftp101 gcov-pull getty grep head hexdump host \ hostaddr id ifconfig ifdef install \ intr ipcrm ipcs irdpd isoread join kill last leave \ less lex loadkeys loadramdisk logger login look lp \ diff --git a/commands/ftpd200/Makefile b/commands/ftpd200/Makefile deleted file mode 100644 index 85436e956..000000000 --- a/commands/ftpd200/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# Makefile for ftpd -# -# 01/25/96 Initial Release Michael Temari, -# 2005-02-25 version 2.00 - -PROG= in.ftpd -SRCS= ftpd.c access.c file.c net.c -MAN= ftpd.8 -SCRIPTS= ftpdsh -FILES= setup.anonftp -NEED_NBSDLIBC=y -LDADD+= -lcrypt - -.include diff --git a/commands/ftpd200/README b/commands/ftpd200/README deleted file mode 100644 index 0d267c10a..000000000 --- a/commands/ftpd200/README +++ /dev/null @@ -1,35 +0,0 @@ -ftpd200 --- FTP server program for Minix 2.0 -written by Michael Temari release 2.00 2005-02-25 - -Full download: ftpd200.tar.Z - -Ftpd is the File Transfer Protocol (FTP) server. - -Important: Release 2.00 incorporates an improved mechanism to restrict -execution of commands on the server. This is done through use of a -shell script, ftpdsh. Any earlier ftpd version in use on a system -accessible from the Internet should be upgraded at least to version 1.01, -version 2.00 is preferable. - -Installation: unpack the tarball in /usr/local/src or another directory -of your choice: -zcat < ftpd200.tar.Z | tar xvfp - - -The ftpd200 directory will be created. Read the Makefile to see how -the program is compiled and installed: - -make (or make ftpd) -- compiles the binary -make install -- installs /usr/bin/in.ftpd, and ftpdsh. Also installs - setup.anonftp script. -make installman -- installs new ftpd.8 man page in /usr/local/man/man8 - -The shell script setup.anonftp sets up and verifies configuration for -anonymous ftp. If you provide anonymous ftp you are letting anyone in -the whole wide world execute a program on your computer. You want to -make sure it's set up correctly so outsiders can't mess with things -they shouldn't. - -This file is included as README in the source directory. For more -notes on compiling and installing, also please see the file README2. - -notes updated by asw 2005-02-25 diff --git a/commands/ftpd200/README2 b/commands/ftpd200/README2 deleted file mode 100644 index 40e035baf..000000000 --- a/commands/ftpd200/README2 +++ /dev/null @@ -1,34 +0,0 @@ -README2: additional notes on compiling and installing ftpd. - -Note that the Makefile install options will replace files in /usr/bin -and /usr/man that were installed with the Minix distribution. If you -are not sure you want to do this you can either rename the original -in.ftpd binary, the anonftp.* scripts, and the ftpd.8 man page to -prevent them from being replaced, or you can edit the Makefile to -change the directory values: - BINDIR= /usr/local/bin - MANDIR= /usr/local/man/man8 -ASW's practice is to rename binaries with a suffix that indicates the -original distribution from which they were obtained, i.e., in.ftpd.203 -for the version distributed with Minix 2.0.3, or with a date code or a -version number. - -If you are sure you want to replace the original ftpd provided with your -distribution you may want to copy the contents of the unpacked tarball -to the main directory tree, in this case /usr/src/commands/ftpd, so that -a new version will be compiled if you do a general recompilation of all -commands using "make all" or "make compile" in /usr/src. ASW's practice -is generally to make a directory in /usr/local/src for new versions of -major programs. -Also note that if you create a new man page where one did not exist -previously you will need to run makewhatis to rebuild the whatis -database, i.e.: - makewhatis /usr/man -or - makewhatis /usr/local/man - -Important: the scripts for setting up and maintaining an anonymous ftp -installation haven't been checked for a long time, I would appreciate -comments. - -ASW 2005-02-06 diff --git a/commands/ftpd200/access.c b/commands/ftpd200/access.c deleted file mode 100644 index 0e686bbb0..000000000 --- a/commands/ftpd200/access.c +++ /dev/null @@ -1,134 +0,0 @@ -/* access.c Copyright 1992-2000 by Michael Temari All Rights Reserved - * - * This file is part of ftpd. - * - * This file handles: - * - * USER PASS QUIT - * - * - * 01/25/96 Initial Release Michael Temari, - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ftpd.h" -#include "access.h" - -_PROTOTYPE(static int AreWeIn, (char *name, struct passwd *pwd)); - -static char *msg530 = "530 Not logged in.\r\n"; - -/* Returns -1 = not logged in, 0 = loggedin */ -int ChkLoggedIn() -{ - if(!loggedin) { - printf(msg530); - return(-1); - } else - return(0); -} - -/* what a USER! */ -int doUSER(buff) -char *buff; -{ - loggedin = 0; - gotuser = 0; - strncpy(username, buff, sizeof(username)); - username[sizeof(username)-1] = '\0'; - - if(*username == '\0') { - printf("501 Bad user name.\r\n"); - return(GOOD); - } - - gotuser = 1; - - printf("331 Password required for %s.\r\n", username); - - return(GOOD); -} - -/* secret, secret, secret */ -int doPASS(buff) -char *buff; -{ -char *name; -struct passwd *pwd; -int bad=0; - - name = username; - - if(!strcmp(name, "anonymous")) - name = "ftp"; - - if(!gotuser || ((pwd = getpwnam(name)) == (struct passwd *)0)) - bad = 1; - else - if(strcmp(name, "ftp")) { - if(!strcmp(pwd->pw_passwd, crypt("", pwd->pw_passwd))) - bad = 1; - if(strcmp(pwd->pw_passwd, crypt(buff, pwd->pw_passwd))) - bad = 1; - } else { - strncpy(anonpass, buff, sizeof(anonpass)); - anonpass[sizeof(anonpass)-1] = '\0'; - } - - if(bad) { - logit("LOGIN", "FAIL"); - printf(msg530); - return(GOOD); - } - - return(AreWeIn(name, pwd)); -} - -/* bye, bye don't let the door hit you in the butt on the way out */ -int doQUIT(buff) -char *buff; -{ - printf("221 Service closing, don't be a stranger.\r\n"); - - return(BAD); -} - -/* see if this user is okay */ -static int AreWeIn(name, pwd) -char *name; -struct passwd *pwd; -{ - if(!strcmp(name, "ftp")) { - if(chroot(pwd->pw_dir)) { - logit("LOGIN", "FAIL"); - printf("530 Not logged in, could not chroot.\r\n"); - return(GOOD); - } - strncpy(newroot, pwd->pw_dir, sizeof(newroot)); - newroot[sizeof(newroot)-1] = '\0'; - anonymous = 1; - strcpy(pwd->pw_dir, "/"); - } - - if(setgid(pwd->pw_gid) || setuid(pwd->pw_uid) || chdir(pwd->pw_dir)) { - logit("LOGIN", "FAIL"); - printf(msg530); - anonymous = 0; - } else { - logit("LOGIN", "PASS"); - showmsg("230", (char *)NULL); - printf("230 User %s logged in, directory %s.\r\n", - username, pwd->pw_dir); - loggedin = 1; - } - - return(GOOD); -} diff --git a/commands/ftpd200/access.h b/commands/ftpd200/access.h deleted file mode 100644 index f2f446289..000000000 --- a/commands/ftpd200/access.h +++ /dev/null @@ -1,12 +0,0 @@ -/* ftpd.h - * - * This file is part of ftpd. - * - * - * 01/25/96 Initial Release Michael Temari, - */ - -_PROTOTYPE(int ChkLoggedIn, (void)); -_PROTOTYPE(int doUSER, (char *buff)); -_PROTOTYPE(int doPASS, (char *buff)); -_PROTOTYPE(int doQUIT, (char *buff)); diff --git a/commands/ftpd200/file.c b/commands/ftpd200/file.c deleted file mode 100644 index 381cfdbea..000000000 --- a/commands/ftpd200/file.c +++ /dev/null @@ -1,1252 +0,0 @@ -/* file.c Copyright 1992-2000 by Michael Temari All Rights Reserved - * - * This file is part of ftpd. - * - * This file handles: - * - * ALLO APPE CDUP CWD DELE LIST MDTM MODE MKD NLST PWD REST RETR - * RMD RNFR RNTO SITE SIZE STAT STOR STOU STRU SYST TYPE - * - * 01/25/96 Initial Release Michael Temari - * 03/09/00 Michael Temari, - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ftpd.h" -#include "access.h" -#include "file.h" -#include "net.h" - -_PROTOTYPE(static int fdxcmd, (int cmd, char *arg)); -_PROTOTYPE(static int endfdxcmd, (int fd)); -_PROTOTYPE(static int asciisize, (char *filename, unsigned long *filesize)); -_PROTOTYPE(static int cnvtfile, (char *name, char **name2)); -_PROTOTYPE(static int procfile, (char *name)); -_PROTOTYPE(static unsigned long fsize, (char *fname)); -_PROTOTYPE(static int sendfile, (char *name, int xmode)); -_PROTOTYPE(static int recvfile, (char *name, int xmode)); -_PROTOTYPE(static char *uniqname, (void)); -_PROTOTYPE(static int docrc, (char *buff, int xmode)); -_PROTOTYPE(static int dofdet, (char *buff)); -_PROTOTYPE(static char *path, (char *fname)); - -#define SEND_FILE 0 -#define SEND_NLST 1 -#define SEND_LIST 2 - -#define RECV_FILE 0 -#define RECV_APND 1 -#define RECV_UNIQ 2 - -#define CNVT_ERROR 0 -#define CNVT_NONE 1 -#define CNVT_TAR 2 -#define CNVT_TAR_Z 3 -#define CNVT_COMP 4 -#define CNVT_TAR_GZ 5 -#define CNVT_GZIP 6 -#define CNVT_UNCOMP 7 - - -#define PROG_FTPDSH "ftpdsh" -#define CMD_NLST 1 -#define CMD_LIST 2 -#define CMD_CRC 3 - -static char *msg550 = "550 %s %s.\r\n"; - -static unsigned long file_restart = 0; - -static char rnfr[256]; -static char buffer[8192]; -static char bufout[8192]; - -static cmdpid = -1; - -/* allocate, we don't need no stink'n allocate */ -int doALLO(buff) -char *buff; -{ - printf("202 ALLO command not needed at this site.\r\n"); - - return(GOOD); -} - -/* append to a file if it exists */ -int doAPPE(buff) -char *buff; -{ - return(recvfile(buff, RECV_APND)); -} - -/* change to parent directory */ -int doCDUP(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - return(doCWD("..")); -} - -/* change directory */ -int doCWD(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - if(chdir(buff)) - printf(msg550, buff, strerror(errno)); - else { - showmsg("250", ".ftpd_msg"); - printf("250 %s command okay.\r\n", line); - } - - return(GOOD); -} - -/* remove a file */ -int doDELE(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - if(anonymous) { - printf("550 Command not allowed for anonymous user\r\n"); - return(GOOD); - } - - if(unlink(buff)) - printf(msg550, buff, strerror(errno)); - else { - printf("250 File \"%s\" deleted.\r\n", buff); - logit("DELE", path(buff)); - } - - return(GOOD); -} - -/* directory listing */ -int doLIST(buff) -char *buff; -{ - file_restart = 0; - - return(sendfile(buff, SEND_LIST)); -} - -/* file modification time, btw when will this be put into an RFC */ -int doMDTM(buff) -char *buff; -{ -struct stat st; -struct tm *t; - - if(ChkLoggedIn()) - return(GOOD); - - if(stat(buff, &st)) { - printf(msg550, buff, strerror(errno)); - return(GOOD); - } - - if((st.st_mode & S_IFMT) != S_IFREG) { - printf("550 Not a regular file.\r\n"); - return(GOOD); - } - - t = gmtime(&st.st_mtime); - - printf("215 %04d%02d%02d%02d%02d%02d\r\n", - t->tm_year+1900, t->tm_mon+1, t->tm_mday, - t->tm_hour, t->tm_min, t->tm_sec); - - return(GOOD); -} - -/* mode */ -int doMODE(buff) -char *buff; -{ - switch(*buff) { - case 'b': - case 'B': - printf("200 Mode set to %c.\r\n", *buff); - mode = MODE_B; - break; - case 's': - case 'S': - printf("200 Mode set to %c.\r\n", *buff); - mode = MODE_S; - break; - default: - printf("501 Unknown mode %c.\r\n", *buff); - } - - return(GOOD); -} - -/* make a directory */ -int doMKD(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - if(anonymous) { - printf("550 Command not allowed for anonymous user\r\n"); - return(GOOD); - } - - if(mkdir(buff, 0777)) - printf(msg550, buff, strerror(errno)); - else { - printf("257 \"%s\" directory created.\r\n", buff); - logit("MKD ", path(buff)); - } - - return(GOOD); -} - -/* name listing */ -int doNLST(buff) -char *buff; -{ - file_restart = 0; - - return(sendfile(buff, SEND_NLST)); -} - -/* where are we */ -int doPWD(buff) -char *buff; -{ -char dir[128]; - - if(ChkLoggedIn()) - return(GOOD); - - if(getcwd(dir, sizeof(dir)) == (char *)NULL) - printf(msg550, buff, strerror(errno)); - else - printf("257 \"%s\" is current directory.\r\n", dir); - - return(GOOD); -} - -/* restart command */ -int doREST(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - file_restart = atol(buff); - - printf("350 Next file transfer will restart at %lu.\r\n", file_restart); - - return(GOOD); -} - -/* they want a file */ -int doRETR(buff) -char *buff; -{ - return(sendfile(buff, SEND_FILE)); -} - -/* remove a directory */ -int doRMD(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - if(anonymous) { - printf("550 Command not allowed for anonymous user\r\n"); - return(GOOD); - } - - if(rmdir(buff)) - printf(msg550, buff, strerror(errno)); - else { - printf("250 Directory \"%s\" deleted.\r\n", buff); - logit("RMD ", path(buff)); - } - - return(GOOD); -} - -/* rename from */ -int doRNFR(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - if(anonymous) { - printf("550 Command not allowed for anonymous user\r\n"); - return(GOOD); - } - - strncpy(rnfr, buff, sizeof(rnfr)); - rnfr[sizeof(rnfr)-1] = '\0'; - - printf("350 Got RNFR waiting for RNTO.\r\n"); - - return(GOOD); -} - -/* rename to */ -int doRNTO(buff) -char *buff; -{ - if(ChkLoggedIn()) - return(GOOD); - - if(anonymous) { - printf("550 Command not allowed for anonymous user\r\n"); - return(GOOD); - } - - if(rnfr[0] == '\0') { - printf("550 Rename failed.\r\n"); - return(GOOD); - } - - if(rename(rnfr, buff) < 0) - printf("550 Rename failed. Error %s\r\n", strerror(errno)); - else { - printf("250 Renamed %s to %s.\r\n", rnfr, buff); - logit("RNFR", path(rnfr)); - logit("RNTO", path(buff)); - } - - rnfr[0] = '\0'; - - return(GOOD); -} - -/* xmode = 0 for multiline crc, xmode <> 0 for single file single line crc */ -static int docrc(buff, xmode) -char *buff; -int xmode; -{ -unsigned short cs; -long fs; -int fd; -int s; -char *p; - - if((fd = fdxcmd(CMD_CRC, buff)) < 0) { - printf("501 Could not obtain CRC.\r\n"); - return(GOOD); - } - - if(xmode == 0) - printf("202-SITE CRC \"%s\"\r\n", buff); - - while(1) { - p = buffer; - while(1) { - if((s = read(fd, p, 1)) != 1) { - if(xmode == 0) - printf("202 SITE CRC DONE.\r\n"); - else - printf("501 Could not obtain CRC.\r\n"); - endfdxcmd(fd); - return(GOOD); - } - if(*p == '\n') { - *p++ = '\r'; - *p++ = '\n'; - *p = '\0'; - break; - } - p++; - } - if(xmode != 0) - break; - printf(" %s", buffer); - } - - cs = atoi(buffer); - - fs = atol(buffer+6); - - printf("202 CRC %05u %ld.\r\n", cs, fs); - - endfdxcmd(fd); - - return(GOOD); -} - -/* site specific */ -int doSITE(buff) -char *buff; -{ -char *args; - - if(ChkLoggedIn()) - return(GOOD); - - - strncpy(line, buff, sizeof(line)); - line[sizeof(line)-1] = '\0'; - - cvtline(&args); - - if(!strcmp(line, "CRC") || !strcmp(line, "CCRC")) - return(docrc(args, strcmp(line, "CRC"))); - - if(!strcmp(line, "FDET")) - return(dofdet(args)); - - printf("501 Unknown SITE command %s.\r\n", line); - - return(GOOD); -} - -static unsigned long fsize(fname) -char *fname; -{ -struct stat st; -unsigned long fs = 0L; - - if(stat(fname, &st)) - return(fs); - - if((st.st_mode & S_IFMT) != S_IFREG) - return(fs); - - if(type == TYPE_A) - return(fs); - - fs = st.st_size; - - return(fs); -} - -/* file size, btw when will this be put into an RFC */ -int doSIZE(buff) -char *buff; -{ -struct stat st; -unsigned long filesize; - - if(ChkLoggedIn()) - return(GOOD); - - if(stat(buff, &st)) { - printf(msg550, buff, strerror(errno)); - return(GOOD); - } - - if((st.st_mode & S_IFMT) != S_IFREG) { - printf("550 Not a regular file.\r\n"); - return(GOOD); - } - - filesize = st.st_size; - - if(type == TYPE_A) - if(asciisize(buff, &filesize)) - return(GOOD); - - printf("215 %lu\r\n", filesize); - - return(GOOD); -} - -/* server status, or file status */ -int doSTAT(buff) -char *buff; -{ -time_t now; -struct tm *tm; -int fd; -int s; - - if(!*buff) { - (void) time(&now); - tm = localtime(&now); - printf("211-%s(%s:%u) FTP server status:\r\n", - myhostname, inet_ntoa(myipaddr), ntohs(myport)); - printf(" Version %s ", FtpdVersion); - printf("%s, %02d %s %d %02d:%02d:%02d %s\r\n", days[tm->tm_wday], - tm->tm_mday, months[tm->tm_mon], 1900+tm->tm_year, - tm->tm_hour, tm->tm_min, tm->tm_sec, tzname[tm->tm_isdst]); - printf(" Connected to %s:%u\r\n", inet_ntoa(rmtipaddr), ntohs(rmtport)); - if(!loggedin) - printf(" Not logged in\r\n"); - else - printf(" Logged in %s\r\n", username); - printf(" MODE: %s\r\n",(mode == MODE_B) ? "Block" : "Stream"); - printf(" TYPE: %s\r\n",(type == TYPE_A) ? "Ascii" : "Binary"); - printf("211 End of status\r\n"); - return(GOOD); - } - - if(ChkLoggedIn()) - return(GOOD); - - printf("211-Status of %s:\r\n", buff); - - if((fd = fdxcmd(CMD_LIST, buff)) < 0) - printf(" Could not retrieve status"); - else { - while((s = read(fd, buffer, 1)) == 1) { - if(*buffer == '\n') - printf("\r\n"); - else - printf("%c", *buffer); - } - endfdxcmd(fd); - } - - printf("211 End of status\r\n"); - - return(GOOD); -} - -/* hey look, we're getting a file */ -int doSTOR(buff) -char *buff; -{ - return(recvfile(buff, RECV_FILE)); -} - -/* hey, get a file unique */ -int doSTOU(buff) -char *buff; -{ - return(recvfile(buff, RECV_UNIQ)); -} - -/* structure */ -int doSTRU(buff) -char *buff; -{ - switch(*buff) { - case 'f': - case 'F': - printf("200 Structure set to %c.\r\n", *buff); - break; - default: - printf("501 Unknown structure %c.\r\n", *buff); - } - - return(GOOD); -} - -/* we're UNIX and proud of it! */ -int doSYST(buff) -char *buff; -{ - printf("215 UNIX Type: L8\r\n"); - - return(GOOD); -} - -/* change transfer type */ -int doTYPE(buff) -char *buff; -{ - if(*(buff+1) != '\0') { - printf("501 Syntax error in parameters.\r\n"); - return(GOOD); - } - - switch(*buff) { - case 'A': - case 'a': - type = TYPE_A; - printf("200 Type set to A.\r\n"); - break; - case 'I': - case 'i': - type = TYPE_I; - printf("200 Type set to I.\r\n"); - break; - default: - printf("501 Invalid type %c.\r\n", *buff); - } - - return(GOOD); -} - -static int fdxcmd(cmd, arg) -int cmd; -char *arg; -{ -char xcmd[3]; -char *argv[5]; -int fds[2]; -char *smallenv[] = { "PATH=/bin:/usr/bin:/usr/local/bin", NULL, NULL }; - - if((smallenv[1] = getenv("TZ")) != NULL) smallenv[1] -= 3; /* ouch... */ - - sprintf(xcmd, "%d", cmd); - - argv[0] = PROG_FTPDSH; - argv[1] = xcmd; - argv[2] = arg; - argv[3] = (char *)NULL; - - if(pipe(fds) < 0) - return(-1); - - if((cmdpid = fork()) < 0) { - close(fds[0]); - close(fds[1]); - return(-1); - } - - if(cmdpid == 0) { /* Child */ - close(fds[0]); - close(0); - open("/dev/null", O_RDONLY); - dup2(fds[1], 1); - dup2(fds[1], 2); - close(fds[1]); - sprintf(argv[0], "/bin/%s", PROG_FTPDSH); - execve(argv[0], argv, smallenv); - sprintf(argv[0], "/usr/bin/%s", PROG_FTPDSH); - execve(argv[0], argv, smallenv); - sprintf(argv[0], "/usr/local/bin/%s", PROG_FTPDSH); - execve(argv[0], argv, smallenv); - exit(0); - } - - close(fds[1]); - - return(fds[0]); -} - -/* Same as close if not cmd child started */ -static int endfdxcmd(fd) -int fd; -{ -int s; -int cs; - - close(fd); - - if(cmdpid == -1) - return(0); - - s = waitpid(cmdpid, &cs, 0); - - cmdpid = -1; - - return(0); -} - -/* returns -1 = size could not be determined, */ -/* 0 = size determined and in filesize */ -static int asciisize(filename, filesize) -char *filename; -unsigned long *filesize; -{ -unsigned long count; -int fd; -char *p, *pp; -int cnt; - - if((fd = open(filename, O_RDONLY)) < 0) { - printf(msg550, filename, strerror(errno)); - return(-1); - } - - count = 0; - - while((cnt = read(fd, buffer, sizeof(buffer))) > 0) { - count += cnt; - p = buffer; - while(cnt > 0) - if((pp = memchr(p, '\n', cnt)) != (char *)NULL) { - count++; - cnt = cnt - 1 - (pp - p); - p = pp + 1; - } else - break; - } - - if(cnt == 0) { - *filesize = count; - close(fd); - return(0); - } - - printf(msg550, filename, strerror(errno)); - - close(fd); - - return(-1); -} - -/* see if we need to run a command to convert the file */ -static int cnvtfile(name, name2) -char *name; -char **name2; -{ -struct stat st; -static char fname[256]; -char *p; -int cmode; - - if(!stat(name, &st)) /* file exists can't be a conversion */ - if((st.st_mode & S_IFMT) != S_IFREG) { /* must be regular file */ - printf("550 Not a regular file.\r\n"); - return(CNVT_ERROR); - } else - return(CNVT_NONE); - - if(errno != ENOENT) { /* doesn't exist is okay, others are not */ - printf(msg550, name, strerror(errno)); - return(CNVT_ERROR); - } - - /* find out what kind of conversion */ - strncpy(fname, name, sizeof(fname)); - fname[sizeof(fname)-1] = '\0'; - - p = fname + strlen(fname); - cmode = CNVT_ERROR; - while(p > fname && cmode == CNVT_ERROR) { - if(*p == '.') { - if(!strcmp(p, ".tar")) - cmode = CNVT_TAR; - else - if(!strcmp(p, ".tar.Z")) - cmode = CNVT_TAR_Z; - else - if(!strcmp(p, ".Z")) - cmode = CNVT_COMP; - else - if(!strcmp(p, ".tar.gz")) - cmode = CNVT_TAR_GZ; - else - if(!strcmp(p, ".gz")) - cmode = CNVT_GZIP; - - if (cmode != CNVT_ERROR) { - /* is there a file to convert? */ - *p = '\0'; - if (!stat(fname, &st)) break; - *p = '.'; - cmode = CNVT_ERROR; - } - } - p--; - } - - if(cmode == CNVT_ERROR) { - printf(msg550, fname, strerror(errno)); - return(CNVT_ERROR); - } - - if(cmode == CNVT_COMP || cmode == CNVT_GZIP || cmode == CNVT_UNCOMP) - if((st.st_mode & S_IFMT) != S_IFREG) { - printf("550 Not a regular file.\r\n"); - return(CNVT_ERROR); - } - - *name2 = fname; - - return(cmode); -} - -static int procfile(name) -char *name; -{ -int cmd; -int fd; -char *name2; - - cmd = cnvtfile(name, &name2); - - switch(cmd) { - case CNVT_TAR: - fd = fdxcmd(cmd + 10, name2); - break; - case CNVT_TAR_Z: - fd = fdxcmd(cmd + 10, name2); - break; - case CNVT_COMP: - fd = fdxcmd(cmd + 10, name2); - break; - case CNVT_TAR_GZ: - fd = fdxcmd(cmd + 10, name2); - break; - case CNVT_GZIP: - fd = fdxcmd(cmd + 10, name2); - break; - case CNVT_UNCOMP: - fd = fdxcmd(cmd + 10, name2); - break; - case CNVT_NONE: - fd = open(name, O_RDONLY); - break; - case CNVT_ERROR: - default: - return(-1); - } - - if(fd < 0) - printf(msg550, name, strerror(errno)); - - return(fd); -} - -/* oh no, they're taking a file */ -static int sendfile(name, xmode) -char *name; -int xmode; -{ -char *fname; -int fd, s; -time_t datastart, dataend; -unsigned long datacount; -long kbs; -char c; -char *p; -char *op, *ope; -off_t sp; -int doascii; -unsigned long fs; -char block[3]; - - if(ChkLoggedIn()) - return(GOOD); - - switch(xmode) { - case SEND_NLST: - fname = "NLST"; - fd = fdxcmd(CMD_NLST, name); - if(fd < 0) - printf(msg550, name, strerror(errno)); - break; - case SEND_LIST: - fname = "LIST"; - fd = fdxcmd(CMD_LIST, name); - if(fd < 0) - printf(msg550, name, strerror(errno)); - break; - default: - fname = name; - fd = procfile(name); - if(fd < 0) - logit("FAIL", path(fname)); - else - logit("SEND", path(fname)); - } - - if(fd < 0) - return(GOOD); - - /* set file position at approriate spot */ - if(file_restart) { - if(type == TYPE_A) { - sp = 0; - while(sp < file_restart) { - sp++; - s = read(fd, buffer, 1); - if(s < 0) { - printf(msg550, fname, strerror(errno)); - endfdxcmd(fd); - file_restart = 0; - return(GOOD); - } - if(s == 0) break; - if(*buffer == '\n') - sp++; - } - } else { - sp = lseek(fd, file_restart, SEEK_SET); - if(sp == -1) { - printf(msg550, fname, strerror(errno)); - endfdxcmd(fd); - file_restart = 0; - return(GOOD); - } - } - if(sp != file_restart) { - printf("550 File restart point error. %lu not %lu\r\n", sp, file_restart); - endfdxcmd(fd); - file_restart = 0; - return(GOOD); - } - } - file_restart = 0; - - fs = fsize(fname); - if(fs == 0L) - printf("%03d File %s okay. Opening data connection.\r\n", - ftpdata_fd >= 0 ? 125 : 150, fname); - else - printf("%03d Opening %s mode data connection for %s (%ld bytes).\r\n", - ftpdata_fd >= 0 ? 125 : 150, - type == TYPE_A ? "ASCII" : "BINARY", - fname, fs); - fflush(stdout); - -#ifdef DEBUG - fprintf(logfile, "After 125/150 b4 DataConnect\n"); - fflush(logfile); -#endif - - if(DataConnect()) { - endfdxcmd(fd); - return(GOOD); - } - -#ifdef DEBUG - fprintf(logfile, "After DataConnect\n"); - fflush(logfile); - fprintf(logfile, "ftpd: parent %d start sendfile \n", getpid()); - fflush(logfile); -#endif - - /* start transfer */ - doascii = (type == TYPE_A) || - ((xmode == SEND_LIST) || (xmode == SEND_NLST)); /* per RFC1123 4.1.2.7 */ - datacount = 0; - time(&datastart); - op = bufout; ope = bufout + sizeof(bufout) - 3; - while((s = read(fd, buffer, sizeof(buffer))) > 0) { -#ifdef DEBUG - fprintf(logfile, "sendfile read %d\n", s); fflush(logfile); -#endif - datacount += s; - if(doascii) { - p = buffer; - while(s-- > 0) { - c = *p++; - if(c == '\n') { - *op++ = '\r'; - datacount++; - } - *op++ = c; - if(op >= ope) { - if(mode == MODE_B) { - block[0] = '\0'; - *(u16_t *)&block[1] = htons(op - bufout); - write(ftpdata_fd, block, sizeof(block)); - } - write(ftpdata_fd, bufout, op - bufout); - op = bufout; - } - } - } else { - if(mode == MODE_B) { - block[0] = '\0'; - *(u16_t *)&block[1] = htons(s); - write(ftpdata_fd, block, sizeof(block)); - } - s = write(ftpdata_fd, buffer, s); - } - } - if(op > bufout) { - if(mode == MODE_B) { - block[0] = MODE_B_EOF; - *(u16_t *)&block[1] = htons(op - bufout); - write(ftpdata_fd, block, sizeof(block)); - } - write(ftpdata_fd, bufout, op - bufout); - } else - if(mode == MODE_B) { - block[0] = MODE_B_EOF; - *(u16_t *)&block[1] = htons(0); - write(ftpdata_fd, block, sizeof(block)); - } - time(&dataend); - -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d end sendfile \n", getpid()); - fflush(logfile); -#endif - - endfdxcmd(fd); - if(mode != MODE_B) { - close(ftpdata_fd); - ftpdata_fd = -1; - } - - if(dataend == datastart) dataend++; - kbs = (datacount * 100 / (dataend - datastart)) / 1024; - - if(s < 0) - printf("451 Transfer aborted.\r\n"); - else - printf("%03d Transfer finished successfully. %ld.%02d KB/s\r\n", - mode == MODE_B ? 250 : 226, - (long)(kbs / 100), (int)(kbs % 100)); - - return(GOOD); -} - -static int recvfile(name, xmode) -char *name; -int xmode; -{ -char *fname; -time_t datastart, dataend; -unsigned long datacount; -long kbs; -char c; -char *p; -char *op, *ope; -int fd, oflag; -int s; -int gotcr; -off_t sp; -char block[3]; -unsigned short cnt; - - if(ChkLoggedIn()) - return(GOOD); - - fname = name; - - switch(xmode) { - case RECV_APND: - oflag = O_WRONLY | O_APPEND; - break; - case RECV_UNIQ: - fname = uniqname(); - oflag = O_WRONLY | O_CREAT; - break; - default: - oflag = O_WRONLY | O_CREAT | O_TRUNC; - } - - if(file_restart) - oflag = O_RDWR; - - fd = open(fname, oflag, (anonymous ? 0000:0600)); - - if(fd < 0) { - printf(msg550, fname, strerror(errno)); - return(GOOD); - } - - /* log the received file */ - logit("RECV", path(fname)); - - /* set file position at approriate spot */ - if(file_restart) { - if(type == TYPE_A) { - sp = 0; - while(sp < file_restart) { - sp++; - s = read(fd, buffer, 1); - if(s < 0) { - printf(msg550, fname, strerror(errno)); - close(fd); - file_restart = 0; - return(GOOD); - } - if(s == 0) break; - if(*buffer == '\n') - sp++; - } - } else { - sp = lseek(fd, file_restart, SEEK_SET); - if(sp == -1) { - printf(msg550, fname, strerror(errno)); - close(fd); - file_restart = 0; - return(GOOD); - } - } - if(sp != file_restart) { - printf("550 File restart point error. %lu not %lu\r\n", sp, file_restart); - close(fd); - file_restart = 0; - return(GOOD); - } - } - file_restart = 0; - - if(xmode == RECV_UNIQ) - printf("%03d FILE: %s\r\n", - ftpdata_fd >= 0 ? 125 : 150, fname); /* per RFC1123 4.1.2.9 */ - else - printf("%03d File %s okay. Opening data connection.\r\n", - ftpdata_fd >= 0 ? 125 : 150, fname); - fflush(stdout); - - if(DataConnect()) { - close(fd); - return(GOOD); - } - -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d start recvfile \n", getpid()); - fflush(logfile); -#endif - - /* start receiving file */ - datacount = 0; - gotcr = 0; - op = bufout; ope = bufout + sizeof(bufout) - 3; - cnt = 0; - time(&datastart); - while(1) { - if(mode != MODE_B) - cnt = sizeof(buffer); - else - if(cnt == 0) { - s = read(ftpdata_fd, block, sizeof(block)); - cnt = ntohs(*(u16_t *)&block[1]); - s = 0; - if(cnt == 0 && block[0] & MODE_B_EOF) - break; - } - s = read(ftpdata_fd, buffer, cnt > sizeof(buffer) ? sizeof(buffer) : cnt); - if(s <= 0) break; - cnt -= s; - datacount += (long)s; - if(type == TYPE_A) { - p = buffer; - while(s-- > 0) { - c = *p++; - if(gotcr) { - gotcr = 0; - if(c != '\n') - *op++ = '\r'; - } - if(c == '\r') - gotcr = 1; - else - *op++ = c; - if(op >= ope) { - write(fd, bufout, op - bufout); - op = bufout; - } - } - } else - write(fd, buffer, s); - if(cnt == 0 && mode == MODE_B && block[0] & MODE_B_EOF) { - s = 0; - break; - } - } - if(gotcr) - *op++ = '\r'; - if(op > bufout) - write(fd, bufout, op - bufout); - time(&dataend); - -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d end recvfile \n", getpid()); - fflush(logfile); -#endif - - close(fd); - if(mode != MODE_B) { - close(ftpdata_fd); - ftpdata_fd = -1; - } - - if(dataend == datastart) dataend++; - kbs = (datacount * 100 / (dataend - datastart)) / 1024; - - if((mode == MODE_B && cnt != 0) || s != 0) - printf("451 Transfer aborted.\r\n"); - else { - printf("%03d Transfer finished successfully. ", - mode == MODE_B ? 250 : 226); - if(xmode == RECV_UNIQ) - printf("Unique file %s. ", fname); - printf("%ld.%02d KB/s\r\n", (long)(kbs / 100), (int)(kbs % 100)); - } - - return(GOOD); -} - -static char *uniqname() -{ -static char uniq[32]; -int i; -struct stat st; - - for(i = 0; i < 1000; i++) { - sprintf(uniq, "ftpd%d%d", getpid(), i); - if(stat(uniq, &st) == -1) - return(uniq); - } - return(uniq); -} - -static char *spath[256]; -static char *path(fname) -char *fname; -{ -char dir[128]; - - if(getcwd(dir, sizeof(dir)) == (char *)NULL) - sprintf(dir, "???"); - - if(fname[0] == '/') - sprintf((char *)spath, "%s%s", newroot, fname); - else - if(dir[1] == '\0') - sprintf((char *)spath, "%s%s%s", newroot, dir, fname); - else - sprintf((char *)spath, "%s%s/%s", newroot, dir, fname); - - return((char *)spath); -} - -/* do file detail */ -static int dofdet(buff) -char *buff; -{ -struct stat st; -char ft; - - if(ChkLoggedIn()) - return(GOOD); - - if(stat(buff, &st)) { - printf("501 Could not obtain file detail.\r\n"); - return(GOOD); - } - switch(st.st_mode & S_IFMT) { - case S_IFIFO: ft = 'p'; break; - case S_IFCHR: ft = 'c'; break; - case S_IFDIR: ft = 'd'; break; - case S_IFBLK: ft = 'b'; break; - case S_IFREG: ft = 'f'; break; - default: ft = '?'; break; - } - printf("202 %c %u %u %u %u %u %lu %lu\r\n", - ft, /* file type */ - st.st_rdev >> 8, /* Major */ - st.st_rdev & 0xff, /* Minor */ - st.st_uid, /* UID */ - st.st_gid, /* GID */ - st.st_mode, /* File Modes */ - st.st_size, /* SIZE */ - st.st_mtime); /* Mod Time */ - - return(GOOD); -} diff --git a/commands/ftpd200/file.h b/commands/ftpd200/file.h deleted file mode 100644 index fdce03919..000000000 --- a/commands/ftpd200/file.h +++ /dev/null @@ -1,32 +0,0 @@ -/* file.h Copyright 1992-2000 by Michael Temari All Rights Reserved - * - * This file is part of ftpd. - * - * - * 01/25/96 Initial Release Michael Temari, - */ - -_PROTOTYPE(int doALLO, (char *buff)); -_PROTOTYPE(int doAPPE, (char *buff)); -_PROTOTYPE(int doCDUP, (char *buff)); -_PROTOTYPE(int doCWD, (char *buff)); -_PROTOTYPE(int doDELE, (char *buff)); -_PROTOTYPE(int doLIST, (char *buff)); -_PROTOTYPE(int doMDTM, (char *buff)); -_PROTOTYPE(int doMODE, (char *buff)); -_PROTOTYPE(int doMKD, (char *buff)); -_PROTOTYPE(int doNLST, (char *buff)); -_PROTOTYPE(int doPWD, (char *buff)); -_PROTOTYPE(int doREST, (char *buff)); -_PROTOTYPE(int doRETR, (char *buff)); -_PROTOTYPE(int doRMD, (char *buff)); -_PROTOTYPE(int doRNFR, (char *buff)); -_PROTOTYPE(int doRNTO, (char *buff)); -_PROTOTYPE(int doSITE, (char *buff)); -_PROTOTYPE(int doSIZE, (char *buff)); -_PROTOTYPE(int doSTAT, (char *buff)); -_PROTOTYPE(int doSTOR, (char *buff)); -_PROTOTYPE(int doSTOU, (char *buff)); -_PROTOTYPE(int doSTRU, (char *buff)); -_PROTOTYPE(int doSYST, (char *buff)); -_PROTOTYPE(int doTYPE, (char *buff)); diff --git a/commands/ftpd200/ftpd.8 b/commands/ftpd200/ftpd.8 deleted file mode 100644 index bae175717..000000000 --- a/commands/ftpd200/ftpd.8 +++ /dev/null @@ -1,161 +0,0 @@ -.\" Copyright (c) 1985 Regents of the University of California. -.\" All rights reserved. The Berkeley software License Agreement -.\" specifies the terms and conditions for redistribution. -.\" -.\" @(#)ftpd.8c 6.4 (Berkeley) 5/28/86 -.\" -.TH FTPD 8 -.SH NAME -ftpd, in.ftpd, ftpdsh, setup.anonftp \- DARPA Internet File Transfer Protocol server -.SH SYNOPSIS -.B "ftp stream tcp nowait root /usr/bin/in.ftpd in.ftpd" -.br -.B "tcpd ftp /usr/bin/in.ftpd" -.SH DESCRIPTION -.B Ftpd -is the DARPA Internet File Transfer Prototocol -server process. The server uses the TCP protocol -and listens at the port specified in the ``ftp'' -service specification; see -.BR services (5). -.PP -The ftp server currently supports the following ftp -requests; case is not distinguished. -.PP -.nf -.ta \w'Request 'u -\fBRequest Description\fP -ABOR abort previous command -ACCT specify account (ignored) -ALLO allocate storage (vacuously) -APPE append to a file -CDUP change to parent of current working directory -CWD change working directory -DELE delete a file -HELP give help information -LIST give list files in a directory (``ls -lA'') -MKD make a directory -MODE specify data transfer \fImode\fP -NLST give name list of files in directory (``ls'') -NOOP do nothing -PASS specify password -PASV prepare for server-to-server transfer -PORT specify data connection port -PWD print the current working directory -QUIT terminate session -RETR retrieve a file -RMD remove a directory -RNFR specify rename-from file name -RNTO specify rename-to file name -STOR store a file -STOU store a file with a unique name -STRU specify data transfer \fIstructure\fP -TYPE specify data transfer \fItype\fP -USER specify user name -XCUP change to parent of current working directory -XCWD change working directory -XMKD make a directory -XPWD print the current working directory -XRMD remove a directory -.fi -.PP -The remaining ftp requests specified in Internet RFC 959 are -recognized, but not implemented. -.PP -The ftp server will abort an active file transfer only when the -ABOR command is preceded by a Telnet "Interrupt Process" (IP) -signal and a Telnet "Synch" signal in the command Telnet stream, -as described in Internet RFC 959. -.PP -.B Ftpd -interprets file names according to the ``globbing'' -conventions used by -.BR csh (1). -This allows users to utilize the metacharacters ``*?[]{}~''. -.PP -.B Ftpd -authenticates users according to two rules. -.IP 1) -The user name must be in the password data base, -.BR /etc/passwd , -and not have a null password. In this case a password -must be provided by the client before any file operations -may be performed. -.IP 2) -If the user name is ``anonymous'' or ``ftp'', an -anonymous ftp account must be present in the password -file (user ``ftp''). In this case the user is allowed -to log in by specifying any password (by convention this -is given as the client host's name). -.PP -In the last case, -.B ftpd -takes special measures to restrict the client's access privileges. -The server performs a -.BR chroot (2) -command to the home directory of the ``ftp'' user. -In order that system security is not breached, it is recommended -that the ``ftp'' subtree be constructed with care; the following -rules are recommended. -.IP ~ftp) -Make the home directory owned by ``ftp'' and unwritable by anyone. -.IP ~ftp/bin) -Make this directory owned by the super-user and unwritable by -anyone. The program -.BR ls (1) -must be present to support the list commands. -Also, -.BR crc (1) -must be present to support generating crcs using the site command, -.BR tar (1) -and -.BR compress (1) -must be present to support on-the-fly generation of .tar and .tar.Z archives, -.BR gzip (1) -must be present to support gzip compression, and -.BR sh (1) -must be present to support -.BR ftpdsh (8) -which also must be present. -.BR ftpdsh controls which binaries can be used. -These programs should all have mode 111. -.IP ~ftp/etc) -Make this directory owned by the super-user and unwritable by -anyone. The files -.BR passwd (5) -and -.BR group (5) -must be present for the -.B ls -command to work properly. These files should be mode 444. They can (and -should) be stripped down versions so as not to reveal names of users who -are not owners of files in the ~ftp/pub directory tree. -.IP ~ftp/pub) -Make this directory mode 755 and owned by the super-user. Create -directories in it owned by users if those users want to manage an -anonymous ftp directory. -.IP ~ftp/pub/incoming) -Optionally create this directory for anonymous uploads. Make it mode -777. The FTP daemon will create files with mode 266, so remote users -can write a file, but only local users can do something with it. -.PP -The script -.B setup.anonftp -can be used to create or check an anonymous FTP tree. -.SH "SEE ALSO" -.BR ftp (1). -.SH BUGS -The anonymous account is inherently dangerous and should -avoided when possible. -.ig \" Minix doesn't have privileged port numbers (yet?) -.PP -The server must run as the super-user -to create sockets with privileged port numbers. It maintains -an effective user id of the logged in user, reverting to -the super-user only when binding addresses to sockets. The -possible security holes have been extensively -scrutinized, but are possibly incomplete. -.. -.\" man page updated by Al Woodhull 2005-02-25 - - diff --git a/commands/ftpd200/ftpd.c b/commands/ftpd200/ftpd.c deleted file mode 100644 index ed0803cfd..000000000 --- a/commands/ftpd200/ftpd.c +++ /dev/null @@ -1,410 +0,0 @@ -/* ftpd.c Copyright 1992-2000 by Michael Temari All Rights Reserved - * - * ftpd An FTP server program for use with Minix. - * - * Usage: Minix usage: tcpd ftp ftpd - * - * 06/14/92 Tnet Release Michael Temari - * 01/15/96 0.30 Michael Temari - * 01/25/96 0.90 Michael Temari - * 03/17/96 0.91 Michael Temari - * 06/27/96 0.92 Michael Temari - * 07/02/96 0.93 Michael Temari - * 07/15/96 0.94 Michael Temari - * 08/27/96 0.95 Michael Temari - * 02/09/97 0.96 Michael Temari - * 02/10/97 0.97 Michael Temari - * 09/25/97 0.98 Michael Temari - * 03/10/00 0.99 Michael Temari, - * 12/12/03 1.00 Michael Temari, - * 02/06/05 1.01 Michael Temari, - * 02/12/05 2.00 Michael Temari, - */ - -char *FtpdVersion = "2.00"; - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ftpd.h" -#include "access.h" -#include "file.h" -#include "net.h" - -#ifdef __NBSD_LIBC -/* Already declared in stdio.h */ -#define getline ftpd_getline -#endif - -_PROTOTYPE(static void init, (void)); -_PROTOTYPE(static int doHELP, (char *buff)); -_PROTOTYPE(static int doNOOP, (char *buff)); -_PROTOTYPE(static int doUNIMP, (char *buff)); -_PROTOTYPE(static int getline, (char *line, int len)); - -FILE *msgfile = (FILE *)NULL; - -/* The following defines the inactivity timeout in seconds */ -#define INACTIVITY_TIMEOUT 60*5 - -char *days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; -char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - -char line[512]; - -int type, format, mode, structure; -int ftpdata_fd = -1; -int loggedin, gotuser, anonymous; -char username[80]; -char anonpass[128]; -char newroot[128]; - -ipaddr_t myipaddr, rmtipaddr, dataaddr; -tcpport_t myport, rmtport, dataport; - -char myhostname[256], rmthostname[256]; - -#define FTPD_LOG "/usr/adm/ftpd.log" -#define FTPD_MSG "/etc/ftpd_msg" - -FILE *logfile; - -int timeout = 0; - -_PROTOTYPE(static int doHELP, (char *buff)); -_PROTOTYPE(int readline, (char **args)); -_PROTOTYPE(void Timeout, (int sig)); -_PROTOTYPE(int main, (int argc, char *argv[])); - -struct commands { - char *name; - _PROTOTYPE(int (*func), (char *buff)); -}; - -struct commands commands[] = { - "ABOR", doUNIMP, - "ACCT", doUNIMP, - "ALLO", doALLO, - "APPE", doAPPE, - "CDUP", doCDUP, - "CWD", doCWD, - "DELE", doDELE, - "HELP", doHELP, - "LIST", doLIST, - "MDTM", doMDTM, - "MKD", doMKD, - "MODE", doMODE, - "NLST", doNLST, - "NOOP", doNOOP, - "PASS", doPASS, - "PASV", doPASV, - "PORT", doPORT, - "PWD", doPWD, - "QUIT", doQUIT, - "REIN", doUNIMP, - "REST", doREST, - "RETR", doRETR, - "RMD", doRMD, - "RNFR", doRNFR, - "RNTO", doRNTO, - "SITE", doSITE, - "SIZE", doSIZE, - "SMNT", doUNIMP, - "STAT", doSTAT, - "STOR", doSTOR, - "STOU", doSTOU, - "STRU", doSTRU, - "SYST", doSYST, - "TYPE", doTYPE, - "USER", doUSER, - "XCUP", doCDUP, - "XCWD", doCWD, - "XMKD", doMKD, - "XPWD", doPWD, - "XRMD", doRMD, - "", (int (*)())0 -}; - -static void init() -{ - loggedin = 0; - gotuser = 0; - anonymous = 0; - newroot[0] = '\0'; - type = TYPE_A; - format = 0; - mode = MODE_S; - structure = 0; - ftpdata_fd = -1; - username[0] = '\0'; - anonpass[0] = '\0'; -} - -/* nothing, nada, zilch... */ -static int doNOOP(buff) -char *buff; -{ - printf("200 NOOP to you too!\r\n"); - - return(GOOD); -} - -/* giv'em help, what a USER! */ -static int doHELP(buff) -char *buff; -{ -struct commands *cmd; -char star; -int i; -char *space = " "; - - printf("214-Here is a list of available ftp commands\r\n"); - printf(" Those with '*' are not yet implemented.\r\n"); - - i = 0; - for(cmd = commands; *cmd->name != '\0'; cmd++) { - if(cmd->func == doUNIMP) - star = '*'; - else - star = ' '; - printf(" %s%c%s", cmd->name, star, space + strlen(cmd->name)); - if(++i == 6) { - printf("\r\n"); - i = 0; - } - } - - if(i) - printf("\r\n"); - - printf("214 That's all the help you get.\r\n"); - - return(GOOD); -} - -/* not implemented */ -static int doUNIMP(buff) -char *buff; -{ - printf("502 Command \"%s\" not implemented!\r\n", line); - - return(GOOD); -} - -/* convert line for use */ -void cvtline(args) -char **args; -{ -char *p; - - p = line + strlen(line); - while(--p >= line) - if(*p == '\r' || *p == '\n' || isspace(*p)) - *p = '\0'; - else - break; - - p = line; - -#ifdef DEBUG - logit("COMMAND", line); -#endif - - while(*p && !isspace(*p)) { - *p = toupper(*p); - p++; - } - - if(*p) { - *p = '\0'; - p++; - while(*p && isspace(*p)) - p++; - } - - *args = p; - - return; -} - -static int getline(line, len) -char *line; -int len; -{ -int s; -int gotcr; - - /* leave room for at end for null */ - len--; - - /* got to be able to put in at least 1 character */ - if(len < 1) - return(-1); - - gotcr = 0; - while(len-- > 0) { - s = read(0, line, 1); - if(s != 1) - return(-1); - if(*line == '\n') - break; - gotcr = (*line == '\r'); - line++; - } - if(gotcr) - --line; - - *line = '\0'; - - return(0); -} - -int readline(args) -char **args; -{ - if(getline(line, sizeof(line))) - return(BAD); - - cvtline(args); - - return(GOOD); -} - -/* signal handler for inactivity timeout */ -void Timeout(sig) -int sig; -{ - timeout = 1; - - printf("421 Inactivity timer expired.\r\n"); -} - -/* logit */ -void logit(type, parm) -char *type; -char *parm; -{ -time_t now; -struct tm *tm; - - if(logfile == (FILE *)NULL) - return; - - time(&now); - tm = localtime(&now); - fprintf(logfile, "%4d%02d%02d%02d%02d%02d ", - 1900+tm->tm_year, - tm->tm_mon + 1, - tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); - fprintf(logfile, "%s %s %s %s %s\n", - rmthostname, username, anonymous ? anonpass : username, type, parm); - fflush(logfile); -} - -void showmsg(reply, filename) -char *reply; -char *filename; -{ -FILE *mfp; -char *pe; -static char mline[256]; - - if(filename == (char *)NULL) - mfp = msgfile; - else - mfp = fopen(filename, "r"); - - if(mfp == (FILE *)NULL) - return; - - while(fgets(mline, sizeof(mline), mfp) != (char *)NULL) { - pe = mline + strlen(mline); - while(--pe >= mline) - if(*pe == '\r' || *pe == '\n') - *pe = '\0'; - else - break; - printf("%s- %s\r\n", reply, mline); - } - - if(filename != (char *)NULL) - fclose(mfp); -} - -int main(argc, argv) -int argc; -char *argv[]; -{ -struct commands *cmd; -char *args; -int status; -time_t now; -struct tm *tm; -int s; - - GetNetInfo(); - - /* open transfer log file if it exists */ - if((logfile = fopen(FTPD_LOG, "r")) != (FILE *)NULL) { - fclose(logfile); - logfile = fopen(FTPD_LOG, "a"); - } - - /* open login msg file */ - msgfile = fopen(FTPD_MSG, "r"); - - /* Let's initialize some stuff */ - init(); - - /* Log the connection */ - logit("CONNECT", ""); - - /* Tell 'em we are ready */ - time(&now); - tm = localtime(&now); - printf("220 FTP service (Ftpd %s) ready on %s at ", - FtpdVersion, myhostname); - printf("%s, %02d %s %d %02d:%02d:%02d %s\r\n", days[tm->tm_wday], - tm->tm_mday, months[tm->tm_mon], 1900+tm->tm_year, - tm->tm_hour, tm->tm_min, tm->tm_sec, - tzname[tm->tm_isdst]); - fflush(stdout); - - /* Loop here getting commands */ - while(1) { - signal(SIGALRM, Timeout); - alarm(INACTIVITY_TIMEOUT); - if(readline(&args) != GOOD) { - if(!timeout) - printf("221 Control connection closing (EOF).\r\n"); - break; - } - alarm(0); - for(cmd = commands; *cmd->name != '\0'; cmd++) - if(!strcmp(line, cmd->name)) - break; - if(*cmd->name != '\0') - status = (*cmd->func)(args); - else { - printf("500 Command \"%s\" not recognized.\r\n", line); - status = GOOD; - } - fflush(stdout); - if(status != GOOD) - break; - } - - CleanUpPasv(); - - return(-1); -} diff --git a/commands/ftpd200/ftpd.h b/commands/ftpd200/ftpd.h deleted file mode 100644 index 373709e64..000000000 --- a/commands/ftpd200/ftpd.h +++ /dev/null @@ -1,37 +0,0 @@ -/* ftpd.h Copyright 1992-2000 by Michael Temari All Rights Reserved - * - * This file is part of ftpd. - * - * - * 01/25/96 Initial Release Michael Temari, - */ - -#define GOOD 0 -#define BAD 1 - -#define TYPE_A 0 -#define TYPE_I 1 - -#define MODE_S 0 -#define MODE_B 1 - -#define MODE_B_EOF 64 - -extern char *FtpdVersion; -extern int type, format, mode, structure; -extern ipaddr_t myipaddr, rmtipaddr, dataaddr; -extern tcpport_t myport, rmtport, dataport; -extern int ftpdata_fd; -extern int loggedin, gotuser, anonymous; -extern char newroot[128]; -extern char *days[], *months[]; -extern char username[80]; -extern char anonpass[128]; -extern char myhostname[256], rmthostname[256]; -extern char line[512]; - -extern FILE *logfile; - -_PROTOTYPE(void cvtline, (char **args)); -_PROTOTYPE(void logit, (char *type, char *parm)); -_PROTOTYPE(void showmsg, (char *reply, char *filename)); diff --git a/commands/ftpd200/ftpdsh b/commands/ftpd200/ftpdsh deleted file mode 100755 index 6ca54e3e9..000000000 --- a/commands/ftpd200/ftpdsh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -case $1 in - 1) ls -A $2 ;; - 2) ls -la $2 ;; - 3) crc $2 ;; - 12) tar cf - $2 ;; - 13) tar cf - $2 | compress -q ;; - 14) compress -cq $2 ;; - 15) tar cf - $2 | gzip ;; - 16) tar -c $2 ;; - 17) compress -dcq $2 ;; -esac -exit diff --git a/commands/ftpd200/net.c b/commands/ftpd200/net.c deleted file mode 100644 index 0c5755d59..000000000 --- a/commands/ftpd200/net.c +++ /dev/null @@ -1,431 +0,0 @@ -/* net.c Copyright 1992-2000 by Michael Temari All Rights Reserved - * - * This file is part of ftpd. - * - * This file handles: - * - * PASV PORT - * - * - * 01/25/1995 Initial Release Michael Temari, - * 02/09/2005 Initial Release Michael Temari, - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ftpd.h" -#include "access.h" -#include "net.h" - -_PROTOTYPE(static void timeout, (int sig)); - -static char *msg425 = "425-Could not open data connection.\r\n"; -static char *msg501 = "501 Syntax error in parameters.\r\n"; - -static int gottimeout = 0; -static int lpid = -1; -static int didpassive = 0; - -/* they must be behind a firewall or using a web browser */ -int doPASV(buff) -char *buff; -{ -nwio_tcpconf_t tcpconf; -nwio_tcpcl_t tcplopt; -char *tcp_device; -ipaddr_t ipaddr; -tcpport_t lport; -int s; -time_t starttime; -int retry; - - if(ChkLoggedIn()) - return(GOOD); - - CleanUpPasv(); - - /* here we set up a connection to listen on */ - if((tcp_device = getenv("TCP_DEVICE")) == NULL) - tcp_device = TCP_DEVICE; - - if(ftpdata_fd >= 0) { - close(ftpdata_fd); - ftpdata_fd = -1; - } - - if((ftpdata_fd = open(tcp_device, O_RDWR)) < 0) { - printf(msg425); - printf("425 Could not open tcp_device. Error %s\r\n", strerror(errno)); - return(GOOD); - } - - tcpconf.nwtc_flags = NWTC_LP_SEL | NWTC_SET_RA | NWTC_UNSET_RP; - - tcpconf.nwtc_remaddr = rmtipaddr; - tcpconf.nwtc_remport = htons(0); - tcpconf.nwtc_locport = htons(0); - - s = ioctl(ftpdata_fd, NWIOSTCPCONF, &tcpconf); - if(s < 0) { - printf(msg425); - printf("425 Could not ioctl NWIOSTCPCONF. Error %s\r\n", strerror(errno)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(GOOD); - } - - s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); - if(s < 0) { - printf(msg425); - printf("425 Could not NWIOGTCPCONF. Error %s\r\n", strerror(errno)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(GOOD); - } - ipaddr = tcpconf.nwtc_locaddr; - lport = tcpconf.nwtc_locport; - - /* Now lets fork a child to do the listening :-( */ - - tcplopt.nwtcl_flags = 0; - - lpid = fork(); - if(lpid < 0) { - printf(msg425); - printf("425 Could not fork listener. Error %s\r\n", strerror(errno)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(GOOD); - } else if(lpid == 0) { - retry = 0; - while(1) { -#ifdef DEBUG - fprintf(logfile, "ftpd: child %d parent %d listen try %d\n", getpid(), getppid(), retry); - fflush(logfile); -#endif - s = ioctl(ftpdata_fd, NWIOTCPLISTEN, &tcplopt); - if(!(s == -1 && errno == EAGAIN)) break; - if(retry++ > 10) break; - sleep(1); - } -#ifdef DEBUG - fprintf(logfile, "ftpd: child %d s %d errno %d\n", getpid(), s, errno); - fflush(logfile); -#endif - if(s < 0) - exit(errno); /* tells parent listen failed */ - else - exit(0); /* tells parent listen okay */ - } - -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d wait for %d\n", getpid(), lpid); - fflush(logfile); -#endif - - /* wait for child to be listening, no more than serveral seconds */ - (void) time(&starttime); - while(1) { - if(time((time_t *)NULL) > (starttime + 15)) break; - signal(SIGALRM, timeout); - alarm(1); - s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d child %d s %d errno %d start %ld now %ld\n", - getpid(), lpid, s, errno, starttime, time((time_t *)NULL)); - fflush(logfile); -#endif - alarm(0); - if(s == -1) break; - sleep(1); - } - -#define hiword(x) ((u16_t)((x) >> 16)) -#define loword(x) ((u16_t)(x & 0xffff)) -#define hibyte(x) (((x) >> 8) & 0xff) -#define lobyte(x) ((x) & 0xff) - - printf("227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n", - hibyte(hiword(htonl(ipaddr))), lobyte(hiword(htonl(ipaddr))), - hibyte(loword(htonl(ipaddr))), lobyte(loword(htonl(ipaddr))), - hibyte(htons(lport)), lobyte(htons(lport))); - -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d child %d send 227\n", getpid(), lpid); - fflush(logfile); -#endif - - didpassive = -1; - - return(GOOD); -} - -/* they want us to connect here */ -int doPORT(buff) -char *buff; -{ -u32_t ipaddr; -u16_t port; -int i; - - if(ftpdata_fd >= 0) { - close(ftpdata_fd); - ftpdata_fd = -1; - } - - ipaddr = (u32_t)0; - for(i = 0; i < 4; i++) { - ipaddr = (ipaddr << 8) + (u32_t)atoi(buff); - if((buff = strchr(buff, ',')) == (char *)0) { - printf(msg501); - return(GOOD); - } - buff++; - } - port = (u16_t)atoi(buff); - if((buff = strchr(buff, ',')) == (char *)0) { - printf(msg501); - return(0); - } - buff++; - port = (port << 8) + (u16_t)atoi(buff); - - dataaddr = htonl(ipaddr); - dataport = htons(port); - if(dataaddr != rmtipaddr) { - printf(msg501); - return(GOOD); - } - - printf("200 Port command okay.\r\n"); - - return(GOOD); -} - -/* connect, huh? */ -int DataConnect() -{ -nwio_tcpconf_t tcpconf; -nwio_tcpcl_t tcpcopt; -nwio_tcpcl_t tcplopt; -char *tcp_device; -int s, cs; -int retry; - - if(didpassive && ftpdata_fd >= 0) { - didpassive = 0; - gottimeout = 0; - signal(SIGALRM, timeout); - alarm(10); - while(!gottimeout) { - s = waitpid(lpid, &cs, 0); - if((s == lpid) || (s < 0 && errno == ECHILD)) break; -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d child %d waitpid s %d cs %04x errno %d\n", getpid(), lpid, s, cs, errno); - fflush(logfile); -#endif - } - alarm(0); -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d child %d waitpid s %d cs %04x errno %d\n", getpid(), lpid, s, cs, errno); - fflush(logfile); -#endif - if(gottimeout) { -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d child %d got timeout\n", getpid(), lpid); - fflush(logfile); -#endif - kill(lpid, SIGKILL); - s = waitpid(lpid, &cs, 0); - } -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d child %d continuing\n", getpid(), lpid); - fflush(logfile); -#endif - lpid = -1; - if(gottimeout) { - printf(msg425); - printf("425 Child listener timeout.\r\n"); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } - if(s < 0) { - printf(msg425); - printf("425 Child listener vanished.\r\n"); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } - if((cs & 0x00ff)) { - printf(msg425); - printf("425 Child listener failed %04x\r\n", cs); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } - cs = (cs >> 8) & 0x00ff; - if(cs) { - printf(msg425); - printf("425 Child listener error %s\r\n", strerror(cs)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } -#ifdef DEBUG - fprintf(logfile, "ftpd: parent %d child %d pasv done\n", getpid(), lpid); - fflush(logfile); -#endif - return(GOOD); - } - - if(ftpdata_fd >= 0) - return(GOOD); - - if((tcp_device = getenv("TCP_DEVICE")) == NULL) - tcp_device = TCP_DEVICE; - - if((ftpdata_fd = open(tcp_device, O_RDWR)) < 0) { - printf(msg425); - printf("425 Could not open tcp_device. Error %s\r\n", strerror(errno)); - return(BAD); - } - - tcpconf.nwtc_flags = NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP; - tcpconf.nwtc_remaddr = dataaddr; - tcpconf.nwtc_remport = dataport; - tcpconf.nwtc_locport = htons(20); - - s = ioctl(ftpdata_fd, NWIOSTCPCONF, &tcpconf); - if(s < 0) { - printf(msg425); - printf("425 Could not ioctl NWIOSTCPCONF. Error %s\r\n", strerror(errno)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } - - s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); - if(s < 0) { - printf(msg425); - printf("425 Could not ioctl NWIOGTCPCONF. Error %s\r\n", strerror(errno)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } - - tcpcopt.nwtcl_flags = 0; - - retry = 0; - do { -#ifdef DEBUG - fprintf(logfile, "try connect\n"); fflush(logfile); - fflush(logfile); -#endif - sleep(2); - s = ioctl(ftpdata_fd, NWIOTCPCONN, &tcpcopt); -#ifdef DEBUG - fprintf(logfile, "after connect %d %d\n", s, errno); - fflush(logfile); -#endif - if(!(s == -1 && errno == EAGAIN)) break; - if(retry++ > 10) break; - sleep(1); - } while(1); - if(s < 0) { - printf(msg425); - printf("425 Could not ioctl NWIOTCPCONN. Error %s\r\n", strerror(errno)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } - - s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); - if(s < 0) { - printf(msg425); - printf("425 Could not ioctl NWIOGTCPCONF. Error %s\r\n", strerror(errno)); - close(ftpdata_fd); - ftpdata_fd = -1; - return(BAD); - } - - return(GOOD); -} - -/* Clean up stuff we did to get a Pasv connection going */ -int CleanUpPasv() -{ -int s, cs; - - if(lpid >= 0) { - kill(lpid, SIGKILL); - while(1) { - s = waitpid(lpid, &cs, 0); - if(s == lpid || (s == -1 && errno == ECHILD)) - break; - } - } - - lpid = -1; - - didpassive = 0; - - return(GOOD); -} - -void GetNetInfo() -{ -nwio_tcpconf_t tcpconf; -int s; -struct hostent *hostent; - - /* Ask the system what our hostname is. */ - if(gethostname(myhostname, sizeof(myhostname)) < 0) - strcpy(myhostname, "unknown"); - - /* lets get our ip address and the clients ip address */ - s = ioctl(0, NWIOGTCPCONF, &tcpconf); - if(s < 0) { - printf("421 FTP service unable to get remote ip address. Closing.\r\n"); - fflush(stdout); - exit(1); - } - - myipaddr = tcpconf.nwtc_locaddr; - myport = tcpconf.nwtc_locport; - rmtipaddr = tcpconf.nwtc_remaddr; - rmtport = tcpconf.nwtc_remport; - - /* Look up the host name of the remote host. */ - hostent = gethostbyaddr((char *) &rmtipaddr, sizeof(rmtipaddr), AF_INET); - if(!hostent) - strcpy(rmthostname, inet_ntoa(rmtipaddr)); - else { - strncpy(rmthostname, hostent->h_name, sizeof(rmthostname)-1); - rmthostname[sizeof(rmthostname)-1] = '\0'; - } -} - -static void timeout(sig) -int sig; -{ - gottimeout = 1; -} diff --git a/commands/ftpd200/net.h b/commands/ftpd200/net.h deleted file mode 100644 index 2bedf9f89..000000000 --- a/commands/ftpd200/net.h +++ /dev/null @@ -1,13 +0,0 @@ -/* net.h Copyright 1992-2000 by Michael Temari All Rights Reserved - * - * This file is part of ftpd. - * - * - * 01/25/96 Initial Release Michael Temari, - */ - -_PROTOTYPE(int doPASV, (char *buff)); -_PROTOTYPE(int doPORT, (char *buff)); -_PROTOTYPE(int DataConnect, (void)); -_PROTOTYPE(int CleanUpPasv, (void)); -_PROTOTYPE(void GetNetInfo, (void)); diff --git a/commands/ftpd200/setup.anonftp b/commands/ftpd200/setup.anonftp deleted file mode 100755 index 8dbb0fbe7..000000000 --- a/commands/ftpd200/setup.anonftp +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/sh -# setup.anonftp - Anonymous FTP setup and maintenance. -# -# 01/22/96 Initial Release Al Woodhul, -# 01/25/96 Michael Temari, -# - -# What is needed for anon ftp - -# ref: Hunt TCP/IP Net Admin pp. 338++ -# ref: Nemeth et al UNIX System Admin Handbook p. 295 -# ref: mail from M. Temari 18.01.96 - -# programs possibly used by ftpd -PROGS="sh ls crc tar compress gzip" - -echo Checking /etc/passwd -if grep '^ftp:[^:]*:[1-9][0-9]*:[1-9][0-9]*:[^:]*:/[^:]*:[^:]*$' \ - /etc/passwd >/dev/null -then - echo -n "OK, ftp entry found: " - grep '^ftp:' /etc/passwd -else - echo "Found no entry for ftp in /etc/passwd, please add one with the" - echo "home directory pointing to the anonymous FTP directory" - exit 1 -fi - -# ftp directory -FTPDIR="`sed '/^ftp:/!d; s/^.*:\\([^:]*\\):[^:]*/\\1/' /etc/passwd`" - -if [ `whoami` != root ] -then - echo You must be root to do this - exit 1 -fi - -echo Setting up for anonymous ftp - -echo Making $FTPDIR and subdirectories -install -d -m 755 -o root -g operator $FTPDIR -install -d -m 751 -o root -g operator $FTPDIR/bin -install -d -m 751 -o root -g operator $FTPDIR/dev -install -d -m 751 -o root -g operator $FTPDIR/etc -install -d -m 755 -o root -g operator $FTPDIR/pub -incoming= -if [ -d $FTPDIR/pub/incoming ] -then - incoming=t -elif [ -t 0 ] -then - echo -n "Create \"incoming\" directory? [n] "; read yn - case "$yn" in - [yY]*|ok|sure) incoming=t - esac -fi -test "$incoming" && install -d -m 777 -o root -g operator $FTPDIR/pub/incoming - -echo Copying files -for PROG in $PROGS -do - test -f /usr/bin/$PROG && install -lcs /usr/bin/$PROG $FTPDIR/bin -done -cp -rp /dev/tcp $FTPDIR/dev/tcp -install -lcs ftpdsh $FTPDIR/bin - -echo Copying a minimum of the password and group files -sed 's/^\([^:]*\):[^:]*:\([^:]*:[^:]*\):.*$/\1:*:\2:::/' \ - /etc/passwd >$FTPDIR/etc/passwd -sed 's/^\([^:]*\):[^:]*:\([^:]*\):.*$/\1:*:\2:/' \ - /etc/group >$FTPDIR/etc/group -chown root:operator $FTPDIR/etc/* -chmod 444 $FTPDIR/etc/* - -echo "Anonymous ftp setup complete"