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