comparison lib/sshv2.c @ 840:dd83cd01dc30

2006-10-31 Brian Masney <masneyb@gftp.org> WARNING: The CVS version of gFTP is currently broken, especially for international users. This will be fixed in a few days. * lib/sshv2.c - added i18n support so that the files are encoded properly
author masneyb
date Wed, 01 Nov 2006 03:15:49 +0000
parents 0d9a3d4188c3
children 32dbed7e0dc4
comparison
equal deleted inserted replaced
839:0d9a3d4188c3 840:dd83cd01dc30
138 #define SSH_ERROR_BADPASS -1 138 #define SSH_ERROR_BADPASS -1
139 #define SSH_ERROR_QUESTION -2 139 #define SSH_ERROR_QUESTION -2
140 140
141 141
142 static char * 142 static char *
143 sshv2_initialize_string (gftp_request * request, size_t len) 143 sshv2_initialize_buffer (gftp_request * request, size_t len)
144 { 144 {
145 sshv2_params * params; 145 sshv2_params * params;
146 guint32 num; 146 guint32 num;
147 char *ret; 147 char *ret;
148 148
166 memcpy (buf + 4, str, len); 166 memcpy (buf + 4, str, len);
167 } 167 }
168 168
169 169
170 static char * 170 static char *
171 sshv2_initialize_buffer_with_i18n_string (gftp_request * request,
172 const char *str, size_t *msglen)
173 {
174 const char *addstr;
175 char *utf8, *ret;
176 size_t pathlen;
177
178 utf8 = gftp_string_from_utf8 (request, str, &pathlen);
179 if (utf8 != NULL)
180 addstr = utf8;
181 else
182 {
183 addstr = str;
184 pathlen = strlen (str);
185 }
186
187 *msglen = pathlen + 8;
188 ret = sshv2_initialize_buffer (request, *msglen);
189 sshv2_add_string_to_buf (ret + 4, addstr, pathlen);
190
191 if (utf8 != NULL)
192 g_free (utf8);
193
194 return (ret);
195 }
196
197
198 static char *
199 _sshv2_generate_utf8_path (gftp_request * request, const char *str, size_t *len)
200 {
201 char *path, *ret, *utf8;
202
203 if (*str == '/')
204 path = g_strdup (str);
205 else
206 path = gftp_build_path (request, request->directory, str, NULL);
207
208 utf8 = gftp_string_from_utf8 (request, path, len);
209 if (utf8 != NULL)
210 {
211 g_free (path);
212 return (utf8);
213 }
214 else
215 {
216 *len = strlen (path);
217 return (path);
218 }
219 }
220
221
222 static char *
223 sshv2_initialize_buffer_with_two_i18n_paths (gftp_request * request,
224 const char *str1,
225 const char *str2, size_t *msglen)
226 {
227 char *first_utf8, *sec_utf8, *ret;
228 size_t pathlen1, pathlen2;
229
230 first_utf8 = _sshv2_generate_utf8_path (request, str1, &pathlen1);
231 sec_utf8 = _sshv2_generate_utf8_path (request, str2, &pathlen2);
232
233 *msglen = pathlen1 + pathlen2 + 12;
234 ret = sshv2_initialize_buffer (request, *msglen);
235 sshv2_add_string_to_buf (ret + 4, first_utf8, pathlen1);
236 sshv2_add_string_to_buf (ret + 8 + pathlen1, sec_utf8, pathlen2);
237
238 if (first_utf8 != str1)
239 g_free (first_utf8);
240
241 if (sec_utf8 != str2)
242 g_free (sec_utf8);
243
244 return (ret);
245 }
246
247 static char *
171 sshv2_initialize_string_with_path (gftp_request * request, const char *path, 248 sshv2_initialize_string_with_path (gftp_request * request, const char *path,
172 size_t *len, char **endpos) 249 size_t *len, char **endpos)
173 { 250 {
174 char *ret, *tempstr; 251 char *ret, *tempstr;
175 size_t pathlen;
176 252
177 if (*path == '/') 253 if (*path == '/')
178 { 254 ret = sshv2_initialize_buffer_with_i18n_string (request, path, len);
179 pathlen = strlen (path);
180 *len += pathlen + 8;
181 ret = sshv2_initialize_string (request, *len);
182 sshv2_add_string_to_buf (ret + 4, path, pathlen);
183 }
184 else 255 else
185 { 256 {
186 tempstr = gftp_build_path (request, request->directory, path, NULL); 257 tempstr = gftp_build_path (request, request->directory, path, NULL);
187 pathlen = strlen (tempstr); 258 ret = sshv2_initialize_buffer_with_i18n_string (request, tempstr, len);
188 *len += pathlen + 8;
189 ret = sshv2_initialize_string (request, *len);
190 sshv2_add_string_to_buf (ret + 4, tempstr, pathlen);
191 g_free (tempstr); 259 g_free (tempstr);
192 } 260 }
193 261
194 if (endpos != NULL) 262 if (endpos != NULL)
195 *endpos = ret + 8 + pathlen; 263 *endpos = ret + *len;
196 264
197 return (ret); 265 return (ret);
198 } 266 }
199 267
200 268
957 static int 1025 static int
958 sshv2_getcwd (gftp_request * request) 1026 sshv2_getcwd (gftp_request * request)
959 { 1027 {
960 sshv2_message message; 1028 sshv2_message message;
961 char *tempstr, *dir; 1029 char *tempstr, *dir;
962 size_t msglen, pathlen; 1030 size_t msglen;
963 int ret; 1031 int ret;
964 1032
965 g_return_val_if_fail (request != NULL, GFTP_EFATAL); 1033 g_return_val_if_fail (request != NULL, GFTP_EFATAL);
966 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL); 1034 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
967 1035
968 if (request->directory == NULL || *request->directory == '\0') 1036 if (request->directory == NULL || *request->directory == '\0')
969 dir = "."; 1037 dir = ".";
970 else 1038 else
971 dir = request->directory; 1039 dir = request->directory;
972 1040
973 pathlen = strlen (dir); 1041 tempstr = sshv2_initialize_buffer_with_i18n_string (request, dir, &msglen);
974 msglen = pathlen + 8;
975 tempstr = sshv2_initialize_string (request, msglen);
976 sshv2_add_string_to_buf (tempstr + 4, dir, pathlen);
977
978 ret = sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, msglen); 1042 ret = sshv2_send_command (request, SSH_FXP_REALPATH, tempstr, msglen);
979
980 g_free (tempstr); 1043 g_free (tempstr);
981 if (ret < 0) 1044 if (ret < 0)
982 return (ret); 1045 return (ret);
983 1046
984 if (request->directory) 1047 if (request->directory)
1188 1251
1189 1252
1190 static int 1253 static int
1191 sshv2_list_files (gftp_request * request) 1254 sshv2_list_files (gftp_request * request)
1192 { 1255 {
1193 size_t msglen, pathlen;
1194 sshv2_params * params; 1256 sshv2_params * params;
1195 sshv2_message message; 1257 sshv2_message message;
1196 char *tempstr; 1258 char *tempstr;
1259 size_t msglen;
1197 int ret; 1260 int ret;
1198 1261
1199 g_return_val_if_fail (request != NULL, GFTP_EFATAL); 1262 g_return_val_if_fail (request != NULL, GFTP_EFATAL);
1200 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL); 1263 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
1201 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); 1264 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
1203 params = request->protocol_data; 1266 params = request->protocol_data;
1204 1267
1205 request->logging_function (gftp_logging_misc, request, 1268 request->logging_function (gftp_logging_misc, request,
1206 _("Retrieving directory listing...\n")); 1269 _("Retrieving directory listing...\n"));
1207 1270
1208 pathlen = strlen (request->directory); 1271 tempstr = sshv2_initialize_buffer_with_i18n_string (request,
1209 msglen = pathlen + 8; 1272 request->directory,
1210 tempstr = sshv2_initialize_string (request, msglen); 1273 &msglen);
1211 sshv2_add_string_to_buf (tempstr + 4, request->directory, pathlen);
1212
1213 ret = sshv2_send_command (request, SSH_FXP_OPENDIR, tempstr, msglen); 1274 ret = sshv2_send_command (request, SSH_FXP_OPENDIR, tempstr, msglen);
1214
1215 g_free (tempstr); 1275 g_free (tempstr);
1216 if (ret < 0) 1276 if (ret < 0)
1217 return (ret); 1277 return (ret);
1218 1278
1219 ret = sshv2_read_status_response (request, &message, -1, SSH_FXP_STATUS, 1279 ret = sshv2_read_status_response (request, &message, -1, SSH_FXP_STATUS,
1599 1659
1600 1660
1601 static int 1661 static int
1602 sshv2_rename (gftp_request * request, const char *oldname, const char *newname) 1662 sshv2_rename (gftp_request * request, const char *oldname, const char *newname)
1603 { 1663 {
1604 char *tempstr, *oldstr, *newstr;
1605 size_t oldlen, newlen, len;
1606 sshv2_message message; 1664 sshv2_message message;
1665 char *tempstr;
1666 size_t msglen;
1607 int ret; 1667 int ret;
1608 1668
1609 g_return_val_if_fail (request != NULL, GFTP_EFATAL); 1669 g_return_val_if_fail (request != NULL, GFTP_EFATAL);
1610 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL); 1670 g_return_val_if_fail (request->protonum == GFTP_SSHV2_NUM, GFTP_EFATAL);
1611 g_return_val_if_fail (oldname != NULL, GFTP_EFATAL); 1671 g_return_val_if_fail (oldname != NULL, GFTP_EFATAL);
1612 g_return_val_if_fail (newname != NULL, GFTP_EFATAL); 1672 g_return_val_if_fail (newname != NULL, GFTP_EFATAL);
1613 1673
1614 if (*oldname == '/') 1674 tempstr = sshv2_initialize_buffer_with_two_i18n_paths (request,
1615 oldstr = g_strdup (oldname); 1675 oldname, newname,
1616 else 1676 &msglen);
1617 oldstr = gftp_build_path (request, request->directory, oldname, NULL); 1677 ret = sshv2_send_command (request, SSH_FXP_RENAME, tempstr, msglen);
1618
1619 if (*newname == '/')
1620 newstr = g_strdup (newname);
1621 else
1622 newstr = gftp_build_path (request, request->directory, newname, NULL);
1623
1624 oldlen = strlen (oldstr);
1625 newlen = strlen (newstr);
1626
1627 len = oldlen + newlen + 12;
1628 tempstr = sshv2_initialize_string (request, len);
1629 sshv2_add_string_to_buf (tempstr + 4, oldstr, oldlen);
1630 sshv2_add_string_to_buf (tempstr + 8 + oldlen, newstr, newlen);
1631
1632 g_free (oldstr);
1633 g_free (newstr);
1634
1635 ret = sshv2_send_command (request, SSH_FXP_RENAME, tempstr, len);
1636
1637 g_free (tempstr); 1678 g_free (tempstr);
1638 if (ret < 0) 1679 if (ret < 0)
1639 return (ret); 1680 return (ret);
1640 1681
1641 memset (&message, 0, sizeof (message)); 1682 memset (&message, 0, sizeof (message));
1642 if ((ret = sshv2_read_response (request, &message, -1)) < 0) 1683 if ((ret = sshv2_read_response (request, &message, -1)) < 0)
1643 return (ret); 1684 return (ret);
1644 1685
1645 message.pos += 4; 1686 message.pos += 4;
1646 if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK, 1, NULL)) < 0) 1687 if ((ret = sshv2_buffer_get_int32 (request, &message, SSH_FX_OK, 1,
1688 NULL)) < 0)
1647 return (ret); 1689 return (ret);
1648 1690
1649 sshv2_message_free (&message); 1691 sshv2_message_free (&message);
1650 1692
1651 return (0); 1693 return (0);