Enlightenment CVS committal

Author  : chaos
Project : e17
Module  : apps/evfs

Dir     : e17/apps/evfs/src/bin


Modified Files:
        Makefile.am evfs_main.c evfs_metadata.c 
Added Files:
        evfs_worker.c 


Log Message:
* Total rework of server architecture.  Few rough edges still, but it passed 
the torture test.  Server now instantiates a new worker process for each 
client.  Cleaner, more secure, and certain elements that shall remain nameless 
(*cough* samba) - need it for auth.

===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/Makefile.am,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- Makefile.am 16 Jul 2007 13:25:22 -0000      1.26
+++ Makefile.am 11 Aug 2007 10:39:02 -0000      1.27
@@ -1,12 +1,12 @@
 AUTOMAKE_OPTIONS     = 1.7 foreign
 
-bin_PROGRAMS = evfs evfscat evfscopy
+bin_PROGRAMS = evfs evfsworker evfscat evfscopy
 
 MAINTAINERCLEANFILES = Makefile.in Makefile
 
 DEBUGFLAGS = -DDEBUG -DDEBUG_NEST -W -Wall
 
-INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/include @EET_CFLAGS@ 
@EVAS_CFLAGS@ @ECORE_CFLAGS@ @XML2_CFLAGS@ $(DEBUGFLAGS) -I.
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src/include @EET_CFLAGS@ 
@EVAS_CFLAGS@ @ECORE_CFLAGS@ @XML2_CFLAGS@ $(DEBUGFLAGS) -I.  
-DBINDIR=\""$(bindir)"\"
 
 evfs_SOURCES = \
        evfs_main.c \
@@ -24,6 +24,22 @@
        $(top_srcdir)/src/common/evfs_vfolder.c \
        $(top_srcdir)/src/common/evfs_server.c
 
+evfsworker_SOURCES = \
+       evfs_worker.c \
+        evfs_cleanup.c \
+        $(top_srcdir)/src/common/evfs_new.c \
+        $(top_srcdir)/src/common/evfs_io.c \
+        $(top_srcdir)/src/common/evfs_event_helper.c \
+        $(top_srcdir)/src/common/evfs_common.c \
+        evfs_server_handle.c \
+        evfs_operation.c \
+        evfs_operation_tasks.c \
+        evfs_metadata.c \
+        evfs_metadata_db.c \
+        $(top_srcdir)/src/common/evfs_vfolder.c \
+        $(top_srcdir)/src/common/evfs_server.c
+
+
 evfscat_SOURCES = \
        evfscat.c
 
@@ -36,5 +52,7 @@
 evfscat_LDADD = $(top_builddir)/src/lib/libevfs.la @XML2_LIBS@ @ECORE_LIBS@ 
@EVAS_LIBS@ @EET_LIBS@
 
 evfscopy_LDADD = $(top_builddir)/src/lib/libevfs.la @XML2_LIBS@ @ECORE_LIBS@ 
@EVAS_LIBS@ @EET_LIBS@
+
+evfsworker_LDADD = $(top_builddir)/src/lib/libevfs.la @XML2_LIBS@ @ECORE_LIBS@ 
@EVAS_LIBS@ @EET_LIBS@
 
 
===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_main.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -3 -r1.61 -r1.62
--- evfs_main.c 25 Jul 2007 17:00:53 -0000      1.61
+++ evfs_main.c 11 Aug 2007 10:39:02 -0000      1.62
@@ -45,8 +45,29 @@
 #include <signal.h>
 #include <errno.h>
 #include <dirent.h>
+#include <ctype.h>
+
+#define EVFS_TIMER_INTERVAL 0.01
+
+static evfs_client* client_worker_waiter = NULL;
+
+/*An object used for testing, so we can GDB the worker*/
+static Ecore_Ipc_Client* worker_client_waiter = NULL;
 
 static evfs_server* server;
