annotate lib/ssh.c @ 70:d40c3b39c130

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