Mercurial > gftp.yaz
diff lib/local.c @ 48:e5f6054590b5
2002-11-5 Brian Masney <masneyb@gftp.org>
* lib/*.c src/gtk/*.c - removed function declarations for the static
functions from the top of the file. I had to rearrange the order of a
bunch of functions to avoid compiler warnings
* lib/gftp.h - include sys/sysmacros.h. If major() and minor() isn't
defined, give a compiler warning and define our own
* lib/local.c (local_get_next_file) - if this file is a device, store
the major/minor number in the file size
* src/gtk/misc-gtk.c (add_file_listbox) - if this file is a device,
use the major() and minor() macros to display the major and minor number
author | masneyb |
---|---|
date | Wed, 06 Nov 2002 02:20:25 +0000 |
parents | 66c064fd05bc |
children | c01d91c10f6c |
line wrap: on
line diff
--- a/lib/local.c Tue Nov 05 20:36:11 2002 +0000 +++ b/lib/local.c Wed Nov 06 02:20:25 2002 +0000 @@ -20,51 +20,6 @@ #include "gftp.h" static const char cvsid[] = "$Id$"; -static void local_destroy ( gftp_request * request ); -static void local_remove_key ( gpointer key, - gpointer value, - gpointer user_data ); -static int local_connect ( gftp_request * request ); -static void local_disconnect ( gftp_request * request ); -static long local_get_file ( gftp_request * request, - const char *filename, - FILE * fd, - off_t startsize ); -static int local_put_file ( gftp_request * request, - const char *filename, - FILE * fd, - off_t startsize, - off_t totalsize ); -static int local_end_transfer ( gftp_request * request ); -static int local_get_next_file ( gftp_request * request, - gftp_file * fle, - FILE * fd ); -static int local_list_files ( gftp_request * request ); -static off_t local_get_file_size ( gftp_request * request, - const char *filename ); -static int local_chdir ( gftp_request * request, - const char *directory ); -static int local_rmdir ( gftp_request * request, - const char *directory ); -static int local_rmfile ( gftp_request * request, - const char *file ); -static int local_mkdir ( gftp_request * request, - const char *directory ); -static int local_rename ( gftp_request * request, - const char *oldname, - const char *newname ); -static int local_chmod ( gftp_request * request, - const char *file, - int mode ); -static int local_set_file_time ( gftp_request * request, - const char *file, - time_t datetime ); -static char *make_text_mode ( gftp_file * fle, - mode_t mode ); -static gint hash_compare ( gconstpointer path1, - gconstpointer path2 ); -static guint hash_function ( gconstpointer key ); - typedef struct local_protocol_data_tag { DIR *dir; @@ -72,51 +27,10 @@ } local_protocol_data; -void -local_init (gftp_request * request) +static void +local_remove_key (gpointer key, gpointer value, gpointer user_data) { - local_protocol_data *lpd; - - g_return_if_fail (request != NULL); - - request->protonum = GFTP_LOCAL_NUM; - request->init = local_init; - request->destroy = local_destroy; - request->connect = local_connect; - request->disconnect = local_disconnect; - request->get_file = local_get_file; - request->put_file = local_put_file; - request->transfer_file = NULL; - request->get_next_file_chunk = NULL; - request->put_next_file_chunk = NULL; - request->end_transfer = local_end_transfer; - request->abort_transfer = local_end_transfer; /* NOTE: uses end_transfer */ - request->list_files = local_list_files; - request->get_next_file = local_get_next_file; - request->set_data_type = NULL; - request->get_file_size = local_get_file_size; - request->chdir = local_chdir; - request->rmdir = local_rmdir; - request->rmfile = local_rmfile; - request->mkdir = local_mkdir; - request->rename = local_rename; - request->chmod = local_chmod; - request->set_file_time = local_set_file_time; - request->site = NULL; - request->parse_url = NULL; - request->url_prefix = "file"; - request->protocol_name = "Local"; - request->need_hostport = 0; - request->need_userpass = 0; - request->use_cache = 0; - request->use_threads = 0; - request->always_connected = 1; - gftp_set_config_options (request); - - lpd = g_malloc0 (sizeof (*lpd)); - request->protocol_data = lpd; - lpd->userhash = g_hash_table_new (hash_function, hash_compare); - lpd->grouphash = g_hash_table_new (hash_function, hash_compare); + g_free (value); } @@ -137,13 +51,6 @@ } -static void -local_remove_key (gpointer key, gpointer value, gpointer user_data) -{ - g_free (value); -} - - static int local_connect (gftp_request * request) { @@ -357,6 +264,92 @@ } +static char * +make_text_mode (gftp_file * fle, mode_t mode) +{ + char *str; + + str = g_malloc0 (11); + + str[0] = '?'; + if (S_ISREG (mode)) + str[0] = '-'; + + if (S_ISLNK (mode)) + { + fle->islink = 1; + str[0] = 'l'; + } + + if (S_ISBLK (mode)) + { + fle->isblock = 1; + str[0] = 'b'; + } + + if (S_ISCHR (mode)) + { + fle->ischar = 1; + str[0] = 'c'; + } + + if (S_ISFIFO (mode)) + { + fle->isfifo = 1; + str[0] = 'p'; + } + + if (S_ISSOCK (mode)) + { + fle->issocket = 1; + str[0] = 's'; + } + + if (S_ISDIR (mode)) + { + fle->isdir = 1; + str[0] = 'd'; + } + + str[1] = mode & S_IRUSR ? 'r' : '-'; + str[2] = mode & S_IWUSR ? 'w' : '-'; + + if ((mode & S_ISUID) && (mode & S_IXUSR)) + str[3] = 's'; + else if (mode & S_ISUID) + str[3] = 'S'; + else if (mode & S_IXUSR) + str[3] = 'x'; + else + str[3] = '-'; + + str[4] = mode & S_IRGRP ? 'r' : '-'; + str[5] = mode & S_IWGRP ? 'w' : '-'; + + if ((mode & S_ISGID) && (mode & S_IXGRP)) + str[6] = 's'; + else if (mode & S_ISGID) + str[6] = 'S'; + else if (mode & S_IXGRP) + str[6] = 'x'; + else + str[6] = '-'; + + str[7] = mode & S_IROTH ? 'r' : '-'; + str[8] = mode & S_IWOTH ? 'w' : '-'; + + if ((mode & S_ISVTX) && (mode & S_IXOTH)) + str[9] = 't'; + else if (mode & S_ISVTX) + str[9] = 'T'; + else if (mode & S_IXOTH) + str[9] = 'x'; + else + str[9] = '-'; + return (str); +} + + static int local_get_next_file (gftp_request * request, gftp_file * fle, FILE * fd) { @@ -440,14 +433,7 @@ if ((fle->attribs[0] == 'b' || fle->attribs[0] == 'u' || fle->attribs[0] == 'c')) - { - /* FIXME find out if sys/sysmacros.h is portable, and if - #define {major,minor} is portable. If so, use that instead. If not, - I will have to add a configure flag to find out the size of the - major numbers */ - fle->size = ((((int) st.st_rdev) >> 8) & 0xFF) << 16; - fle->size |= st.st_rdev & 0xFF; - } + fle->size = (off_t) st.st_rdev; else fle->size = st.st_size; @@ -684,92 +670,6 @@ } -static char * -make_text_mode (gftp_file * fle, mode_t mode) -{ - char *str; - - str = g_malloc0 (11); - - str[0] = '?'; - if (S_ISREG (mode)) - str[0] = '-'; - - if (S_ISLNK (mode)) - { - fle->islink = 1; - str[0] = 'l'; - } - - if (S_ISBLK (mode)) - { - fle->isblock = 1; - str[0] = 'b'; - } - - if (S_ISCHR (mode)) - { - fle->ischar = 1; - str[0] = 'c'; - } - - if (S_ISFIFO (mode)) - { - fle->isfifo = 1; - str[0] = 'p'; - } - - if (S_ISSOCK (mode)) - { - fle->issocket = 1; - str[0] = 's'; - } - - if (S_ISDIR (mode)) - { - fle->isdir = 1; - str[0] = 'd'; - } - - str[1] = mode & S_IRUSR ? 'r' : '-'; - str[2] = mode & S_IWUSR ? 'w' : '-'; - - if ((mode & S_ISUID) && (mode & S_IXUSR)) - str[3] = 's'; - else if (mode & S_ISUID) - str[3] = 'S'; - else if (mode & S_IXUSR) - str[3] = 'x'; - else - str[3] = '-'; - - str[4] = mode & S_IRGRP ? 'r' : '-'; - str[5] = mode & S_IWGRP ? 'w' : '-'; - - if ((mode & S_ISGID) && (mode & S_IXGRP)) - str[6] = 's'; - else if (mode & S_ISGID) - str[6] = 'S'; - else if (mode & S_IXGRP) - str[6] = 'x'; - else - str[6] = '-'; - - str[7] = mode & S_IROTH ? 'r' : '-'; - str[8] = mode & S_IWOTH ? 'w' : '-'; - - if ((mode & S_ISVTX) && (mode & S_IXOTH)) - str[9] = 't'; - else if (mode & S_ISVTX) - str[9] = 'T'; - else if (mode & S_IXOTH) - str[9] = 'x'; - else - str[9] = '-'; - return (str); -} - - static gint hash_compare (gconstpointer path1, gconstpointer path2) { @@ -783,3 +683,51 @@ return (GPOINTER_TO_UINT (key)); } + +void +local_init (gftp_request * request) +{ + local_protocol_data *lpd; + + g_return_if_fail (request != NULL); + + request->protonum = GFTP_LOCAL_NUM; + request->init = local_init; + request->destroy = local_destroy; + request->connect = local_connect; + request->disconnect = local_disconnect; + request->get_file = local_get_file; + request->put_file = local_put_file; + request->transfer_file = NULL; + request->get_next_file_chunk = NULL; + request->put_next_file_chunk = NULL; + request->end_transfer = local_end_transfer; + request->abort_transfer = local_end_transfer; /* NOTE: uses end_transfer */ + request->list_files = local_list_files; + request->get_next_file = local_get_next_file; + request->set_data_type = NULL; + request->get_file_size = local_get_file_size; + request->chdir = local_chdir; + request->rmdir = local_rmdir; + request->rmfile = local_rmfile; + request->mkdir = local_mkdir; + request->rename = local_rename; + request->chmod = local_chmod; + request->set_file_time = local_set_file_time; + request->site = NULL; + request->parse_url = NULL; + request->url_prefix = "file"; + request->protocol_name = "Local"; + request->need_hostport = 0; + request->need_userpass = 0; + request->use_cache = 0; + request->use_threads = 0; + request->always_connected = 1; + gftp_set_config_options (request); + + lpd = g_malloc0 (sizeof (*lpd)); + request->protocol_data = lpd; + lpd->userhash = g_hash_table_new (hash_function, hash_compare); + lpd->grouphash = g_hash_table_new (hash_function, hash_compare); +} +