+static Ecore_Event_Handler *client_add = NULL;
+static Ecore_Event_Handler *client_del = NULL;
+static Ecore_Event_Handler *client_data = NULL;
+
+static Ecore_Event_Handler *worker_add = NULL;
+static Ecore_Event_Handler *worker_del = NULL;
+static Ecore_Event_Handler *worker_data = NULL;
+
+int ipc_server_data(void *data __UNUSED__, int type __UNUSED__, void *event);
+int ecore_timer_enterer(__UNUSED__ void *data);
+void evfs_worker_initialise();
+void evfs_load_plugins();
+
 
 evfs_client *
 evfs_client_get(Ecore_Ipc_Client * client)
@@ -62,6 +83,38 @@
    return serve->clientCounter - 1;
 }
 
+int evfs_server_worker_spawn(int id) 
+{
+   const char *server_exe = BINDIR "/evfsworker";
+   char strid[20];
+
+   snprintf(strid, 20, "%d", id);
+   printf("Creating new worker, client ID: %d\n",id);
+
+   if (!access(server_exe, X_OK | R_OK)) {
+        setsid();
+        if (fork() == 0) {
+             execl(server_exe, strid, NULL);
+        }
+        return 1;
+     } else {
+        fprintf(stderr, "You don't have rights to execute the evfs worker\n");
+        return 1;
+     }
+
+   return 0;
+}
+
+
+void evfs_worker_initialise()
+{
+   /*Load the plugins */ 
+   evfs_load_plugins();
+   evfs_operation_initialise();
+}
+
+
+/* Server -> Client IPC*/
 int
 ipc_client_add(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
@@ -71,17 +124,43 @@
    e = (Ecore_Ipc_Event_Client_Add *) event;
    /*printf("ERR: EVFS Client Connected!!!\n"); */
 
+   /*Make sure we're not the worker server's event*/
+   if (ecore_ipc_client_server_get(e->client) != server->ipc_server) return 1;
+
    client = NEW(evfs_client);
    client->client = e->client;
    client->server = server;
    client->prog_command = NULL;
    client->id = evfs_server_get_next_id(server);
    ecore_hash_set(server->client_hash, client->client, client);
-
    server->num_clients++;
 
-   evfs_event_client_id_notify(client);
 
+   printf("Creating new worker..\n");
+   
+   /*Save a reference to this client, so we can allocate the worker child to
+    * it when it calls back*/
+   
+   if (worker_client_waiter) {
+          client->worker_client = worker_client_waiter;
+          ecore_hash_set(evfs_server_get()->worker_hash, worker_client_waiter, 
client);
+          worker_client_waiter = NULL;
+
+          evfs_event_client_id_notify(client);
+   } else {
+          if (client_worker_waiter) {
+                  printf("EVFS: Worker failed to connect for previous client - 
Abort\n");
+          } else {
+                  client_worker_waiter = client;
+
+                  /*Spawn a worker*/
+                  evfs_server_worker_spawn(client->id);
+          }
+   }
+   
+   /*ecore_ipc_server_send(client->master, 
EVFS_MESSAGE_CLIENTID,0,0,0,0,(void*)client,sizeof(int));*/
+
+   /*Tell our child that we've connected*/
    return (1);
 }
 
@@ -96,6 +175,10 @@
 
    e = (Ecore_Ipc_Event_Client_Del *) event;
 
+   /*Make sure we're not the worker server's event*/
+   if (ecore_ipc_client_server_get(e->client) != server->ipc_server) return 1;
+
+
    client = ecore_hash_get(server->client_hash, e->client);
    printf("Client %ld, Client Disconnected!!!\n", client->id);
 
@@ -108,8 +191,14 @@
         (*EVFS_PLUGIN_FILE(plugin)->functions->evfs_client_disconnect) 
(client);
      }
 
-   ecore_list_destroy(keys);
+   /*Kill the child pid*/
+   if (client->pid) {
+       printf("Sending client %p the kill signal\n", client->worker_client);
+       ecore_ipc_client_send(client->worker_client, 
EVFS_MESSAGE_KILL,0,0,0,0,NULL,0);
+   }
 
