[9] | 1 | /* ftp.c by Michael Temari 06/21/92
|
---|
| 2 | *
|
---|
| 3 | * ftp An ftp client program for use with TNET.
|
---|
| 4 | *
|
---|
| 5 | * Usage: ftp [[host] [port]]
|
---|
| 6 | *
|
---|
| 7 | * Version: 0.10 06/21/92 (pre-release not yet completed)
|
---|
| 8 | * 0.20 07/01/92
|
---|
| 9 | * 0.30 01/15/96 (Minix 1.7.1 initial release)
|
---|
| 10 | * 0.40 08/27/96
|
---|
| 11 | *
|
---|
| 12 | * Author: Michael Temari, <temari@ix.netcom.com>
|
---|
| 13 | */
|
---|
| 14 |
|
---|
| 15 | #include <stdio.h>
|
---|
| 16 | #include <stdlib.h>
|
---|
| 17 | #include <ctype.h>
|
---|
| 18 | #include <string.h>
|
---|
| 19 |
|
---|
| 20 | #include "ftp.h"
|
---|
| 21 | #include "local.h"
|
---|
| 22 | #include "file.h"
|
---|
| 23 | #include "other.h"
|
---|
| 24 | #include "net.h"
|
---|
| 25 |
|
---|
| 26 | FILE *fpcommin;
|
---|
| 27 | FILE *fpcommout;
|
---|
| 28 |
|
---|
| 29 | int linkopen;
|
---|
| 30 | int loggedin;
|
---|
| 31 | int type;
|
---|
| 32 | int format;
|
---|
| 33 | int mode;
|
---|
| 34 | int structure;
|
---|
| 35 | int passive;
|
---|
| 36 | int atty;
|
---|
| 37 |
|
---|
| 38 | int cmdargc;
|
---|
| 39 | char *cmdargv[NUMARGS];
|
---|
| 40 |
|
---|
| 41 | char reply[1024];
|
---|
| 42 |
|
---|
| 43 | _PROTOTYPE(static int makeargs, (char *buff));
|
---|
| 44 | _PROTOTYPE(int DOhelp, (void));
|
---|
| 45 | _PROTOTYPE(int main, (int argc, char *argv[]));
|
---|
| 46 |
|
---|
| 47 | static int makeargs(buff)
|
---|
| 48 | char *buff;
|
---|
| 49 | {
|
---|
| 50 | char *p;
|
---|
| 51 | int i;
|
---|
| 52 |
|
---|
| 53 | for(i = 0; i < NUMARGS; i++)
|
---|
| 54 | cmdargv[i] = (char *)0;
|
---|
| 55 |
|
---|
| 56 | p = buff + strlen(buff) - 1;
|
---|
| 57 | while(p != buff)
|
---|
| 58 | if(*p == '\r' || *p == '\n' || isspace(*p))
|
---|
| 59 | *p-- = '\0';
|
---|
| 60 | else
|
---|
| 61 | break;
|
---|
| 62 |
|
---|
| 63 | p = buff;
|
---|
| 64 | cmdargc = 0;
|
---|
| 65 | while(cmdargc < NUMARGS) {
|
---|
| 66 | while(*p && isspace(*p))
|
---|
| 67 | p++;
|
---|
| 68 | if(*p == '\0')
|
---|
| 69 | break;
|
---|
| 70 | cmdargv[cmdargc++] = p;
|
---|
| 71 | while(*p && !isspace(*p)) {
|
---|
| 72 | if(cmdargc == 1)
|
---|
| 73 | *p = tolower(*p);
|
---|
| 74 | p++;
|
---|
| 75 | }
|
---|
| 76 | if(*p == '\0')
|
---|
| 77 | break;
|
---|
| 78 | *p = '\0';
|
---|
| 79 | p++;
|
---|
| 80 | }
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | int readline(prompt, buff, len)
|
---|
| 84 | char *prompt;
|
---|
| 85 | char *buff;
|
---|
| 86 | int len;
|
---|
| 87 | {
|
---|
| 88 | printf(prompt); fflush(stdout);
|
---|
| 89 |
|
---|
| 90 | if(fgets(buff, len, stdin) == (char *)NULL) {
|
---|
| 91 | printf("\nEnd of file on input!\n");
|
---|
| 92 | exit(1);
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | *strchr(buff, '\n') = 0;
|
---|
| 96 |
|
---|
| 97 | if(!atty) {
|
---|
| 98 | printf("%s\n", buff);
|
---|
| 99 | fflush(stdout);
|
---|
| 100 | }
|
---|
| 101 |
|
---|
| 102 | return(0);
|
---|
| 103 | }
|
---|
| 104 |
|
---|
| 105 | int DOgetreply()
|
---|
| 106 | {
|
---|
| 107 | char *p;
|
---|
| 108 | char buff[6];
|
---|
| 109 | int s;
|
---|
| 110 | int firsttime;
|
---|
| 111 |
|
---|
| 112 | do {
|
---|
| 113 | firsttime = 1;
|
---|
| 114 | do {
|
---|
| 115 | if(fgets(reply, sizeof(reply), fpcommin) == (char *)0)
|
---|
| 116 | return(-1);
|
---|
| 117 | p = reply + strlen(reply) - 1;
|
---|
| 118 | while(p != reply)
|
---|
| 119 | if(*p == '\r' || *p == '\n' || isspace(*p))
|
---|
| 120 | *p-- = '\0';
|
---|
| 121 | else
|
---|
| 122 | break;
|
---|
| 123 | printf("%s\n", reply); fflush(stdout);
|
---|
| 124 | if(firsttime) {
|
---|
| 125 | firsttime = 0;
|
---|
| 126 | strncpy(buff, reply, 4);
|
---|
| 127 | buff[3] = ' ';
|
---|
| 128 | }
|
---|
| 129 | } while(strncmp(reply, buff, 3) || reply[3] == '-');
|
---|
| 130 | s = atoi(buff);
|
---|
| 131 | } while(s < 200 && s != 125 & s != 150);
|
---|
| 132 |
|
---|
| 133 | return(s);
|
---|
| 134 | }
|
---|
| 135 |
|
---|
| 136 | int DOcmdcheck()
|
---|
| 137 | {
|
---|
| 138 | if(!linkopen) {
|
---|
| 139 | printf("You must \"OPEN\" a connection first.\n");
|
---|
| 140 | return(1);
|
---|
| 141 | }
|
---|
| 142 |
|
---|
| 143 | if(!loggedin) {
|
---|
| 144 | printf("You must login first.\n");
|
---|
| 145 | return(1);
|
---|
| 146 | }
|
---|
| 147 |
|
---|
| 148 | return(0);
|
---|
| 149 | }
|
---|
| 150 |
|
---|
| 151 | int DOcommand(ftpcommand, ftparg)
|
---|
| 152 | char *ftpcommand;
|
---|
| 153 | char *ftparg;
|
---|
| 154 | {
|
---|
| 155 | if(*ftparg)
|
---|
| 156 | fprintf(fpcommout, "%s %s\r\n", ftpcommand, ftparg);
|
---|
| 157 | else
|
---|
| 158 | fprintf(fpcommout, "%s\r\n", ftpcommand);
|
---|
| 159 |
|
---|
| 160 | fflush(fpcommout);
|
---|
| 161 |
|
---|
| 162 | return(DOgetreply());
|
---|
| 163 | }
|
---|
| 164 |
|
---|
| 165 | int DOhelp()
|
---|
| 166 | {
|
---|
| 167 | char junk[10];
|
---|
| 168 |
|
---|
| 169 | printf("Command: Description\n");
|
---|
| 170 | printf("! Escape to a shell\n");
|
---|
| 171 | printf("append Append a file to remote host\n");
|
---|
| 172 | printf("ascii Set file transfer mode to ascii\n");
|
---|
| 173 | printf("binary Set file transfer mode to binary\n");
|
---|
| 174 | printf("bye Close connection and exit\n");
|
---|
| 175 | printf("cd Change directory on remote host\n");
|
---|
| 176 | printf("close Close connection\n");
|
---|
| 177 | printf("del Remove file on remote host\n");
|
---|
| 178 | printf("dir Display long form remote host directory listing\n");
|
---|
| 179 | printf("exit Close connection and exit\n");
|
---|
| 180 | printf("get Retrieve a file from remote host\n");
|
---|
| 181 | printf("help Display this text\n");
|
---|
| 182 | printf("lcd Change directory on local host\n");
|
---|
| 183 | printf("ldir Display long form local host directory listing\n");
|
---|
| 184 | printf("lls Display local host directory listing\n");
|
---|
| 185 | printf("lmkdir Create directory on local host\n");
|
---|
| 186 | printf("lpwd Display current directory on local host\n");
|
---|
| 187 | printf("lrmdir Remove directory on local host\n");
|
---|
| 188 | printf("ls Display remote host directory listing\n");
|
---|
| 189 | printf("mget Retrieve multiple files from remote host\n");
|
---|
| 190 | printf("mkdir Create directory on remote host\n");
|
---|
| 191 | printf("mod Get file modification time\n");
|
---|
| 192 |
|
---|
| 193 | readline("Press ENTER to continue... ", junk, sizeof(junk));
|
---|
| 194 |
|
---|
| 195 | printf("mput Send multiple files to remote host\n");
|
---|
| 196 | printf("noop Send the ftp NOOP command\n");
|
---|
| 197 | printf("open Open connection to remote host\n");
|
---|
| 198 | printf("pass Enter remote user password\n");
|
---|
| 199 | printf("passive Toggle passive mode\n");
|
---|
| 200 | printf("put Send a file to remote host\n");
|
---|
| 201 | printf("putu Send a file to remote host(unique)\n");
|
---|
| 202 | printf("pwd Display current directory on remote host\n");
|
---|
| 203 | printf("quit Close connection and exit\n");
|
---|
| 204 | printf("quote Send raw ftp command to remote host\n");
|
---|
| 205 | printf("reget Restart a partial file retrieve from remote host\n");
|
---|
| 206 | printf("remotehelp Display ftp commands implemented on remote host\n");
|
---|
| 207 | printf("reput Restart a partial file send to remote host\n");
|
---|
| 208 | printf("rm Remove file on remote host\n");
|
---|
| 209 | printf("rmdir Remove directory on remote host\n");
|
---|
| 210 | printf("site Send a site specific command\n");
|
---|
| 211 | printf("size Get file size information\n");
|
---|
| 212 | printf("status Get connection/file status information\n");
|
---|
| 213 | printf("system Get remote system type information\n");
|
---|
| 214 | printf("user Enter remote user information\n");
|
---|
| 215 |
|
---|
| 216 | return(0);
|
---|
| 217 | }
|
---|
| 218 |
|
---|
| 219 | struct commands {
|
---|
| 220 | char *name;
|
---|
| 221 | _PROTOTYPE(int (*func), (void));
|
---|
| 222 | };
|
---|
| 223 |
|
---|
| 224 | static struct commands commands[] = {
|
---|
| 225 | "!", DOlshell,
|
---|
| 226 | "append", DOappe,
|
---|
| 227 | "ascii", DOascii,
|
---|
| 228 | "binary", DObinary,
|
---|
| 229 | "bin", DObinary,
|
---|
| 230 | "bye", DOquit,
|
---|
| 231 | "cd", DOcd,
|
---|
| 232 | "close", DOclose,
|
---|
| 233 | "del", DOdelete,
|
---|
| 234 | "dir", DOlist,
|
---|
| 235 | "exit", DOquit,
|
---|
| 236 | "get", DOretr,
|
---|
| 237 | "help", DOhelp,
|
---|
| 238 | "lcd", DOlcd,
|
---|
| 239 | "ldir", DOllist,
|
---|
| 240 | "lls", DOlnlst,
|
---|
| 241 | "lmkdir", DOlmkdir,
|
---|
| 242 | "lpwd", DOlpwd,
|
---|
| 243 | "lrmdir", DOlrmdir,
|
---|
| 244 | "ls", DOnlst,
|
---|
| 245 | "mget", DOMretr,
|
---|
| 246 | "mkdir", DOmkdir,
|
---|
| 247 | "mod", DOmdtm,
|
---|
| 248 | "mput", DOMstor,
|
---|
| 249 | "noop", DOnoop,
|
---|
| 250 | "open", DOopen,
|
---|
| 251 | "pass", DOpass,
|
---|
| 252 | "passive", DOpassive,
|
---|
| 253 | "put", DOstor,
|
---|
| 254 | "putu", DOstou,
|
---|
| 255 | "pwd", DOpwd,
|
---|
| 256 | "quit", DOquit,
|
---|
| 257 | "quote", DOquote,
|
---|
| 258 | "reget", DOrretr,
|
---|
| 259 | "remotehelp", DOremotehelp,
|
---|
| 260 | "reput", DOrstor,
|
---|
| 261 | "rm", DOdelete,
|
---|
| 262 | "rmdir", DOrmdir,
|
---|
| 263 | "site", DOsite,
|
---|
| 264 | "size", DOsize,
|
---|
| 265 | "status", DOstat,
|
---|
| 266 | "system", DOsyst,
|
---|
| 267 | "user", DOuser,
|
---|
| 268 | "", (int (*)())0
|
---|
| 269 | };
|
---|
| 270 |
|
---|
| 271 | int main(argc, argv)
|
---|
| 272 | int argc;
|
---|
| 273 | char *argv[];
|
---|
| 274 | {
|
---|
| 275 | int s;
|
---|
| 276 | struct commands *cmd;
|
---|
| 277 | static char buffer[128];
|
---|
| 278 |
|
---|
| 279 | NETinit();
|
---|
| 280 |
|
---|
| 281 | FTPinit();
|
---|
| 282 |
|
---|
| 283 | s = 0;
|
---|
| 284 |
|
---|
| 285 | if(argc > 1) {
|
---|
| 286 | sprintf(buffer, "open %s ", argv[1]);
|
---|
| 287 | makeargs(buffer);
|
---|
| 288 | s = DOopen();
|
---|
| 289 | if(atty && s > 0) {
|
---|
| 290 | sprintf(buffer, "user");
|
---|
| 291 | makeargs(buffer);
|
---|
| 292 | s = DOuser();
|
---|
| 293 | }
|
---|
| 294 | }
|
---|
| 295 |
|
---|
| 296 | while(s >= 0) {
|
---|
| 297 | readline("ftp>", buffer, sizeof(buffer));
|
---|
| 298 | makeargs(buffer);
|
---|
| 299 | if(cmdargc == 0) continue;
|
---|
| 300 | for(cmd = commands; *cmd->name != '\0'; cmd++)
|
---|
| 301 | if(!strcmp(cmdargv[0], cmd->name))
|
---|
| 302 | break;
|
---|
| 303 | if(*cmd->name != '\0')
|
---|
| 304 | s = (*cmd->func)();
|
---|
| 305 | else {
|
---|
| 306 | s = 0;
|
---|
| 307 | printf("Command \"%s\" not recognized.\n", cmdargv[0]);
|
---|
| 308 | }
|
---|
| 309 | }
|
---|
| 310 |
|
---|
| 311 | return(0);
|
---|
| 312 | }
|
---|