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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }