Mercurial > gftp.yaz
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); |