Mercurial > hg > toybox
annotate toys/pending/ftpget.c @ 1613:96aa7ec74936 draft
Fix yet another sed bug.
The s/// command would copy the \ of substitutions before deciding what to
do with them (generally overwriting the \ with the new data). When the
substitution was A) at the very end of the new string, B) resolved to nothing,
it could leave a trailing \ that didn't belong there and didn't get overwritten
because the "copy trailing data" part that copies the original string's null
terminator already happened before the \ overwrote it.
The ghostwheel() function restarts regexes after embedded NUL bytes, but
if the string it's passed is _longer_ than the length it's told then it
gets confused (and it means we're off the end of our allocation so segfaults
are likely).
Fix: test for \ first and move the "copy byte" logic into an else case.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 15 Dec 2014 03:34:55 -0600 |
parents | 00c20f410c46 |
children | 5fac2769a159 |
rev | line source |
---|---|
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
1 /* ftpget.c - Get a remote file from FTP. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
2 * |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
3 * Copyright 2013 Ranjan Kumar <ranjankumar.bth@gmail.com> |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
5 * |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
6 * No Standard. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
7 * |
1169
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
8 USE_FTPGET(NEWTOY(ftpget, "<2cvu:p:P#<0=21>65535", TOYFLAG_BIN)) |
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
9 USE_FTPGET(OLDTOY(ftpput,ftpget, "<2vu:p:P#<0=21>65535", TOYFLAG_BIN)) |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
10 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
11 config FTPGET |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
12 bool "ftpget/ftpput" |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
13 default n |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
14 help |
1169
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
15 usage: ftpget [-cv] [-u USER -p PASSWORD -P PORT] HOST_NAME [LOCAL_FILENAME] REMOTE_FILENAME |
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
16 usage: ftpput [-v] [-u USER -p PASSWORD -P PORT] HOST_NAME [REMOTE_FILENAME] LOCAL_FILENAME |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
17 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
18 ftpget - Get a remote file from FTP. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
19 ftpput - Upload a local file on remote machine through FTP. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
20 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
21 -c Continue previous transfer. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
22 -v Verbose. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
23 -u User name. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
24 -p Password. |
1169
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
25 -P Port Number (default 21). |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
26 */ |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
27 #define FOR_ftpget |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
28 #include "toys.h" |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
29 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
30 GLOBALS( |
1169
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
31 long port; // char *port; |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
32 char *password; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
33 char *username; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
34 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
35 FILE *sockfp; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
36 int c; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
37 int isget; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
38 char buf[sizeof(struct sockaddr_storage)]; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
39 ) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
40 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
41 #define DATACONNECTION_OPENED 125 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
42 #define FTPFILE_STATUSOKAY 150 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
43 #define FTP_COMMAND_OKAY 200 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
44 #define FTPFILE_STATUS 213 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
45 #define FTPSERVER_READY 220 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
46 #define CLOSE_DATACONECTION 226 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
47 #define PASSIVE_MODE 227 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
48 #define USERLOGGED_SUCCESS 230 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
49 #define PASSWORD_REQUEST 331 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
50 #define REQUESTED_PENDINGACTION 350 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
51 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
52 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
53 static void setport(unsigned port_num) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
54 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
55 int af = ((struct sockaddr *)TT.buf)->sa_family; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
56 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
57 if (af == AF_INET) ((struct sockaddr_in*)TT.buf)->sin_port = port_num; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
58 else if (af == AF_INET6) ((struct sockaddr_in6*)TT.buf)->sin6_port = port_num; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
59 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
60 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
61 static int connect_to_stream() |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
62 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
63 int sockfd, af = ((struct sockaddr *)TT.buf)->sa_family; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
64 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
65 sockfd = xsocket(af, SOCK_STREAM, 0); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
66 if (connect(sockfd, (struct sockaddr*)TT.buf,((af == AF_INET)? |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
67 sizeof(struct sockaddr_in):sizeof(struct sockaddr_in6))) < 0) { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
68 close(sockfd); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
69 perror_exit("can't connect to remote host"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
70 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
71 return sockfd; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
72 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
73 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
74 //close ftp connection and print the message. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
75 static void close_stream(char *msg_str) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
76 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
77 char *str = toybuf; //toybuf holds response data. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
78 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
79 //Remove garbage chars (from ' ' space to '\x7f') DEL remote server response. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
80 while ((*str >= 0x20) && (*str < 0x7f)) str++; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
81 *str = '\0'; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
82 if (TT.sockfp) fclose(TT.sockfp); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
83 error_exit("%s server response: %s", (msg_str) ? msg_str:"", toybuf); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
84 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
85 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
86 //send command to ftp and get return status. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
87 static int get_ftp_response(char *command, char *param) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
88 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
89 unsigned cmd_status = 0; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
90 char *fmt = "%s %s\r\n"; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
91 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
92 if (command) { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
93 if (!param) fmt += 3; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
94 fprintf(TT.sockfp, fmt, command, param); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
95 fflush(TT.sockfp); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
96 if (toys.optflags & FLAG_v) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
97 fprintf(stderr, "FTP Request: %s %s\r\n", command, param); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
98 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
99 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
100 do { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
101 if (!fgets(toybuf, sizeof(toybuf)-1, TT.sockfp)) close_stream(NULL); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
102 } while (!isdigit(toybuf[0]) || toybuf[3] != ' '); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
103 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
104 toybuf[3] = '\0'; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
105 cmd_status = atolx_range(toybuf, 0, INT_MAX); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
106 toybuf[3] = ' '; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
107 return cmd_status; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
108 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
109 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
110 static void send_requests(void) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
111 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
112 int cmd_status = 0; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
113 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
114 //FTP connection request. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
115 if (get_ftp_response(NULL, NULL) != FTPSERVER_READY) close_stream(NULL); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
116 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
117 //230 User authenticated, password please; 331 Password request. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
118 cmd_status = get_ftp_response("USER", TT.username); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
119 if (cmd_status == PASSWORD_REQUEST) { //user logged in. Need Password. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
120 if (get_ftp_response("PASS", TT.password) != USERLOGGED_SUCCESS) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
121 close_stream("PASS"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
122 } else if (cmd_status == USERLOGGED_SUCCESS); //do nothing |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
123 else close_stream("USER"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
124 //200 Type Binary. Command okay. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
125 if (get_ftp_response("TYPE I", NULL) != FTP_COMMAND_OKAY) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
126 close_stream("TYPE I"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
127 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
128 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
129 static void get_sockaddr(char *host) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
130 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
131 struct addrinfo hints, *result; |
1389
e59d4322331b
fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1169
diff
changeset
|
132 char port[6]; |
1169
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
133 int status; |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
134 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
135 errno = 0; |
1169
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
136 snprintf(port, 6, "%ld", TT.port); |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
137 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
138 memset(&hints, 0 , sizeof(struct addrinfo)); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
139 hints.ai_family = AF_UNSPEC; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
140 hints.ai_socktype = SOCK_STREAM; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
141 |
1169
ab7f336bfe52
Noticed a few differences from standard help messages, plus a small
Isaac Dunham <ibid.ag@gmail.com>
parents:
1168
diff
changeset
|
142 status = getaddrinfo(host, port, &hints, &result); |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
143 if (status) error_exit("bad address '%s' : %s", host, gai_strerror(status)); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
144 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
145 memcpy(TT.buf, result->ai_addr, result->ai_addrlen); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
146 freeaddrinfo(result); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
147 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
148 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
149 // send commands to ftp fo PASV mode. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
150 static void verify_pasv_mode(char *r_filename) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
151 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
152 char *pch; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
153 unsigned portnum; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
154 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
155 //vsftpd reply like:- "227 Entering Passive Mode (125,19,39,117,43,39)". |
1433
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
156 if (get_ftp_response("PASV", NULL) != PASSIVE_MODE) goto close_stream; |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
157 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
158 //Response is "NNN <some text> (N1,N2,N3,N4,P1,P2) garbage. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
159 //Server's IP is N1.N2.N3.N4 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
160 //Server's port for data connection is P1*256+P2. |
1433
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
161 if (!(pch = strrchr(toybuf, ')'))) goto close_stream; |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
162 *pch = '\0'; |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
163 if (!(pch = strrchr(toybuf, ','))) goto close_stream; |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
164 *pch = '\0'; |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
165 |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
166 portnum = atolx_range(pch + 1, 0, 255); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
167 |
1433
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
168 if (!(pch = strrchr(toybuf, ','))) goto close_stream; |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
169 *pch = '\0'; |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
170 portnum = portnum + (atolx_range(pch + 1, 0, 255) * 256); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
171 setport(htons(portnum)); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
172 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
173 if (TT.isget && get_ftp_response("SIZE", r_filename) != FTPFILE_STATUS) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
174 TT.c = 0; |
1433
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
175 return; |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
176 |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
177 close_stream: |
00c20f410c46
Patches to commands for issues reported from static analysis tool.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
1389
diff
changeset
|
178 close_stream("PASV"); |
1168
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
179 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
180 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
181 /* |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
182 * verify the local file presence. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
183 * if present, get the size of the file. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
184 */ |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
185 static void is_localfile_present(char *l_filename) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
186 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
187 struct stat sb; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
188 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
189 if (stat(l_filename, &sb) < 0) perror_exit("stat"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
190 //if local file present, then request for pending file action. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
191 if (sb.st_size > 0) { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
192 sprintf(toybuf, "REST %lu", (unsigned long) sb.st_size); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
193 if (get_ftp_response(toybuf, NULL) != REQUESTED_PENDINGACTION) TT.c = 0; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
194 } else TT.c = 0; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
195 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
196 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
197 static void transfer_file(int local_fd, int remote_fd) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
198 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
199 int len, rfd = (TT.isget)?remote_fd:local_fd, |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
200 wfd = (TT.isget)?local_fd:remote_fd; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
201 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
202 if (rfd < 0 || wfd < 0) error_exit("Error in file creation:"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
203 while ((len = xread(rfd, toybuf, sizeof(toybuf)))) xwrite(wfd, toybuf, len); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
204 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
205 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
206 static void get_file(char *l_filename, char *r_filename) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
207 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
208 int local_fd = -1, remote_fd; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
209 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
210 verify_pasv_mode(r_filename); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
211 remote_fd = connect_to_stream(); //Connect to data socket. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
212 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
213 //if local file name will be '-' then local fd will be stdout. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
214 if ((l_filename[0] == '-') && !l_filename[1]) { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
215 local_fd = 1; //file descriptor will become stdout. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
216 TT.c = 0; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
217 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
218 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
219 //if continue, check for local file existance. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
220 if (TT.c) is_localfile_present(l_filename); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
221 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
222 //verify the remote file presence. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
223 if (get_ftp_response("RETR", r_filename) > FTPFILE_STATUSOKAY) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
224 close_stream("RETR"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
225 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
226 //if local fd is not stdout, create a file descriptor. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
227 if (local_fd == -1) { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
228 int flags = O_WRONLY; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
229 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
230 flags |= (TT.c)? O_APPEND : (O_CREAT | O_TRUNC); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
231 local_fd = xcreate((char *)l_filename, flags, 0666); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
232 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
233 transfer_file(local_fd, remote_fd); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
234 xclose(remote_fd); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
235 xclose(local_fd); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
236 if (get_ftp_response(NULL, NULL) != CLOSE_DATACONECTION) close_stream(NULL); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
237 get_ftp_response("QUIT", NULL); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
238 toys.exitval = EXIT_SUCCESS; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
239 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
240 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
241 static void put_file(char *r_filename, char *l_filename) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
242 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
243 int local_fd = 0, remote_fd; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
244 unsigned cmd_status = 0; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
245 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
246 verify_pasv_mode(r_filename); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
247 remote_fd = connect_to_stream(); //Connect to data socket. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
248 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
249 //open the local file for transfer. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
250 if ((l_filename[0] != '-') || l_filename[1]) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
251 local_fd = xcreate((char *)l_filename, O_RDONLY, 0666); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
252 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
253 //verify for the remote file status, Ok or Open: transfer File. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
254 cmd_status = get_ftp_response("STOR", r_filename); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
255 if ( (cmd_status == DATACONNECTION_OPENED) || |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
256 (cmd_status == FTPFILE_STATUSOKAY)) { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
257 transfer_file(local_fd, remote_fd); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
258 if (get_ftp_response(NULL, NULL) != CLOSE_DATACONECTION) close_stream(NULL); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
259 get_ftp_response("QUIT", NULL); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
260 toys.exitval = EXIT_SUCCESS; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
261 } else { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
262 toys.exitval = EXIT_FAILURE; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
263 close_stream("STOR"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
264 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
265 xclose(remote_fd); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
266 xclose(local_fd); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
267 } |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
268 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
269 void ftpget_main(void) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
270 { |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
271 char **argv = toys.optargs; //host name + file name. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
272 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
273 TT.isget = toys.which->name[3] == 'g'; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
274 TT.c = 1; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
275 //if user name is not specified. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
276 if (!(toys.optflags & FLAG_u) && (toys.optflags & FLAG_p)) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
277 error_exit("Missing username:"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
278 //if user name and password is not specified in command line. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
279 if (!(toys.optflags & FLAG_u) && !(toys.optflags & FLAG_p)) |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
280 TT.username = TT.password ="anonymous"; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
281 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
282 //if continue is not in the command line argument. |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
283 if (TT.isget && !(toys.optflags & FLAG_c)) TT.c = 0; |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
284 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
285 if (toys.optflags & FLAG_v) fprintf(stderr, "Connecting to %s\n", argv[0]); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
286 get_sockaddr(argv[0]); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
287 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
288 TT.sockfp = xfdopen(connect_to_stream(), "r+"); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
289 send_requests(); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
290 |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
291 if (TT.isget) get_file(argv[1], argv[2] ? argv[2] : argv[1]); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
292 else put_file(argv[1], argv[2] ? argv[2] : argv[1]); |
fbe6804a3f33
Attached is an implementation for ftpget/put commands.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents:
diff
changeset
|
293 } |