+   ecore_list_destroy(keys);
+   ecore_ipc_client_del(client->client);
    ecore_hash_remove(server->client_hash, client);
    evfs_cleanup_client(client);
 
@@ -123,34 +212,98 @@
    Ecore_Ipc_Event_Client_Data *e = (Ecore_Ipc_Event_Client_Data *) event;
    evfs_client *client;
 
-   ecore_ipc_message *msg =
-      ecore_ipc_message_new(e->major, e->minor, e->ref, e->ref_to, e->response,
-                            e->data, e->size);
+   /*Make sure we're not the worker server's event*/
+   if (ecore_ipc_client_server_get(e->client) != server->ipc_server) return 1;
 
    client = evfs_client_get(e->client);
 
-   if (!client->prog_command)
-     {
-        client->prog_command = evfs_command_new();
-     }
+   /*Onsend to client's worker, if any*/
+   if (client->worker_client) {
+          /*printf("Onsending data to client..%d %d %d %d %d\n", 
e->major,e->minor,e->ref,e->ref_to,e->response,e->data, e->size );*/
+          
+          
ecore_ipc_client_send(client->worker_client,e->major,e->minor,e->ref,e->ref_to,e->response,e->data,
 e->size); 
+   } else {
+          printf("No worker client to send to at ipc_client_data\n");
+   }
 
-   /*True == command finished */
-   if (evfs_process_incoming_command(server, client->prog_command, msg))
-     {
-        evfs_command_client *com_cli = NEW(evfs_command_client);
+   return 1;
+}
+/*-----------*/
 
-        com_cli->client = client;
-        com_cli->command = client->prog_command;
-        client->prog_command = NULL;
-        ecore_list_append(server->incoming_command_list, com_cli);
-     }
+/*Server -> Worker IPC*/
+int
+ipc_worker_add(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+       Ecore_Ipc_Event_Client_Data *e = (Ecore_Ipc_Event_Client_Data *) event;
+
+       /*Make sure we're not the daemon server's event*/
+       if (ecore_ipc_client_server_get(e->client) != server->worker_server) 
return 1;
+
+       printf("New worker client to server..\n");
+               
+       if (client_worker_waiter) {
+               printf("Client %p waiting for worker..\n", 
client_worker_waiter);
+               
+               client_worker_waiter->worker_client = e->client;
+               ecore_hash_set(evfs_server_get()->worker_hash, e->client, 
client_worker_waiter);
+
+               evfs_event_client_id_notify(client_worker_waiter);      
+               client_worker_waiter = NULL;
+       } else {
+               printf("Added worker to holding queue..\n");
+               worker_client_waiter = e->client;
+       }
+
+       return 1;
+}
+
+int
+ipc_worker_del(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+   Ecore_Ipc_Event_Client_Del *e;
+   Ecore_List *keys;
+   evfs_client *client;
+   evfs_plugin *plugin;
+   char *key;
+   
+   e = (Ecore_Ipc_Event_Client_Del *) event;
+
+   /*Make sure we're not the daemon server's event*/
+   if (ecore_ipc_client_server_get(e->client) != server->worker_server) return 
1;
 
-   free(msg);
+   printf("Worker disconnect..\n");
 
    return 1;
 }
 
 int
