annotate lib/ssh.c @ 27:6db3583f538a

2002-09-24 Brian Masney <masneyb@gftp.org> * intl/ - remove this directory
author masneyb
date Tue, 24 Sep 2002 12:21:35 +0000
parents 83090328581e
children c8ec7877432e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1 /*****************************************************************************/
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
2 /* ssh.c - functions that will use the ssh protocol */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
3 /* Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org> */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
4 /* */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
5 /* This program is free software; you can redistribute it and/or modify */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
6 /* it under the terms of the GNU General Public License as published by */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
7 /* the Free Software Foundation; either version 2 of the License, or */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
8 /* (at your option) any later version. */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
9 /* */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
10 /* This program is distributed in the hope that it will be useful, */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
13 /* GNU General Public License for more details. */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
14 /* */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
15 /* You should have received a copy of the GNU General Public License */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
16 /* along with this program; if not, write to the Free Software */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
17 /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
18 /*****************************************************************************/
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
19
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
20 /* This will use Brian Wellington <bwelling@xbill.org>'s sftpserv program */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
21 /* on the remote. Some of this code is derived from the sftp client */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
22
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
23 #include "gftp.h"
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
24
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
25 #define CHDIR 10
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
26 #define GETDIR 11
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
27 #define TELLDIR 12
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
28 #define SENDFILE 15
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
29 #define NOFILEMATCH 16
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
30 #define FILESIZE 20
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
31 #define FILEMODE 21
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
32 #define DATA 22
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
33 #define ENDDATA 23
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
34 #define FILEOK 24
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
35 #define STREAM 25
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
36 #define REQUEST 26
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
37 #define FILENAME 27
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
38 #define EXEC 28
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
39 #define SKIPBYTES 29
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
40 #define ERROR 30
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
41 #define SUCCESS 31
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
42 #define CLOSE 32
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
43 #define SSH_VERSION 33
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
44 #define CANCEL 34
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
45 #define FILETIME 40
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
46
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
47 typedef struct ssh_parms_tag
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
48 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
49 char *buffer, /* The buffer we are reading the data from */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
50 *pos; /* Our position in this buffer */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
51 int enddata; /* Are we done reading the data */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
52 char channel; /* Data channel we are writing to */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
53 } ssh_parms;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
54
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
55
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
56 typedef struct ssh_message_tag
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
57 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
58 char channel,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
59 command;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
60 gint32 len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
61 void *data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
62 } ssh_message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
63
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
64
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
65 static void ssh_destroy ( gftp_request * request );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
66 static int ssh_connect ( gftp_request * request );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
67 static void ssh_disconnect ( gftp_request * request );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
68 static long ssh_get_file ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
69 const char *filename,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
70 FILE * fd,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
71 off_t startsize );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
72 static int ssh_put_file ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
73 const char *filename,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
74 FILE * fd,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
75 off_t startsize,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
76 off_t totalsize );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
77 static size_t ssh_get_next_file_chunk ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
78 char *buf,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
79 size_t size );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
80 static size_t ssh_put_next_file_chunk ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
81 char *buf,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
82 size_t size );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
83 static int ssh_end_transfer ( gftp_request * request );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
84 static int ssh_list_files ( gftp_request * request );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
85 static int ssh_get_next_file ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
86 gftp_file * fle,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
87 FILE * fd );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
88 static int ssh_chdir ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
89 const char *directory );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
90 static char *ssh_exec ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
91 const char *command,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
92 size_t len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
93 static int ssh_rmdir ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
94 const char *directory );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
95 static int ssh_rmfile ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
96 const char *file );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
97 static int ssh_mkdir ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
98 const char *newdir );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
99 static int ssh_rename ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
100 const char *oldname,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
101 const char *newname );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
102 static int ssh_chmod ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
103 const char *file,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
104 int mode );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
105 static int ssh_send_command ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
106 int cmdnum,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
107 const char *command,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
108 size_t len );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
109 static int ssh_read_response ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
110 ssh_message *message,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
111 FILE * fd );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
112 static char *ssh_read_message ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
113 char *buf,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
114 size_t len,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
115 FILE * fd );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
116 static char *ssh_read_line ( gftp_request * request );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
117 static void ssh_log_command ( gftp_request * request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
118 int channel,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
119 int cmdnum,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
120 const char *command,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
121 size_t len,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
122 int direction );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
123 static size_t ssh_remove_spaces ( char *string );
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
124
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
125 void
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
126 ssh_init (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
127 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
128 g_return_if_fail (request != NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
129
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
130 request->protonum = GFTP_SSH_NUM;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
131 request->init = ssh_init;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
132 request->destroy = ssh_destroy;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
133 request->connect = ssh_connect;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
134 request->disconnect = ssh_disconnect;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
135 request->get_file = ssh_get_file;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
136 request->put_file = ssh_put_file;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
137 request->transfer_file = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
138 request->get_next_file_chunk = ssh_get_next_file_chunk;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
139 request->put_next_file_chunk = ssh_put_next_file_chunk;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
140 request->end_transfer = ssh_end_transfer;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
141 request->list_files = ssh_list_files;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
142 request->get_next_file = ssh_get_next_file;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
143 request->set_data_type = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
144 request->get_file_size = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
145 request->chdir = ssh_chdir;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
146 request->rmdir = ssh_rmdir;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
147 request->rmfile = ssh_rmfile;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
148 request->mkdir = ssh_mkdir;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
149 request->rename = ssh_rename;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
150 request->chmod = ssh_chmod;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
151 request->set_file_time = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
152 request->site = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
153 request->parse_url = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
154 request->url_prefix = "ssh";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
155 request->protocol_name = "SSH";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
156 request->need_hostport = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
157 request->need_userpass = ssh_need_userpass;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
158 request->use_cache = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
159 request->use_threads = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
160 request->always_connected = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
161 request->protocol_data = g_malloc0 (sizeof (ssh_parms));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
162 gftp_set_config_options (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
163 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
164
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
165
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
166 static void
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
167 ssh_destroy (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
168 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
169 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
170
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
171 g_return_if_fail (request != NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
172 g_return_if_fail (request->protonum == GFTP_SSH_NUM);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
173
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
174 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
175 if (params->buffer)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
176 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
177 g_free (params->buffer);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
178 params->buffer = params->pos = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
179 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
180 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
181
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
182
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
183 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
184 ssh_connect (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
185 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
186 char **args, *tempstr, pts_name[20], *p1, p2, *exepath, port[6];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
187 int version, fdm, fds, s[2];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
188 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
189 const gchar *errstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
190 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
191 pid_t child;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
192
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
193 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
194 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
195 g_return_val_if_fail (request->hostname != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
196
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
197 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
198 if (request->sockfd != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
199 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
200
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
201 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
202 _("Opening SSH connection to %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
203 request->hostname);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
204
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
205 if (request->sftpserv_path == NULL ||
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
206 *request->sftpserv_path == '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
207 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
208 p1 = "";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
209 p2 = ' ';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
210 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
211 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
212 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
213 p1 = request->sftpserv_path;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
214 p2 = '/';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
215 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
216
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
217 *port = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
218 exepath = g_strdup_printf ("%s%csftpserv", p1, p2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
219 args = make_ssh_exec_args (request, exepath, 0, port);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
220
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
221 if (ssh_use_askpass)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
222 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
223 fdm = fds = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
224 if (socketpair (AF_LOCAL, SOCK_STREAM, 0, s) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
225 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
226 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
227 _("Cannot create a socket pair: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
228 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
229 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
230 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
231 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
232 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
233 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
234 s[0] = s[1] = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
235 if ((fdm = ptym_open (pts_name)) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
236 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
237 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
238 _("Cannot open master pty %s: %s\n"), pts_name,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
239 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
240 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
241 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
242 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
243
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
244 if ((child = fork ()) == 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
245 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
246 setsid ();
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
247 if (ssh_use_askpass)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
248 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
249 close (s[0]);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
250 fds = s[1];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
251 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
252 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
253 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
254 if ((fds = ptys_open (fdm, pts_name)) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
255 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
256 printf ("Cannot open slave pts %s: %s\n", pts_name,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
257 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
258 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
259 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
260 close (fdm);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
261 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
262
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
263 dup2 (fds, 0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
264 dup2 (fds, 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
265 dup2 (fds, 2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
266 if (!ssh_use_askpass && fds > 2)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
267 close (fds);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
268 execvp (ssh_prog_name != NULL && *ssh_prog_name != '\0' ?
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
269 ssh_prog_name : "ssh", args);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
270
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
271 tempstr = _("Error: Cannot execute ssh: ");
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
272 write (1, tempstr, strlen (tempstr));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
273 errstr = g_strerror (errno);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
274 write (1, errstr, strlen (errstr));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
275 write (1, "\n", 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
276 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
277 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
278 else if (child > 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
279 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
280 if (ssh_use_askpass)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
281 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
282 close (s[1]);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
283 fdm = s[0];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
284 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
285 tty_raw (fdm);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
286 tempstr = ssh_start_login_sequence (request, fdm);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
287 if (!tempstr ||
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
288 !(strlen (tempstr) > 4 && strcmp (tempstr + strlen (tempstr) - 5,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
289 "xsftp") == 0))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
290 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
291 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
292 _("Error: Received wrong init string from server\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
293 g_free (args);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
294 g_free (exepath);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
295 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
296 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
297 g_free (args);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
298 g_free (exepath);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
299 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
300
14
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
301 if ((request->sockfd = fdopen (fdm, "rb+")) == NULL)
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
302 {
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
303 request->logging_function (gftp_logging_error, request->user_data,
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
304 _("Cannot fdopen() socket: %s\n"),
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
305 g_strerror (errno));
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
306 close (fdm);
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
307 return (-2);
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
308 }
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
309
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
310 if ((request->sockfd_write = fdopen (fdm, "wb+")) == NULL)
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
311 {
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
312 request->logging_function (gftp_logging_error, request->user_data,
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
313 _("Cannot fdopen() socket: %s\n"),
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
314 g_strerror (errno));
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
315 gftp_disconnect (request);
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
316 return (-2);
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
317 }
1
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
318
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
319 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
320 version = htonl (7 << 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
321 if (ssh_send_command (request, SSH_VERSION, (char *) &version, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
322 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
323 if (ssh_read_response (request, &message, NULL) != SSH_VERSION)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
324 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
325 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
326
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
327 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
328 _("Successfully logged into SSH server %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
329 request->hostname);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
330 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
331 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
332 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
333 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
334 _("Cannot fork another process: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
335 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
336 g_free (args);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
337 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
338 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
339
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
340 ssh_chdir (request, request->directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
341
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
342 if (ssh_send_command (request, GETDIR, NULL, 0) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
343 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
344
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
345 if (ssh_read_response (request, &message, NULL) != TELLDIR)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
346 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
347 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
348 _("Could not get current working directory: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
349 (char *) message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
350 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
351 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
352 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
353
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
354 if (request->directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
355 g_free (request->directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
356 request->directory = message.data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
357
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
358 if (request->sockfd == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
359 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
360
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
361 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
362 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
363
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
364
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
365 static void
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
366 ssh_disconnect (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
367 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
368 g_return_if_fail (request != NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
369 g_return_if_fail (request->protonum == GFTP_SSH_NUM);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
370
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
371 if (request->sockfd != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
372 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
373 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
374 _("Disconnecting from site %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
375 request->hostname);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
376 fclose (request->sockfd);
14
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
377 request->sockfd = request->sockfd_write = NULL;
1
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
378 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
379 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
380
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
381
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
382 static long
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
383 ssh_get_file (gftp_request * request, const char *filename, FILE * fd,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
384 off_t startsize)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
385 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
386 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
387 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
388 off_t retsize;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
389 int ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
390
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
391 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
392 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
393 g_return_val_if_fail (filename != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
394 /* fd ignored for this protocol */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
395
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
396 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
397 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
398 if (ssh_send_command (request, REQUEST, filename, strlen (filename) + 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
399 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
400
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
401 retsize = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
402 while (1)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
403 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
404 ret = ssh_read_response (request, &message, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
405 switch (ret)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
406 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
407 case FILESIZE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
408 retsize = strtol ((char *) message.data, NULL, 10);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
409 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
410 case NOFILEMATCH:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
411 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
412 _("Remote host could not find file %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
413 filename);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
414 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
415 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
416 case FILENAME:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
417 params->channel = message.channel;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
418 startsize = htonl (startsize);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
419 if (ssh_send_command (request, SKIPBYTES, (char *) &startsize, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
420 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
421 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
422 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
423 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
424 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
425 case -1:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
426 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
427 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
428 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
429
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
430 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
431 if (ret == FILETIME)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
432 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
433 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
434
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
435 return (retsize);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
436 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
437
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
438
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
439 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
440 ssh_put_file (gftp_request * request, const char *filename, FILE * fd,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
441 off_t startsize, off_t totalsize)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
442 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
443 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
444 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
445 char tempchar;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
446
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
447 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
448 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
449 g_return_val_if_fail (filename != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
450 /* fd ignored for this protocol */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
451
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
452 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
453 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
454 tempchar = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
455 if (ssh_send_command (request, SENDFILE, &tempchar, 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
456 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
457
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
458 params->channel = tempchar;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
459 if (ssh_send_command (request, FILENAME, filename, strlen (filename) + 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
460 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
461
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
462 if (ssh_read_response (request, &message, NULL) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
463 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
464 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
465 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
466 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
467
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
468 if (!(message.command == FILEOK && message.len == 1
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
469 && *(char *) message.data != 0))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
470 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
471 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
472 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
473 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
474 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
475
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
476 if (ssh_send_command (request, FILESIZE, (void *) &totalsize, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
477 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
478
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
479 if (ssh_send_command (request, FILEMODE, "rw-r--r--", 9) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
480 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
481
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
482 if (ssh_send_command (request, FILETIME, (char *) 0, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
483 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
484
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
485 if (startsize > 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
486 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
487 startsize = htonl (startsize);
14
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
488 /* This protocol only supports files up to 2 gig in size. I truncate
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
489 the file size here just to suppress compiler warnings */
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
490 if (ssh_send_command (request, SKIPBYTES,
83090328581e * More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents: 1
diff changeset
491 GINT_TO_POINTER ((gint32) startsize), 4) < 0)
1
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
492 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
493 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
494
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
495 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
496 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
497
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
498
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
499 static size_t
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
500 ssh_get_next_file_chunk (gftp_request * request, char *buf, size_t size)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
501 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
502 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
503 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
504
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
505 switch (ssh_read_response (request, &message, NULL))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
506 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
507 case DATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
508 len = size > message.len ? message.len : size;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
509 memcpy (buf, message.data, len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
510 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
511 return (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
512 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
513 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
514 if (ssh_read_response (request, &message, NULL) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
515 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
516 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
517 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
518 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
519 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
520 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
521 case -1:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
522 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
523 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
524 default:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
525 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
526 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
527 _("Received unexpected response from server\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
528 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
529 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
530 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
531 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
532
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
533
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
534 static size_t
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
535 ssh_put_next_file_chunk (gftp_request * request, char *buf, size_t size)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
536 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
537 if (size == 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
538 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
539 if (ssh_send_command (request, ENDDATA, NULL, 0) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
540 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
541 if (ssh_send_command (request, NOFILEMATCH, NULL, 0) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
542 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
543 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
544 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
545 return (ssh_send_command (request, DATA, buf, size) == 0 ? size : 0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
546 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
547
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
548
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
549 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
550 ssh_end_transfer (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
551 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
552 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
553
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
554 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
555 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
556
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
557 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
558 if (params->buffer)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
559 g_free (params->buffer);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
560 params->buffer = params->pos = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
561 params->enddata = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
562
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
563 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
564 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
565
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
566
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
567 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
568 ssh_list_files (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
569 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
570 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
571 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
572 char *tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
573 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
574
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
575 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
576 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
577
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
578 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
579 params->enddata = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
580 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
581 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
582 _("Retrieving directory listing...\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
583
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
584 tempstr = g_strconcat ("/bin/ls -al", NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
585 len = ssh_remove_spaces (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
586
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
587 if (ssh_send_command (request, EXEC, tempstr, len) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
588 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
589 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
590 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
591 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
592 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
593
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
594 if (ssh_read_response (request, &message, NULL) != STREAM)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
595 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
596 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
597 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
598 _("Received unexpected response from server\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
599 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
600 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
601 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
602 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
603
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
604 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
605 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
606
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
607
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
608 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
609 ssh_get_next_file (gftp_request * request, gftp_file * fle, FILE * fd)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
610 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
611 char *tempstr, *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
612 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
613 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
614 int ret, len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
615
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
616 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
617 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
618 g_return_val_if_fail (fle != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
619
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
620 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
621 if (request->last_dir_entry)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
622 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
623 g_free (request->last_dir_entry);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
624 request->last_dir_entry = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
625 request->last_dir_entry_len = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
626 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
627
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
628 len = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
629 while (1)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
630 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
631 if (params->enddata && params->buffer == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
632 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
633 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
634 _("Finished retrieving directory listing\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
635 params->enddata = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
636 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
637 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
638
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
639 if (!params->enddata &&
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
640 (!params->pos || strchr (params->pos, '\n') == NULL))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
641 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
642 if ((ret = ssh_read_response (request, &message, fd)) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
643 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
644 if (message.data)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
645 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
646 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
647 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
648
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
649 if (!request->cached)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
650 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
651 request->last_dir_entry_len = message.len + 6;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
652 request->last_dir_entry = g_malloc (request->last_dir_entry_len + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
653 request->last_dir_entry[0] = message.channel;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
654 request->last_dir_entry[1] = message.command;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
655 len = htonl (message.len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
656 memcpy (&request->last_dir_entry[2], &len, 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
657 memcpy (&request->last_dir_entry[6], message.data, message.len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
658 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
659
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
660 if (ret == DATA)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
661 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
662 if (params->pos == NULL || *params->pos == '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
663 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
664 if (params->buffer)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
665 g_free (params->buffer);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
666 params->buffer = params->pos = message.data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
667 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
668 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
669 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
670 tempstr = params->buffer;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
671 params->buffer = g_malloc (strlen (params->pos) +
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
672 strlen ((char *) message.data) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
673 strcpy (params->buffer, params->pos);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
674 strcat (params->buffer, (char *) message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
675 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
676 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
677 params->pos = params->buffer;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
678 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
679 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
680 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
681 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
682 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
683 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
684 ret = DATA;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
685
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
686 switch (ret)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
687 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
688 case DATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
689 if ((tempstr = ssh_read_line (request)) == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
690 continue;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
691 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
692 while (*pos == ' ' || *pos == '\t')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
693 pos++;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
694 if (*pos == '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
695 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
696 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
697 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
698 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
699
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
700 if (gftp_parse_ls (tempstr, fle) != 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
701 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
702 if (strncmp (tempstr, "total", strlen ("total")) &&
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
703 strncmp (tempstr, _("total"), strlen (_("total"))))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
704 request->logging_function (gftp_logging_misc,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
705 request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
706 _("Warning: Cannot parse listing %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
707 tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
708 gftp_file_destroy (fle);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
709 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
710 tempstr = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
711 continue;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
712 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
713 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
714 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
715 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
716 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
717 params->enddata = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
718 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
719 default:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
720 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
721 _("Received unexpected response from server\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
722 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
723 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
724 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
725
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
726 if (ret == DATA)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
727 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
728 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
729
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
730 return (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
731 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
732
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
733
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
734 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
735 ssh_chdir (gftp_request * request, const char *directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
736 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
737 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
738 int ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
739
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
740 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
741 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
742
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
743 if (directory != NULL && *directory != '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
744 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
745 if (ssh_send_command (request, CHDIR, directory,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
746 strlen (directory) + 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
747 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
748
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
749 if ((ret = ssh_read_response (request, &message, NULL)) != SUCCESS)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
750 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
751 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
752 _("Could not change remote directory to %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
753 directory, (char *) message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
754 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
755 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
756 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
757 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
758 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
759
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
760 if (directory != request->directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
761 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
762 if (ssh_send_command (request, GETDIR, NULL, 0) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
763 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
764
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
765 if (ssh_read_response (request, &message, NULL) != TELLDIR)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
766 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
767 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
768 _("Could not get current working directory: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
769 (char *) message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
770 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
771 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
772 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
773
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
774 if (request->directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
775 g_free (request->directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
776 request->directory = message.data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
777 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
778
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
779 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
780 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
781
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
782
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
783 static char *
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
784 ssh_exec (gftp_request * request, const char *command, size_t len)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
785 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
786 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
787 char *err, *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
788 int ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
789
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
790 g_return_val_if_fail (request != NULL, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
791 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
792 g_return_val_if_fail (command != NULL, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
793
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
794 err = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
795 if (ssh_send_command (request, EXEC, command, len) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
796 return (NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
797
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
798 while (1)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
799 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
800 ret = ssh_read_response (request, &message, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
801 switch (ret)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
802 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
803 case -1:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
804 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
805 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
806 return (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
807 case DATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
808 case ERROR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
809 pos = (char *) message.data+message.len-1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
810 if (*pos == '\n')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
811 *pos = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
812
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
813 if (err != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
814 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
815 err = g_realloc (err, strlen (message.data) + strlen (err) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
816 strcat (err, message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
817 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
818 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
819 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
820 err = g_malloc (strlen (message.data) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
821 strcpy (err, message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
822 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
823 if (ret == ERROR)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
824 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
825 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
826 return (err);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
827 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
828 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
829 case SUCCESS:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
830 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
831 return (err);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
832 case STREAM:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
833 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
834 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
835 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
836 return (err);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
837 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
838 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
839 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
840 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
841
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
842
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
843 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
844 ssh_rmdir (gftp_request * request, const char *directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
845 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
846 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
847 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
848
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
849 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
850 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
851 g_return_val_if_fail (directory != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
852
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
853 tempstr = g_strconcat ("/bin/rmdir ", directory, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
854 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
855 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
856 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
857 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
858 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
859 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
860 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
861 _("Error: Could not remove directory %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
862 directory, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
863 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
864 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
865 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
866 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
867 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
868 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
869 _("Successfully removed %s\n"), directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
870 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
871 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
872 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
873
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
874
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
875 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
876 ssh_rmfile (gftp_request * request, const char *file)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
877 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
878 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
879 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
880
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
881 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
882 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
883 g_return_val_if_fail (file != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
884
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
885 tempstr = g_strconcat ("/bin/rm -f ", file, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
886 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
887 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
888 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
889 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
890 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
891 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
892 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
893 _("Error: Could not remove file %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
894 file, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
895 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
896 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
897 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
898 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
899 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
900 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
901 _("Successfully removed %s\n"), file);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
902 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
903 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
904 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
905
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
906
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
907 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
908 ssh_mkdir (gftp_request * request, const char *newdir)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
909 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
910 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
911 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
912
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
913 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
914 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
915 g_return_val_if_fail (newdir != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
916
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
917 tempstr = g_strconcat ("/bin/mkdir ", newdir, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
918 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
919 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
920 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
921 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
922 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
923 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
924 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
925 _("Error: Could not make directory %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
926 newdir, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
927 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
928 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
929 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
930 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
931 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
932 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
933 _("Successfully made directory %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
934 newdir);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
935 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
936 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
937 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
938
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
939
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
940 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
941 ssh_rename (gftp_request * request, const char *oldname, const char *newname )
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
942 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
943 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
944 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
945
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
946 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
947 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
948 g_return_val_if_fail (oldname != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
949 g_return_val_if_fail (newname != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
950
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
951 tempstr = g_strconcat ("/bin/mv ", oldname, " ", newname, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
952 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
953 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
954 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
955 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
956 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
957 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
958 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
959 _("Error: Could not rename %s to %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
960 oldname, newname, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
961 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
962 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
963 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
964 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
965 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
966 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
967 _("Successfully renamed %s to %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
968 oldname, newname);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
969 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
970 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
971 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
972
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
973
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
974 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
975 ssh_chmod (gftp_request * request, const char *file, int mode)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
976 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
977 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
978 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
979
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
980 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
981 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
982 g_return_val_if_fail (file != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
983
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
984 tempstr = g_malloc (strlen (file) + (mode / 10) + 14);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
985 sprintf (tempstr, "/bin/chmod %d %s", mode, file);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
986 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
987 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
988 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
989 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
990 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
991 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
992 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
993 _("Error: Could not change mode of %s to %d: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
994 file, mode, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
995 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
996 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
997 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
998 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
999 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1000 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1001 _("Successfully changed mode of %s to %d\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1002 file, mode);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1003 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1004 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1005 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1006
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1007
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1008 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1009 ssh_send_command (gftp_request * request, int cmdnum, const char *command,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1010 size_t len)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1011 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1012 ssize_t wrote;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1013 ssh_parms * params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1014 char *buf;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1015 int clen;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1016
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1017 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1018 clen = htonl (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1019 buf = g_malloc (len + 6);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1020 buf[0] = params->channel;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1021 buf[1] = cmdnum;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1022 memcpy (&buf[2], &clen, 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1023 if (command)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1024 memcpy (&buf[6], command, len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1025 ssh_log_command (request, params->channel, cmdnum, command, len, 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1026
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1027 wrote = fwrite (buf, 1, len + 6, request->sockfd_write);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1028 if (ferror (request->sockfd_write))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1029 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1030 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1031 _("Error: Could not write to socket: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1032 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1033 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1034 g_free (buf);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1035 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1036 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1037
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1038 g_free (buf);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1039
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1040 fflush (request->sockfd_write);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1041 if (ferror (request->sockfd_write))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1042 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1043 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1044 _("Error: Could not write to socket: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1045 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1046 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1047 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1048 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1049 return 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1050
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1051 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1052
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1053 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1054 ssh_read_response (gftp_request * request, ssh_message *message, FILE * fd)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1055 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1056 char buf[6];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1057
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1058 if (ssh_read_message (request, buf, 6, fd) == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1059 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1060
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1061 message->channel = buf[0];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1062 message->command = buf[1];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1063 memcpy (&message->len, buf + 2, 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1064 message->len = ntohl (message->len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1065 if (message->len > 8192)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1066 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1067 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1068 _("Error: Message size %d too big from server\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1069 message->len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1070 memset (message, 0, sizeof (*message));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1071 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1072 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1073 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1074
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1075 message->data = g_malloc (message->len + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1076
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1077 if (message->len > 0 && ssh_read_message (request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1078 (char *) message->data, message->len, fd) == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1079 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1080
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1081 ((char *) message->data)[message->len] = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1082 ssh_log_command (request, message->channel, message->command, message->data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1083 message->len, 0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1084 return (message->command);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1085 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1086
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1087
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1088 static char *
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1089 ssh_read_message (gftp_request * request, char *buf, size_t len, FILE * fd)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1090 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1091 if (fd == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1092 fd = request->sockfd;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1093
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1094 fread (buf, len, 1, fd);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1095 if (ferror (fd))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1096 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1097 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1098 _("Error: Could not read from socket: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1099 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1100 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1101 return (NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1102 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1103
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1104 return (buf);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1105 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1106
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1107
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1108 static char *
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1109 ssh_read_line (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1110 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1111 char *retstr, *pos, tempchar;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1112 ssh_parms *buffer;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1113
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1114 pos = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1115 buffer = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1116 if (!buffer->enddata && (pos = strchr (buffer->pos, '\n')) == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1117 return (NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1118
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1119 if (pos == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1120 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1121 pos = buffer->pos + strlen (buffer->pos) - 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1122 tempchar = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1123 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1124 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1125 tempchar = pos + 1 == '\0' ? '\0' : '1';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1126
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1127 if (*(pos-1) == '\r')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1128 *(pos-1) = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1129 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1130 *pos = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1131
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1132 retstr = g_malloc (strlen (buffer->pos) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1133 strcpy (retstr, buffer->pos);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1134
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1135 if (tempchar != '\0' && *buffer->pos != '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1136 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1137 buffer->pos = pos + 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1138 while (*buffer->pos == '\r' || *buffer->pos == '\n')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1139 buffer->pos++;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1140 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1141 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1142 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1143 g_free (buffer->buffer);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1144 buffer->buffer = buffer->pos = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1145 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1146 return (retstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1147 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1148
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1149
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1150 static void
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1151 ssh_log_command (gftp_request * request, int channel, int cmdnum,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1152 const char *command, size_t len, int direction)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1153 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1154 const char *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1155 char *tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1156 int ok;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1157
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1158 switch (cmdnum)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1159 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1160 case CHDIR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1161 tempstr = "CHDIR ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1162 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1163 case GETDIR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1164 tempstr = "GETDIR ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1165 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1166 case TELLDIR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1167 tempstr = "TELLDIR ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1168 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1169 case SENDFILE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1170 tempstr = "SENDFILE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1171 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1172 case FILESIZE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1173 tempstr = "FILESIZE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1174 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1175 case FILEMODE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1176 tempstr = "FILEMODE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1177 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1178 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1179 tempstr = "ENDDATA ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1180 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1181 case FILEOK:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1182 tempstr = "FILEOK ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1183 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1184 case STREAM:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1185 tempstr = "STREAM ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1186 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1187 case REQUEST:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1188 tempstr = "REQUEST ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1189 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1190 case FILENAME:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1191 tempstr = "FILENAME ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1192 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1193 case EXEC:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1194 tempstr = "EXEC ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1195 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1196 case SKIPBYTES:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1197 tempstr = "SKIPBYTES ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1198 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1199 case ERROR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1200 tempstr = "ERROR: ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1201 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1202 case SUCCESS:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1203 tempstr = "SUCCESS ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1204 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1205 case CLOSE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1206 tempstr = "CLOSE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1207 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1208 case SSH_VERSION:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1209 tempstr = "VERSION ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1210 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1211 case CANCEL:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1212 tempstr = "CANCEL ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1213 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1214 case FILETIME:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1215 tempstr = "FILETIME ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1216 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1217 default:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1218 return;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1219 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1220
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1221 ok = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1222 if (command)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1223 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1224 for (pos = command; pos < command + len; pos++)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1225 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1226 if (*pos == '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1227 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1228 ok = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1229 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1230 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1231 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1232 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1233
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1234 request->logging_function (direction == GFTP_DIRECTION_DOWNLOAD ?
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1235 gftp_logging_send : gftp_logging_recv,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1236 request->user_data, "%d: %s %s\n", channel,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1237 tempstr, ok ? command : "");
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1238 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1239
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1240
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1241 static size_t
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1242 ssh_remove_spaces ( char *string )
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1243 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1244 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1245 char *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1246
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1247 for (pos = string, len = 0; *pos != '\0'; len++, pos++)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1248 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1249 if (*pos == ' ')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1250 *pos = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1251 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1252 return (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1253 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1254