Mercurial > gftp.yaz
comparison lib/local.c @ 787:3751478bb260
2006-7-27 Brian Masney <masneyb@gftp.org>
* lib/protocols.c (gftp_get_all_subdirs) - split this function into
several smaller functions. Added support for getting the true file
size if it is a symlink. Added more error handling. Fixed a segfault
that may occur when transferring deeply nested directories
* lib/fsp.c lib/gftp.h lib/local.c lib/protocols.c lib/rfc2068.c
lib/rfc959.c lib/sshv2.c (*_chdir) - removed support for passing
the request->directory into this function. There is no longer a
need for this. (*_stat_filename) - added support for getting the
file size
author | masneyb |
---|---|
date | Fri, 28 Jul 2006 01:44:54 +0000 |
parents | d553d14a2565 |
children | 739462d1bfb5 |
comparison
equal
deleted
inserted
replaced
786:78bad9db6cb0 | 787:3751478bb260 |
---|---|
26 GHashTable *userhash, *grouphash; | 26 GHashTable *userhash, *grouphash; |
27 } local_protocol_data; | 27 } local_protocol_data; |
28 | 28 |
29 | 29 |
30 static void | 30 static void |
31 local_remove_key (/*@unused@*/ gpointer key, gpointer value, | 31 local_remove_key (gpointer key, gpointer value, gpointer user_data) |
32 /*@unused@*/ gpointer user_data) | |
33 { | 32 { |
34 g_free (value); | 33 g_free (value); |
35 } | 34 } |
36 | 35 |
37 | 36 |
153 } | 152 } |
154 | 153 |
155 | 154 |
156 static int | 155 static int |
157 local_put_file (gftp_request * request, const char *filename, int fd, | 156 local_put_file (gftp_request * request, const char *filename, int fd, |
158 off_t startsize, /*@unused@*/ off_t totalsize) | 157 off_t startsize, off_t totalsize) |
159 { | 158 { |
160 int flags; | 159 int flags; |
161 | 160 |
162 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | 161 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
163 g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL); | 162 g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL); |
224 return (0); | 223 return (0); |
225 } | 224 } |
226 | 225 |
227 | 226 |
228 static int | 227 static int |
229 local_stat_filename (/*@unused@*/ gftp_request * request, const char *filename, | 228 local_stat_filename (gftp_request * request, const char *filename, |
230 mode_t * mode) | 229 mode_t * mode, off_t * filesize) |
231 { | 230 { |
232 struct stat st; | 231 struct stat st; |
233 | 232 |
234 if (stat (filename, &st) != 0) | 233 if (stat (filename, &st) != 0) |
235 return (GFTP_ERETRYABLE); | 234 return (GFTP_ERETRYABLE); |
236 | 235 |
237 *mode = st.st_mode; | 236 *mode = st.st_mode; |
237 *filesize = st.st_size; | |
238 | |
238 return (0); | 239 return (0); |
239 } | 240 } |
240 | 241 |
241 | 242 |
242 static int | 243 static int |
358 return (0); | 359 return (0); |
359 } | 360 } |
360 | 361 |
361 | 362 |
362 static off_t | 363 static off_t |
363 local_get_file_size (/*@unused@*/ gftp_request * request, const char *filename) | 364 local_get_file_size (gftp_request * request, const char *filename) |
364 { | 365 { |
365 struct stat st; | 366 struct stat st; |
366 | 367 |
367 if (stat (filename, &st) == -1) | 368 if (stat (filename, &st) == -1) |
368 return (GFTP_ERETRYABLE); | 369 return (GFTP_ERETRYABLE); |
371 | 372 |
372 | 373 |
373 static int | 374 static int |
374 local_chdir (gftp_request * request, const char *directory) | 375 local_chdir (gftp_request * request, const char *directory) |
375 { | 376 { |
376 char tempstr[255]; | 377 char tempstr[MAXNAMLEN]; |
377 | 378 |
378 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | 379 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
379 g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL); | 380 g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL); |
380 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | 381 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); |
381 | 382 |
383 { | 384 { |
384 request->logging_function (gftp_logging_misc, request, | 385 request->logging_function (gftp_logging_misc, request, |
385 _("Successfully changed local directory to %s\n"), | 386 _("Successfully changed local directory to %s\n"), |
386 directory); | 387 directory); |
387 | 388 |
388 if (request->directory != directory) | 389 if (getcwd (tempstr, sizeof (tempstr)) == NULL) |
389 { | 390 { |
390 if (getcwd (tempstr, sizeof (tempstr)) == NULL) | 391 request->logging_function (gftp_logging_error, request, |
391 { | 392 _("Could not get current working directory: %s\n"), |
392 request->logging_function (gftp_logging_error, request, | 393 g_strerror (errno)); |
393 _("Could not get current working directory: %s\n"), | 394 return (GFTP_ERETRYABLE); |
394 g_strerror (errno)); | |
395 return (GFTP_ERETRYABLE); | |
396 } | |
397 | |
398 if (request->directory) | |
399 g_free (request->directory); | |
400 request->directory = g_strdup (tempstr); | |
401 } | 395 } |
402 | 396 |
397 if (request->directory) | |
398 g_free (request->directory); | |
399 | |
400 request->directory = g_strdup (tempstr); | |
403 return (0); | 401 return (0); |
404 } | 402 } |
405 else | 403 else |
406 { | 404 { |
407 request->logging_function (gftp_logging_error, request, | 405 request->logging_function (gftp_logging_error, request, |
408 _("Could not change local directory to %s: %s\n"), | 406 _("Could not change local directory to %s: %s\n"), |
409 directory, g_strerror (errno)); | 407 directory, g_strerror (errno)); |
410 return (GFTP_ERETRYABLE); | 408 return (GFTP_ERETRYABLE); |
411 } | 409 } |
412 } | 410 } |
413 | 411 |
414 | 412 |