annotate lib/ssh.c @ 1:8b1883341c6f

Initial revision
author masneyb
date Mon, 05 Aug 2002 19:46:57 +0000
parents
children 83090328581e
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
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
301 request->sockfd = request->datafd = fdopen (fdm, "rb");
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
302 request->sockfd_write = fdopen (fdm, "wb");
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
303
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
304 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
305 version = htonl (7 << 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
306 if (ssh_send_command (request, SSH_VERSION, (char *) &version, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
307 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
308 if (ssh_read_response (request, &message, NULL) != SSH_VERSION)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
309 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
310 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
311
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
312 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
313 _("Successfully logged into SSH server %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
314 request->hostname);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
315 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
316 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
317 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
318 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
319 _("Cannot fork another process: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
320 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
321 g_free (args);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
322 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
323 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
324
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
325 ssh_chdir (request, request->directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
326
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
327 if (ssh_send_command (request, GETDIR, NULL, 0) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
328 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
329
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
330 if (ssh_read_response (request, &message, NULL) != TELLDIR)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
331 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
332 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
333 _("Could not get current working directory: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
334 (char *) message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
335 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
336 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
337 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
338
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
339 if (request->directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
340 g_free (request->directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
341 request->directory = message.data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
342
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
343 if (request->sockfd == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
344 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
345
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
346 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
347 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
348
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
349
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
350 static void
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
351 ssh_disconnect (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
352 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
353 g_return_if_fail (request != NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
354 g_return_if_fail (request->protonum == GFTP_SSH_NUM);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
355
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
356 if (request->sockfd != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
357 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
358 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
359 _("Disconnecting from site %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
360 request->hostname);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
361 fclose (request->sockfd);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
362 request->sockfd = request->datafd = request->sockfd_write = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
363 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
364 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
365
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
366
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
367 static long
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
368 ssh_get_file (gftp_request * request, const char *filename, FILE * fd,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
369 off_t startsize)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
370 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
371 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
372 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
373 off_t retsize;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
374 int ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
375
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
376 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
377 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
378 g_return_val_if_fail (filename != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
379 /* fd ignored for this protocol */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
380
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
381 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
382 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
383 if (ssh_send_command (request, REQUEST, filename, strlen (filename) + 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
384 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
385
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
386 retsize = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
387 while (1)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
388 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
389 ret = ssh_read_response (request, &message, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
390 switch (ret)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
391 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
392 case FILESIZE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
393 retsize = strtol ((char *) message.data, NULL, 10);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
394 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
395 case NOFILEMATCH:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
396 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
397 _("Remote host could not find file %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
398 filename);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
399 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
400 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
401 case FILENAME:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
402 params->channel = message.channel;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
403 startsize = htonl (startsize);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
404 if (ssh_send_command (request, SKIPBYTES, (char *) &startsize, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
405 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
406 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
407 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
408 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
409 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
410 case -1:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
411 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
412 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
413 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
414
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
415 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
416 if (ret == FILETIME)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
417 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
418 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
419
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
420 return (retsize);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
421 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
422
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
423
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
424 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
425 ssh_put_file (gftp_request * request, const char *filename, FILE * fd,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
426 off_t startsize, off_t totalsize)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
427 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
428 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
429 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
430 char tempchar;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
431
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
432 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
433 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
434 g_return_val_if_fail (filename != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
435 /* fd ignored for this protocol */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
436
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
437 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
438 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
439 tempchar = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
440 if (ssh_send_command (request, SENDFILE, &tempchar, 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
441 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
442
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
443 params->channel = tempchar;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
444 if (ssh_send_command (request, FILENAME, filename, strlen (filename) + 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
445 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
446
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
447 if (ssh_read_response (request, &message, NULL) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
448 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
449 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
450 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
451 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
452
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
453 if (!(message.command == FILEOK && message.len == 1
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
454 && *(char *) message.data != 0))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
455 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
456 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
457 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
458 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
459 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
460
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
461 if (ssh_send_command (request, FILESIZE, (void *) &totalsize, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
462 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
463
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
464 if (ssh_send_command (request, FILEMODE, "rw-r--r--", 9) < 0)
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 if (ssh_send_command (request, FILETIME, (char *) 0, 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
468 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
469
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
470 if (startsize > 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
471 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
472 startsize = htonl (startsize);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
473 /* FIXME - warning on IRIX - pointer from integer of different size */
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
474 if (ssh_send_command (request, SKIPBYTES, GUINT_TO_POINTER (startsize), 4) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
475 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
476 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
477
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
478 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
479 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
480
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
481
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
482 static size_t
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
483 ssh_get_next_file_chunk (gftp_request * request, char *buf, size_t size)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
484 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
485 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
486 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
487
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
488 switch (ssh_read_response (request, &message, NULL))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
489 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
490 case DATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
491 len = size > message.len ? message.len : size;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
492 memcpy (buf, message.data, len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
493 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
494 return (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
495 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
496 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
497 if (ssh_read_response (request, &message, NULL) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
498 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
499 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
500 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
501 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
502 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
503 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
504 case -1:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
505 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
506 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
507 default:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
508 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
509 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
510 _("Received unexpected response from server\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
511 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
512 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
513 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
514 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
515
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
516
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
517 static size_t
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
518 ssh_put_next_file_chunk (gftp_request * request, char *buf, size_t size)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
519 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
520 if (size == 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
521 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
522 if (ssh_send_command (request, ENDDATA, NULL, 0) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
523 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
524 if (ssh_send_command (request, NOFILEMATCH, NULL, 0) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
525 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
526 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
527 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
528 return (ssh_send_command (request, DATA, buf, size) == 0 ? size : 0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
529 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
530
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
531
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
532 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
533 ssh_end_transfer (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
534 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
535 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
536
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
537 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
538 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
539 g_return_val_if_fail (request->datafd != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
540
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
541 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
542 if (params->buffer)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
543 g_free (params->buffer);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
544 params->buffer = params->pos = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
545 params->enddata = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
546
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
547 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
548 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
549
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
550
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
551 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
552 ssh_list_files (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
553 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
554 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
555 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
556 char *tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
557 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
558
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
559 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
560 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
561
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
562 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
563 params->enddata = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
564 params->channel = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
565 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
566 _("Retrieving directory listing...\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
567
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
568 tempstr = g_strconcat ("/bin/ls -al", NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
569 len = ssh_remove_spaces (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
570
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
571 if (ssh_send_command (request, EXEC, tempstr, len) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
572 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
573 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
574 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
575 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
576 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
577
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
578 if (ssh_read_response (request, &message, NULL) != STREAM)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
579 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
580 g_free (message.data);
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 _("Received unexpected response from server\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
583 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
584 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
585 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
586 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
587
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
588 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
589 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
590
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
591
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
592 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
593 ssh_get_next_file (gftp_request * request, gftp_file * fle, FILE * fd)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
594 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
595 char *tempstr, *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
596 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
597 ssh_parms *params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
598 int ret, len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
599
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
600 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
601 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
602 g_return_val_if_fail (fle != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
603
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
604 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
605 if (request->last_dir_entry)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
606 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
607 g_free (request->last_dir_entry);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
608 request->last_dir_entry = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
609 request->last_dir_entry_len = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
610 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
611
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
612 len = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
613 while (1)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
614 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
615 if (params->enddata && params->buffer == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
616 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
617 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
618 _("Finished retrieving directory listing\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
619 params->enddata = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
620 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
621 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
622
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
623 if (!params->enddata &&
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
624 (!params->pos || strchr (params->pos, '\n') == NULL))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
625 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
626 if ((ret = ssh_read_response (request, &message, fd)) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
627 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
628 if (message.data)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
629 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
630 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
631 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
632
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
633 if (!request->cached)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
634 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
635 request->last_dir_entry_len = message.len + 6;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
636 request->last_dir_entry = g_malloc (request->last_dir_entry_len + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
637 request->last_dir_entry[0] = message.channel;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
638 request->last_dir_entry[1] = message.command;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
639 len = htonl (message.len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
640 memcpy (&request->last_dir_entry[2], &len, 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
641 memcpy (&request->last_dir_entry[6], message.data, message.len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
642 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
643
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
644 if (ret == DATA)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
645 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
646 if (params->pos == NULL || *params->pos == '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
647 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
648 if (params->buffer)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
649 g_free (params->buffer);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
650 params->buffer = params->pos = message.data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
651 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
652 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
653 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
654 tempstr = params->buffer;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
655 params->buffer = g_malloc (strlen (params->pos) +
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
656 strlen ((char *) message.data) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
657 strcpy (params->buffer, params->pos);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
658 strcat (params->buffer, (char *) message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
659 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
660 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
661 params->pos = params->buffer;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
662 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
663 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
664 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
665 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
666 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
667 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
668 ret = DATA;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
669
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
670 switch (ret)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
671 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
672 case DATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
673 if ((tempstr = ssh_read_line (request)) == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
674 continue;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
675 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
676 while (*pos == ' ' || *pos == '\t')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
677 pos++;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
678 if (*pos == '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
679 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
680 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
681 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
682 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
683
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
684 if (gftp_parse_ls (tempstr, fle) != 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
685 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
686 if (strncmp (tempstr, "total", strlen ("total")) &&
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
687 strncmp (tempstr, _("total"), strlen (_("total"))))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
688 request->logging_function (gftp_logging_misc,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
689 request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
690 _("Warning: Cannot parse listing %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
691 tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
692 gftp_file_destroy (fle);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
693 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
694 tempstr = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
695 continue;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
696 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
697 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
698 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
699 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
700 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
701 params->enddata = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
702 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
703 default:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
704 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
705 _("Received unexpected response from server\n"));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
706 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
707 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
708 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
709
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
710 if (ret == DATA)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
711 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
712 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
713
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
714 return (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
715 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
716
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
717
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
718 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
719 ssh_chdir (gftp_request * request, const char *directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
720 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
721 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
722 int ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
723
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
724 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
725 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
726
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
727 if (directory != NULL && *directory != '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
728 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
729 if (ssh_send_command (request, CHDIR, directory,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
730 strlen (directory) + 1) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
731 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
732
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
733 if ((ret = ssh_read_response (request, &message, NULL)) != SUCCESS)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
734 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
735 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
736 _("Could not change remote directory to %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
737 directory, (char *) message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
738 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
739 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
740 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
741 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
742 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
743
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
744 if (directory != request->directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
745 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
746 if (ssh_send_command (request, GETDIR, NULL, 0) < 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 (ssh_read_response (request, &message, NULL) != TELLDIR)
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 get current working directory: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
753 (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
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
758 if (request->directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
759 g_free (request->directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
760 request->directory = message.data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
761 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
762
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
763 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
764 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
765
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
766
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
767 static char *
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
768 ssh_exec (gftp_request * request, const char *command, size_t len)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
769 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
770 ssh_message message;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
771 char *err, *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
772 int ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
773
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
774 g_return_val_if_fail (request != NULL, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
775 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
776 g_return_val_if_fail (command != NULL, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
777
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
778 err = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
779 if (ssh_send_command (request, EXEC, command, len) < 0)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
780 return (NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
781
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
782 while (1)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
783 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
784 ret = ssh_read_response (request, &message, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
785 switch (ret)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
786 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
787 case -1:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
788 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
789 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
790 return (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
791 case DATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
792 case ERROR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
793 pos = (char *) message.data+message.len-1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
794 if (*pos == '\n')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
795 *pos = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
796
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
797 if (err != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
798 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
799 err = g_realloc (err, strlen (message.data) + strlen (err) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
800 strcat (err, message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
801 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
802 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
803 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
804 err = g_malloc (strlen (message.data) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
805 strcpy (err, message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
806 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
807 if (ret == ERROR)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
808 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
809 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
810 return (err);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
811 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
812 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
813 case SUCCESS:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
814 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
815 return (err);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
816 case STREAM:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
817 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
818 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
819 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
820 return (err);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
821 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
822 g_free (message.data);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
823 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
824 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
825
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
826
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
827 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
828 ssh_rmdir (gftp_request * request, const char *directory)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
829 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
830 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
831 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
832
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
833 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
834 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
835 g_return_val_if_fail (directory != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
836
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
837 tempstr = g_strconcat ("/bin/rmdir ", directory, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
838 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
839 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
840 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
841 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
842 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
843 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
844 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
845 _("Error: Could not remove directory %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
846 directory, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
847 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
848 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
849 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
850 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
851 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
852 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
853 _("Successfully removed %s\n"), directory);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
854 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
855 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
856 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
857
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
858
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
859 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
860 ssh_rmfile (gftp_request * request, const char *file)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
861 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
862 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
863 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
864
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
865 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
866 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
867 g_return_val_if_fail (file != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
868
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
869 tempstr = g_strconcat ("/bin/rm -f ", file, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
870 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
871 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
872 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
873 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
874 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
875 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
876 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
877 _("Error: Could not remove file %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
878 file, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
879 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
880 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
881 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
882 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
883 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
884 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
885 _("Successfully removed %s\n"), file);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
886 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
887 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
888 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
889
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
890
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
891 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
892 ssh_mkdir (gftp_request * request, const char *newdir)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
893 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
894 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
895 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
896
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
897 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
898 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
899 g_return_val_if_fail (newdir != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
900
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
901 tempstr = g_strconcat ("/bin/mkdir ", newdir, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
902 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
903 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
904 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
905 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
906 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
907 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
908 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
909 _("Error: Could not make directory %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
910 newdir, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
911 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
912 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
913 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
914 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
915 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
916 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
917 _("Successfully made directory %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
918 newdir);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
919 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
920 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
921 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
922
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
923
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
924 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
925 ssh_rename (gftp_request * request, const char *oldname, const char *newname )
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
926 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
927 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
928 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
929
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
930 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
931 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
932 g_return_val_if_fail (oldname != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
933 g_return_val_if_fail (newname != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
934
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
935 tempstr = g_strconcat ("/bin/mv ", oldname, " ", newname, NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
936 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
937 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
938 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
939 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
940 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
941 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
942 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
943 _("Error: Could not rename %s to %s: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
944 oldname, newname, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
945 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
946 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
947 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
948 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
949 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
950 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
951 _("Successfully renamed %s to %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
952 oldname, newname);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
953 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
954 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
955 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
956
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
957
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
958 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
959 ssh_chmod (gftp_request * request, const char *file, int mode)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
960 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
961 char *tempstr, *pos, *ret;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
962 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
963
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
964 g_return_val_if_fail (request != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
965 g_return_val_if_fail (request->protonum == GFTP_SSH_NUM, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
966 g_return_val_if_fail (file != NULL, -2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
967
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
968 tempstr = g_malloc (strlen (file) + (mode / 10) + 14);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
969 sprintf (tempstr, "/bin/chmod %d %s", mode, file);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
970 len = strlen (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
971 pos = tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
972 while ((pos = strchr (pos, ' ')) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
973 *pos++ = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
974 if ((ret = ssh_exec (request, tempstr, len)) != NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
975 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
976 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
977 _("Error: Could not change mode of %s to %d: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
978 file, mode, ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
979 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
980 g_free (ret);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
981 return (-2);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
982 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
983 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
984 request->logging_function (gftp_logging_misc, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
985 _("Successfully changed mode of %s to %d\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
986 file, mode);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
987 g_free (tempstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
988 return (0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
989 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
990
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
991
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
992 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
993 ssh_send_command (gftp_request * request, int cmdnum, const char *command,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
994 size_t len)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
995 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
996 ssize_t wrote;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
997 ssh_parms * params;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
998 char *buf;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
999 int clen;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1000
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1001 params = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1002 clen = htonl (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1003 buf = g_malloc (len + 6);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1004 buf[0] = params->channel;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1005 buf[1] = cmdnum;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1006 memcpy (&buf[2], &clen, 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1007 if (command)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1008 memcpy (&buf[6], command, len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1009 ssh_log_command (request, params->channel, cmdnum, command, len, 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1010
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1011 wrote = fwrite (buf, 1, len + 6, request->sockfd_write);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1012 if (ferror (request->sockfd_write))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1013 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1014 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1015 _("Error: Could not write to socket: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1016 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1017 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1018 g_free (buf);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1019 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1020 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1021
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1022 g_free (buf);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1023
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1024 fflush (request->sockfd_write);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1025 if (ferror (request->sockfd_write))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1026 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1027 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1028 _("Error: Could not write to socket: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1029 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1030 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1031 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1032 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1033 return 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1034
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1035 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1036
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1037 static int
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1038 ssh_read_response (gftp_request * request, ssh_message *message, FILE * fd)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1039 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1040 char buf[6];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1041
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1042 if (ssh_read_message (request, buf, 6, fd) == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1043 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1044
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1045 message->channel = buf[0];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1046 message->command = buf[1];
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1047 memcpy (&message->len, buf + 2, 4);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1048 message->len = ntohl (message->len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1049 if (message->len > 8192)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1050 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1051 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1052 _("Error: Message size %d too big from server\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1053 message->len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1054 memset (message, 0, sizeof (*message));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1055 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1056 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1057 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1058
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1059 message->data = g_malloc (message->len + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1060
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1061 if (message->len > 0 && ssh_read_message (request,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1062 (char *) message->data, message->len, fd) == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1063 return (-1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1064
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1065 ((char *) message->data)[message->len] = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1066 ssh_log_command (request, message->channel, message->command, message->data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1067 message->len, 0);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1068 return (message->command);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1069 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1070
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1071
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1072 static char *
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1073 ssh_read_message (gftp_request * request, char *buf, size_t len, FILE * fd)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1074 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1075 if (fd == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1076 fd = request->sockfd;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1077
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1078 fread (buf, len, 1, fd);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1079 if (ferror (fd))
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1080 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1081 request->logging_function (gftp_logging_error, request->user_data,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1082 _("Error: Could not read from socket: %s\n"),
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1083 g_strerror (errno));
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1084 gftp_disconnect (request);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1085 return (NULL);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1086 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1087
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1088 return (buf);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1089 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1090
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1091
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1092 static char *
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1093 ssh_read_line (gftp_request * request)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1094 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1095 char *retstr, *pos, tempchar;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1096 ssh_parms *buffer;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1097
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1098 pos = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1099 buffer = request->protocol_data;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1100 if (!buffer->enddata && (pos = strchr (buffer->pos, '\n')) == NULL)
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 if (pos == NULL)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1104 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1105 pos = buffer->pos + strlen (buffer->pos) - 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1106 tempchar = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1107 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1108 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1109 tempchar = pos + 1 == '\0' ? '\0' : '1';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1110
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1111 if (*(pos-1) == '\r')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1112 *(pos-1) = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1113 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1114 *pos = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1115
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1116 retstr = g_malloc (strlen (buffer->pos) + 1);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1117 strcpy (retstr, buffer->pos);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1118
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1119 if (tempchar != '\0' && *buffer->pos != '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1120 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1121 buffer->pos = pos + 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1122 while (*buffer->pos == '\r' || *buffer->pos == '\n')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1123 buffer->pos++;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1124 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1125 else
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1126 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1127 g_free (buffer->buffer);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1128 buffer->buffer = buffer->pos = NULL;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1129 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1130 return (retstr);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1131 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1132
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1133
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1134 static void
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1135 ssh_log_command (gftp_request * request, int channel, int cmdnum,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1136 const char *command, size_t len, int direction)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1137 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1138 const char *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1139 char *tempstr;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1140 int ok;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1141
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1142 switch (cmdnum)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1143 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1144 case CHDIR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1145 tempstr = "CHDIR ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1146 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1147 case GETDIR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1148 tempstr = "GETDIR ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1149 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1150 case TELLDIR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1151 tempstr = "TELLDIR ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1152 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1153 case SENDFILE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1154 tempstr = "SENDFILE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1155 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1156 case FILESIZE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1157 tempstr = "FILESIZE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1158 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1159 case FILEMODE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1160 tempstr = "FILEMODE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1161 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1162 case ENDDATA:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1163 tempstr = "ENDDATA ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1164 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1165 case FILEOK:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1166 tempstr = "FILEOK ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1167 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1168 case STREAM:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1169 tempstr = "STREAM ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1170 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1171 case REQUEST:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1172 tempstr = "REQUEST ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1173 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1174 case FILENAME:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1175 tempstr = "FILENAME ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1176 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1177 case EXEC:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1178 tempstr = "EXEC ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1179 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1180 case SKIPBYTES:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1181 tempstr = "SKIPBYTES ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1182 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1183 case ERROR:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1184 tempstr = "ERROR: ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1185 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1186 case SUCCESS:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1187 tempstr = "SUCCESS ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1188 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1189 case CLOSE:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1190 tempstr = "CLOSE ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1191 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1192 case SSH_VERSION:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1193 tempstr = "VERSION ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1194 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1195 case CANCEL:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1196 tempstr = "CANCEL ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1197 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1198 case FILETIME:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1199 tempstr = "FILETIME ";
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1200 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1201 default:
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1202 return;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1203 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1204
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1205 ok = 0;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1206 if (command)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1207 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1208 for (pos = command; pos < command + len; pos++)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1209 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1210 if (*pos == '\0')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1211 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1212 ok = 1;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1213 break;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1214 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1215 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1216 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1217
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1218 request->logging_function (direction == GFTP_DIRECTION_DOWNLOAD ?
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1219 gftp_logging_send : gftp_logging_recv,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1220 request->user_data, "%d: %s %s\n", channel,
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1221 tempstr, ok ? command : "");
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1222 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1223
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1224
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1225 static size_t
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1226 ssh_remove_spaces ( char *string )
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1227 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1228 size_t len;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1229 char *pos;
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1230
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1231 for (pos = string, len = 0; *pos != '\0'; len++, pos++)
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1232 {
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1233 if (*pos == ' ')
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1234 *pos = '\0';
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1235 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1236 return (len);
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1237 }
8b1883341c6f Initial revision
masneyb
parents:
diff changeset
1238