From: <enl...@so...> - 2001-02-20 03:56:55
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd.c efsd.h efsd_fileops.c efsd_fileops.h efsd_io.c efsd_misc.h libefsd.c libefsd.h Log Message: readlink() functionality and a whole bunch of cleanups to remove code redundancy. Sorry for the wait Raster I was out of town :) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- efsd.c 2001/02/13 01:30:08 1.9 +++ efsd.c 2001/02/20 03:57:52 1.10 @@ -97,55 +97,59 @@ switch (command->type) { - case REMOVE: + case EFSD_CMD_REMOVE: D(("Handling REMOVE\n")); result = efsd_remove(command, client); break; - case MOVE: + case EFSD_CMD_MOVE: D(("Handling MOVE\n")); result = efsd_move(command, client); break; - case COPY: + case EFSD_CMD_COPY: D(("Handling COPY\n")); result = efsd_copy(command, client); break; - case SYMLINK: + case EFSD_CMD_SYMLINK: D(("Handling SYMLINK\n")); result = efsd_symlink(command, client); break; - case LISTDIR: + case EFSD_CMD_LISTDIR: D(("Handling LISTDIR\n")); result = efsd_listdir(command, client); break; - case MAKEDIR: + case EFSD_CMD_MAKEDIR: D(("Handling MAKEDIR\n")); result = efsd_makedir(command, client); break; - case CHMOD: + case EFSD_CMD_CHMOD: D(("Handling CHMOD\n")); result = efsd_chmod(command, client); break; - case SETMETA: + case EFSD_CMD_SETMETA: D(("Handling SETMETA\n")); result = efsd_set_metadata(command, client); break; - case GETMETA: + case EFSD_CMD_GETMETA: D(("Handling GETMETA\n")); result = efsd_get_metadata(command, client); break; - case STARTMON: + case EFSD_CMD_STARTMON: D(("Handling STARTMON\n")); result = efsd_start_monitor(command, client); break; - case STOPMON: + case EFSD_CMD_STOPMON: D(("Handling STOPMON\n")); result = efsd_stop_monitor(command, client); break; - case STAT: + case EFSD_CMD_STAT: D(("Handling STAT\n")); result = efsd_stat(command, client); break; - case CLOSE: + case EFSD_CMD_READLINK: + D(("Handling READLINK\n")); + result = efsd_readlink(command, client); + break; + case EFSD_CMD_CLOSE: D(("Handling CLOSE\n")); result = efsd_close_connection(client); break; @@ -179,8 +183,8 @@ m = (EfsdFamMonitor*)famev.userdata; bzero(&ee, sizeof(EfsdEvent)); - ee.type = FILECHANGE; - ee.efsd_filechange_event.changecode = famev.code; + ee.type = EFSD_EVENT_FILECHANGE; + ee.efsd_filechange_event.changetype = (EfsdFilechangeType)famev.code; ee.efsd_filechange_event.file = strdup(famev.filename); switch(m->type) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- efsd.h 2001/02/16 07:25:38 1.4 +++ efsd.h 2001/02/20 03:57:52 1.5 @@ -27,7 +27,6 @@ #include <sys/types.h> #include <sys/stat.h> -#include <fam.h> #define EFSD_CLIENTS 100 @@ -42,19 +41,43 @@ } EfsdStatus; +typedef enum efsd_filechange_type +{ + EFSD_CHANGE_CHANGED = 1, + EFSD_CHANGE_DELETED = 2, + EFSD_CHANGE_START_EXEC = 3, + EFSD_CHANGE_STOP_EXEC = 4, + EFSD_CHANGE_CREATED = 5, + EFSD_CHANGE_MOVED = 6, + EFSD_CHANGE_ACKNOWLEDGE = 7, + EFSD_CHANGE_EXISTS = 8, + EFSD_CHANGE_END_EXISTS = 9 +} +EfsdFilechangeType; + typedef enum efsd_event_type { - FILECHANGE, - REPLY + EFSD_EVENT_FILECHANGE, + EFSD_EVENT_REPLY } EfsdEventType; typedef enum efsd_command_type { - REMOVE, MOVE, COPY, SYMLINK, - LISTDIR, MAKEDIR, CHMOD, - SETMETA, GETMETA, STARTMON, - STOPMON, STAT, CLOSE + EFSD_CMD_REMOVE, + EFSD_CMD_MOVE, + EFSD_CMD_COPY, + EFSD_CMD_SYMLINK, + EFSD_CMD_LISTDIR, + EFSD_CMD_MAKEDIR, + EFSD_CMD_CHMOD, + EFSD_CMD_SETMETA, + EFSD_CMD_GETMETA, + EFSD_CMD_STARTMON, + EFSD_CMD_STOPMON, + EFSD_CMD_STAT, + EFSD_CMD_READLINK, + EFSD_CMD_CLOSE } EfsdCommandType; @@ -158,13 +181,13 @@ /* Events, sent from daemon to client. */ -/* Filechange event, generated through FAM. +/* Filechange event. */ typedef struct efsd_filechange_event { EfsdEventType type; EfsdCmdId id; - int changecode; + EfsdFilechangeType changetype; char *file; } EfsdFileChangeEvent; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fileops.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_fileops.c 2001/01/19 01:36:35 1.1 +++ efsd_fileops.c 2001/02/20 03:57:52 1.2 @@ -32,6 +32,7 @@ #include <sys/stat.h> #include <sys/types.h> #include <sys/socket.h> +#include <sys/param.h> #include <sys/un.h> #include <string.h> #include <unistd.h> @@ -61,7 +62,7 @@ if (sockfd < 0) return (-1); - ee.type = REPLY; + ee.type = EFSD_EVENT_REPLY; ee.efsd_reply_event.command = *cmd; ee.efsd_reply_event.status = status; ee.efsd_reply_event.errorcode = errorcode; @@ -235,10 +236,24 @@ if (lstat(cmd->efsd_file_cmd.file, st) >= 0) result = efsd_send_reply(cmd, SUCCESS, 0, sizeof(struct stat), st, client); else - result = efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client); + result = efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client); - if (st) - free(st); + FREE(st); + + return result; +} + + +int +efsd_readlink(EfsdCommand *cmd, int client) +{ + char s[MAXPATHLEN]; + int result, n; + + if ((n = readlink(cmd->efsd_file_cmd.file, s, MAXPATHLEN)) >= 0) + result = efsd_send_reply(cmd, SUCCESS, 0, n, s, client); + else + result = efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client); return result; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fileops.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_fileops.h 2001/01/19 01:36:35 1.1 +++ efsd_fileops.h 2001/02/20 03:57:52 1.2 @@ -42,5 +42,6 @@ int efsd_start_monitor(EfsdCommand *cmd, int client); int efsd_stop_monitor(EfsdCommand *cmd, int client); int efsd_stat(EfsdCommand *cmd, int client); +int efsd_readlink(EfsdCommand *cmd, int client); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- efsd_io.c 2001/02/16 07:25:38 1.4 +++ efsd_io.c 2001/02/20 03:57:52 1.5 @@ -38,8 +38,10 @@ #include <errno.h> #include <efsd_debug.h> +#include <efsd_misc.h> #include <efsd_io.h> + static int read_data(int sockfd, void *dest, int size); static int read_int(int sockfd, int *dest); static int read_string(int sockfd, char **s); @@ -47,29 +49,19 @@ static int write_int(int sockfd, int data); static int write_string(int sockfd, char *s); -static int read_remove_cmd(int sockfd, EfsdCommand *cmd); -static int read_move_cmd(int sockfd, EfsdCommand *cmd); -static int read_listdir_cmd(int sockfd, EfsdCommand *cmd); -static int read_makedir_cmd(int sockfd, EfsdCommand *cmd); +static int read_file_cmd(int sockfd, EfsdCommand *cmd); +static int read_2file_cmd(int sockfd, EfsdCommand *cmd); static int read_chmod_cmd(int sockfd, EfsdCommand *cmd); static int read_set_metadata_cmd(int sockfd, EfsdCommand *cmd); static int read_get_metadata_cmd(int sockfd, EfsdCommand *cmd); -static int read_start_monitor_cmd(int sockfd, EfsdCommand *cmd); -static int read_stop_monitor_cmd(int sockfd, EfsdCommand *cmd); -static int read_stat_cmd(int sockfd, EfsdCommand *cmd); static int read_filechange_event(int sockfd, EfsdEvent *ee); static int read_reply_event(int sockfd, EfsdEvent *ee); -static int write_remove_cmd(int sockfd, EfsdCommand *cmd); -static int write_move_cmd(int sockfd, EfsdCommand *cmd); -static int write_listdir_cmd(int sockfd, EfsdCommand *cmd); -static int write_makedir_cmd(int sockfd, EfsdCommand *cmd); +static int write_file_cmd(int sockfd, EfsdCommand *cmd); +static int write_2file_cmd(int sockfd, EfsdCommand *cmd); static int write_chmod_cmd(int sockfd, EfsdCommand *cmd); static int write_set_metadata_cmd(int sockfd, EfsdCommand *cmd); static int write_get_metadata_cmd(int sockfd, EfsdCommand *cmd); -static int write_start_monitor_cmd(int sockfd, EfsdCommand *cmd); -static int write_stop_monitor_cmd(int sockfd, EfsdCommand *cmd); -static int write_stat_cmd(int sockfd, EfsdCommand *cmd); static int write_filechange_event(int sockfd, EfsdEvent *ee); static int write_reply_event(int sockfd, EfsdEvent *ee); @@ -200,7 +192,7 @@ static int -read_remove_cmd(int sockfd, EfsdCommand *cmd) +read_file_cmd(int sockfd, EfsdCommand *cmd) { int count = 0, count2; @@ -221,7 +213,7 @@ static int -read_move_cmd(int sockfd, EfsdCommand *cmd) +read_2file_cmd(int sockfd, EfsdCommand *cmd) { int count = 0, count2; @@ -246,48 +238,6 @@ static int -read_listdir_cmd(int sockfd, EfsdCommand *cmd) -{ - int count = 0, count2; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.id))) < 0) - return (-1); - count2 = count; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.options))) < 0) - return (-1); - count2 += count; - - if ((count = read_string(sockfd, &(cmd->efsd_file_cmd.file))) < 0) - return (-1); - count2 += count; - - return (count2); -} - - -static int -read_makedir_cmd(int sockfd, EfsdCommand *cmd) -{ - int count = 0, count2; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.id))) < 0) - return (-1); - count2 = count; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.options))) < 0) - return (-1); - count2 += count; - - if ((count = read_string(sockfd, &(cmd->efsd_file_cmd.file))) < 0) - return (-1); - count2 += count; - - return (count2); -} - - -static int read_chmod_cmd(int sockfd, EfsdCommand *cmd) { int count = 0, count2; @@ -367,69 +317,6 @@ static int -read_start_monitor_cmd(int sockfd, EfsdCommand *cmd) -{ - int count = 0, count2; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.id))) < 0) - return (-1); - count2 = count; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.options))) < 0) - return (-1); - count2 += count; - - if ((count = read_string(sockfd, &(cmd->efsd_file_cmd.file))) < 0) - return (-1); - count2 += count; - - return (count2); -} - - -static int -read_stop_monitor_cmd(int sockfd, EfsdCommand *cmd) -{ - int count = 0, count2; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.id))) < 0) - return (-1); - count2 = count; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.options))) < 0) - return (-1); - count2 += count; - - if ((count = read_string(sockfd, &(cmd->efsd_file_cmd.file))) < 0) - return (-1); - count2 += count; - - return (count2); -} - - -static int -read_stat_cmd(int sockfd, EfsdCommand *cmd) -{ - int count = 0, count2; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.id))) < 0) - return (-1); - count2 = count; - - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.options))) < 0) - return (-1); - count2 += count; - - if ((count = read_string(sockfd, &(cmd->efsd_file_cmd.file))) < 0) - return (-1); - count2 += count; - - return (count2); -} - - -static int read_filechange_event(int sockfd, EfsdEvent *ee) { int count, count2; @@ -438,7 +325,7 @@ return (-1); count2 = count; - if ((count = read_int(sockfd, &(ee->efsd_filechange_event.changecode))) < 0) + if ((count = read_int(sockfd, (int*)&(ee->efsd_filechange_event.changetype))) < 0) return (-1); count2 += count; @@ -490,7 +377,7 @@ static int -write_remove_cmd(int sockfd, EfsdCommand *cmd) +write_file_cmd(int sockfd, EfsdCommand *cmd) { if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) return (-1); @@ -506,7 +393,7 @@ static int -write_move_cmd(int sockfd, EfsdCommand *cmd) +write_2file_cmd(int sockfd, EfsdCommand *cmd) { if (write_int(sockfd, cmd->efsd_2file_cmd.id) < 0) return (-1); @@ -525,38 +412,6 @@ static int -write_listdir_cmd(int sockfd, EfsdCommand *cmd) -{ - if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) - return (-1); - - if (write_int(sockfd, cmd->efsd_file_cmd.options) < 0) - return (-1); - - if (write_string(sockfd, cmd->efsd_file_cmd.file) < 0) - return (-1); - - return (0); -} - - -static int -write_makedir_cmd(int sockfd, EfsdCommand *cmd) -{ - if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) - return (-1); - - if (write_int(sockfd, cmd->efsd_file_cmd.options) < 0) - return (-1); - - if (write_string(sockfd, cmd->efsd_file_cmd.file) < 0) - return (-1); - - return (0); -} - - -static int write_chmod_cmd(int sockfd, EfsdCommand *cmd) { if (write_int(sockfd, cmd->efsd_chmod_cmd.id) < 0) @@ -617,60 +472,12 @@ static int -write_start_monitor_cmd(int sockfd, EfsdCommand *cmd) -{ - if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) - return (-1); - - if (write_int(sockfd, cmd->efsd_file_cmd.options) < 0) - return (-1); - - if (write_string(sockfd, cmd->efsd_file_cmd.file) < 0) - return (-1); - - return (0); -} - - -static int -write_stop_monitor_cmd(int sockfd, EfsdCommand *cmd) -{ - if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) - return (-1); - - if (write_int(sockfd, cmd->efsd_file_cmd.options) < 0) - return (-1); - - if (write_string(sockfd, cmd->efsd_file_cmd.file) < 0) - return (-1); - - return (0); -} - - -static int -write_stat_cmd(int sockfd, EfsdCommand *cmd) -{ - if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) - return (-1); - - if (write_int(sockfd, cmd->efsd_file_cmd.options) < 0) - return (-1); - - if (write_string(sockfd, cmd->efsd_file_cmd.file) < 0) - return (-1); - - return (0); -} - - -static int write_filechange_event(int sockfd, EfsdEvent *ee) { if (write_int(sockfd, ee->efsd_filechange_event.id) < 0) return (-1); - if (write_int(sockfd, ee->efsd_filechange_event.changecode) < 0) + if (write_int(sockfd, ee->efsd_filechange_event.changetype) < 0) return (-1); if (write_string(sockfd, ee->efsd_filechange_event.file) < 0) @@ -718,37 +525,29 @@ switch (cmd->type) { - case REMOVE: - result = write_remove_cmd(sockfd, cmd); - break; - case MOVE: - result = write_move_cmd(sockfd, cmd); - break; - case LISTDIR: - result = write_listdir_cmd(sockfd, cmd); + case EFSD_CMD_REMOVE: + case EFSD_CMD_LISTDIR: + case EFSD_CMD_MAKEDIR: + case EFSD_CMD_STARTMON: + case EFSD_CMD_STOPMON: + case EFSD_CMD_STAT: + case EFSD_CMD_READLINK: + result = write_file_cmd(sockfd, cmd); + break; + case EFSD_CMD_MOVE: + case EFSD_CMD_SYMLINK: + result = write_2file_cmd(sockfd, cmd); break; - case MAKEDIR: - result = write_makedir_cmd(sockfd, cmd); - break; - case CHMOD: + case EFSD_CMD_CHMOD: result = write_chmod_cmd(sockfd, cmd); break; - case SETMETA: + case EFSD_CMD_SETMETA: result = write_set_metadata_cmd(sockfd, cmd); break; - case GETMETA: + case EFSD_CMD_GETMETA: result = write_get_metadata_cmd(sockfd, cmd); - break; - case STARTMON: - result = write_start_monitor_cmd(sockfd, cmd); - break; - case STOPMON: - result = write_stop_monitor_cmd(sockfd, cmd); break; - case STAT: - result = write_stat_cmd(sockfd, cmd); - break; - case CLOSE: + case EFSD_CMD_CLOSE: result = 0; break; default: @@ -774,37 +573,29 @@ { switch (cmd->type) { - case REMOVE: - result = read_remove_cmd(sockfd, cmd); - break; - case MOVE: - result = read_move_cmd(sockfd, cmd); - break; - case LISTDIR: - result = read_listdir_cmd(sockfd, cmd); + case EFSD_CMD_REMOVE: + case EFSD_CMD_LISTDIR: + case EFSD_CMD_MAKEDIR: + case EFSD_CMD_STARTMON: + case EFSD_CMD_STOPMON: + case EFSD_CMD_STAT: + case EFSD_CMD_READLINK: + result = read_file_cmd(sockfd, cmd); + break; + case EFSD_CMD_MOVE: + case EFSD_CMD_SYMLINK: + result = read_2file_cmd(sockfd, cmd); break; - case MAKEDIR: - result = read_makedir_cmd(sockfd, cmd); - break; - case CHMOD: + case EFSD_CMD_CHMOD: result = read_chmod_cmd(sockfd, cmd); break; - case SETMETA: + case EFSD_CMD_SETMETA: result = read_set_metadata_cmd(sockfd, cmd); break; - case GETMETA: + case EFSD_CMD_GETMETA: result = read_get_metadata_cmd(sockfd, cmd); - break; - case STARTMON: - result = read_start_monitor_cmd(sockfd, cmd); - break; - case STOPMON: - result = read_stop_monitor_cmd(sockfd, cmd); break; - case STAT: - result = read_stat_cmd(sockfd, cmd); - break; - case CLOSE: + case EFSD_CMD_CLOSE: result = 0; break; default: @@ -829,10 +620,10 @@ switch (ee->type) { - case FILECHANGE: + case EFSD_EVENT_FILECHANGE: result = write_filechange_event(sockfd, ee); break; - case REPLY: + case EFSD_EVENT_REPLY: result = write_reply_event(sockfd, ee); break; default: @@ -858,10 +649,10 @@ { switch (ee->type) { - case FILECHANGE: + case EFSD_EVENT_FILECHANGE: result = read_filechange_event(sockfd, ee); break; - case REPLY: + case EFSD_EVENT_REPLY: result = read_reply_event(sockfd, ee); break; default: @@ -880,62 +671,31 @@ switch (ecom->type) { - case REMOVE: - case LISTDIR: - case MAKEDIR: - case CHMOD: - case STARTMON: - case STOPMON: - case STAT: - if (ecom->efsd_file_cmd.file) - { - free(ecom->efsd_file_cmd.file); - ecom->efsd_file_cmd.file = NULL; - } - break; - case MOVE: - case SYMLINK: - if (ecom->efsd_2file_cmd.file2) - { - free(ecom->efsd_2file_cmd.file1); - ecom->efsd_2file_cmd.file1 = NULL; - } - if (ecom->efsd_2file_cmd.file2) - { - free(ecom->efsd_2file_cmd.file2); - ecom->efsd_2file_cmd.file2 = NULL; - } - break; - case SETMETA: - if (ecom->efsd_set_metadata_cmd.data) - { - free(ecom->efsd_set_metadata_cmd.data); - ecom->efsd_set_metadata_cmd.data = NULL; - } - if (ecom->efsd_set_metadata_cmd.key) - { - free(ecom->efsd_set_metadata_cmd.key); - ecom->efsd_set_metadata_cmd.key = NULL; - } - if (ecom->efsd_set_metadata_cmd.file) - { - free(ecom->efsd_set_metadata_cmd.file); - ecom->efsd_set_metadata_cmd.file = NULL; - } - break; - case GETMETA: - if (ecom->efsd_get_metadata_cmd.key) - { - free(ecom->efsd_get_metadata_cmd.key); - ecom->efsd_get_metadata_cmd.key = NULL; - } - if (ecom->efsd_get_metadata_cmd.file) - { - free(ecom->efsd_get_metadata_cmd.file); - ecom->efsd_get_metadata_cmd.file = NULL; - } + case EFSD_CMD_REMOVE: + case EFSD_CMD_LISTDIR: + case EFSD_CMD_MAKEDIR: + case EFSD_CMD_CHMOD: + case EFSD_CMD_STARTMON: + case EFSD_CMD_STOPMON: + case EFSD_CMD_STAT: + case EFSD_CMD_READLINK: + FREE(ecom->efsd_file_cmd.file); + break; + case EFSD_CMD_MOVE: + case EFSD_CMD_SYMLINK: + FREE(ecom->efsd_2file_cmd.file1); + FREE(ecom->efsd_2file_cmd.file2); + break; + case EFSD_CMD_SETMETA: + FREE(ecom->efsd_set_metadata_cmd.data); + FREE(ecom->efsd_set_metadata_cmd.key); + FREE(ecom->efsd_set_metadata_cmd.file); + break; + case EFSD_CMD_GETMETA: + FREE(ecom->efsd_get_metadata_cmd.key); + FREE(ecom->efsd_get_metadata_cmd.file); break; - case CLOSE: + case EFSD_CMD_CLOSE: break; default: } @@ -950,19 +710,11 @@ switch (ev->type) { - case REPLY: - if (ev->efsd_reply_event.data) - { - free(ev->efsd_reply_event.data); - ev->efsd_reply_event.data = NULL; - } - break; - case FILECHANGE: - if (ev->efsd_filechange_event.file) - { - free(ev->efsd_filechange_event.file); - ev->efsd_filechange_event.file = NULL; - } + case EFSD_EVENT_REPLY: + FREE(ev->efsd_reply_event.data); + break; + case EFSD_EVENT_FILECHANGE: + FREE(ev->efsd_filechange_event.file); break; default: } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- efsd_misc.h 2001/02/07 04:51:13 1.3 +++ efsd_misc.h 2001/02/20 03:57:52 1.4 @@ -25,11 +25,14 @@ #ifndef __efsd_misc_h #define __efsd_misc_h +#define FREE(X) { if (X) { free(X); X = NULL; } } + int efsd_misc_file_exists(char *filename); int efsd_misc_file_is_dir(char *filename); void efsd_misc_remove_trailing_slashes(char *path); int efsd_misc_is_absolute_path(char *path); char **efsd_misc_get_path_dirs(char *path, int *num_dirs); void efsd_slashify(char *path); + #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- libefsd.c 2001/02/13 00:14:21 1.6 +++ libefsd.c 2001/02/20 03:57:52 1.7 @@ -51,8 +51,10 @@ static void send_command(EfsdConnection *ec, EfsdCommand *com); static EfsdCmdId get_next_id(void); +static EfsdCmdId file_cmd(EfsdConnection *ec, EfsdCommandType type, char *file); +static EfsdCmdId twofile_cmd(EfsdConnection *ec, EfsdCommandType type, + char *file1, char *file2); - static char* get_full_path(char *file) { @@ -97,6 +99,49 @@ } +static EfsdCmdId +file_cmd(EfsdConnection *ec, EfsdCommandType type, char *file) +{ + char *f; + EfsdCommand cmd; + + if (!ec || !file || file[0] == '\0') + return -1; + + cmd.type = type; + cmd.efsd_file_cmd.id = get_next_id(); + f = get_full_path(file); + cmd.efsd_file_cmd.file = strdup(f); + free(f); + + send_command(ec, &cmd); + return cmd.efsd_file_cmd.id; +} + + +static EfsdCmdId +twofile_cmd(EfsdConnection *ec, EfsdCommandType type, char *file1, char *file2) +{ + char *f; + EfsdCommand cmd; + + if (!ec || !file1 || file1[0] == '\0' || file2 || file2[0] == '\0') + return -1; + + cmd.type = type; + cmd.efsd_2file_cmd.id = get_next_id(); + f = get_full_path(file1); + cmd.efsd_2file_cmd.file1 = strdup(f); + free(f); + f = get_full_path(file2); + cmd.efsd_2file_cmd.file2 = strdup(f); + free(f); + + send_command(ec, &cmd); + return cmd.efsd_2file_cmd.id; +} + + /** API starts here */ extern void efsd_cleanup_event(EfsdEvent *ev); @@ -154,7 +199,7 @@ if (!ec) return; - cmd.type = CLOSE; + cmd.type = EFSD_CMD_CLOSE; send_command(ec, &cmd); close(ec->fd); @@ -210,129 +255,42 @@ EfsdCmdId efsd_remove(EfsdConnection *ec, char *filename) { - char *f; - EfsdCommand cmd; - - if (!ec || !filename || filename[0] == '\0') - return -1; - - cmd.type = REMOVE; - cmd.efsd_file_cmd.id = get_next_id(); - f = get_full_path(filename); - cmd.efsd_file_cmd.file = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_file_cmd.id; + return (file_cmd(ec, EFSD_CMD_REMOVE, filename)); } EfsdCmdId efsd_move(EfsdConnection *ec, char *from_file, char *to_file) { - char *f; - EfsdCommand cmd; - - if (!ec || !from_file || from_file[0] == '\0' || !to_file || to_file[0] == '\0') - return -1; - - cmd.type = MOVE; - cmd.efsd_2file_cmd.id = get_next_id(); - f = get_full_path(from_file); - cmd.efsd_2file_cmd.file1 = strdup(f); - free(f); - f = get_full_path(to_file); - cmd.efsd_2file_cmd.file2 = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_2file_cmd.id; + return (twofile_cmd(ec, EFSD_CMD_MOVE, from_file, to_file)); } EfsdCmdId efsd_copy(EfsdConnection *ec, char *from_file, char *to_file) { - char *f; - EfsdCommand cmd; - - if (!ec || !from_file || from_file[0] == '\0' || !to_file || to_file[0] == '\0') - return -1; - - cmd.type = COPY; - cmd.efsd_2file_cmd.id = get_next_id(); - f = get_full_path(from_file); - cmd.efsd_2file_cmd.file1 = strdup(f); - free(f); - f = get_full_path(to_file); - cmd.efsd_2file_cmd.file2 = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_2file_cmd.id; + return (twofile_cmd(ec, EFSD_CMD_COPY, from_file, to_file)); } EfsdCmdId efsd_symlink(EfsdConnection *ec, char *from_file, char *to_file) { - char *f; - EfsdCommand cmd; - - if (!ec || !from_file || from_file[0] == '\0' || !to_file || to_file[0] == '\0') - return -1; - - cmd.type = SYMLINK; - cmd.efsd_2file_cmd.id = get_next_id(); - f = get_full_path(from_file); - cmd.efsd_2file_cmd.file1 = strdup(f); - free(f); - f = get_full_path(to_file); - cmd.efsd_2file_cmd.file2 = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_2file_cmd.id; + return (twofile_cmd(ec, EFSD_CMD_SYMLINK, from_file, to_file)); } EfsdCmdId efsd_listdir(EfsdConnection *ec, char *dirname) { - char *f; - EfsdCommand cmd; - - if (!ec || !dirname || dirname[0] == '\0') - return -1; - - cmd.type = LISTDIR; - cmd.efsd_file_cmd.id = get_next_id(); - f = get_full_path(dirname); - cmd.efsd_file_cmd.file = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_file_cmd.id; + return (file_cmd(ec, EFSD_CMD_LISTDIR, dirname)); } EfsdCmdId efsd_makedir(EfsdConnection *ec, char *dirname) { - char *f; - EfsdCommand cmd; - - if (!ec || !dirname || dirname[0] == '\0') - return -1; - - cmd.type = MAKEDIR; - cmd.efsd_file_cmd.id = get_next_id(); - f = get_full_path(dirname); - cmd.efsd_file_cmd.file = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_file_cmd.id; + return (file_cmd(ec, EFSD_CMD_MAKEDIR, dirname)); } @@ -345,7 +303,7 @@ if (!ec || !filename || filename[0] == '\0') return -1; - cmd.type = CHMOD; + cmd.type = EFSD_CMD_CHMOD; cmd.efsd_chmod_cmd.id = get_next_id(); cmd.efsd_chmod_cmd.mode = mode; f = get_full_path(filename); @@ -368,7 +326,7 @@ !key || key[0] == '\0' || !data) return -1; - cmd.type = SETMETA; + cmd.type = EFSD_CMD_SETMETA; cmd.efsd_set_metadata_cmd.id = get_next_id(); cmd.efsd_set_metadata_cmd.datatype = datatype; cmd.efsd_set_metadata_cmd.data_len = data_len; @@ -393,7 +351,7 @@ || !key || key[0] == '\0') return -1; - cmd.type = GETMETA; + cmd.type = EFSD_CMD_GETMETA; cmd.efsd_get_metadata_cmd.id = get_next_id(); cmd.efsd_get_metadata_cmd.key = strdup(key); f = get_full_path(filename); @@ -408,58 +366,28 @@ EfsdCmdId efsd_start_monitor(EfsdConnection *ec, char *filename) { - char *f; - EfsdCommand cmd; - - if (!ec || !filename || filename[0] == '\0') - return -1; - - cmd.type = STARTMON; - cmd.efsd_file_cmd.id = get_next_id(); - f = get_full_path(filename); - cmd.efsd_file_cmd.file = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_file_cmd.id; + return (file_cmd(ec, EFSD_CMD_STARTMON, filename)); } EfsdCmdId efsd_stop_monitor(EfsdConnection *ec, char *filename) { - char *f; - EfsdCommand cmd; - - if (!ec || !filename || filename[0] == '\0') - return -1; - - cmd.type = STOPMON; - cmd.efsd_file_cmd.id = get_next_id(); - f = get_full_path(filename); - cmd.efsd_file_cmd.file = strdup(f); - free(f); - - send_command(ec, &cmd); - return cmd.efsd_file_cmd.id; + return (file_cmd(ec, EFSD_CMD_STOPMON, filename)); } EfsdCmdId efsd_stat(EfsdConnection *ec, char *filename) { - char *f; - EfsdCommand cmd; - - if (!ec || !filename || filename[0] == '\0') - return -1; + return (file_cmd(ec, EFSD_CMD_STAT, filename)); +} - cmd.type = STAT; - cmd.efsd_file_cmd.id = get_next_id(); - f = get_full_path(filename); - cmd.efsd_file_cmd.file = strdup(f); - free(f); - send_command(ec, &cmd); - return cmd.efsd_file_cmd.id; +EfsdCmdId +efsd_readlink(EfsdConnection *ec, char *filename) +{ + return (file_cmd(ec, EFSD_CMD_READLINK, filename)); } + + =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- libefsd.h 2001/02/13 00:14:21 1.4 +++ libefsd.h 2001/02/20 03:57:52 1.5 @@ -137,10 +137,12 @@ EfsdCmdId efsd_stop_monitor(EfsdConnection *ec, char *filename); /* Returns the full file stats in the generated reply, - as returned by the lstats() command. + as returned by the lstat() command. */ EfsdCmdId efsd_stat(EfsdConnection *ec, char *filename); +/* Returns the file a symlink points to */ +EfsdCmdId efsd_readlink(EfsdConnection *ec, char *filename); #ifdef __cplusplus } |
From: <enl...@so...> - 2001-02-20 03:57:24
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/demo Modified Files: efsddemo.c run_efsddemo.sh Log Message: readlink() functionality and a whole bunch of cleanups to remove code redundancy. Sorry for the wait Raster I was out of town :) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/efsddemo.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- efsddemo.c 2001/02/16 07:25:38 1.7 +++ efsddemo.c 2001/02/20 03:57:52 1.8 @@ -32,7 +32,9 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> + #include <libefsd.h> +#include <fam.h> /* This one demonstrates how to read events from efsd in blocking mode, by calling @@ -108,50 +110,50 @@ { switch (ee->type) { - case FILECHANGE: - switch (ee->efsd_filechange_event.changecode) + case EFSD_EVENT_FILECHANGE: + switch (ee->efsd_filechange_event.changetype) { - case FAMChanged: + case EFSD_CHANGE_CHANGED: printf("Filechange event for cmd %i: %s changed.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMDeleted: + case EFSD_CHANGE_DELETED: printf("Filechange event for cmd %i: %s deleted.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMStartExecuting: + case EFSD_CHANGE_START_EXEC: printf("Filechange event for cmd %i: %s started.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMStopExecuting: + case EFSD_CHANGE_STOP_EXEC: printf("Filechange event for cmd %i: %s stopped.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMCreated: + case EFSD_CHANGE_CREATED: printf("Filechange event for cmd %i: %s created.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMMoved: + case EFSD_CHANGE_MOVED: printf("Filechange event for cmd %i: %s moved.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMAcknowledge: + case EFSD_CHANGE_ACKNOWLEDGE: printf("Filechange event for cmd %i: %s acked.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMExists: + case EFSD_CHANGE_EXISTS: printf("Filechange event for cmd %i: %s exists.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); break; - case FAMEndExist: + case EFSD_CHANGE_END_EXISTS: printf("Filechange event for cmd %i: %s end exists.\n", ee->efsd_filechange_event.id, ee->efsd_filechange_event.file); @@ -163,54 +165,54 @@ break; } break; - case REPLY: + case EFSD_EVENT_REPLY: switch (ee->efsd_reply_event.command.type) { - case REMOVE: + case EFSD_CMD_REMOVE: printf("Remove event %i\n -- removing %s\n", ee->efsd_reply_event.command.efsd_file_cmd.id, ee->efsd_reply_event.command.efsd_file_cmd.file); break; - case MOVE: + case EFSD_CMD_MOVE: printf("Move event %i\n -- moving %s to %s\n", ee->efsd_reply_event.command.efsd_2file_cmd.id, ee->efsd_reply_event.command.efsd_2file_cmd.file1, ee->efsd_reply_event.command.efsd_2file_cmd.file2); break; - case SYMLINK: + case EFSD_CMD_SYMLINK: printf("Symlink event %i\n", ee->efsd_reply_event.command.efsd_2file_cmd.id); break; - case LISTDIR: + case EFSD_CMD_LISTDIR: printf("Listdir event %i\n", ee->efsd_reply_event.command.efsd_file_cmd.id); break; - case MAKEDIR: + case EFSD_CMD_MAKEDIR: printf("Mkdir event %i\n -- creating %s\n", ee->efsd_reply_event.command.efsd_file_cmd.id, ee->efsd_reply_event.command.efsd_file_cmd.file); break; - case CHMOD: + case EFSD_CMD_CHMOD: printf("Chmod event %i\n", ee->efsd_reply_event.command.efsd_chmod_cmd.id); break; - case SETMETA: + case EFSD_CMD_SETMETA: printf("Setmeta event %i\n", ee->efsd_reply_event.command.efsd_set_metadata_cmd.id); break; - case GETMETA: + case EFSD_CMD_GETMETA: printf("Getmeta event %i\n", ee->efsd_reply_event.command.efsd_get_metadata_cmd.id); break; - case STARTMON: + case EFSD_CMD_STARTMON: printf("Startmon event %i\n", ee->efsd_reply_event.command.efsd_file_cmd.id); break; - case STOPMON: + case EFSD_CMD_STOPMON: printf("Stopmon event %i\n", ee->efsd_reply_event.command.efsd_file_cmd.id); break; - case STAT: + case EFSD_CMD_STAT: { struct stat *st; @@ -234,8 +236,16 @@ ee->efsd_reply_event.command.efsd_file_cmd.file); } + break; + case EFSD_CMD_READLINK: + printf("Readlink event %i\n", + ee->efsd_reply_event.command.efsd_file_cmd.id); + if (ee->efsd_reply_event.status == SUCCESS) + { + printf("target is %s\n", (char*)ee->efsd_reply_event.data); + } break; - case CLOSE: + case EFSD_CMD_CLOSE: printf("Close event %i\n", ee->efsd_reply_event.command.efsd_file_cmd.id); break; @@ -336,6 +346,12 @@ /* Stat a file */ id = efsd_stat(ec, "/bin/"); printf("Stat()ing file, command ID %i\n", id); + + sleep(2); + + /* Readlink a file */ + id = efsd_readlink(ec, "horms-is-flim.demo"); + printf("Readlink file, command ID %i\n", id); sleep(2); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/run_efsddemo.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- run_efsddemo.sh 2001/01/19 01:36:35 1.1 +++ run_efsddemo.sh 2001/02/20 03:57:52 1.2 @@ -2,5 +2,6 @@ rm -f *-is-flim.demo touch raster-is-flim.demo +ln -s raster-is-flim.demo horms-is-flim.demo LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../efsd/.libs ./efsddemo $@ |
From: <enl...@so...> - 2001-02-20 18:03:30
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: Makefile.am efsd.c efsd_common.c efsd_debug.h efsd_fam.c efsd_fam.h efsd_fileops.c efsd_io.c efsd_misc.c efsd_misc.h libefsd.c Log Message: * No more glib. * Fixed a bug in the demultiplexing of fam events to multiple clients -- clients that monitored a file/dir that's already monitored didn't see the exists....end exists events. * More debugging code to get a function nesting tree in case we need it. To make it work, compile with -DDEBUG_NEST. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- Makefile.am 2001/02/07 04:51:13 1.2 +++ Makefile.am 2001/02/20 18:04:28 1.3 @@ -5,7 +5,7 @@ # A list of all the files in the current directory which can be regenerated MAINTAINERCLEANFILES = Makefile.in Makefile -INCLUDES = -DDEBUG $(GLIB_CFLAGS) +INCLUDES = -DDEBUG include_HEADERS = \ efsd.h \ @@ -13,24 +13,27 @@ efsd_SOURCES = \ efsd.c \ + efsd_common.h \ + efsd_common.c \ efsd_debug.h \ + efsd_debug.c \ efsd_fam.h \ efsd_fam.c \ - efsd_io.h \ - efsd_io.c \ efsd_fileops.h \ efsd_fileops.c \ + efsd_io.h \ + efsd_io.c \ + efsd_list.h \ + efsd_list.c \ efsd_misc.h \ - efsd_misc.c \ - efsd_common.h \ - efsd_common.c + efsd_misc.c -efsd_LDADD = $(GLIB_LIBS) - lib_LTLIBRARIES = libefsd.la libefsd_la_SOURCES = \ efsd.h \ + efsd_debug.h \ + efsd_debug.c \ efsd_io.h \ efsd_io.c \ efsd_common.h \ =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- efsd.c 2001/02/20 03:57:52 1.10 +++ efsd.c 2001/02/20 18:04:28 1.11 @@ -47,6 +47,7 @@ #include <efsd_io.h> #include <efsd_fam.h> #include <efsd_fileops.h> +#include <efsd_list.h> #include <efsd_misc.h> #include <efsd_common.h> @@ -82,11 +83,14 @@ static void efsd_connect_to_fam(void) { + D_ENTER; + if ((FAMOpen(&famcon)) < 0) { fprintf(stderr, "Can not connect to fam -- exiting.\n"); exit(-1); } + D_RETURN; } @@ -95,6 +99,8 @@ { int result = (-1); + D_ENTER; + switch (command->type) { case EFSD_CMD_REMOVE: @@ -156,7 +162,7 @@ default: } - return result; + D_RETURN_(result); } @@ -166,6 +172,8 @@ FAMEvent famev; EfsdEvent ee; + D_ENTER; + while (FAMPending(&famcon) > 0) { bzero(&famev, sizeof(FAMEvent)); @@ -173,7 +181,7 @@ if (FAMNextEvent(&famcon, &famev) < 0) { FAMOpen(&famcon); - return; + D_RETURN; } if (famev.filename) @@ -195,7 +203,7 @@ EfsdFamRequest *efr; - efr = (EfsdFamRequest*)((g_list_first(m->clients))->data); + efr = (EfsdFamRequest*)(efsd_list_data(efsd_list_head(m->clients))); if (clientfd[efr->client] >= 0) { @@ -222,13 +230,13 @@ { /* This is an event generated by an actual change */ - GList *cl; + EfsdList *cl; - for (cl = g_list_first(m->clients); cl; cl = g_list_next(cl)) + for (cl = efsd_list_head(m->clients); cl; cl = efsd_list_next(cl)) { EfsdFamRequest *efr; - efr = (EfsdFamRequest*) cl->data; + efr = (EfsdFamRequest*) efsd_list_data(cl); if (clientfd[efr->client] >= 0) { ee.efsd_filechange_event.id = efr->id; @@ -247,6 +255,8 @@ efsd_cleanup_event(&ee); } } + + D_RETURN; } @@ -258,6 +268,8 @@ EfsdCommand ecmd; fd_set fdset; + D_ENTER; + for (i = 0; i < EFSD_CLIENTS; i++) clientfd[i] = -1; @@ -375,13 +387,17 @@ } } } + D_RETURN; } static void efsd_cleanup_signal_callback(int signal) { + D_ENTER; + D(("Received sig %i -- cleanup.\n", signal)); efsd_cleanup(); + D_RETURN; } static void @@ -389,6 +405,8 @@ { int i; + D_ENTER; + for (i = 0; i < EFSD_CLIENTS; i++) { if (clientfd[i] >= 0) @@ -400,6 +418,8 @@ FAMClose(&famcon); efsd_fam_cleanup(); exit(0); + + D_RETURN; } @@ -408,6 +428,8 @@ { int i; + D_ENTER; + if (geteuid() == 0) { fprintf(stderr, "Efsd is not meant to be run by root -- at least not yet :)\n"); @@ -445,6 +467,8 @@ signal(SIGPIPE, SIG_IGN); atexit(efsd_remove_socket_file); + + D_RETURN; } @@ -452,6 +476,8 @@ efsd_daemonize(void) { pid_t pid; + + D_ENTER; if (!opt_foreground) { @@ -472,6 +498,8 @@ #endif chdir("/"); umask(077); + + D_RETURN; } @@ -480,6 +508,8 @@ { int i; + D_ENTER; + for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h") @@ -518,30 +548,33 @@ exit(-1); } } + D_RETURN; } static int efsd_close_connection(int client) { + D_ENTER; D(("Closing connection %i\n", client)); if (clientfd[client] < 0) { D(("Connection already closed ???\n")); - return (-1); + D_RETURN_(-1); } efsd_fam_cleanup_client(client); close(clientfd[client]); clientfd[client] = -1; - return (0); + D_RETURN_(0); } int main(int argc, char **argv) { + D_ENTER; efsd_check_options(argc, argv); efsd_daemonize(); @@ -550,5 +583,5 @@ efsd_connect_to_fam(); efsd_handle_connections(); - return 0; + D_RETURN_(0); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_common.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- efsd_common.c 2001/02/13 01:30:08 1.2 +++ efsd_common.c 2001/02/20 18:04:28 1.3 @@ -39,15 +39,18 @@ #include <strings.h> #endif +#include <efsd_debug.h> char * efsd_get_socket_file(void) { char *dir = NULL; static char s[4096] = "\0"; + + D_ENTER; if (s[0] != '\0') - return (s); + D_RETURN_(s); dir = getenv("HOME"); @@ -62,12 +65,14 @@ snprintf(s, sizeof(s), "%s/.efsd", dir); s[sizeof(s)-1] = '\0'; - return (s); + D_RETURN_(s); } void efsd_remove_socket_file(void) { + D_ENTER; unlink(efsd_get_socket_file()); + D_RETURN; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_debug.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- efsd_debug.h 2001/02/16 00:12:02 1.2 +++ efsd_debug.h 2001/02/20 18:04:28 1.3 @@ -38,5 +38,42 @@ #define D(msg) #endif +#ifdef DEBUG_NEST + +extern int efsd_debug_nest_level; +void efsd_debug_whitespace(int num); + +#define D_ENTER \ +{ \ + efsd_debug_nest_level++; \ + printf("ENTER "); \ + efsd_debug_whitespace(efsd_debug_nest_level); \ + printf("%s, %u %s()\n", __FILE__, __LINE__, __FUNCTION__); \ + fflush(stdout); \ +} +#define D_RETURN \ +{ \ + printf("RETURN "); \ + efsd_debug_whitespace(efsd_debug_nest_level); \ + printf("%s, %u %s()\n", __FILE__, __LINE__, __FUNCTION__); \ + fflush(stdout); \ + efsd_debug_nest_level--; \ + return; \ +} +#define D_RETURN_(x) \ +{ \ + printf("RETURN "); \ + efsd_debug_whitespace(efsd_debug_nest_level); \ + printf("%s, %u %s()\n", __FILE__, __LINE__, __FUNCTION__); \ + fflush(stdout); \ + efsd_debug_nest_level--; \ + return x; \ +} +#else +#define D_ENTER +#define D_RETURN return +#define D_RETURN_(x) return (x) +#endif + #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fam.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- efsd_fam.c 2001/01/19 01:57:55 1.2 +++ efsd_fam.c 2001/02/20 18:04:28 1.3 @@ -40,7 +40,7 @@ extern FAMConnection famcon; extern int clientnums[]; -GList *monitors = NULL; +EfsdList *monitors = NULL; static EfsdFamRequest * efsd_fam_new_request(int client, EfsdCmdId id); static void efsd_fam_free_request(EfsdFamRequest *efr); @@ -61,50 +61,52 @@ { EfsdFamRequest *efr; - efr = (EfsdFamRequest*)malloc(sizeof(EfsdFamRequest)); + D_ENTER; + + efr = NEW(EfsdFamRequest); efr->client = client; efr->id = id; - return efr; + D_RETURN_(efr); } static void efsd_fam_free_request(EfsdFamRequest *efr) { - if (efr) - free(efr); + D_ENTER; + FREE(efr); + D_RETURN; } void efsd_fam_init(void) { + D_ENTER; + D_RETURN; } void efsd_fam_cleanup(void) { - GList *l; - - for (l = g_list_first(monitors); l; l = g_list_next(l)) - { - efsd_fam_free_monitor((EfsdFamMonitor*)l->data); - l->data = NULL; - } - g_list_free(monitors); + D_ENTER; + efsd_list_free(efsd_list_head(monitors), (EfsdFunc)efsd_fam_free_monitor); + D_RETURN; } int efsd_fam_start_monitor(EfsdCommand *com, int client) { + D_ENTER; + if (!efsd_fam_is_monitored(com->efsd_file_cmd.file)) { EfsdFamMonitor *m; m = efsd_fam_new_monitor(com, client, FULL); - monitors = g_list_append(monitors, m); + monitors = efsd_list_prepend(monitors, m); if (efsd_misc_file_is_dir(m->filename)) { @@ -122,34 +124,37 @@ efsd_fam_add_monitor(com, client); } - return (0); + D_RETURN_(0); } int efsd_fam_stop_monitor(EfsdCommand *com, int client) { - return efsd_fam_del_monitor(com, client); + D_ENTER; + D_RETURN_(efsd_fam_del_monitor(com, client)); } int efsd_fam_is_monitored(char *filename) { - GList *l; + EfsdList *l; + + D_ENTER; - l = g_list_first(monitors); + l = efsd_list_head(monitors); while (l) { EfsdFamMonitor *m; - m = (EfsdFamMonitor *)l->data; + m = (EfsdFamMonitor *)efsd_list_data(l); if (!strcmp(m->filename, filename)) - return (1); + D_RETURN_(1); } - return (0); + D_RETURN_(0); } @@ -158,6 +163,8 @@ { EfsdFamMonitor *m; + D_ENTER; + m = efsd_fam_new_monitor(com, client, SIMPLE); if (efsd_misc_file_is_dir(m->filename)) @@ -166,6 +173,8 @@ FAMMonitorFile(&famcon, m->filename, m->fam_req, m); FAMCancelMonitor(&famcon, m->fam_req); + + D_RETURN; } @@ -173,122 +182,129 @@ efsd_fam_new_monitor(EfsdCommand *com, int client, EfsdFamMonType type) { EfsdFamMonitor *m; + + D_ENTER; - m = (EfsdFamMonitor*)malloc(sizeof(EfsdFamMonitor)); + m = NEW(EfsdFamMonitor); m->filename = strdup(com->efsd_file_cmd.file); - m->fam_req = (FAMRequest*)malloc(sizeof(FAMRequest)); + m->fam_req = NEW(FAMRequest); m->clients = NULL; - m->clients = g_list_append(m->clients, - efsd_fam_new_request(client, com->efsd_file_cmd.id)); + m->clients = efsd_list_prepend(m->clients, + efsd_fam_new_request(client, com->efsd_file_cmd.id)); m->use_count = 1; m->type = type; - return m; + D_RETURN_(m); } void efsd_fam_free_monitor(EfsdFamMonitor *m) { + D_ENTER; + if (!m) - return; + D_RETURN; if (m->filename) free (m->filename); if (m->fam_req) free (m->fam_req); - - g_list_free(m->clients); + efsd_list_free(m->clients, (EfsdFunc)efsd_fam_free_request); free (m); + + D_RETURN; } static void efsd_fam_add_monitor(EfsdCommand *com, int client) { - GList *l; - GList *l2; + EfsdList *l; + EfsdList *l2 = NULL; EfsdFamMonitor *m; char *f; + D_ENTER; + f = com->efsd_file_cmd.file; - l = g_list_first(monitors); + l = efsd_list_head(monitors); while (l) { - m = (EfsdFamMonitor *)l->data; + m = (EfsdFamMonitor *)efsd_list_data(l); if (!strcmp(m->filename, f)) { D(("Incrementing usecount for monitoring file %s.\n", f)); m->use_count++; - for (l2 = g_list_first(m->clients); l2; l2 = g_list_next(l2)) + for (l2 = efsd_list_head(m->clients); l2; l2 = efsd_list_next(l2)) { - if (((EfsdFamRequest*)l2->data)->client == client) + if (((EfsdFamRequest*)efsd_list_data(l2))->client == client) break; } if (!l2) { m->clients = - g_list_append(m->clients, efsd_fam_new_request(client, com->efsd_file_cmd.id)); + efsd_list_prepend(m->clients, + efsd_fam_new_request(client, com->efsd_file_cmd.id)); + efsd_fam_force_startstop_monitor(com, client); } - return; + D_RETURN; } - l = g_list_next(l); + l = efsd_list_next(l); } + D_RETURN; } static int efsd_fam_del_monitor(EfsdCommand *com, int client) { - FAMRequest *fam_req = NULL; - GList *l; + EfsdList *l; int success; char *f; EfsdFamMonitor *m = NULL; + + D_ENTER; - l = g_list_first(monitors); + l = efsd_list_head(monitors); f = com->efsd_file_cmd.file; success = 0; while (l) { - m = (EfsdFamMonitor *)l->data; + m = (EfsdFamMonitor *)efsd_list_data(l); if (!strcmp(m->filename, f)) { D(("Decrementing usecount for monitoring file %s.\n", f)); if (--(m->use_count) == 0) { - fam_req = m->fam_req; - monitors = g_list_remove_link(monitors, l); - l->data = NULL; - g_list_free_1(l); - l = NULL; + D(("Use count is zero -- stopping monitoring of %s.\n", f)); + FAMCancelMonitor(&famcon, m->fam_req); + monitors = efsd_list_remove(monitors, l, (EfsdFunc)efsd_fam_free_monitor); } else { EfsdFamRequest *efr; - GList *l2; + EfsdList *l2; /* Use count not zero -- remove given client from list of monitoring clients. */ - for (l2 = g_list_first(m->clients); l2; l2 = g_list_next(l2)) + for (l2 = efsd_list_head(m->clients); l2; l2 = efsd_list_next(l2)) { - efr = (EfsdFamRequest*)l2->data; + efr = (EfsdFamRequest*)efsd_list_data(l2); if (efr->client == client) { - m->clients = g_list_remove_link(m->clients, l2); - efsd_fam_free_request(efr); - l2->data = NULL; - g_list_free_1(l2); + m->clients = efsd_list_remove(m->clients, l2, (EfsdFunc)efsd_fam_free_request); + l2 = NULL; break; } } @@ -297,43 +313,37 @@ break; } - l = g_list_next(l); + l = efsd_list_next(l); } - if (fam_req) - { - /* Use count dropped to zero -- stop monitoring. */ - D(("Use count is zero -- stopping monitoring of %s.\n", f)); - FAMCancelMonitor(&famcon, fam_req); - efsd_fam_free_monitor(m); - } - if (success) - return (0); + D_RETURN_(0); - return (-1); + D_RETURN_(-1); } int efsd_fam_cleanup_client(int client) { - GList *l, *c; + EfsdList *l, *c; + + D_ENTER; - l = g_list_first(monitors); + l = efsd_list_head(monitors); while (l) { EfsdFamMonitor *m; - m = (EfsdFamMonitor *)l->data; + m = (EfsdFamMonitor *)efsd_list_data(l); - c = g_list_first(m->clients); + c = efsd_list_head(m->clients); while (c) { - if (*((int*)c->data) == client) + if (((EfsdFamRequest*)efsd_list_data(c))->client == client) break; - c = g_list_next(c); + c = efsd_list_next(c); } if (c) @@ -344,27 +354,25 @@ D(("Stopping monitoring %s.\n", m->filename)); FAMCancelMonitor(&famcon, m->fam_req); - monitors = g_list_remove_link(monitors, l); - g_list_free_1(l); + monitors = efsd_list_remove(monitors, l, (EfsdFunc)efsd_fam_free_monitor); l = NULL; } else { - /* Use count not zero, but remove client from list of users */ - g_list_remove_link(m->clients, c); - if (!c->prev && !c->next) + if (!efsd_list_prev(c) && !efsd_list_next(c)) { /* This cannot happen -- use count is not zero! */ fprintf(stderr, "FAM connection handling error -- ouch.\n"); exit(-1); } - g_list_free_1(c); + + /* Use count not zero, but remove client from list of users */ + m->clients = efsd_list_remove(m->clients, c, (EfsdFunc)efsd_fam_free_request); } } - l = g_list_next(l); + l = efsd_list_next(l); } - - return (0); + D_RETURN_(0); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fam.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- efsd_fam.h 2001/01/19 01:57:55 1.2 +++ efsd_fam.h 2001/02/20 18:04:28 1.3 @@ -25,10 +25,10 @@ #ifndef efsd_fam_h #define efsd_fam_h -#include <glib.h> #include <fam.h> #include <efsd.h> +#include <efsd_list.h> typedef enum { @@ -62,7 +62,7 @@ and with what command id. list<EfsdFamRequest*>. */ - GList *clients; + EfsdList *clients; } EfsdFamMonitor; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fileops.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- efsd_fileops.c 2001/02/20 03:57:52 1.2 +++ efsd_fileops.c 2001/02/20 18:04:28 1.3 @@ -57,10 +57,12 @@ EfsdEvent ee; int sockfd; + D_ENTER; + sockfd = clientfd[client]; if (sockfd < 0) - return (-1); + D_RETURN_(-1); ee.type = EFSD_EVENT_REPLY; ee.efsd_reply_event.command = *cmd; @@ -69,65 +71,75 @@ ee.efsd_reply_event.data_len = data_len; ee.efsd_reply_event.data = data; - return (efsd_write_event(sockfd, &ee)); + D_RETURN_(efsd_write_event(sockfd, &ee)); } int efsd_remove(EfsdCommand *cmd, int client) { + D_ENTER; + if (remove(cmd->efsd_file_cmd.file) < 0) { - return (efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int efsd_move(EfsdCommand *cmd, int client) { + D_ENTER; + if (rename(cmd->efsd_2file_cmd.file1, cmd->efsd_2file_cmd.file2) < 0) { - return (efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int efsd_copy(EfsdCommand *cmd, int client) { + D_ENTER; + /* if (rename(cmd->efsd_2file_cmd.file1, cmd->efsd_2file_cmd.file2) < 0) { - return (efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); */ - return (efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); } int efsd_symlink(EfsdCommand *cmd, int client) { + D_ENTER; + if (symlink(cmd->efsd_2file_cmd.file1, cmd->efsd_2file_cmd.file2) < 0) { - return (efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int efsd_listdir(EfsdCommand *cmd, int client) { + D_ENTER; + if (efsd_misc_file_is_dir(cmd->efsd_file_cmd.file)) { /* List directory by adding a FAM monitor to the @@ -135,10 +147,10 @@ then removing the monitor. */ efsd_fam_force_startstop_monitor(cmd, client); - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } - return (efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); } @@ -149,6 +161,8 @@ int num_dirs, cur_dir, i; int success = 1; + D_ENTER; + path_dirs = efsd_misc_get_path_dirs(cmd->efsd_file_cmd.file, &num_dirs); /* This is a full path, see libefsd.c */ @@ -171,57 +185,65 @@ /* XXX this does not clean up if we had partial success ... */ if (!success) - return (efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int efsd_chmod(EfsdCommand *cmd, int client) { + D_ENTER; + if (chmod(cmd->efsd_chmod_cmd.file, cmd->efsd_chmod_cmd.mode) < 0) { - return (efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int efsd_set_metadata(EfsdCommand *cmd, int client) { + D_ENTER; printf("The setting metadata people are still out for lunch.\n"); - return (-1); + D_RETURN_(-1); } int efsd_get_metadata(EfsdCommand *cmd, int client) { + D_ENTER; printf("Getting metadata not here yet. Come back later.\n"); - return (-1); + D_RETURN_(-1); } int efsd_start_monitor(EfsdCommand *cmd, int client) { + D_ENTER; + if (efsd_fam_start_monitor(cmd, client) >= 0) - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); - return (efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); } int efsd_stop_monitor(EfsdCommand *cmd, int client) { + D_ENTER; + if (efsd_fam_stop_monitor(cmd, client) >= 0) - return (efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); - return (efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); + D_RETURN_(efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); } @@ -231,6 +253,8 @@ struct stat *st; int result; + D_ENTER; + st = (struct stat*)malloc(sizeof(struct stat)); if (lstat(cmd->efsd_file_cmd.file, st) >= 0) @@ -240,7 +264,7 @@ FREE(st); - return result; + D_RETURN_(result); } @@ -250,10 +274,12 @@ char s[MAXPATHLEN]; int result, n; + D_ENTER; + if ((n = readlink(cmd->efsd_file_cmd.file, s, MAXPATHLEN)) >= 0) result = efsd_send_reply(cmd, SUCCESS, 0, n, s, client); else result = efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client); - return result; + D_RETURN_(result); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- efsd_io.c 2001/02/20 03:57:52 1.5 +++ efsd_io.c 2001/02/20 18:04:28 1.6 @@ -76,8 +76,10 @@ int num_left, num_read; char *ptr; + D_ENTER; + if (sockfd < 0) - return (-1); + D_RETURN_(-1); ptr = (char*)dest; num_left = size; @@ -98,13 +100,15 @@ gettimeofday(&t1, NULL); if (t0.tv_sec < t1.tv_sec && t0.tv_usec < t1.tv_usec) - return (-1); + { + D_RETURN_(-1); + } else goto again; } else { - return (-1); /* Error occurred -- return error. */ + D_RETURN_(-1); /* Error occurred -- return error. */ } } else if (num_read == 0) @@ -114,7 +118,7 @@ ptr += num_read; } - return (size - num_left); + D_RETURN_(size - num_left); } @@ -123,10 +127,12 @@ { int count = 0; + D_ENTER; + if ((count = read_data(sockfd, dest, sizeof(int))) != sizeof(int)) - return (-1); + D_RETURN_(-1); - return (count); + D_RETURN_(count); } @@ -141,14 +147,16 @@ int i; int count = 0, count2 = 0; + D_ENTER; + if ((count = read_data(sockfd, &i, sizeof(int))) != sizeof(int)) - return (-1); + D_RETURN_(-1); *s = (char*)malloc(sizeof(char) * i); if ((count2 = read_data(sockfd, *s, i)) != i) - return (-1); + D_RETURN_(-1); - return (count + count2); + D_RETURN_(count + count2); } @@ -157,8 +165,10 @@ { int result; + D_ENTER; + if (sockfd < 0) - return (-1); + D_RETURN_(-1); if ( (result = write(sockfd, data, size)) != size) { @@ -167,27 +177,30 @@ D(("Broken pipe in write_data()\n")); } - return (-1); + D_RETURN_(-1); } - return (0); + D_RETURN_(0); } static int write_int(int sockfd, int data) { - return write_data(sockfd, &data, sizeof(int)); + D_ENTER; + D_RETURN_(write_data(sockfd, &data, sizeof(int))); } static int write_string(int sockfd, char *data) { + D_ENTER; + if (write_int(sockfd, strlen(data)+1) < 0) - return (-1); + D_RETURN_(-1); - return write_data(sockfd, data, strlen(data)+1); + D_RETURN_(write_data(sockfd, data, strlen(data)+1)); } @@ -196,19 +209,21 @@ { int count = 0, count2; + D_ENTER; + if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.id))) < 0) - return (-1); + D_RETURN_(-1); count2 = count; if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.options))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_string(sockfd, &(cmd->efsd_file_cmd.file))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; - return (count2); + D_RETURN_(count2); } @@ -217,23 +232,25 @@ { int count = 0, count2; + D_ENTER; + if ((count = read_int(sockfd, &(cmd->efsd_2file_cmd.id))) < 0) - return (-1); + D_RETURN_(-1); count2 = count; if ((count = read_int(sockfd, &(cmd->efsd_2file_cmd.options))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_string(sockfd, &(cmd->efsd_2file_cmd.file1))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_string(sockfd, &(cmd->efsd_2file_cmd.file2))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; - return (count2); + D_RETURN_(count2); } @@ -242,19 +259,21 @@ { int count = 0, count2; + D_ENTER; + if ((count = read_int(sockfd, &(cmd->efsd_chmod_cmd.id))) < 0) - return (-1); + D_RETURN_(-1); count2 = count; if ((count = read_string(sockfd, &(cmd->efsd_chmod_cmd.file))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_data(sockfd, &(cmd->efsd_chmod_cmd.mode), sizeof(mode_t))) != sizeof(mode_t)) - return (-1); + D_RETURN_(-1); count2 += count; - return (count2); + D_RETURN_(count2); } @@ -264,34 +283,36 @@ int i; int count = 0, count2; + D_ENTER; + if ((count = read_int(sockfd, &(cmd->efsd_set_metadata_cmd.id))) < 0) - return (-1); + D_RETURN_(-1); count2 = count; if ((count = read_data(sockfd, &(cmd->efsd_set_metadata_cmd.datatype), sizeof(EfsdDatatype))) != sizeof(EfsdDatatype)) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_int(sockfd, &(cmd->efsd_set_metadata_cmd.data_len))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; i = cmd->efsd_set_metadata_cmd.data_len; cmd->efsd_set_metadata_cmd.data = malloc(i); if ((count = read_data(sockfd, &(cmd->efsd_set_metadata_cmd.data), i)) != i) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_string(sockfd, &(cmd->efsd_set_metadata_cmd.key))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_string(sockfd, &(cmd->efsd_set_metadata_cmd.file))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; - return (count2); + D_RETURN_(count2); } @@ -300,19 +321,21 @@ { int count = 0, count2; + D_ENTER; + if ((count = read_int(sockfd, &(cmd->efsd_get_metadata_cmd.id))) < 0) - return (-1); + D_RETURN_(-1); count2 = count; if ((count = read_string(sockfd, &(cmd->efsd_get_metadata_cmd.key))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_string(sockfd, &(cmd->efsd_get_metadata_cmd.file))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; - return (count2); + D_RETURN_(count2); } @@ -321,19 +344,21 @@ { int count, count2; + D_ENTER; + if ((count = read_int(sockfd, &(ee->efsd_filechange_event.id))) < 0) - return (-1); + D_RETURN_(-1); count2 = count; if ((count = read_int(sockfd, (int*)&(ee->efsd_filechange_event.changetype))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_string(sockfd, &(ee->efsd_filechange_event.file))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; - return (count2); + D_RETURN_(count2); } @@ -342,20 +367,22 @@ { int count = 0, count2; + D_ENTER; + if ((count = efsd_read_command(sockfd, &(ee->efsd_reply_event.command))) < 0) - return (-1); + D_RETURN_(-1); count2 = count; if ((count = read_int(sockfd, (int*)&(ee->efsd_reply_event.status))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_int(sockfd, &(ee->efsd_reply_event.errorcode))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if ((count = read_int(sockfd, &(ee->efsd_reply_event.data_len))) < 0) - return (-1); + D_RETURN_(-1); count2 += count; if (ee->efsd_reply_event.data_len > 0) @@ -363,7 +390,7 @@ ee->efsd_reply_event.data = malloc(ee->efsd_reply_event.data_len); if ((count = read_data(sockfd, (ee->efsd_reply_event.data), ee->efsd_reply_event.data_len)) < 0) - return (-1); + D_RETURN_(-1); count2 += count; } else @@ -372,141 +399,155 @@ ee->efsd_reply_event.data = NULL; } - return (count2); + D_RETURN_(count2); } static int write_file_cmd(int sockfd, EfsdCommand *cmd) { + D_ENTER; + if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, cmd->efsd_file_cmd.options) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_file_cmd.file) < 0) - return (-1); + D_RETURN_(-1); - return (0); + D_RETURN_(0); } static int write_2file_cmd(int sockfd, EfsdCommand *cmd) { + D_ENTER; + if (write_int(sockfd, cmd->efsd_2file_cmd.id) < 0) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, cmd->efsd_2file_cmd.options) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_2file_cmd.file1) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_2file_cmd.file2) < 0) - return (-1); + D_RETURN_(-1); - return (0); + D_RETURN_(0); } static int write_chmod_cmd(int sockfd, EfsdCommand *cmd) { + D_ENTER; + if (write_int(sockfd, cmd->efsd_chmod_cmd.id) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_chmod_cmd.file) < 0) - return (-1); + D_RETURN_(-1); if (write_data(sockfd, &(cmd->efsd_chmod_cmd.mode), sizeof(cmd->efsd_chmod_cmd.mode)) < 0) - return (-1); + D_RETURN_(-1); - return (0); + D_RETURN_(0); } static int write_set_metadata_cmd(int sockfd, EfsdCommand *cmd) { + D_ENTER; + if (write_int(sockfd, cmd->efsd_set_metadata_cmd.id) < 0) - return (-1); + D_RETURN_(-1); if (write_data(sockfd, &(cmd->efsd_set_metadata_cmd.datatype), sizeof(EfsdDatatype)) < 0) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, cmd->efsd_set_metadata_cmd.data_len) < 0) - return (-1); + D_RETURN_(-1); if (write_data(sockfd, cmd->efsd_set_metadata_cmd.data, cmd->efsd_set_metadata_cmd.data_len) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_set_metadata_cmd.key) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_set_metadata_cmd.file) < 0) - return (-1); + D_RETURN_(-1); - return (0); + D_RETURN_(0); } static int write_get_metadata_cmd(int sockfd, EfsdCommand *cmd) { + D_ENTER; + if (write_int(sockfd, cmd->efsd_get_metadata_cmd.id) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_get_metadata_cmd.key) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, cmd->efsd_get_metadata_cmd.file) < 0) - return (-1); + D_RETURN_(-1); - return (0); + D_RETURN_(0); } static int write_filechange_event(int sockfd, EfsdEvent *ee) { + D_ENTER; + if (write_int(sockfd, ee->efsd_filechange_event.id) < 0) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, ee->efsd_filechange_event.changetype) < 0) - return (-1); + D_RETURN_(-1); if (write_string(sockfd, ee->efsd_filechange_event.file) < 0) - return (-1); + D_RETURN_(-1); - return (0); + D_RETURN_(0); } static int write_reply_event(int sockfd, EfsdEvent *ee) { + D_ENTER; + if (efsd_write_command(sockfd, &(ee->efsd_reply_event.command)) < 0) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, ee->efsd_reply_event.status) < 0) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, ee->efsd_reply_event.errorcode) < 0) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, ee->efsd_reply_event.data_len) < 0) - return (-1); + D_RETURN_(-1); if (write_data(sockfd, ee->efsd_reply_event.data, ee->efsd_reply_event.data_len) < 0) - return (-1); + D_RETURN_(-1); - return (0); + D_RETURN_(0); } @@ -517,11 +558,13 @@ { int result = (-1); + D_ENTER; + if (!cmd) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, cmd->type) < 0) - return (-1); + D_RETURN_(-1); switch (cmd->type) { @@ -556,7 +599,7 @@ if (result < 0) fprintf(stderr, "error writing command.\n"); - return result; + D_RETURN_(result); } @@ -566,8 +609,10 @@ int result = -1; int count = 0; + D_ENTER; + if (!cmd) - return (-1); + D_RETURN_(-1); if ((count = read_int(sockfd, (int*)&(cmd->type))) >= 0) { @@ -603,7 +648,7 @@ } - return (result + count); + D_RETURN_(result + count); } @@ -612,11 +657,13 @@ { int result = -1; + D_ENTER; + if (!ee) - return (-1); + D_RETURN_(-1); if (write_int(sockfd, ee->type) < 0) - return (-1); + D_RETURN_(-1); switch (ee->type) { @@ -632,7 +679,7 @@ if (result < 0) fprintf(stderr, "error writing event.\n"); - return result; + D_RETURN_(result); } @@ -642,8 +689,10 @@ int result = -1; int count = 0; + D_ENTER; + if (!ee) - return (-1); + D_RETURN_(-1); if ((count = read_int(sockfd, (int*)&(ee->type))) >= 0) { @@ -659,15 +708,17 @@ } } - return (count + result); + D_RETURN_(count + result); } void efsd_cleanup_command(EfsdCommand *ecom) { + D_ENTER; + if (!ecom) - return; + D_RETURN; switch (ecom->type) { @@ -699,14 +750,17 @@ break; default: } + D_RETURN; } void efsd_cleanup_event(EfsdEvent *ev) { + D_ENTER; + if (!ev) - return; + D_RETURN; switch (ev->type) { @@ -717,5 +771,6 @@ FREE(ev->efsd_filechange_event.file); break; default: - } + } + D_RETURN; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- efsd_misc.c 2001/02/07 04:51:13 1.5 +++ efsd_misc.c 2001/02/20 18:04:28 1.6 @@ -38,21 +38,23 @@ #define mkdir _mkdir2 #endif +#include <efsd_debug.h> #include <efsd_misc.h> - int efsd_misc_file_exists(char *filename) { struct stat st; + D_ENTER; + if (!filename) - return (0); + D_RETURN_(0); if (stat(filename, &st) < 0) - return (0); + D_RETURN_(0); - return (1); + D_RETURN_(1); } @@ -61,13 +63,15 @@ { struct stat st; + D_ENTER; + if (!filename) - return (0); + D_RETURN_(0); if (stat(filename, &st) < 0) - return (0); + D_RETURN_(0); - return (S_ISDIR(st.st_mode)); + D_RETURN_(S_ISDIR(st.st_mode)); } @@ -76,8 +80,10 @@ { int len; + D_ENTER; + if (!s || s[0] == '\0') - return; + D_RETURN; len = strlen(s); @@ -86,23 +92,26 @@ s[len-1] = '\0'; len--; } + D_RETURN; } int efsd_misc_is_absolute_path(char *s) { + D_ENTER; + if (!s || s[0] == '\0') - return (0); + D_RETURN_(0); #ifndef __EMX__ if (s[0] == '/') #else if (_fnisabs(s)) #endif - return (1); + D_RETURN_(1); - return (0); + D_RETURN_(0); } @@ -116,10 +125,12 @@ int drive_present = 0; #endif + D_ENTER; + if (!s || s[0] == '\0') { *num_dirs = 0; - return NULL; + D_RETURN_(NULL); } efsd_misc_remove_trailing_slashes(s); @@ -171,19 +182,24 @@ result[num] = strdup(q); - return (result); + D_RETURN_(result); } +#ifdef __EMX__ void efsd_slashify(char *s) { - int i; + int i; - if ( s == NULL ) - return; - - for (i = 0; i<strlen(s); i++ ) - { - if ( s[i] == '\\' ) - s[i] = '/'; - } + D_ENTER; + + if (!s || s[0] == '\0') + D_RETURN; + + for (i = 0; i< strlen(s); i++) + { + if (s[i] == '\\') + s[i] = '/'; + } + D_RETURN; } +#endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- efsd_misc.h 2001/02/20 03:57:52 1.4 +++ efsd_misc.h 2001/02/20 18:04:28 1.5 @@ -25,14 +25,17 @@ #ifndef __efsd_misc_h #define __efsd_misc_h +#define NEW(X) ((X*) malloc(sizeof(X))) #define FREE(X) { if (X) { free(X); X = NULL; } } + int efsd_misc_file_exists(char *filename); int efsd_misc_file_is_dir(char *filename); void efsd_misc_remove_trailing_slashes(char *path); int efsd_misc_is_absolute_path(char *path); char **efsd_misc_get_path_dirs(char *path, int *num_dirs); +#ifdef __EMX__ void efsd_slashify(char *path); - +#endif #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- libefsd.c 2001/02/20 03:57:52 1.7 +++ libefsd.c 2001/02/20 18:04:28 1.8 @@ -39,6 +39,7 @@ #endif #include <efsd.h> +#include <efsd_debug.h> #include <efsd_io.h> #include <efsd_common.h> #include <libefsd.h> @@ -60,33 +61,39 @@ { char *result; + D_ENTER; + if (!file || !file[0]) - return NULL; + D_RETURN_(NULL); #ifndef __EMX__ if (file[0] == '/') #else if (_fnisabs(file)) #endif - return strdup(file); + D_RETURN_(strdup(file)); result = getcwd(NULL, 0); result = realloc(result, strlen(result) + strlen(file) + 2); strcat(result, "/"); strcat(result, file); - return result; + D_RETURN_(result); } static void send_command(EfsdConnection *ec, EfsdCommand *com) { + D_ENTER; + if (!ec || !com) - return; + D_RETURN; if (efsd_write_command(ec->fd, com) < 0) fprintf(stderr, "libefsd: write() error.\n"); + + D_RETURN; } @@ -95,7 +102,8 @@ { static EfsdCmdId id_counter = 0; - return ++id_counter; + D_ENTER; + D_RETURN_(++id_counter); } @@ -105,8 +113,10 @@ char *f; EfsdCommand cmd; + D_ENTER; + if (!ec || !file || file[0] == '\0') - return -1; + D_RETURN_(-1); cmd.type = type; cmd.efsd_file_cmd.id = get_next_id(); @@ -115,7 +125,7 @@ free(f); send_command(ec, &cmd); - return cmd.efsd_file_cmd.id; + D_RETURN_(cmd.efsd_file_cmd.id); } @@ -125,8 +135,10 @@ char *f; EfsdCommand cmd; + D_ENTER; + if (!ec || !file1 || file1[0] == '\0' || file2 || file2[0] == '\0') - return -1; + D_RETURN_(-1); cmd.type = type; cmd.efsd_2file_cmd.id = get_next_id(); @@ -138,7 +150,7 @@ free(f); send_command(ec, &cmd); - return cmd.efsd_2file_cmd.id; + D_RETURN_(cmd.efsd_2file_cmd.id); } @@ -153,13 +165,15 @@ struct sockaddr_un cli_sun; EfsdConnection *ec; + D_ENTER; + ec = (EfsdConnection*)malloc(sizeof(EfsdConnection)); if (!ec) - return NULL; + D_RETURN_(NULL); if ( (ec->fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { - fprintf(stderr, "libefsd: socket() error.\n"); return NULL; + fprintf(stderr, "libefsd: socket() error.\n"); D_RETURN_(NULL); } bzero(&cli_sun, sizeof(cli_sun)); @@ -168,7 +182,7 @@ if (connect(ec->fd, (struct sockaddr*)&cli_sun, sizeof(cli_sun)) < 0) { - fprintf(stderr, "libefsd: connect() error.\n"); return NULL; + fprintf(stderr, "libefsd: connect() error.\n"); D_RETURN_(NULL); } if (fcntl(ec->fd, F_SETFL, O_NONBLOCK) < 0) @@ -177,17 +191,19 @@ exit(-1); } - return (ec); + D_RETURN_(ec); } int efsd_get_connection_fd(EfsdConnection *ec) { + D_ENTER; + if (!ec) - return (-1); + D_RETURN_(-1); - return ec->fd; + D_RETURN_(ec->fd); } @@ -196,14 +212,17 @@ { EfsdCommand cmd; + D_ENTER; + if (!ec) - return; + D_RETURN; cmd.type = EFSD_CMD_CLOSE; send_command(ec, &cmd); close(ec->fd); free(ec); + D_RETURN; } @@ -213,8 +232,10 @@ fd_set fdset; struct timeval tv; + D_ENTER; + if (!ec || ec->fd < 0) - return (-1); + D_RETURN_(-1); FD_ZERO(&fdset); FD_SET(ec->fd, &fdset); @@ -223,16 +244,18 @@ tv.tv_usec = 0; select(ec->fd + 1, &fdset, NULL, NULL, &tv); - return (FD_ISSET(ec->fd, &fdset)); + D_RETURN_(FD_ISSET(ec->fd, &fdset)); } int efsd_next_event(EfsdConnection *ec, EfsdEvent *ev) { + D_ENTER; + if (!ec || !ev || ec->fd < 0) - return (-1); + D_RETURN_(-1); - return (efsd_read_event(ec->fd, ev)); + D_RETURN_(efsd_read_event(ec->fd, ev)); } @@ -241,56 +264,64 @@ { fd_set fdset; + D_ENTER; + if (!ec || !ev || ec->fd < 0) - return (-1); + D_RETURN_(-1); FD_ZERO(&fdset); FD_SET(ec->fd, &fdset); select(ec->fd+1, &fdset, NULL, NULL, NULL); - return (efsd_read_event(ec->fd, ev)); + D_RETURN_(efsd_read_event(ec->fd, ev)); } EfsdCmdId efsd_remove(EfsdConnection *ec, char *filename) { - return (file_cmd(ec, EFSD_CMD_REMOVE, filename)); + D_ENTER; + D_RETURN_(file_cmd(ec, EFSD_CMD_REMOVE, filename)); } EfsdCmdId efsd_move(EfsdConnection *ec, char *from_file, char *to_file) { - return (twofile_cmd(ec, EFSD_CMD_MOVE, from_file, to_file)); + D_ENTER; + D_RETURN_(twofile_cmd(ec, EFSD_CMD_MOVE, from_file, to_file)); } EfsdCmdId efsd_copy(EfsdConnection *ec, char *from_file, char *to_file) { - return (twofile_cmd(ec, EFSD_CMD_COPY, from_file, to_file)); + D_ENTER; + D_RETURN_(twofile_cmd(ec, EFSD_CMD_COPY, from_file, to_file)); } EfsdCmdId efsd_symlink(EfsdConnection *ec, char *from_file, char *to_file) { - return (twofile_cmd(ec, EFSD_CMD_SYMLINK, from_file, to_file)); + D_ENTER; + D_RETURN_(twofile_cmd(ec, EFSD_CMD_SYMLINK, from_file, to_file)); } EfsdCmdId efsd_listdir(EfsdConnection *ec, char *dirname) { - return (file_cmd(ec, EFSD_CMD_LISTDIR, dirname)); + D_ENTER; + D_RETURN_(file_cmd(ec, EFSD_CMD_LISTDIR, dirname)); } EfsdCmdId efsd_makedir(EfsdConnection *ec, char *dirname) { - return (file_cmd(ec, EFSD_CMD_MAKEDIR, dirname)); + D_ENTER; + D_RETURN_(file_cmd(ec, EFSD_CMD_MAKEDIR, dirname)); } @@ -300,8 +331,10 @@ char *f; EfsdCommand cmd; + D_ENTER; + if (!ec || !filename || filename[0] == '\0') - return -1; + D_RETURN_(-1); cmd.type = EFSD_CMD_CHMOD; cmd.efsd_chmod_cmd.id = get_next_id(); @@ -311,7 +344,7 @@ free(f); send_command(ec, &cmd); - return cmd.efsd_chmod_cmd.id; + D_RETURN_(cmd.efsd_chmod_cmd.id); } @@ -322,9 +355,11 @@ char *f; EfsdCommand cmd; + D_ENTER; + if (!ec || !filename || filename[0] == '\0' || !key || key[0] == '\0' || !data) - return -1; + D_RETURN_(-1); cmd.type = EFSD_CMD_SETMETA; cmd.efsd_set_metadata_cmd.id = get_next_id(); @@ -337,7 +372,7 @@ free(f); send_command(ec, &cmd); - return cmd.efsd_set_metadata_cmd.id; + D_RETURN_(cmd.efsd_set_metadata_cmd.id); } @@ -347,9 +382,11 @@ char *f; EfsdCommand cmd; + D_ENTER; + if (!ec || !filename || filename[0] == '\0' || !key || key[0] == '\0') - return -1; + D_RETURN_(-1); cmd.type = EFSD_CMD_GETMETA; cmd.efsd_get_metadata_cmd.id = get_next_id(); @@ -359,35 +396,39 @@ free(f); send_command(ec, &cmd); - return cmd.efsd_get_metadata_cmd.id; + D_RETURN_(cmd.efsd_get_metadata_cmd.id); } EfsdCmdId efsd_start_monitor(EfsdConnection *ec, char *filename) { - return (file_cmd(ec, EFSD_CMD_STARTMON, filename)); + D_ENTER; + D_RETURN_(file_cmd(ec, EFSD_CMD_STARTMON, filename)); } EfsdCmdId efsd_stop_monitor(EfsdConnection *ec, char *filename) { - return (file_cmd(ec, EFSD_CMD_STOPMON, filename)); + D_ENTER; + D_RETURN_(file_cmd(ec, EFSD_CMD_STOPMON, filename)); } EfsdCmdId efsd_stat(EfsdConnection *ec, char *filename) { - return (file_cmd(ec, EFSD_CMD_STAT, filename)); + D_ENTER; + D_RETURN_(file_cmd(ec, EFSD_CMD_STAT, filename)); } EfsdCmdId efsd_readlink(EfsdConnection *ec, char *filename) { - return (file_cmd(ec, EFSD_CMD_READLINK, filename)); + D_ENTER; + D_RETURN_(file_cmd(ec, EFSD_CMD_READLINK, filename)); } |
From: <enl...@so...> - 2001-02-20 18:03:59
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd Modified Files: README configure.in Log Message: * No more glib. * Fixed a bug in the demultiplexing of fam events to multiple clients -- clients that monitored a file/dir that's already monitored didn't see the exists....end exists events. * More debugging code to get a function nesting tree in case we need it. To make it work, compile with -DDEBUG_NEST. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/README,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- README 2001/01/19 01:36:35 1.1 +++ README 2001/02/20 18:04:28 1.2 @@ -45,8 +45,6 @@ * FAM, the File Alteration Monitor, available at http://oss.sgi.com/projects/fam. -* Glib (at least for now :) available at http://www.gtk.org. - To run the demo: ================ =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- configure.in 2001/01/19 01:36:35 1.1 +++ configure.in 2001/02/20 18:04:28 1.2 @@ -28,24 +28,6 @@ exit 1; fi; -dnl Check for glib. -AC_CHECK_PROG(GLIB_OK, glib-config, "yes", "no") -if test "$GLIB_OK" = "no"; then cat <<EOF; - ------------------------------------------------------- -ERROR: Could not find a complete installation of glib. - -You can download glib at: -*** FIXME *** ------------------------------------------------------- -EOF -exit 1; -fi; -GLIB_LIBS=`glib-config --libs` -GLIB_CFLAGS=`glib-config --cflags` -AC_SUBST(GLIB_LIBS) -AC_SUBST(GLIB_CFLAGS) - dnl Set PACKAGE_LOCALE_DIR in config.h. if test "x${prefix}" = "xNONE"; then |
From: <enl...@so...> - 2001-02-20 18:03:59
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/demo Modified Files: efsddemo.c Log Message: * No more glib. * Fixed a bug in the demultiplexing of fam events to multiple clients -- clients that monitored a file/dir that's already monitored didn't see the exists....end exists events. * More debugging code to get a function nesting tree in case we need it. To make it work, compile with -DDEBUG_NEST. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/efsddemo.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- efsddemo.c 2001/02/20 03:57:52 1.8 +++ efsddemo.c 2001/02/20 18:04:28 1.9 @@ -367,7 +367,7 @@ demo -- you should see the use counts for the monitor be in-/decremented. */ - sleep(2); + sleep(10); /* Stop monitoring home directory */ id = efsd_stop_monitor(ec, getenv("HOME")); |
From: <enl...@so...> - 2001-02-20 18:15:59
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Added Files: efsd_debug.c efsd_list.c efsd_list.h Log Message: Forgot to add these ... |
From: <enl...@so...> - 2001-02-20 19:33:21
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd_io.c Log Message: More output to see what's wrong in Michael's case... =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- efsd_io.c 2001/02/20 18:04:28 1.6 +++ efsd_io.c 2001/02/20 19:34:20 1.7 @@ -172,11 +172,21 @@ if ( (result = write(sockfd, data, size)) != size) { - if (result < 0 && errno == EPIPE) + if (result < 0) { - D(("Broken pipe in write_data()\n")); + if (errno == EPIPE) + { + D(("Broken pipe in write_data()\n")); + } + else + { + perror("Write error:"); + } } - + else + { + D(("Couldn't write all data.\n")); + } D_RETURN_(-1); } |
From: <enl...@so...> - 2001-02-20 19:46:44
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd_io.c Log Message: Okay -- more output. You should see the following output from the server when running the demo in a -DDEBUG build: <...> efsd-debug: Reading command ... efsd-debug: Handling STARTMON efsd-debug: Starting monitoring dir /home/elwood. efsd-debug: Writing reply event. efsd-debug: Done. efsd-debug: Writing filechange event. efsd-debug: Writing filechange event. <... lots of these, for each file in your home> efsd-debug: Reading command ... efsd-debug: Handling STOPMON efsd-debug: Decrementing usecount for monitoring file /home/elwood. efsd-debug: Use count is zero -- stopping monitoring of /home/elwood. efsd-debug: Writing reply event. efsd-debug: Done. efsd-debug: Reading command ... efsd-debug: Handling CLOSE efsd-debug: Closing connection 0 efsd-debug: Done. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- efsd_io.c 2001/02/20 19:34:20 1.7 +++ efsd_io.c 2001/02/20 19:47:43 1.8 @@ -678,9 +678,11 @@ switch (ee->type) { case EFSD_EVENT_FILECHANGE: + D(("Writing filechange event.\n")); result = write_filechange_event(sockfd, ee); break; case EFSD_EVENT_REPLY: + D(("Writing reply event.\n")); result = write_reply_event(sockfd, ee); break; default: |
From: <enl...@so...> - 2001-02-20 21:57:25
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd_io.c Log Message: Of course write()s can see EAGAIN errors too ... =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- efsd_io.c 2001/02/20 19:47:43 1.8 +++ efsd_io.c 2001/02/20 21:58:25 1.9 @@ -163,31 +163,48 @@ static int write_data(int sockfd, void *data, int size) { - int result; + int result; + struct timeval t0; + struct timeval t1; D_ENTER; if (sockfd < 0) D_RETURN_(-1); - if ( (result = write(sockfd, data, size)) != size) + gettimeofday(&t0, NULL); + + for ( ; ; ) { - if (result < 0) + if ( (result = write(sockfd, data, size)) != size) { - if (errno == EPIPE) - { - D(("Broken pipe in write_data()\n")); - } - else + if (result < 0) { - perror("Write error:"); + if (errno == EAGAIN) + { + gettimeofday(&t1, NULL); + if (t0.tv_sec < t1.tv_sec && + t0.tv_usec < t1.tv_usec) + { + D_RETURN_(-1); + } + } + else if (errno == EPIPE) + { + D(("Broken pipe in write_data()\n")); + D_RETURN_(-1); + } + else + { + perror("Write error:"); + D_RETURN_(-1); + } } } else { - D(("Couldn't write all data.\n")); + break; } - D_RETURN_(-1); } D_RETURN_(0); |
From: <enl...@so...> - 2001-02-22 20:13:40
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd_io.c Log Message: Writing data should now also work when data could only partially be written ... =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- efsd_io.c 2001/02/20 21:58:25 1.9 +++ efsd_io.c 2001/02/22 20:14:45 1.10 @@ -90,7 +90,6 @@ while (num_left) { again: - errno = 0; num_read = read(sockfd, ptr, num_left); if (num_read < 0) @@ -166,48 +165,55 @@ int result; struct timeval t0; struct timeval t1; + int num_left, num_written; + char *ptr; D_ENTER; if (sockfd < 0) D_RETURN_(-1); + ptr = (char*)data; + num_left = size; + num_written = 0; + gettimeofday(&t0, NULL); - for ( ; ; ) + while (num_left) { - if ( (result = write(sockfd, data, size)) != size) + again: + num_written = write(sockfd, ptr, num_left); + + if (num_written < 0) { - if (result < 0) + if (errno == EAGAIN) { - if (errno == EAGAIN) - { - gettimeofday(&t1, NULL); - if (t0.tv_sec < t1.tv_sec && - t0.tv_usec < t1.tv_usec) - { - D_RETURN_(-1); - } - } - else if (errno == EPIPE) - { - D(("Broken pipe in write_data()\n")); - D_RETURN_(-1); - } - else + gettimeofday(&t1, NULL); + if (t0.tv_sec < t1.tv_sec && + t0.tv_usec < t1.tv_usec) { - perror("Write error:"); D_RETURN_(-1); } + else + goto again; } - } - else - { - break; + else if (errno == EPIPE) + { + D(("Broken pipe in write_data()\n")); + D_RETURN_(-1); + } + else + { + perror("Write error:"); + D_RETURN_(-1); + } } + + num_left -= num_written; + ptr += num_written; } - D_RETURN_(0); + D_RETURN_(size - num_left); } |
From: <enl...@so...> - 2001-02-23 19:45:22
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd_io.c Log Message: Data read/write cleanups -- select() in read_data() and write_data() as well, to avoid burning CPU cycles ... =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- efsd_io.c 2001/02/22 20:14:45 1.10 +++ efsd_io.c 2001/02/23 19:46:00 1.11 @@ -65,16 +65,13 @@ static int write_filechange_event(int sockfd, EfsdEvent *ee); static int write_reply_event(int sockfd, EfsdEvent *ee); -/* Read data from the client -- adapted from - the improved read() functions in the Stevens books. -*/ int read_data(int sockfd, void *dest, int size) { - struct timeval t0; - struct timeval t1; int num_left, num_read; + fd_set fdset; char *ptr; + struct timeval tv; D_ENTER; @@ -84,39 +81,42 @@ ptr = (char*)dest; num_left = size; num_read = 0; - - gettimeofday(&t0, NULL); + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&fdset); while (num_left) { - again: - num_read = read(sockfd, ptr, num_left); + FD_SET(sockfd, &fdset); - if (num_read < 0) + while (select(sockfd + 1, &fdset, NULL, NULL, &tv) < 0) { - if (errno == EAGAIN) + if (errno == EINTR) { - gettimeofday(&t1, NULL); - if (t0.tv_sec < t1.tv_sec && - t0.tv_usec < t1.tv_usec) - { - D_RETURN_(-1); - } - else - goto again; + D(("read_data select() interrupted\n")); + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&fdset); } else { - D_RETURN_(-1); /* Error occurred -- return error. */ + fprintf(stderr, "Select error -- exiting.\n"); + exit(-1); } } + + if ((num_read = read(sockfd, ptr, num_left)) < 0) + { + perror("Read error:"); + D_RETURN_(-1); /* Error occurred -- return error. */ + } else if (num_read == 0) break; /* End of file */ num_left -= num_read; ptr += num_read; } - + D_RETURN_(size - num_left); } @@ -162,11 +162,10 @@ static int write_data(int sockfd, void *data, int size) { - int result; - struct timeval t0; - struct timeval t1; int num_left, num_written; + fd_set fdset; char *ptr; + struct timeval tv; D_ENTER; @@ -176,28 +175,33 @@ ptr = (char*)data; num_left = size; num_written = 0; + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&fdset); - gettimeofday(&t0, NULL); - while (num_left) { - again: - num_written = write(sockfd, ptr, num_left); + FD_SET(sockfd, &fdset); - if (num_written < 0) + while (select(sockfd + 1, NULL, &fdset, NULL, &tv) < 0) { - if (errno == EAGAIN) + if (errno == EINTR) + { + D(("read_data select() interrupted\n")); + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&fdset); + } + else { - gettimeofday(&t1, NULL); - if (t0.tv_sec < t1.tv_sec && - t0.tv_usec < t1.tv_usec) - { - D_RETURN_(-1); - } - else - goto again; + fprintf(stderr, "Select error -- exiting.\n"); + exit(-1); } - else if (errno == EPIPE) + } + + if ((num_written = write(sockfd, ptr, num_left)) < 0) + { + if (errno == EPIPE) { D(("Broken pipe in write_data()\n")); D_RETURN_(-1); @@ -208,11 +212,11 @@ D_RETURN_(-1); } } - + num_left -= num_written; ptr += num_written; } - + D_RETURN_(size - num_left); } |
From: <enl...@so...> - 2001-02-27 00:09:28
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd_io.c Log Message: I didn't check the select() return value. Ouch. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- efsd_io.c 2001/02/23 19:46:00 1.11 +++ efsd_io.c 2001/02/27 00:10:45 1.12 @@ -68,7 +68,7 @@ int read_data(int sockfd, void *dest, int size) { - int num_left, num_read; + int num_left, num_read, result; fd_set fdset; char *ptr; struct timeval tv; @@ -89,7 +89,7 @@ { FD_SET(sockfd, &fdset); - while (select(sockfd + 1, &fdset, NULL, NULL, &tv) < 0) + while ((result = select(sockfd + 1, &fdset, NULL, NULL, &tv)) < 0) { if (errno == EINTR) { @@ -105,6 +105,11 @@ } } + if (result == 0) + { + D_RETURN_(-1); + } + if ((num_read = read(sockfd, ptr, num_left)) < 0) { perror("Read error:"); @@ -162,7 +167,7 @@ static int write_data(int sockfd, void *data, int size) { - int num_left, num_written; + int num_left, num_written, result; fd_set fdset; char *ptr; struct timeval tv; @@ -183,7 +188,7 @@ { FD_SET(sockfd, &fdset); - while (select(sockfd + 1, NULL, &fdset, NULL, &tv) < 0) + while ((result = select(sockfd + 1, NULL, &fdset, NULL, &tv)) < 0) { if (errno == EINTR) { @@ -197,6 +202,11 @@ fprintf(stderr, "Select error -- exiting.\n"); exit(-1); } + } + + if (result == 0) + { + D_RETURN_(-1); } if ((num_written = write(sockfd, ptr, num_left)) < 0) |
From: <enl...@so...> - 2001-02-27 21:57:40
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd Modified Files: configure.in Log Message: Patch from Humming to specify fam's directory, and you even get 3 extra whitespaces for free, yes, free! =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/configure.in,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- configure.in 2001/02/20 18:04:28 1.2 +++ configure.in 2001/02/27 21:59:00 1.3 @@ -11,6 +11,9 @@ AM_PROG_LIBTOOL dnl Check for fam. +AC_ARG_WITH(fam, + [ --with-fam=DIR use DIR where fam is installed.], + [CPPFLAGS="$CPPFLAGS -I$withval/include"; LDFLAGS="$LDFLAGS -L$withval/lib"]) FAM_HEADER_OK="yes" FAM_LIB_OK="yes" AC_CHECK_HEADER(fam.h, , FAM_HEADER_OK="no") |
From: <enl...@li...> - 2001-03-02 01:22:42
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: Makefile.am efsd.c efsd_common.c efsd_debug.c efsd_debug.h efsd_io.c efsd_misc.c efsd_misc.h libefsd.c libefsd.h Log Message: * Moved socket file into ~/.e or, if there's no HOME, /tmp/.e, creating the directory in case it doesn't exist yet. * The stresstest with /dev in combination with lots of fs commands showed that there's more that can go wrong and that I'll need some kind of job queueing. All fs commands in libefsd return a nonnegative EfsdCmdId now only in case the command could successfully be written, and a value < 0 otherwise. This includes efsd_close(). More later. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/Makefile.am,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- Makefile.am 2001/02/20 18:04:28 1.3 +++ Makefile.am 2001/03/02 01:24:08 1.4 @@ -5,7 +5,7 @@ # A list of all the files in the current directory which can be regenerated MAINTAINERCLEANFILES = Makefile.in Makefile -INCLUDES = -DDEBUG +INCLUDES = -DDEBUG #-DDEBUG_NEST include_HEADERS = \ efsd.h \ @@ -38,5 +38,7 @@ efsd_io.c \ efsd_common.h \ efsd_common.c \ + efsd_misc.h \ + efsd_misc.c \ libefsd.c =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- efsd.c 2001/02/20 18:04:28 1.11 +++ efsd.c 2001/03/02 01:24:08 1.12 @@ -148,7 +148,7 @@ result = efsd_stop_monitor(command, client); break; case EFSD_CMD_STAT: - D(("Handling STAT\n")); + D(("Handling STAT on %s\n", command->efsd_file_cmd.file)); result = efsd_stat(command, client); break; case EFSD_CMD_READLINK: @@ -410,7 +410,10 @@ for (i = 0; i < EFSD_CLIENTS; i++) { if (clientfd[i] >= 0) - close(clientfd[i]); + { + D(("Cleaning up client %i, fd %i\n", i, clientfd[i])); + close(clientfd[i]); + } } close(listen_fd); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_common.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- efsd_common.c 2001/02/20 18:04:28 1.3 +++ efsd_common.c 2001/03/02 01:24:08 1.4 @@ -62,7 +62,11 @@ if (!dir) dir = "/tmp"; - snprintf(s, sizeof(s), "%s/.efsd", dir); + snprintf(s, sizeof(s), "%s/.e", dir); + if (!efsd_misc_file_is_dir(s)) + efsd_misc_mkdir(s); + + snprintf(s, sizeof(s), "%s/.e/efsd_socket", dir); s[sizeof(s)-1] = '\0'; D_RETURN_(s); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_debug.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_debug.c 2001/02/20 18:16:58 1.1 +++ efsd_debug.c 2001/03/02 01:24:08 1.2 @@ -26,8 +26,9 @@ # include <config.h> #endif -#ifdef DEBUG #include <stdio.h> +#include <sys/time.h> +#include <unistd.h> int efsd_debug_nest_level = 0; @@ -39,4 +40,12 @@ printf("-"); } -#endif +void +efsd_debug_print_timestamp(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + printf("%li.%li ", tv.tv_sec, tv.tv_usec); +} + =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_debug.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- efsd_debug.h 2001/02/20 18:04:28 1.3 +++ efsd_debug.h 2001/03/02 01:24:08 1.4 @@ -27,10 +27,13 @@ #include <stdio.h> +void efsd_debug_print_timestamp(void); + #ifdef DEBUG #define D(msg) \ { \ printf("efsd-debug: "); \ + efsd_debug_print_timestamp(); \ printf msg; \ fflush(stdout); \ } @@ -47,6 +50,7 @@ { \ efsd_debug_nest_level++; \ printf("ENTER "); \ + efsd_debug_print_timestamp(); \ efsd_debug_whitespace(efsd_debug_nest_level); \ printf("%s, %u %s()\n", __FILE__, __LINE__, __FUNCTION__); \ fflush(stdout); \ @@ -54,6 +58,7 @@ #define D_RETURN \ { \ printf("RETURN "); \ + efsd_debug_print_timestamp(); \ efsd_debug_whitespace(efsd_debug_nest_level); \ printf("%s, %u %s()\n", __FILE__, __LINE__, __FUNCTION__); \ fflush(stdout); \ @@ -63,6 +68,7 @@ #define D_RETURN_(x) \ { \ printf("RETURN "); \ + efsd_debug_print_timestamp(); \ efsd_debug_whitespace(efsd_debug_nest_level); \ printf("%s, %u %s()\n", __FILE__, __LINE__, __FUNCTION__); \ fflush(stdout); \ =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- efsd_io.c 2001/02/27 00:10:45 1.12 +++ efsd_io.c 2001/03/02 01:24:08 1.13 @@ -107,6 +107,7 @@ if (result == 0) { + D(("Read timed out...\n")); D_RETURN_(-1); } @@ -206,6 +207,7 @@ if (result == 0) { + D(("Write timed out...\n")); D_RETURN_(-1); } @@ -213,7 +215,7 @@ { if (errno == EPIPE) { - D(("Broken pipe in write_data()\n")); + D(("Broken pipe in write_data() to fd %i\n", sockfd)); D_RETURN_(-1); } else @@ -715,7 +717,8 @@ switch (ee->type) { case EFSD_EVENT_FILECHANGE: - D(("Writing filechange event.\n")); + D(("Writing filechange event for file %s\n", + ee->efsd_filechange_event.file)); result = write_filechange_event(sockfd, ee); break; case EFSD_EVENT_REPLY: =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- efsd_misc.c 2001/02/20 18:04:28 1.6 +++ efsd_misc.c 2001/03/02 01:24:08 1.7 @@ -41,6 +41,9 @@ #include <efsd_debug.h> #include <efsd_misc.h> +static mode_t default_mode = (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | + S_IXGRP | S_IROTH | S_IXOTH); + int efsd_misc_file_exists(char *filename) { @@ -72,6 +75,23 @@ D_RETURN_(0); D_RETURN_(S_ISDIR(st.st_mode)); +} + + +int +efsd_misc_mkdir(char *filename) +{ + D_ENTER; + + if (!filename) + D_RETURN_(0); + + if (mkdir(filename, default_mode) < 0) + { + D_RETURN_(0); + } + + D_RETURN_(1); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- efsd_misc.h 2001/02/20 18:04:28 1.5 +++ efsd_misc.h 2001/03/02 01:24:08 1.6 @@ -31,6 +31,7 @@ int efsd_misc_file_exists(char *filename); int efsd_misc_file_is_dir(char *filename); +int efsd_misc_mkdir(char *filename); void efsd_misc_remove_trailing_slashes(char *path); int efsd_misc_is_absolute_path(char *path); char **efsd_misc_get_path_dirs(char *path, int *num_dirs); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- libefsd.c 2001/02/20 18:04:28 1.8 +++ libefsd.c 2001/03/02 01:24:08 1.9 @@ -50,7 +50,7 @@ }; -static void send_command(EfsdConnection *ec, EfsdCommand *com); +static int send_command(EfsdConnection *ec, EfsdCommand *com); static EfsdCmdId get_next_id(void); static EfsdCmdId file_cmd(EfsdConnection *ec, EfsdCommandType type, char *file); static EfsdCmdId twofile_cmd(EfsdConnection *ec, EfsdCommandType type, @@ -82,18 +82,21 @@ } -static void +static int send_command(EfsdConnection *ec, EfsdCommand *com) { D_ENTER; if (!ec || !com) - D_RETURN; + D_RETURN_(-1); if (efsd_write_command(ec->fd, com) < 0) - fprintf(stderr, "libefsd: write() error.\n"); + { + fprintf(stderr, "libefsd: couldn't write command.\n"); + D_RETURN_(-1); + } - D_RETURN; + D_RETURN_(0); } @@ -124,7 +127,10 @@ cmd.efsd_file_cmd.file = strdup(f); free(f); - send_command(ec, &cmd); + if (send_command(ec, &cmd) < 0) + { + D_RETURN_(-1); + } D_RETURN_(cmd.efsd_file_cmd.id); } @@ -149,7 +155,6 @@ cmd.efsd_2file_cmd.file2 = strdup(f); free(f); - send_command(ec, &cmd); D_RETURN_(cmd.efsd_2file_cmd.id); } @@ -207,7 +212,7 @@ } -void +int efsd_close(EfsdConnection *ec) { EfsdCommand cmd; @@ -215,14 +220,17 @@ D_ENTER; if (!ec) - D_RETURN; + D_RETURN_(-1); cmd.type = EFSD_CMD_CLOSE; - send_command(ec, &cmd); + if (send_command(ec, &cmd) < 0) + { + D_RETURN_(-1); + } close(ec->fd); free(ec); - D_RETURN; + D_RETURN_(0); } @@ -343,7 +351,10 @@ cmd.efsd_chmod_cmd.file = strdup(f); free(f); - send_command(ec, &cmd); + if (send_command(ec, &cmd) < 0) + { + D_RETURN_(-1); + } D_RETURN_(cmd.efsd_chmod_cmd.id); } @@ -371,7 +382,10 @@ cmd.efsd_set_metadata_cmd.file = strdup(f); free(f); - send_command(ec, &cmd); + if (send_command(ec, &cmd) < 0) + { + D_RETURN_(-1); + } D_RETURN_(cmd.efsd_set_metadata_cmd.id); } @@ -395,7 +409,10 @@ cmd.efsd_get_metadata_cmd.file = strdup(f); free(f); - send_command(ec, &cmd); + if (send_command(ec, &cmd) < 0) + { + D_RETURN_(-1); + } D_RETURN_(cmd.efsd_get_metadata_cmd.id); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- libefsd.h 2001/02/20 03:57:52 1.5 +++ libefsd.h 2001/03/02 01:24:08 1.6 @@ -47,8 +47,10 @@ /* Use this to close an efsd connection. Frees the allocated EfsdConnection. + Returns value < 0 if the the final + command could not be sent to Efsd. */ -void efsd_close(EfsdConnection *ec); +int efsd_close(EfsdConnection *ec); /* Use this to get the file descriptor of an efsd @@ -92,9 +94,11 @@ /* Various commands to operate on the fs. - Each command returns and efsd command ID, which is also - contained in the efsd events returned by the server so - that commands and the generated replies can be associated. + UNLESS there's a communication problem (e.g. clogged + buffers), each command returns and efsd command ID, which + is also contained in the efsd events returned by the server + so that commands and the generated replies can be associated. + In case of an error, a value < 0 is returned. Filenames are internally converted to fully canonical path names if not fully specified. @@ -125,10 +129,11 @@ */ EfsdCmdId efsd_chmod(EfsdConnection *ec, char *filename, mode_t mode); -/* These aren't implemented yet. +/* Metadata operations. */ EfsdCmdId efsd_set_metadata(EfsdConnection *ec, char *key, char *filename, EfsdDatatype datatype, int datalength, void *data); +EfsdCmdId efsd_del_metadata(EfsdConnection *ec, char *key, char *filename); EfsdCmdId efsd_get_metadata(EfsdConnection *ec, char *key, char *filename); /* Start/stop a FAM monitor for a given file or directory. |
From: <enl...@li...> - 2001-03-02 01:23:12
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/demo Modified Files: efsddemo.c Log Message: * Moved socket file into ~/.e or, if there's no HOME, /tmp/.e, creating the directory in case it doesn't exist yet. * The stresstest with /dev in combination with lots of fs commands showed that there's more that can go wrong and that I'll need some kind of job queueing. All fs commands in libefsd return a nonnegative EfsdCmdId now only in case the command could successfully be written, and a value < 0 otherwise. This includes efsd_close(). More later. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/efsddemo.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- efsddemo.c 2001/02/20 18:04:28 1.9 +++ efsddemo.c 2001/03/02 01:24:08 1.10 @@ -329,35 +329,49 @@ sleep(2); /* Remove a file */ - id = efsd_remove(ec, "some-crappy-file-that-wont-exist"); - printf("Removing file, command ID %i\n", id); + if ((id = efsd_remove(ec, "some-crappy-file-that-wont-exist")) >= 0) + printf("Removing file, command ID %i\n", id); + else + printf("Couldn't issue rm command.\n"); + sleep(2); - id = efsd_move(ec, "raster-is-flim.demo", "cK-is-flim.demo"); - printf("Moving file, command ID %i\n", id); + if ((id = efsd_move(ec, "raster-is-flim.demo", "cK-is-flim.demo")) >= 0) + printf("Moving file, command ID %i\n", id); + else + printf("Couldn't issue mv command.\n"); /* List contents of a directory */ - id = efsd_listdir(ec, "/usr/local/enlightenment/bin"); - printf("Listing directory, command ID %i\n", id); + if ((id = efsd_listdir(ec, "/usr/local/enlightenment/bin")) >= 0) + printf("Listing directory, command ID %i\n", id); + else + printf("Couldn't issue ls command.\n"); sleep(2); /* Stat a file */ - id = efsd_stat(ec, "/bin/"); - printf("Stat()ing file, command ID %i\n", id); + if ((id = efsd_stat(ec, "/bin/")) >= 0) + printf("Stat()ing file, command ID %i\n", id); + else + printf("Couldn't issue stat command.\n"); sleep(2); /* Readlink a file */ - id = efsd_readlink(ec, "horms-is-flim.demo"); - printf("Readlink file, command ID %i\n", id); + if ((id = efsd_readlink(ec, "horms-is-flim.demo")) >= 0) + printf("Readlink file, command ID %i\n", id); + else + printf("Couldn't issue readlink command.\n"); sleep(2); /* Start monitoring home directory */ - id = efsd_start_monitor(ec, getenv("HOME")); - printf("Starting monitor, command ID %i\n", id); + if ((id = efsd_start_monitor(ec, "/dev")) >= 0) + //id = efsd_start_monitor(ec, getenv("HOME")); + printf("Starting monitor, command ID %i\n", id); + else + printf("Couldn't issue startmon command.\n"); /* Sleep a while -- you should see events if you for example touch files in you home during that @@ -367,16 +381,20 @@ demo -- you should see the use counts for the monitor be in-/decremented. */ - sleep(10); + sleep(5); /* Stop monitoring home directory */ - id = efsd_stop_monitor(ec, getenv("HOME")); - printf("Stopping monitor, command ID %i\n", id); + if ((id = efsd_stop_monitor(ec, "/dev")) >= 0) + printf("Stopping monitor, command ID %i\n", id); + else + printf("Couldn't issue stopmon command.\n"); sleep(2); /* Close connection to efsd. */ - efsd_close(ec); + if (efsd_close(ec) >= 0) + printf ("Connection closed successfully.\n"); + kill(child, SIGKILL); return 0; |
From: <enl...@li...> - 2001-03-04 01:11:26
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: Makefile.am efsd.c efsd_common.c efsd_fam.c efsd_fileops.c efsd_fileops.h efsd_io.c efsd_io.h efsd_list.c efsd_list.h efsd_misc.c efsd_misc.h libefsd.c libefsd.h Added Files: efsd_queue.c efsd_queue.h Log Message: OOOOOOOH look how it nicely handles /dev with e :) Moved everything to sendmsg() and recmsg(), much better. Also cleaned up the function names a good deal, to make it easier to find stuff. There's also a job queueing system now, in case writes time out. Should be much more solid now. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/Makefile.am,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- Makefile.am 2001/03/02 01:24:08 1.4 +++ Makefile.am 2001/03/04 01:12:57 1.5 @@ -23,10 +23,14 @@ efsd_fileops.c \ efsd_io.h \ efsd_io.c \ + efsd_queue.h \ + efsd_queue.c \ efsd_list.h \ efsd_list.c \ efsd_misc.h \ - efsd_misc.c + efsd_misc.c \ + efsd_types.h \ + efsd_types.c lib_LTLIBRARIES = libefsd.la @@ -40,5 +44,7 @@ efsd_common.c \ efsd_misc.h \ efsd_misc.c \ + efsd_types.h \ + efsd_types.c \ libefsd.c =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- efsd.c 2001/03/02 01:24:08 1.12 +++ efsd.c 2001/03/04 01:12:57 1.13 @@ -29,6 +29,7 @@ #include <stdlib.h> #include <stdio.h> #include <fcntl.h> +#include <sys/time.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> @@ -49,6 +50,8 @@ #include <efsd_fileops.h> #include <efsd_list.h> #include <efsd_misc.h> +#include <efsd_queue.h> +#include <efsd_types.h> #include <efsd_common.h> /* The connection to FAM */ @@ -57,11 +60,6 @@ /* File desciptors for connected clients */ int clientfd[EFSD_CLIENTS]; -/* Array of client connection indices for - data pointers, like used in FAM -*/ -int clientnums[EFSD_CLIENTS]; - /* File descriptor for accepting new clients */ static int listen_fd; @@ -105,55 +103,55 @@ { case EFSD_CMD_REMOVE: D(("Handling REMOVE\n")); - result = efsd_remove(command, client); + result = efsd_file_remove(command, client); break; case EFSD_CMD_MOVE: D(("Handling MOVE\n")); - result = efsd_move(command, client); + result = efsd_file_move(command, client); break; case EFSD_CMD_COPY: D(("Handling COPY\n")); - result = efsd_copy(command, client); + result = efsd_file_copy(command, client); break; case EFSD_CMD_SYMLINK: D(("Handling SYMLINK\n")); - result = efsd_symlink(command, client); + result = efsd_file_symlink(command, client); break; case EFSD_CMD_LISTDIR: D(("Handling LISTDIR\n")); - result = efsd_listdir(command, client); + result = efsd_file_listdir(command, client); break; case EFSD_CMD_MAKEDIR: D(("Handling MAKEDIR\n")); - result = efsd_makedir(command, client); + result = efsd_file_makedir(command, client); break; case EFSD_CMD_CHMOD: D(("Handling CHMOD\n")); - result = efsd_chmod(command, client); + result = efsd_file_chmod(command, client); break; case EFSD_CMD_SETMETA: D(("Handling SETMETA\n")); - result = efsd_set_metadata(command, client); + result = efsd_file_set_metadata(command, client); break; case EFSD_CMD_GETMETA: D(("Handling GETMETA\n")); - result = efsd_get_metadata(command, client); + result = efsd_file_get_metadata(command, client); break; case EFSD_CMD_STARTMON: D(("Handling STARTMON\n")); - result = efsd_start_monitor(command, client); + result = efsd_file_start_monitor(command, client); break; case EFSD_CMD_STOPMON: D(("Handling STOPMON\n")); - result = efsd_stop_monitor(command, client); + result = efsd_file_stop_monitor(command, client); break; case EFSD_CMD_STAT: D(("Handling STAT on %s\n", command->efsd_file_cmd.file)); - result = efsd_stat(command, client); + result = efsd_file_stat(command, client); break; case EFSD_CMD_READLINK: D(("Handling READLINK\n")); - result = efsd_readlink(command, client); + result = efsd_file_readlink(command, client); break; case EFSD_CMD_CLOSE: D(("Handling CLOSE\n")); @@ -208,9 +206,9 @@ if (clientfd[efr->client] >= 0) { ee.efsd_filechange_event.id = efr->id; - if (efsd_write_event(clientfd[efr->client], &ee) < 0) + if (efsd_io_write_event(clientfd[efr->client], &ee) < 0) { - efsd_close_connection(efr->client); + efsd_queue_add_event(clientfd[efr->client], &ee); D(("write() error when writing FAM event.\n")); } } @@ -241,9 +239,9 @@ { ee.efsd_filechange_event.id = efr->id; - if (efsd_write_event(clientfd[efr->client], &ee) < 0) + if (efsd_io_write_event(clientfd[efr->client], &ee) < 0) { - efsd_close_connection(efr->client); + efsd_queue_add_event(clientfd[efr->client], &ee); D(("write() error when writing FAM event.\n")); } } @@ -252,7 +250,7 @@ break; } - efsd_cleanup_event(&ee); + efsd_event_cleanup(&ee); } } @@ -264,9 +262,10 @@ efsd_handle_connections(void) { struct sockaddr_un serv_sun, cli_sun; - int num_read, fdsize, clilen, i, can_accept, sock_fd; - EfsdCommand ecmd; - fd_set fdset; + int num_read, fdsize, clilen, i, n, can_accept, sock_fd; + EfsdCommand ecmd; + fd_set fdset; + struct timeval tv; D_ENTER; @@ -299,6 +298,9 @@ for ( ; ; ) { + tv.tv_sec = 1; + tv.tv_usec = 0; + can_accept = 0; FD_ZERO(&fdset); fdsize = 0; @@ -330,8 +332,28 @@ } /* Wait for next event to happen ... */ - select(fdsize+1, &fdset, NULL, NULL, NULL); + while ((n = select(fdsize+1, &fdset, NULL, NULL, &tv)) < 0) + { + if (errno == EINTR) + { + D(("read_data select() interrupted\n")); + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&fdset); + } + else + { + fprintf(stderr, "Select error -- exiting.\n"); + exit(-1); + } + } + /* Check if anything is queued to be written ... */ + if (!efsd_queue_empty()) + { + efsd_queue_process(); + } + if (FD_ISSET(famcon.fd, &fdset)) { /* FAM reported something -- handle it. */ @@ -345,17 +367,19 @@ /* A connected client sent something -- handle it. */ bzero(&ecmd, sizeof(EfsdCommand)); D(("Reading command ...\n")); - if ( (num_read = efsd_read_command(clientfd[i], &ecmd)) >= 0) + if ( (num_read = efsd_io_read_command(clientfd[i], &ecmd)) >= 0) { if (efsd_handle_client_command(&ecmd, i) < 0) - efsd_close_connection(i); + { + D(("Failed to write command, command queued.\n")); + } } else { efsd_close_connection(i); } D(("Done.\n")); - efsd_cleanup_command(&ecmd); + efsd_cmd_cleanup(&ecmd); } } @@ -429,8 +453,6 @@ static void efsd_initialize(void) { - int i; - D_ENTER; if (geteuid() == 0) @@ -438,9 +460,6 @@ fprintf(stderr, "Efsd is not meant to be run by root -- at least not yet :)\n"); exit(-1); } - - for (i = 0; i < EFSD_CLIENTS; i++) - clientnums[i] = i; /* lots of paranoia - clean up dead socket on exit no matter what */ /* only case it doesnt work: SIGKILL (kill -9) */ =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_common.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- efsd_common.c 2001/03/02 01:24:08 1.4 +++ efsd_common.c 2001/03/04 01:12:57 1.5 @@ -40,6 +40,7 @@ #endif #include <efsd_debug.h> +#include <efsd_misc.h> char * efsd_get_socket_file(void) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fam.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- efsd_fam.c 2001/02/20 18:04:28 1.3 +++ efsd_fam.c 2001/03/04 01:12:57 1.4 @@ -38,7 +38,6 @@ extern FAMConnection famcon; -extern int clientnums[]; EfsdList *monitors = NULL; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fileops.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- efsd_fileops.c 2001/02/20 18:04:28 1.3 +++ efsd_fileops.c 2001/03/04 01:12:57 1.4 @@ -43,6 +43,8 @@ #include <efsd_fileops.h> #include <efsd_io.h> #include <efsd_misc.h> +#include <efsd_queue.h> +#include <efsd_types.h> extern FAMConnection famcon; extern int clientfd[EFSD_CLIENTS]; @@ -50,9 +52,9 @@ static mode_t default_mode = (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); -int -efsd_send_reply(EfsdCommand *cmd, EfsdStatus status, int errorcode, - int data_len, void *data, int client) +static int +send_reply(EfsdCommand *cmd, EfsdStatus status, int errorcode, + int data_len, void *data, int client) { EfsdEvent ee; int sockfd; @@ -69,74 +71,84 @@ ee.efsd_reply_event.status = status; ee.efsd_reply_event.errorcode = errorcode; ee.efsd_reply_event.data_len = data_len; + + /* This data chunk is supposed to be cleaned + up by the caller (where it was created). + */ ee.efsd_reply_event.data = data; + + if (efsd_io_write_event(sockfd, &ee) < 0) + { + efsd_queue_add_event(sockfd, &ee); + D_RETURN_(-1); + } - D_RETURN_(efsd_write_event(sockfd, &ee)); + D_RETURN_(0); } int -efsd_remove(EfsdCommand *cmd, int client) +efsd_file_remove(EfsdCommand *cmd, int client) { D_ENTER; if (remove(cmd->efsd_file_cmd.file) < 0) { - D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int -efsd_move(EfsdCommand *cmd, int client) +efsd_file_move(EfsdCommand *cmd, int client) { D_ENTER; if (rename(cmd->efsd_2file_cmd.file1, cmd->efsd_2file_cmd.file2) < 0) { - D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int -efsd_copy(EfsdCommand *cmd, int client) +efsd_file_copy(EfsdCommand *cmd, int client) { D_ENTER; /* if (rename(cmd->efsd_2file_cmd.file1, cmd->efsd_2file_cmd.file2) < 0) { - D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); */ - D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, errno, 0, NULL, client)); } int -efsd_symlink(EfsdCommand *cmd, int client) +efsd_file_symlink(EfsdCommand *cmd, int client) { D_ENTER; if (symlink(cmd->efsd_2file_cmd.file1, cmd->efsd_2file_cmd.file2) < 0) { - D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int -efsd_listdir(EfsdCommand *cmd, int client) +efsd_file_listdir(EfsdCommand *cmd, int client) { D_ENTER; @@ -147,15 +159,15 @@ then removing the monitor. */ efsd_fam_force_startstop_monitor(cmd, client); - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } - D_RETURN_(efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, 0, 0, NULL, client)); } int -efsd_makedir(EfsdCommand *cmd, int client) +efsd_file_makedir(EfsdCommand *cmd, int client) { char **path_dirs; int num_dirs, cur_dir, i; @@ -185,28 +197,28 @@ /* XXX this does not clean up if we had partial success ... */ if (!success) - D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, errno, 0, NULL, client)); - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int -efsd_chmod(EfsdCommand *cmd, int client) +efsd_file_chmod(EfsdCommand *cmd, int client) { D_ENTER; if (chmod(cmd->efsd_chmod_cmd.file, cmd->efsd_chmod_cmd.mode) < 0) { - D_RETURN_(efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, errno, 0, NULL, client)); } - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); } int -efsd_set_metadata(EfsdCommand *cmd, int client) +efsd_file_set_metadata(EfsdCommand *cmd, int client) { D_ENTER; printf("The setting metadata people are still out for lunch.\n"); @@ -215,7 +227,7 @@ int -efsd_get_metadata(EfsdCommand *cmd, int client) +efsd_file_get_metadata(EfsdCommand *cmd, int client) { D_ENTER; printf("Getting metadata not here yet. Come back later.\n"); @@ -224,31 +236,31 @@ int -efsd_start_monitor(EfsdCommand *cmd, int client) +efsd_file_start_monitor(EfsdCommand *cmd, int client) { D_ENTER; if (efsd_fam_start_monitor(cmd, client) >= 0) - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); - D_RETURN_(efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, 0, 0, NULL, client)); } int -efsd_stop_monitor(EfsdCommand *cmd, int client) +efsd_file_stop_monitor(EfsdCommand *cmd, int client) { D_ENTER; if (efsd_fam_stop_monitor(cmd, client) >= 0) - D_RETURN_(efsd_send_reply(cmd, SUCCESS, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, SUCCESS, 0, 0, NULL, client)); - D_RETURN_(efsd_send_reply(cmd, FAILURE, 0, 0, NULL, client)); + D_RETURN_(send_reply(cmd, FAILURE, 0, 0, NULL, client)); } int -efsd_stat(EfsdCommand *cmd, int client) +efsd_file_stat(EfsdCommand *cmd, int client) { struct stat *st; int result; @@ -258,9 +270,9 @@ st = (struct stat*)malloc(sizeof(struct stat)); if (lstat(cmd->efsd_file_cmd.file, st) >= 0) - result = efsd_send_reply(cmd, SUCCESS, 0, sizeof(struct stat), st, client); + result = send_reply(cmd, SUCCESS, 0, sizeof(struct stat), st, client); else - result = efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client); + result = send_reply(cmd, FAILURE, errno, 0, NULL, client); FREE(st); @@ -269,7 +281,7 @@ int -efsd_readlink(EfsdCommand *cmd, int client) +efsd_file_readlink(EfsdCommand *cmd, int client) { char s[MAXPATHLEN]; int result, n; @@ -277,9 +289,9 @@ D_ENTER; if ((n = readlink(cmd->efsd_file_cmd.file, s, MAXPATHLEN)) >= 0) - result = efsd_send_reply(cmd, SUCCESS, 0, n, s, client); + result = send_reply(cmd, SUCCESS, 0, n, s, client); else - result = efsd_send_reply(cmd, FAILURE, errno, 0, NULL, client); + result = send_reply(cmd, FAILURE, errno, 0, NULL, client); D_RETURN_(result); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_fileops.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- efsd_fileops.h 2001/02/20 03:57:52 1.2 +++ efsd_fileops.h 2001/03/04 01:12:57 1.3 @@ -27,21 +27,18 @@ #include <efsd.h> -int send_reply(EfsdCommand *cmd, EfsdStatus status, int errorcode, - int data_len, void *data, int client); - -int efsd_remove(EfsdCommand *cmd, int client); -int efsd_move(EfsdCommand *cmd, int client); -int efsd_copy(EfsdCommand *cmd, int client); -int efsd_symlink(EfsdCommand *cmd, int client); -int efsd_listdir(EfsdCommand *cmd, int client); -int efsd_makedir(EfsdCommand *cmd, int client); -int efsd_chmod(EfsdCommand *cmd, int client); -int efsd_set_metadata(EfsdCommand *cmd, int client); -int efsd_get_metadata(EfsdCommand *cmd, int client); -int efsd_start_monitor(EfsdCommand *cmd, int client); -int efsd_stop_monitor(EfsdCommand *cmd, int client); -int efsd_stat(EfsdCommand *cmd, int client); -int efsd_readlink(EfsdCommand *cmd, int client); +int efsd_file_remove(EfsdCommand *cmd, int client); +int efsd_file_move(EfsdCommand *cmd, int client); +int efsd_file_copy(EfsdCommand *cmd, int client); +int efsd_file_symlink(EfsdCommand *cmd, int client); +int efsd_file_listdir(EfsdCommand *cmd, int client); +int efsd_file_makedir(EfsdCommand *cmd, int client); +int efsd_file_chmod(EfsdCommand *cmd, int client); +int efsd_file_set_metadata(EfsdCommand *cmd, int client); +int efsd_file_get_metadata(EfsdCommand *cmd, int client); +int efsd_file_start_monitor(EfsdCommand *cmd, int client); +int efsd_file_stop_monitor(EfsdCommand *cmd, int client); +int efsd_file_stat(EfsdCommand *cmd, int client); +int efsd_file_readlink(EfsdCommand *cmd, int client); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- efsd_io.c 2001/03/02 01:24:08 1.13 +++ efsd_io.c 2001/03/04 01:12:57 1.14 @@ -29,6 +29,7 @@ #include <stdlib.h> #include <stdio.h> #include <sys/types.h> +#include <sys/uio.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/un.h> @@ -41,13 +42,15 @@ #include <efsd_misc.h> #include <efsd_io.h> +/* The maximum number of data chunks (ints, char*s, void*s ...) + a command/event consists of. Major laziness. +*/ +#define MAX_IOVEC 20 static int read_data(int sockfd, void *dest, int size); static int read_int(int sockfd, int *dest); static int read_string(int sockfd, char **s); -static int write_data(int sockfd, void *data, int size); -static int write_int(int sockfd, int data); -static int write_string(int sockfd, char *s); +static int write_data(int sockfd, struct msghdr *msg); static int read_file_cmd(int sockfd, EfsdCommand *cmd); static int read_2file_cmd(int sockfd, EfsdCommand *cmd); @@ -56,74 +59,74 @@ static int read_get_metadata_cmd(int sockfd, EfsdCommand *cmd); static int read_filechange_event(int sockfd, EfsdEvent *ee); static int read_reply_event(int sockfd, EfsdEvent *ee); + +static int fill_file_cmd(struct iovec *iov, EfsdCommand *ec); +static int fill_2file_cmd(struct iovec *iov, EfsdCommand *ec); +static int fill_chmod_cmd(struct iovec *iov, EfsdCommand *ec); +static int fill_set_metadata_cmd(struct iovec *iov, EfsdCommand *ec); +static int fill_get_metadata_cmd(struct iovec *iov, EfsdCommand *ec); +static int fill_close_cmd(struct iovec *iov, EfsdCommand *ec); +static int fill_filechange_event(struct iovec *iov, EfsdEvent *ee); +static int fill_reply_event(struct iovec *iov, EfsdEvent *ee); +static int fill_event(struct iovec *iov, EfsdEvent *ee); +static int fill_command(struct iovec *iov, EfsdCommand *ec); -static int write_file_cmd(int sockfd, EfsdCommand *cmd); -static int write_2file_cmd(int sockfd, EfsdCommand *cmd); -static int write_chmod_cmd(int sockfd, EfsdCommand *cmd); -static int write_set_metadata_cmd(int sockfd, EfsdCommand *cmd); -static int write_get_metadata_cmd(int sockfd, EfsdCommand *cmd); -static int write_filechange_event(int sockfd, EfsdEvent *ee); -static int write_reply_event(int sockfd, EfsdEvent *ee); +static int len1, len2; -int +static int read_data(int sockfd, void *dest, int size) { - int num_left, num_read, result; + int n, result; fd_set fdset; - char *ptr; struct timeval tv; + struct msghdr msg; + struct iovec iov[1]; D_ENTER; if (sockfd < 0) D_RETURN_(-1); - ptr = (char*)dest; - num_left = size; - num_read = 0; tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); - while (num_left) + while ((result = select(sockfd + 1, &fdset, NULL, NULL, &tv)) < 0) { - FD_SET(sockfd, &fdset); - - while ((result = select(sockfd + 1, &fdset, NULL, NULL, &tv)) < 0) + if (errno == EINTR) { - if (errno == EINTR) - { - D(("read_data select() interrupted\n")); - tv.tv_sec = 1; - tv.tv_usec = 0; - FD_ZERO(&fdset); - } - else - { - fprintf(stderr, "Select error -- exiting.\n"); - exit(-1); - } + D(("read_data select() interrupted\n")); + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&fdset); } - - if (result == 0) + else { - D(("Read timed out...\n")); - D_RETURN_(-1); + fprintf(stderr, "Select error -- exiting.\n"); + exit(-1); } + } - if ((num_read = read(sockfd, ptr, num_left)) < 0) - { - perror("Read error:"); - D_RETURN_(-1); /* Error occurred -- return error. */ - } - else if (num_read == 0) - break; /* End of file */ - - num_left -= num_read; - ptr += num_read; + if (result == 0) + { + D(("Read timed out...\n")); + D_RETURN_(-1); } - - D_RETURN_(size - num_left); + + iov[0].iov_base = dest; + iov[0].iov_len = size; + bzero(&msg, sizeof(struct msghdr)); + msg.msg_iov = iov; + msg.msg_iovlen = 1; + + if ((n = recvmsg(sockfd, &msg, MSG_WAITALL)) < 0) + { + perror("Error"); + D_RETURN_(-1); + } + + D_RETURN_(n); } @@ -166,11 +169,10 @@ static int -write_data(int sockfd, void *data, int size) +write_data(int sockfd, struct msghdr *msg) { - int num_left, num_written, result; + int n, result; fd_set fdset; - char *ptr; struct timeval tv; D_ENTER; @@ -178,97 +180,58 @@ if (sockfd < 0) D_RETURN_(-1); - ptr = (char*)data; - num_left = size; - num_written = 0; tv.tv_sec = 1; tv.tv_usec = 0; FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); - while (num_left) + while ((result = select(sockfd + 1, NULL, &fdset, NULL, &tv)) < 0) { - FD_SET(sockfd, &fdset); - - while ((result = select(sockfd + 1, NULL, &fdset, NULL, &tv)) < 0) - { - if (errno == EINTR) - { - D(("read_data select() interrupted\n")); - tv.tv_sec = 1; - tv.tv_usec = 0; - FD_ZERO(&fdset); - } - else - { - fprintf(stderr, "Select error -- exiting.\n"); - exit(-1); - } - } - - if (result == 0) + if (errno == EINTR) { - D(("Write timed out...\n")); - D_RETURN_(-1); + D(("read_data select() interrupted\n")); + tv.tv_sec = 1; + tv.tv_usec = 0; + FD_ZERO(&fdset); } - - if ((num_written = write(sockfd, ptr, num_left)) < 0) + else { - if (errno == EPIPE) - { - D(("Broken pipe in write_data() to fd %i\n", sockfd)); - D_RETURN_(-1); - } - else - { - perror("Write error:"); - D_RETURN_(-1); - } + fprintf(stderr, "Select error -- exiting.\n"); + exit(-1); } - - num_left -= num_written; - ptr += num_written; } - - D_RETURN_(size - num_left); -} - - -static int -write_int(int sockfd, int data) -{ - D_ENTER; - D_RETURN_(write_data(sockfd, &data, sizeof(int))); -} - -static int -write_string(int sockfd, char *data) -{ - D_ENTER; + if (result == 0) + { + D(("Write timed out.\n")); + D_RETURN_(-1); + } - if (write_int(sockfd, strlen(data)+1) < 0) - D_RETURN_(-1); + if ((n = sendmsg(sockfd, msg, 0)) < 0) + { + perror("error"); + } - D_RETURN_(write_data(sockfd, data, strlen(data)+1)); + D_RETURN_(n); } static int -read_file_cmd(int sockfd, EfsdCommand *cmd) +read_file_cmd(int sockfd, EfsdCommand *ec) { int count = 0, count2; D_ENTER; - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.id))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_file_cmd.id))) < 0) D_RETURN_(-1); count2 = count; - if ((count = read_int(sockfd, &(cmd->efsd_file_cmd.options))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_file_cmd.options))) < 0) D_RETURN_(-1); count2 += count; - - if ((count = read_string(sockfd, &(cmd->efsd_file_cmd.file))) < 0) + + if ((count = read_string(sockfd, &(ec->efsd_file_cmd.file))) < 0) D_RETURN_(-1); count2 += count; @@ -277,25 +240,25 @@ static int -read_2file_cmd(int sockfd, EfsdCommand *cmd) +read_2file_cmd(int sockfd, EfsdCommand *ec) { int count = 0, count2; D_ENTER; - if ((count = read_int(sockfd, &(cmd->efsd_2file_cmd.id))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_2file_cmd.id))) < 0) D_RETURN_(-1); count2 = count; - if ((count = read_int(sockfd, &(cmd->efsd_2file_cmd.options))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_2file_cmd.options))) < 0) D_RETURN_(-1); count2 += count; - if ((count = read_string(sockfd, &(cmd->efsd_2file_cmd.file1))) < 0) + if ((count = read_string(sockfd, &(ec->efsd_2file_cmd.file1))) < 0) D_RETURN_(-1); count2 += count; - if ((count = read_string(sockfd, &(cmd->efsd_2file_cmd.file2))) < 0) + if ((count = read_string(sockfd, &(ec->efsd_2file_cmd.file2))) < 0) D_RETURN_(-1); count2 += count; @@ -304,21 +267,21 @@ static int -read_chmod_cmd(int sockfd, EfsdCommand *cmd) +read_chmod_cmd(int sockfd, EfsdCommand *ec) { int count = 0, count2; D_ENTER; - if ((count = read_int(sockfd, &(cmd->efsd_chmod_cmd.id))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_chmod_cmd.id))) < 0) D_RETURN_(-1); count2 = count; - if ((count = read_string(sockfd, &(cmd->efsd_chmod_cmd.file))) < 0) + if ((count = read_string(sockfd, &(ec->efsd_chmod_cmd.file))) < 0) D_RETURN_(-1); count2 += count; - if ((count = read_data(sockfd, &(cmd->efsd_chmod_cmd.mode), sizeof(mode_t))) != sizeof(mode_t)) + if ((count = read_data(sockfd, &(ec->efsd_chmod_cmd.mode), sizeof(mode_t))) != sizeof(mode_t)) D_RETURN_(-1); count2 += count; @@ -327,37 +290,37 @@ static int -read_set_metadata_cmd(int sockfd, EfsdCommand *cmd) +read_set_metadata_cmd(int sockfd, EfsdCommand *ec) { int i; int count = 0, count2; D_ENTER; - if ((count = read_int(sockfd, &(cmd->efsd_set_metadata_cmd.id))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_set_metadata_cmd.id))) < 0) D_RETURN_(-1); count2 = count; - if ((count = read_data(sockfd, &(cmd->efsd_set_metadata_cmd.datatype), + if ((count = read_data(sockfd, &(ec->efsd_set_metadata_cmd.datatype), sizeof(EfsdDatatype))) != sizeof(EfsdDatatype)) D_RETURN_(-1); count2 += count; - if ((count = read_int(sockfd, &(cmd->efsd_set_metadata_cmd.data_len))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_set_metadata_cmd.data_len))) < 0) D_RETURN_(-1); count2 += count; - i = cmd->efsd_set_metadata_cmd.data_len; - cmd->efsd_set_metadata_cmd.data = malloc(i); - if ((count = read_data(sockfd, &(cmd->efsd_set_metadata_cmd.data), i)) != i) + i = ec->efsd_set_metadata_cmd.data_len; + ec->efsd_set_metadata_cmd.data = malloc(i); + if ((count = read_data(sockfd, &(ec->efsd_set_metadata_cmd.data), i)) != i) D_RETURN_(-1); count2 += count; - if ((count = read_string(sockfd, &(cmd->efsd_set_metadata_cmd.key))) < 0) + if ((count = read_string(sockfd, &(ec->efsd_set_metadata_cmd.key))) < 0) D_RETURN_(-1); count2 += count; - if ((count = read_string(sockfd, &(cmd->efsd_set_metadata_cmd.file))) < 0) + if ((count = read_string(sockfd, &(ec->efsd_set_metadata_cmd.file))) < 0) D_RETURN_(-1); count2 += count; @@ -366,21 +329,21 @@ static int -read_get_metadata_cmd(int sockfd, EfsdCommand *cmd) +read_get_metadata_cmd(int sockfd, EfsdCommand *ec) { int count = 0, count2; D_ENTER; - if ((count = read_int(sockfd, &(cmd->efsd_get_metadata_cmd.id))) < 0) + if ((count = read_int(sockfd, &(ec->efsd_get_metadata_cmd.id))) < 0) D_RETURN_(-1); count2 = count; - if ((count = read_string(sockfd, &(cmd->efsd_get_metadata_cmd.key))) < 0) + if ((count = read_string(sockfd, &(ec->efsd_get_metadata_cmd.key))) < 0) D_RETURN_(-1); count2 += count; - if ((count = read_string(sockfd, &(cmd->efsd_get_metadata_cmd.file))) < 0) + if ((count = read_string(sockfd, &(ec->efsd_get_metadata_cmd.file))) < 0) D_RETURN_(-1); count2 += count; @@ -418,7 +381,7 @@ D_ENTER; - if ((count = efsd_read_command(sockfd, &(ee->efsd_reply_event.command))) < 0) + if ((count = efsd_io_read_command(sockfd, &(ee->efsd_reply_event.command))) < 0) D_RETURN_(-1); count2 = count; @@ -452,170 +415,239 @@ } -static int -write_file_cmd(int sockfd, EfsdCommand *cmd) +static int +fill_file_cmd(struct iovec *iov, EfsdCommand *ec) { + int n = 0; + D_ENTER; - if (write_int(sockfd, cmd->efsd_file_cmd.id) < 0) - D_RETURN_(-1); + len1 = strlen(ec->efsd_file_cmd.file) + 1; - if (write_int(sockfd, cmd->efsd_file_cmd.options) < 0) - D_RETURN_(-1); - - if (write_string(sockfd, cmd->efsd_file_cmd.file) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ec->type; + iov[n].iov_len = sizeof(EfsdCommandType); + iov[++n].iov_base = &ec->efsd_file_cmd.id; + iov[n].iov_len = sizeof(EfsdCmdId); + iov[++n].iov_base = &ec->efsd_file_cmd.options; + iov[n].iov_len = sizeof(EfsdOption); + iov[++n].iov_base = &len1; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_file_cmd.file; + iov[n].iov_len = len1; - D_RETURN_(0); + D_RETURN_(n+1); } -static int -write_2file_cmd(int sockfd, EfsdCommand *cmd) +static int +fill_2file_cmd(struct iovec *iov, EfsdCommand *ec) { + int n = 0; + D_ENTER; - if (write_int(sockfd, cmd->efsd_2file_cmd.id) < 0) - D_RETURN_(-1); - - if (write_int(sockfd, cmd->efsd_2file_cmd.options) < 0) - D_RETURN_(-1); - - if (write_string(sockfd, cmd->efsd_2file_cmd.file1) < 0) - D_RETURN_(-1); + len1 = strlen(ec->efsd_2file_cmd.file1) + 1; + len2 = strlen(ec->efsd_2file_cmd.file2) + 1; - if (write_string(sockfd, cmd->efsd_2file_cmd.file2) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ec->type; + iov[n].iov_len = sizeof(EfsdCommandType); + iov[++n].iov_base = &ec->efsd_2file_cmd.id; + iov[n].iov_len = sizeof(EfsdCmdId); + iov[++n].iov_base = &ec->efsd_2file_cmd.options; + iov[n].iov_len = sizeof(EfsdOption); + iov[++n].iov_base = &len1; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_2file_cmd.file1; + iov[n].iov_len = len1; + iov[++n].iov_base = &len2; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_2file_cmd.file2; + iov[n].iov_len = len2; - D_RETURN_(0); + D_RETURN_(n+1); } -static int -write_chmod_cmd(int sockfd, EfsdCommand *cmd) +static int +fill_chmod_cmd(struct iovec *iov, EfsdCommand *ec) { + int n = 0; + D_ENTER; - if (write_int(sockfd, cmd->efsd_chmod_cmd.id) < 0) - D_RETURN_(-1); + len1 = strlen(ec->efsd_file_cmd.file) + 1; - if (write_string(sockfd, cmd->efsd_chmod_cmd.file) < 0) - D_RETURN_(-1); - - if (write_data(sockfd, &(cmd->efsd_chmod_cmd.mode), - sizeof(cmd->efsd_chmod_cmd.mode)) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ec->type; + iov[n].iov_len = sizeof(EfsdCommandType); + iov[++n].iov_base = &ec->efsd_file_cmd.id; + iov[n].iov_len = sizeof(EfsdCmdId); + iov[++n].iov_base = &len1; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_chmod_cmd.file; + iov[n].iov_len = len1; + iov[++n].iov_base = &ec->efsd_chmod_cmd.mode; + iov[n].iov_len = sizeof(mode_t); - D_RETURN_(0); + D_RETURN_(n+1); } -static int -write_set_metadata_cmd(int sockfd, EfsdCommand *cmd) +static int +fill_set_metadata_cmd(struct iovec *iov, EfsdCommand *ec) { + int n = 0; + D_ENTER; - if (write_int(sockfd, cmd->efsd_set_metadata_cmd.id) < 0) - D_RETURN_(-1); - - if (write_data(sockfd, &(cmd->efsd_set_metadata_cmd.datatype), - sizeof(EfsdDatatype)) < 0) - D_RETURN_(-1); - - if (write_int(sockfd, cmd->efsd_set_metadata_cmd.data_len) < 0) - D_RETURN_(-1); - - if (write_data(sockfd, cmd->efsd_set_metadata_cmd.data, - cmd->efsd_set_metadata_cmd.data_len) < 0) - D_RETURN_(-1); - - if (write_string(sockfd, cmd->efsd_set_metadata_cmd.key) < 0) - D_RETURN_(-1); + len1 = strlen(ec->efsd_set_metadata_cmd.key) + 1; + len2 = strlen(ec->efsd_set_metadata_cmd.file) + 1; - if (write_string(sockfd, cmd->efsd_set_metadata_cmd.file) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ec->type; + iov[n].iov_len = sizeof(EfsdCommandType); + iov[++n].iov_base = &ec->efsd_set_metadata_cmd.id; + iov[n].iov_len = sizeof(EfsdCmdId); + iov[++n].iov_base = &ec->efsd_set_metadata_cmd.datatype; + iov[n].iov_len = sizeof(EfsdDatatype); + iov[++n].iov_base = &ec->efsd_set_metadata_cmd.data_len; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_set_metadata_cmd.data; + iov[n].iov_len = ec->efsd_set_metadata_cmd.data_len; + iov[++n].iov_base = &len1; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_set_metadata_cmd.key; + iov[n].iov_len = len1; + iov[++n].iov_base = &len2; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_set_metadata_cmd.file; + iov[n].iov_len = len2; - D_RETURN_(0); + D_RETURN_(n+1); } -static int -write_get_metadata_cmd(int sockfd, EfsdCommand *cmd) +static int +fill_get_metadata_cmd(struct iovec *iov, EfsdCommand *ec) { + int n = 0; + D_ENTER; - if (write_int(sockfd, cmd->efsd_get_metadata_cmd.id) < 0) - D_RETURN_(-1); - - if (write_string(sockfd, cmd->efsd_get_metadata_cmd.key) < 0) - D_RETURN_(-1); + len1 = strlen(ec->efsd_get_metadata_cmd.key) + 1; + len2 = strlen(ec->efsd_get_metadata_cmd.file) + 1; - if (write_string(sockfd, cmd->efsd_get_metadata_cmd.file) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ec->type; + iov[n].iov_len = sizeof(EfsdCommandType); + iov[++n].iov_base = &ec->efsd_set_metadata_cmd.id; + iov[n].iov_len = sizeof(EfsdCmdId); + iov[++n].iov_base = &len1; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_get_metadata_cmd.key; + iov[n].iov_len = len1; + iov[++n].iov_base = &len2; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ec->efsd_get_metadata_cmd.file; + iov[n].iov_len = len2; - D_RETURN_(0); + D_RETURN_(n); } -static int -write_filechange_event(int sockfd, EfsdEvent *ee) +static int +fill_close_cmd(struct iovec *iov, EfsdCommand *ec) { + int n = 0; + D_ENTER; - if (write_int(sockfd, ee->efsd_filechange_event.id) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ec->type; + iov[n].iov_len = sizeof(EfsdCommandType); - if (write_int(sockfd, ee->efsd_filechange_event.changetype) < 0) - D_RETURN_(-1); + D_RETURN_(n+1); +} - if (write_string(sockfd, ee->efsd_filechange_event.file) < 0) - D_RETURN_(-1); - D_RETURN_(0); +static int +fill_filechange_event(struct iovec *iov, EfsdEvent *ee) +{ + int n = 0; + + D_ENTER; + + len1 = strlen(ee->efsd_filechange_event.file) + 1; + + iov[n].iov_base = &ee->type; + iov[n].iov_len = sizeof(EfsdEventType); + iov[++n].iov_base = &ee->efsd_filechange_event.id; + iov[n].iov_len = sizeof(EfsdCmdId); + iov[++n].iov_base = &ee->efsd_filechange_event.changetype; + iov[n].iov_len = sizeof(EfsdFilechangeType); + iov[++n].iov_base = &len1; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ee->efsd_filechange_event.file; + iov[n].iov_len = len1; + + D_RETURN_(n+1); } static int -write_reply_event(int sockfd, EfsdEvent *ee) +fill_reply_event(struct iovec *iov, EfsdEvent *ee) { + int n = 0; + D_ENTER; - if (efsd_write_command(sockfd, &(ee->efsd_reply_event.command)) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ee->type; + iov[n].iov_len = sizeof(EfsdEventType); - if (write_int(sockfd, ee->efsd_reply_event.status) < 0) - D_RETURN_(-1); + n++; - if (write_int(sockfd, ee->efsd_reply_event.errorcode) < 0) - D_RETURN_(-1); - - if (write_int(sockfd, ee->efsd_reply_event.data_len) < 0) - D_RETURN_(-1); + n += fill_command(&iov[n], &ee->efsd_reply_event.command); - if (write_data(sockfd, ee->efsd_reply_event.data, - ee->efsd_reply_event.data_len) < 0) - D_RETURN_(-1); + iov[n].iov_base = &ee->efsd_reply_event.status; + iov[n].iov_len = sizeof(EfsdStatus); + iov[++n].iov_base = &ee->efsd_reply_event.errorcode; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = &ee->efsd_reply_event.data_len; + iov[n].iov_len = sizeof(int); + iov[++n].iov_base = ee->efsd_reply_event.data; + iov[n].iov_len = ee->efsd_reply_event.data_len; - D_RETURN_(0); + D_RETURN_(n+1); } -/* Non-static stuff below: */ -int -efsd_write_command(int sockfd, EfsdCommand *cmd) +static int +fill_event(struct iovec *iov, EfsdEvent *ee) { - int result = (-1); + int n = 0; D_ENTER; - if (!cmd) - D_RETURN_(-1); + switch (ee->type) + { + case EFSD_EVENT_FILECHANGE: + n = fill_filechange_event(iov, ee); + break; + case EFSD_EVENT_REPLY: + n = fill_reply_event(iov, ee); + break; + default: + } - if (write_int(sockfd, cmd->type) < 0) - D_RETURN_(-1); - - switch (cmd->type) + D_RETURN_(n); +} + + +static int +fill_command(struct iovec *iov, EfsdCommand *ec) +{ + int n = 0; + + D_ENTER; + + switch (ec->type) { case EFSD_CMD_REMOVE: case EFSD_CMD_LISTDIR: @@ -624,48 +656,74 @@ case EFSD_CMD_STOPMON: case EFSD_CMD_STAT: case EFSD_CMD_READLINK: - result = write_file_cmd(sockfd, cmd); + n = fill_file_cmd(iov, ec); break; case EFSD_CMD_MOVE: case EFSD_CMD_SYMLINK: - result = write_2file_cmd(sockfd, cmd); + n = fill_2file_cmd(iov, ec); break; case EFSD_CMD_CHMOD: - result = write_chmod_cmd(sockfd, cmd); + n = fill_chmod_cmd(iov, ec); break; case EFSD_CMD_SETMETA: - result = write_set_metadata_cmd(sockfd, cmd); + n = fill_set_metadata_cmd(iov, ec); break; case EFSD_CMD_GETMETA: - result = write_get_metadata_cmd(sockfd, cmd); + n = fill_get_metadata_cmd(iov, ec); break; case EFSD_CMD_CLOSE: - result = 0; + n = fill_close_cmd(iov, ec); break; default: } + + D_RETURN_(n); +} + + + +/* Non-static stuff below: */ + +int +efsd_io_write_command(int sockfd, EfsdCommand *ec) +{ + struct iovec iov[MAX_IOVEC]; + struct msghdr msg; + int n; + + D_ENTER; - if (result < 0) - fprintf(stderr, "error writing command.\n"); + if (!ec) + D_RETURN_(-1); + + bzero(&msg, sizeof(struct msghdr)); + msg.msg_iov = iov; + msg.msg_iovlen = fill_command(iov, ec); + + if ((n = write_data(sockfd, &msg)) < 0) + { + perror("Error:"); + D_RETURN_(-1); + } - D_RETURN_(result); + D_RETURN_(0); } int -efsd_read_command(int sockfd, EfsdCommand *cmd) +efsd_io_read_command(int sockfd, EfsdCommand *ec) { int result = -1; int count = 0; D_ENTER; - if (!cmd) + if (!ec) D_RETURN_(-1); - if ((count = read_int(sockfd, (int*)&(cmd->type))) >= 0) + if ((count = read_int(sockfd, (int*)&(ec->type))) >= 0) { - switch (cmd->type) + switch (ec->type) { case EFSD_CMD_REMOVE: case EFSD_CMD_LISTDIR: @@ -674,25 +732,26 @@ case EFSD_CMD_STOPMON: case EFSD_CMD_STAT: case EFSD_CMD_READLINK: - result = read_file_cmd(sockfd, cmd); + result = read_file_cmd(sockfd, ec); break; case EFSD_CMD_MOVE: case EFSD_CMD_SYMLINK: - result = read_2file_cmd(sockfd, cmd); + result = read_2file_cmd(sockfd, ec); break; case EFSD_CMD_CHMOD: - result = read_chmod_cmd(sockfd, cmd); + result = read_chmod_cmd(sockfd, ec); break; case EFSD_CMD_SETMETA: - result = read_set_metadata_cmd(sockfd, cmd); + result = read_set_metadata_cmd(sockfd, ec); break; case EFSD_CMD_GETMETA: - result = read_get_metadata_cmd(sockfd, cmd); + result = read_get_metadata_cmd(sockfd, ec); break; case EFSD_CMD_CLOSE: result = 0; break; default: + D(("Unknown command\n")); } } @@ -702,41 +761,26 @@ int -efsd_write_event(int sockfd, EfsdEvent *ee) +efsd_io_write_event(int sockfd, EfsdEvent *ee) { - int result = -1; + struct iovec iov[MAX_IOVEC]; + struct msghdr msg; D_ENTER; if (!ee) D_RETURN_(-1); - if (write_int(sockfd, ee->type) < 0) - D_RETURN_(-1); + bzero(&msg, sizeof(struct msghdr)); + msg.msg_iov = iov; + msg.msg_iovlen = fill_event(iov, ee); - switch (ee->type) - { - case EFSD_EVENT_FILECHANGE: - D(("Writing filechange event for file %s\n", - ee->efsd_filechange_event.file)); - result = write_filechange_event(sockfd, ee); - break; - case EFSD_EVENT_REPLY: - D(("Writing reply event.\n")); - result = write_reply_event(sockfd, ee); - break; - default: - } - - if (result < 0) - fprintf(stderr, "error writing event.\n"); - - D_RETURN_(result); + D_RETURN_(write_data(sockfd, &msg)); } int -efsd_read_event(int sockfd, EfsdEvent *ee) +efsd_io_read_event(int sockfd, EfsdEvent *ee) { int result = -1; int count = 0; @@ -757,72 +801,10 @@ result = read_reply_event(sockfd, ee); break; default: + D(("Unknown event.\n")); } } D_RETURN_(count + result); } - -void -efsd_cleanup_command(EfsdCommand *ecom) -{ - D_ENTER; - - if (!ecom) - D_RETURN; - - switch (ecom->type) - { - case EFSD_CMD_REMOVE: - case EFSD_CMD_LISTDIR: - case EFSD_CMD_MAKEDIR: - case EFSD_CMD_CHMOD: - case EFSD_CMD_STARTMON: - case EFSD_CMD_STOPMON: - case EFSD_CMD_STAT: - case EFSD_CMD_READLINK: - FREE(ecom->efsd_file_cmd.file); - break; - case EFSD_CMD_MOVE: - case EFSD_CMD_SYMLINK: - FREE(ecom->efsd_2file_cmd.file1); - FREE(ecom->efsd_2file_cmd.file2); - break; - case EFSD_CMD_SETMETA: - FREE(ecom->efsd_set_metadata_cmd.data); - FREE(ecom->efsd_set_metadata_cmd.key); - FREE(ecom->efsd_set_metadata_cmd.file); - break; - case EFSD_CMD_GETMETA: - FREE(ecom->efsd_get_metadata_cmd.key); - FREE(ecom->efsd_get_metadata_cmd.file); - break; - case EFSD_CMD_CLOSE: - break; - default: - } - D_RETURN; -} - - -void -efsd_cleanup_event(EfsdEvent *ev) -{ - D_ENTER; - - if (!ev) - D_RETURN; - - switch (ev->type) - { - case EFSD_EVENT_REPLY: - FREE(ev->efsd_reply_event.data); - break; - case EFSD_EVENT_FILECHANGE: - FREE(ev->efsd_filechange_event.file); - break; - default: - } - D_RETURN; -} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_io.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_io.h 2001/01/19 01:36:35 1.1 +++ efsd_io.h 2001/03/04 01:12:57 1.2 @@ -27,13 +27,10 @@ #include <efsd.h> -int efsd_write_command(int sockfd, EfsdCommand *ecom); -int efsd_read_command(int sockfd, EfsdCommand *ecom); +int efsd_io_write_command(int sockfd, EfsdCommand *ecom); +int efsd_io_read_command(int sockfd, EfsdCommand *ecom); -int efsd_write_event(int sockfd, EfsdEvent *ee); -int efsd_read_event(int sockfd, EfsdEvent *ee); - -void efsd_cleanup_command(EfsdCommand *ecom); -void efsd_cleanup_event(EfsdEvent *ev); +int efsd_io_write_event(int sockfd, EfsdEvent *ee); +int efsd_io_read_event(int sockfd, EfsdEvent *ee); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_list.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_list.c 2001/02/20 18:16:58 1.1 +++ efsd_list.c 2001/03/04 01:12:57 1.2 @@ -95,6 +95,26 @@ EfsdList * +efsd_list_append(EfsdList *l, void *data) +{ + EfsdList *lnew; + + D_ENTER; + lnew = efsd_list_new(data); + + while (l->next) + l = l->next; + + lnew->prev = l; + + if (l) + l->next = lnew; + + D_RETURN_(lnew); +} + + +EfsdList * efsd_list_prepend(EfsdList *l, void *data) { EfsdList *lnew; @@ -145,7 +165,8 @@ prev = item->prev; next = item->next; - free_func(item->data); + if (free_func) + free_func(item->data); free(item); /* first item */ =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_list.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_list.h 2001/02/20 18:16:58 1.1 +++ efsd_list.h 2001/03/04 01:12:57 1.2 @@ -32,6 +32,11 @@ EfsdList *efsd_list_head(EfsdList *l); EfsdList *efsd_list_next(EfsdList *l); EfsdList *efsd_list_prev(EfsdList *l); + +/* Appends item to end of list and returns pointer to it. */ +EfsdList *efsd_list_append(EfsdList *l, void *data); + +/* Prepends item and returns pointer to it. */ EfsdList *efsd_list_prepend(EfsdList *l, void *data); void efsd_list_free(EfsdList *l, EfsdFunc free_func); EfsdList *efsd_list_remove(EfsdList *l, EfsdList *ll, EfsdFunc free_func); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- efsd_misc.c 2001/03/02 01:24:08 1.7 +++ efsd_misc.c 2001/03/04 01:12:57 1.8 @@ -223,3 +223,22 @@ D_RETURN; } #endif + + +void * +efsd_misc_memdup(void *data, int size) +{ + void *result = NULL; + + D_ENTER; + + if (!data) + { + D_RETURN_(NULL); + } + + result = malloc(size); + memcpy(result, data, size); + + D_RETURN_(result); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- efsd_misc.h 2001/03/02 01:24:08 1.6 +++ efsd_misc.h 2001/03/04 01:12:57 1.7 @@ -35,6 +35,10 @@ void efsd_misc_remove_trailing_slashes(char *path); int efsd_misc_is_absolute_path(char *path); char **efsd_misc_get_path_dirs(char *path, int *num_dirs); + +/* Could somebody tell me if memdup() is portable? */ +void *efsd_misc_memdup(void *data, int size); + #ifdef __EMX__ void efsd_slashify(char *path); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- libefsd.c 2001/03/02 01:24:08 1.9 +++ libefsd.c 2001/03/04 01:12:57 1.10 @@ -90,7 +90,7 @@ if (!ec || !com) D_RETURN_(-1); - if (efsd_write_command(ec->fd, com) < 0) + if (efsd_io_write_command(ec->fd, com) < 0) { fprintf(stderr, "libefsd: couldn't write command.\n"); D_RETURN_(-1); @@ -255,6 +255,29 @@ D_RETURN_(FD_ISSET(ec->fd, &fdset)); } + +int +efsd_ready(EfsdConnection *ec) +{ + fd_set fdset; + struct timeval tv; + + D_ENTER; + + if (!ec || ec->fd < 0) + D_RETURN_(-1); + + FD_ZERO(&fdset); + FD_SET(ec->fd, &fdset); + + tv.tv_sec = 0; + tv.tv_usec = 0; + select(ec->fd + 1, NULL, &fdset, NULL, &tv); + + D_RETURN_(FD_ISSET(ec->fd, &fdset)); +} + + int efsd_next_event(EfsdConnection *ec, EfsdEvent *ev) { @@ -263,13 +286,14 @@ if (!ec || !ev || ec->fd < 0) D_RETURN_(-1); - D_RETURN_(efsd_read_event(ec->fd, ev)); + D_RETURN_(efsd_io_read_event(ec->fd, ev)); } int efsd_wait_event(EfsdConnection *ec, EfsdEvent *ev) { + int result; fd_set fdset; D_ENTER; @@ -279,9 +303,12 @@ FD_ZERO(&fdset); FD_SET(ec->fd, &fdset); - select(ec->fd+1, &fdset, NULL, NULL, NULL); + if ((result = select(ec->fd+1, &fdset, NULL, NULL, NULL)) < 0) + { + D_RETURN_(-1); + } - D_RETURN_(efsd_read_event(ec->fd, ev)); + D_RETURN_(efsd_io_read_event(ec->fd, ev)); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- libefsd.h 2001/03/02 01:24:08 1.6 +++ libefsd.h 2001/03/04 01:12:57 1.7 @@ -89,7 +89,7 @@ the EfsdEvent entirely, call efsd_cleanup_event() first and then simply free() the pointer. */ -void efsd_cleanup_event(EfsdEvent *ev); +void efsd_event_cleanup(EfsdEvent *ev); /* Various commands to operate on the fs. |
From: <enl...@li...> - 2001-03-04 01:11:55
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/demo Modified Files: efsddemo.c Log Message: OOOOOOOH look how it nicely handles /dev with e :) Moved everything to sendmsg() and recmsg(), much better. Also cleaned up the function names a good deal, to make it easier to find stuff. There's also a job queueing system now, in case writes time out. Should be much more solid now. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/efsddemo.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- efsddemo.c 2001/03/02 01:24:08 1.10 +++ efsddemo.c 2001/03/04 01:12:57 1.11 @@ -62,7 +62,7 @@ printf("RUNNING IN BLOCKING MODE\n"); - while (efsd_wait_event(ec, &ee) != -1) + while (efsd_wait_event(ec, &ee) >= 0) handle_efsd_event(&ee); } @@ -263,7 +263,7 @@ } /* Cleanup memory allocated for this event */ - efsd_cleanup_event(ee); + efsd_event_cleanup(ee); } |
From: <enl...@li...> - 2001-03-04 01:15:48
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Added Files: efsd_types.c efsd_types.h Log Message: Forgot those... |
From: <enl...@li...> - 2001-03-06 02:52:27
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: Makefile.am efsd_common.c efsd_common.h efsd_misc.h libefsd.c libefsd.h Added Files: efsd_magic.c efsd_magic.h Log Message: The beginning of file magic support and mimetypes ... not really worth playing with it yet, BUT all the functionality needed is basically there ... look in efsd_magic.c for some info -- efsd basically builds a tree of magic tests, like the /usr/share/misc/magic file implicitly does. Lower levels in the tree (assuming root on top) are more specialized, like for mp3's with different bitrates and stuff. The tests are done in three levels -- first level: filesystem checks, i.e. when you ask for the mimetype of a directory, you get something like ext2/dir back (Raster, can you look up the fs magic code for ext3 and add it???) etc. If it's a regular file, the magic tests kick in. I put together a small db which already lets me recognize XCFs and tcpdump traces ... which means string checks and binary value checks basically work. Really cool. If that fails as well, file extensions will be checked ... which are not implemented yet. The whole thing currently is in the client ... not sure if it should be there or in the server ... but the api is tiny, 3 functions, so I can move it any time. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/Makefile.am,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- Makefile.am 2001/03/04 01:12:57 1.5 +++ Makefile.am 2001/03/06 02:54:05 1.6 @@ -36,12 +36,14 @@ libefsd_la_SOURCES = \ efsd.h \ + efsd_common.h \ + efsd_common.c \ efsd_debug.h \ efsd_debug.c \ efsd_io.h \ efsd_io.c \ - efsd_common.h \ - efsd_common.c \ + efsd_magic.h \ + efsd_magic.c \ efsd_misc.h \ efsd_misc.c \ efsd_types.h \ =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_common.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- efsd_common.c 2001/03/04 01:12:57 1.5 +++ efsd_common.c 2001/03/06 02:54:05 1.6 @@ -42,8 +42,9 @@ #include <efsd_debug.h> #include <efsd_misc.h> + char * -efsd_get_socket_file(void) +efsd_get_efsd_dir(void) { char *dir = NULL; static char s[4096] = "\0"; @@ -66,8 +67,22 @@ snprintf(s, sizeof(s), "%s/.e", dir); if (!efsd_misc_file_is_dir(s)) efsd_misc_mkdir(s); + + D_RETURN_(s); +} + + +char * +efsd_get_socket_file(void) +{ + static char s[4096] = "\0"; + + D_ENTER; + + if (s[0] != '\0') + D_RETURN_(s); - snprintf(s, sizeof(s), "%s/.e/efsd_socket", dir); + snprintf(s, sizeof(s), "%s/efsd_socket", efsd_get_efsd_dir()); s[sizeof(s)-1] = '\0'; D_RETURN_(s); @@ -81,3 +96,21 @@ unlink(efsd_get_socket_file()); D_RETURN; } + + +char * +efsd_get_magic_db(void) +{ + static char s[4096] = "\0"; + + D_ENTER; + + if (s[0] != '\0') + D_RETURN_(s); + + snprintf(s, sizeof(s), "%s/magic.db", efsd_get_efsd_dir()); + s[sizeof(s)-1] = '\0'; + + D_RETURN_(s); +} + =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_common.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- efsd_common.h 2001/02/16 00:12:01 1.3 +++ efsd_common.h 2001/03/06 02:54:05 1.4 @@ -25,7 +25,11 @@ #ifndef __efsd_common_h #define __efsd_common_h +char *efsd_get_efsd_dir(void); + char *efsd_get_socket_file(void); void efsd_remove_socket_file(void); + +char *efsd_get_magic_db(void); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_misc.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- efsd_misc.h 2001/03/04 01:12:57 1.7 +++ efsd_misc.h 2001/03/06 02:54:05 1.8 @@ -25,6 +25,15 @@ #ifndef __efsd_misc_h #define __efsd_misc_h +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + + #define NEW(X) ((X*) malloc(sizeof(X))) #define FREE(X) { if (X) { free(X); X = NULL; } } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- libefsd.c 2001/03/04 01:12:57 1.10 +++ libefsd.c 2001/03/06 02:54:05 1.11 @@ -42,6 +42,7 @@ #include <efsd_debug.h> #include <efsd_io.h> #include <efsd_common.h> +#include <efsd_magic.h> #include <libefsd.h> struct efsd_connection @@ -476,3 +477,18 @@ } +char * +efsd_get_file_mimetype(char *filename) +{ + static int initialized = 0; + + D_ENTER; + + if (!initialized) + { + efsd_magic_init(efsd_get_magic_db()); + initialized = 1; + } + + D_RETURN_(efsd_magic_get(filename)); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- libefsd.h 2001/03/04 01:12:57 1.7 +++ libefsd.h 2001/03/06 02:54:05 1.8 @@ -149,6 +149,8 @@ /* Returns the file a symlink points to */ EfsdCmdId efsd_readlink(EfsdConnection *ec, char *filename); + +char *efsd_get_file_mimetype(char *filename); #ifdef __cplusplus } #endif |
From: <enl...@li...> - 2001-03-06 02:52:57
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/demo Modified Files: Makefile.am efsddemo.c Log Message: The beginning of file magic support and mimetypes ... not really worth playing with it yet, BUT all the functionality needed is basically there ... look in efsd_magic.c for some info -- efsd basically builds a tree of magic tests, like the /usr/share/misc/magic file implicitly does. Lower levels in the tree (assuming root on top) are more specialized, like for mp3's with different bitrates and stuff. The tests are done in three levels -- first level: filesystem checks, i.e. when you ask for the mimetype of a directory, you get something like ext2/dir back (Raster, can you look up the fs magic code for ext3 and add it???) etc. If it's a regular file, the magic tests kick in. I put together a small db which already lets me recognize XCFs and tcpdump traces ... which means string checks and binary value checks basically work. Really cool. If that fails as well, file extensions will be checked ... which are not implemented yet. The whole thing currently is in the client ... not sure if it should be there or in the server ... but the api is tiny, 3 functions, so I can move it any time. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- Makefile.am 2001/01/19 01:36:35 1.1 +++ Makefile.am 2001/03/06 02:54:05 1.2 @@ -11,7 +11,7 @@ efsddemo_SOURCES = \ efsddemo.c -efsddemo_LDADD = -L$(top_srcdir)/efsd/.libs -lefsd +efsddemo_LDADD = -L$(top_srcdir)/efsd/.libs -lefsd -ledb EXTRA_DIST = run_efsddemo.sh =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/efsddemo.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- efsddemo.c 2001/03/04 01:12:57 1.11 +++ efsddemo.c 2001/03/06 02:54:05 1.12 @@ -275,6 +275,15 @@ } +void +mime_type_tests(void) +{ + printf("Mimetype for /bin: %s\n", efsd_get_file_mimetype("/bin")); + printf("Mimetype for xcf: %s\n", efsd_get_file_mimetype("/usr/local/data/xcf/hp.xcf")); + printf("Mimetype for tcpdump: %s\n", efsd_get_file_mimetype("/usr/local/devel/norm/traces/normal-slogin-mule-curry.trace")); +} + + int main(int argc, char** argv) { @@ -297,6 +306,13 @@ blocking = 0; else blocking = 1; + + + /* Mime type tests ... */ + mime_type_tests(); + + + /* Now some fs monitoring tests ... */ /* Open connection to efsd. */ if ( (ec = efsd_open()) == NULL) |
From: <enl...@li...> - 2001-03-06 02:52:57
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd Modified Files: configure.in Log Message: The beginning of file magic support and mimetypes ... not really worth playing with it yet, BUT all the functionality needed is basically there ... look in efsd_magic.c for some info -- efsd basically builds a tree of magic tests, like the /usr/share/misc/magic file implicitly does. Lower levels in the tree (assuming root on top) are more specialized, like for mp3's with different bitrates and stuff. The tests are done in three levels -- first level: filesystem checks, i.e. when you ask for the mimetype of a directory, you get something like ext2/dir back (Raster, can you look up the fs magic code for ext3 and add it???) etc. If it's a regular file, the magic tests kick in. I put together a small db which already lets me recognize XCFs and tcpdump traces ... which means string checks and binary value checks basically work. Really cool. If that fails as well, file extensions will be checked ... which are not implemented yet. The whole thing currently is in the client ... not sure if it should be there or in the server ... but the api is tiny, 3 functions, so I can move it any time. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/configure.in,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- configure.in 2001/02/27 21:59:00 1.3 +++ configure.in 2001/03/06 02:54:05 1.4 @@ -10,6 +10,8 @@ AC_HEADER_STDC AM_PROG_LIBTOOL +AC_C_BIGENDIAN + dnl Check for fam. AC_ARG_WITH(fam, [ --with-fam=DIR use DIR where fam is installed.], |
From: <enl...@li...> - 2001-03-06 20:35:18
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/efsd Modified Files: efsd_common.c efsd_common.h efsd_magic.c efsd_magic.h libefsd.c Log Message: More mimetype meat ... file name patterns should work now too ... more later ... =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_common.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- efsd_common.c 2001/03/06 02:54:05 1.6 +++ efsd_common.c 2001/03/06 20:36:58 1.7 @@ -114,3 +114,19 @@ D_RETURN_(s); } + +char * +efsd_get_patterns_db(void) +{ + static char s[4096] = "\0"; + + D_ENTER; + + if (s[0] != '\0') + D_RETURN_(s); + + snprintf(s, sizeof(s), "%s/patterns.db", efsd_get_efsd_dir()); + s[sizeof(s)-1] = '\0'; + + D_RETURN_(s); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_common.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- efsd_common.h 2001/03/06 02:54:05 1.4 +++ efsd_common.h 2001/03/06 20:36:58 1.5 @@ -31,5 +31,6 @@ void efsd_remove_socket_file(void); char *efsd_get_magic_db(void); +char *efsd_get_patterns_db(void); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_magic.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_magic.c 2001/03/06 02:54:05 1.1 +++ efsd_magic.c 2001/03/06 20:36:58 1.2 @@ -32,9 +32,11 @@ #include <sys/param.h> #include <sys/statfs.h> #include <sys/un.h> +#include <netinet/in.h> #include <string.h> #include <unistd.h> #include <errno.h> +#include <fnmatch.h> #include <Edb.h> #ifdef __EMX__ @@ -55,6 +57,16 @@ } EfsdMagicType; +typedef enum efsd_magic_test +{ + EFSD_MAGIC_TEST_EQUAL, + EFSD_MAGIC_TEST_SMALLER, + EFSD_MAGIC_TEST_LARGER, + EFSD_MAGIC_TEST_MASK, + EFSD_MAGIC_TEST_NOTMASK +} +EfsdMagicTest; + typedef enum efsd_byteorder { EFSD_BYTEORDER_HOST, @@ -88,6 +100,7 @@ int use_mask; int mask; + EfsdMagicTest test; char *mimetype; @@ -129,7 +142,7 @@ #define NTFS_SUPER_MAGIC 0x5346544e -/* The root node of the magic checks tree. It's test-related +/* The root node of the magic checks tree. Its test-related entries aren't used, it's only a container for the first level's list of EfsdMagics. */ @@ -138,6 +151,14 @@ /* The db where everything is stored. */ static E_DB_File *magic_db = NULL; +static char **patterns = NULL; +static char **pattern_mimetypes = NULL; +static int num_patterns; + +/* db helper functions */ +int e_db_int8_t_get(E_DB_File * db, char *key, u_int8_t *val); +int e_db_int16_t_get(E_DB_File * db, char *key, u_int16_t *val); +int e_db_int32_t_get(E_DB_File * db, char *key, u_int32_t *val); static EfsdMagic *magic_new(char *key, char *params); static void magic_free(EfsdMagic *em); @@ -146,11 +167,53 @@ static char *magic_test_level(EfsdMagic *em, FILE *f); static char *magic_test_perform(EfsdMagic *em, FILE *f); static void magic_init_level(char *key, char *ptr, EfsdMagic *em_parent); +static void pattern_init(char *pattern_dbfile); static void fix_byteorder(EfsdMagic *em); static char *magic_test_fs(char *filename); static char *magic_test_data(char *filename); -static char *magic_test_extension(char *filename); +static char *magic_test_pattern(char *filename); + +int +e_db_int8_t_get(E_DB_File * db, char *key, u_int8_t *val) +{ + int result; + int v; + + D_ENTER; + + result = e_db_int_get(db, key, &v); + *val = (u_int8_t)v; + D_RETURN_(result); +} + + +int +e_db_int16_t_get(E_DB_File * db, char *key, u_int16_t *val) +{ + int result; + int v; + + D_ENTER; + + result = e_db_int_get(db, key, &v); + *val = (u_int16_t)v; + D_RETURN_(result); +} + + +int +e_db_int32_t_get(E_DB_File * db, char *key, u_int32_t *val) +{ + int result; + int v; + + D_ENTER; + + result = e_db_int_get(db, key, &v); + *val = (u_int32_t)v; + D_RETURN_(result); +} static EfsdMagic * @@ -176,10 +239,18 @@ switch (em->type) { case EFSD_MAGIC_8: + em->value = NEW(u_int8_t); + e_db_int8_t_get(magic_db, key, (u_int8_t*)em->value); + fix_byteorder(em); + break; case EFSD_MAGIC_16: + em->value = NEW(u_int16_t); + e_db_int16_t_get(magic_db, key, (u_int16_t*)em->value); + fix_byteorder(em); + break; case EFSD_MAGIC_32: - em->value = malloc(sizeof(int)); - e_db_int_get(magic_db, key, (int*)em->value); + em->value = NEW(u_int32_t); + e_db_int32_t_get(magic_db, key, (u_int32_t*)em->value); fix_byteorder(em); break; case EFSD_MAGIC_STRING: @@ -194,6 +265,9 @@ else em->use_mask = FALSE; + sprintf(params, "%s", "/test"); + e_db_int_get(magic_db, key, (int*)&em->test); + sprintf(params, "%s", "/mimetype"); em->mimetype = e_db_str_get(magic_db, key); @@ -272,7 +346,7 @@ static void fix_byteorder(EfsdMagic *em) { - size_t size = 0; + int size = 0; int i; char tmp[4]; char *data; @@ -340,7 +414,7 @@ fread(&val, sizeof(val), 1, f); if (em->use_mask) - val &= em->mask; + val &= (u_int8_t)em->mask; if (val == *((u_int8_t*)em->value)) { D_RETURN_(em->mimetype); } @@ -353,7 +427,7 @@ fread(&val, sizeof(val), 1, f); if (em->use_mask) - val &= em->mask; + val &= (u_int16_t)em->mask; if (val == *((u_int16_t*)em->value)) { D_RETURN_(em->mimetype); } @@ -365,7 +439,7 @@ fread(&val, sizeof(val), 1, f); if (em->use_mask) - val &= em->mask; + val &= (u_int32_t)em->mask; D(("Performing long test: %x == %x\n", val, *((u_int32_t*)em->value))); @@ -596,23 +670,80 @@ } +static void +pattern_init(char *pattern_dbfile) +{ + E_DB_File *db; + int i; + + D_ENTER; + + patterns = e_db_dump_key_list(pattern_dbfile, &num_patterns); + + if (num_patterns > 0) + { + pattern_mimetypes = malloc(sizeof(char*) * num_patterns); + + db = e_db_open(pattern_dbfile); + + for (i = 0; i < num_patterns; i++) + pattern_mimetypes[i] = e_db_str_get(db, patterns[i]); + + e_db_close(db); + } + + D_RETURN; +} + + static char * -magic_test_extension(char *filename) +magic_test_pattern(char *filename) { + char *ptr; + int i; + D_ENTER; + + if (!filename) + D_RETURN_(NULL); + + for (i = 0; i < num_patterns; i++) + { + ptr = strrchr(filename, '/'); + if (!ptr) + ptr = filename; + else + ptr++; + + D(("Testing for pattern: %s\n", ptr)); + + if (!fnmatch(patterns[i], ptr, FNM_PATHNAME | FNM_PERIOD)) + { + D_RETURN(pattern_mimetypes[i]); + } + } + D_RETURN_(NULL); } void -efsd_magic_init(char *dbfile) +efsd_magic_init(char *magic_dbfile, char *pattern_dbfile) { char key[MAXPATHLEN]; char *ptr; D_ENTER; + + if (!magic_dbfile || magic_dbfile[0] == '\0' || + !pattern_dbfile || pattern_dbfile[0] == '\0') + { + D(("Missing db files.\n")); + D_RETURN; + } - magic_db = e_db_open_read(dbfile); + magic_db = e_db_open_read(magic_dbfile); + if (!magic_db) { D(("Could not open magic db!\n")); @@ -625,6 +756,8 @@ magic_init_level(key, ptr, &magic); e_db_close(magic_db); + pattern_init(pattern_dbfile); + D_RETURN; } @@ -632,11 +765,22 @@ void efsd_magic_cleanup(void) { + int i; + D_ENTER; magic_cleanup_level(&magic); magic.kids = NULL; + for (i = 0; i < num_patterns; i++) + { + FREE(patterns[i]); + FREE(pattern_mimetypes[i]); + } + + FREE(patterns); + FREE(pattern_mimetypes); + D_RETURN; } @@ -660,11 +804,11 @@ D(("magic: data check failed.\n")); - result = magic_test_extension(filename); + result = magic_test_pattern(filename); if (result) D_RETURN_(result); - D(("magic: file extension check failed.\n")); + D(("magic: file pattern check failed.\n")); D_RETURN_(NULL); } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/efsd_magic.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- efsd_magic.h 2001/03/06 02:54:05 1.1 +++ efsd_magic.h 2001/03/06 20:36:58 1.2 @@ -25,8 +25,21 @@ #ifndef __efsd_magic_h #define __efsd_magic_h -void efsd_magic_init(char *dbfile); +/* Initializes the magic tests from a given db file, + and the patterns from a second one. + */ +void efsd_magic_init(char *magic_dbfile, + char *pattern_dbfile); + +/* Clears the current magic test hierarchy. + */ void efsd_magic_cleanup(void); + +/* Returns mimetype for a given file, NULL when + nothing could be found. If you want to keep + the result around, strdup() it. Otherwise, + you don't have to free it. +*/ char *efsd_magic_get(char *filename); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/efsd/libefsd.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- libefsd.c 2001/03/06 02:54:05 1.11 +++ libefsd.c 2001/03/06 20:36:58 1.12 @@ -486,7 +486,8 @@ if (!initialized) { - efsd_magic_init(efsd_get_magic_db()); + efsd_magic_init(efsd_get_magic_db(), + efsd_get_patterns_db()); initialized = 1; } |
From: <enl...@li...> - 2001-03-06 20:35:49
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/demo Modified Files: efsddemo.c Log Message: More mimetype meat ... file name patterns should work now too ... more later ... =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/efsd/demo/efsddemo.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- efsddemo.c 2001/03/06 02:54:05 1.12 +++ efsddemo.c 2001/03/06 20:36:58 1.13 @@ -232,8 +232,8 @@ ee->efsd_reply_event.command.efsd_file_cmd.file); if (S_ISDIR(st->st_mode)) - printf("%s is a directory.\n", - ee->efsd_reply_event.command.efsd_file_cmd.file); + printf("%s is a directory.\n", + ee->efsd_reply_event.command.efsd_file_cmd.file); } break; @@ -276,11 +276,14 @@ void -mime_type_tests(void) +mime_type_tests(int argc, char** argv) { - printf("Mimetype for /bin: %s\n", efsd_get_file_mimetype("/bin")); - printf("Mimetype for xcf: %s\n", efsd_get_file_mimetype("/usr/local/data/xcf/hp.xcf")); - printf("Mimetype for tcpdump: %s\n", efsd_get_file_mimetype("/usr/local/devel/norm/traces/normal-slogin-mule-curry.trace")); + int i; + + for (i = 0; i < argc; i++) + { + printf("Mimetype for '%s': '%s'\n", argv[i], efsd_get_file_mimetype(argv[i])); + } } @@ -309,7 +312,10 @@ /* Mime type tests ... */ - mime_type_tests(); + if (blocking) + mime_type_tests(argc-1, &argv[1]); + else + mime_type_tests(argc-2, &argv[2]); /* Now some fs monitoring tests ... */ |
From: <enl...@li...> - 2001-03-07 19:42:06
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/tools Log Message: Directory /cvsroot/enlightenment/e17/apps/efsd/tools added to the repository |
From: <enl...@li...> - 2001-03-07 19:43:07
|
Enlightenment CVS committal Author : cpk Project : e17 Module : apps/efsd Dir : e17/apps/efsd/tools Added Files: Makefile.am magic2db.in Log Message: We're getting there. Introducing magic2db, a perl script to build a magic db from a magic definition file, like /usr/share/misc/magic. |