+ipc_worker_data(void *data __UNUSED__, int type __UNUSED__, void *event)
+{
+
+   Ecore_Ipc_Event_Client_Data *e = (Ecore_Ipc_Event_Client_Data *) event;
+   evfs_client *client;
+   int id;
+
+   /*Make sure we're not the daemon server's event*/
+   if (ecore_ipc_client_server_get(e->client) != server->worker_server) return 
1;
+
+   //printf("WORKER: Unrecognised major: %d\n", e->major);
+   //
+   /*printf("Sending data to client.. %d %d %d %d %d\n", e->major, e->minor, 
e->ref, e->ref_to, e->response);*/
+
+   client = ecore_hash_get(evfs_server_get()->worker_hash, e->client);
+   if (client) {
+          ecore_ipc_client_send(client->client, 
e->major,e->minor,e->ref,e->ref_to,e->response,e->data,e->size);
+   } else {
+                  printf("Cannot find client at ipc_worker_data\n");
+   }
+
+   return 1;
+}
+/*------------------*/
+
+
+int
 evfs_handle_command(evfs_client * client, evfs_command * command)
 {
    int cleanup_command=1;
@@ -522,6 +675,12 @@
 }
 
 int
+ecore_timer_enterer_server(__UNUSED__ void *data)
+{
+   return 1;
+}
+
+int
 main(int argc, char **argv)
 {
    /*Init the ipc server */
@@ -533,12 +692,15 @@
    server = evfs_server_new();
    server->client_hash =
       ecore_hash_new(ecore_direct_hash, ecore_direct_compare);
+
+   server->worker_hash =
+      ecore_hash_new(ecore_direct_hash, ecore_direct_compare);
    
    server->plugin_uri_hash = ecore_hash_new(ecore_str_hash, ecore_str_compare);
    server->plugin_meta_hash = ecore_hash_new(ecore_str_hash, 
ecore_str_compare);
    server->plugin_vfolder_hash = ecore_hash_new(ecore_str_hash, 
ecore_str_compare); 
    
-   server->clientCounter = 0;
+   server->clientCounter = 1000;
    server->incoming_command_list = ecore_list_new();
 
    //ecore_idle_enterer_add(incoming_command_cb, NULL);
@@ -547,7 +709,7 @@
    evfs_object_server_is_set();
 
    /*Add a timer, to make sure our event loop keeps going.  Kinda hacky */
-   ecore_timer_add(0.01, ecore_timer_enterer, NULL);
+   server->tmr = ecore_timer_add(1, ecore_timer_enterer_server, NULL);
 
    if ((server->ipc_server =
         ecore_ipc_server_connect(ECORE_IPC_LOCAL_USER, EVFS_IPC_TITLE, 0,
@@ -565,19 +727,28 @@
         server->ipc_server =
            ecore_ipc_server_add(ECORE_IPC_LOCAL_USER, EVFS_IPC_TITLE, 0, NULL);
 
-        ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, ipc_client_add,
+        client_add = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, 
ipc_client_add,
+                                NULL);
+        client_del = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, 
ipc_client_del,
+                                NULL);
+        client_data = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, 
ipc_client_data,
                                 NULL);
-        ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, ipc_client_del,
+
+       server->worker_server = 
+           ecore_ipc_server_add(ECORE_IPC_LOCAL_USER, EVFS_WOR_TITLE, 0, NULL);
+
+        worker_add = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD, 
ipc_worker_add,
                                 NULL);
-        ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, ipc_client_data,
+        worker_del = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL, 
ipc_worker_del,
                                 NULL);
+        worker_data = ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA, 
ipc_worker_data,
+                                NULL);
+
+               
      }
 
-   /*Load the plugins */
-   evfs_load_plugins();
    evfs_io_initialise();
    evfs_vfolder_initialise();
-   evfs_operation_initialise();
    evfs_trash_initialise();
    
    if (argc >= 2 && !strcmp(argv[1], "-nometa"))
===================================================================
RCS file: /cvs/e/e17/apps/evfs/src/bin/evfs_metadata.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -3 -r1.33 -r1.34
--- evfs_metadata.c     25 Jul 2007 17:00:53 -0000      1.33
+++ evfs_metadata.c     11 Aug 2007 10:39:02 -0000      1.34
@@ -380,6 +380,11 @@
 
 }
 
+void evfs_metadata_initialise_worker()
+{
+       evfs_metadata_db_init(&db);
+}
+
 Evas_List* evfs_metadata_groups_get() {
        int ret;
        Evas_List* ret_list = NULL;



-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to