CVS: is/intersync intersync.c,1.48,1.49

Robert Read <[email protected]> Tue, 24 Sep 2002 23:31:40 -0700
Newsgroups gmane.comp.file-systems.intermezzo.cvs
Message-ID <[email protected]>
Update of /cvsroot/intermezzo/is/intersync
In directory usw-pr-cvs1:/tmp/cvs-serv27614/intersync

Modified Files:
	intersync.c 
Log Message:
* incorporate --daemon patch from Don Mahurin <[email protected]> 
* add --server="" support, also from Don - Thanks Don!



Index: intersync.c
===================================================================
RCS file: /cvsroot/intermezzo/is/intersync/intersync.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -U2 -r1.48 -r1.49
--- intersync.c	17 May 2002 00:38:10 -0000	1.48
+++ intersync.c	25 Sep 2002 06:31:38 -0000	1.49
@@ -206,4 +206,5 @@
     --hoard=FILE          hoard the files listed in FILE\n\
     --reint               quit after reintegration and hoard is done\n\
+    --daemon              run intersync as daemon process\n\
     --version             output version information and exit\n\
 \n\
@@ -244,4 +245,6 @@
 #define OPT_FSET -10
                 {"fsetname", required_argument, NULL, OPT_FSET},
+#define OPT_DAEMON -11
+                {"daemon", no_argument, NULL, OPT_DAEMON},
                 {0}
         };
@@ -254,4 +257,5 @@
         cfg->cfg_hoard_conf = NULL;
         cfg->cfg_reint_only = 0;
+        cfg->cfg_daemon = 0;
         cfg->cfg_clientid = NULL;
         cfg->cfg_fsetname = NULL;
@@ -292,4 +296,7 @@
                         cfg->cfg_reint_only = 1;
                         break;
+                case OPT_DAEMON:
+                        cfg->cfg_daemon = 1;
+                        break;
                 case OPT_CLIENTID:
                         cfg->cfg_clientid = g_strdup(optarg);
@@ -385,4 +392,6 @@
 int cfg_defaults(struct is_config *cfg) 
 {
+        if (cfg->cfg_server != NULL && cfg->cfg_server[0] == '\0')
+                cfg->cfg_server = NULL;
         if (cfg->cfg_server_port == -1)
                 cfg->cfg_server_port = DEFAULT_SERVER_PORT;
@@ -396,4 +405,6 @@
                 cfg->cfg_local_ip = g_strdup(DEFAULT_LOCAL_IP);
         }
+        if (!cfg->cfg_fsetname && !cfg->cfg_server)
+                cfg->cfg_fsetname = g_strdup("rootfset");
         return 0;
 }
@@ -434,7 +445,4 @@
                 cfg_set(cfg, tmp_cfg);
 
-        if (!cfg->cfg_fsetname && !cfg->cfg_server)
-                cfg->cfg_fsetname = g_strdup("rootfset");
-        
         cfg_defaults(cfg);
         
@@ -458,4 +466,67 @@
 }
 
+int logger_pipe_open(char *tag)
+{
+   int pid, p[2];
+   pipe(p);
+
+   if((pid = fork()) == -1)
+   {
+      fprintf(stderr, "fork failed\n");
+      return -1;
+   }
+   else if(pid == 0)
+   {
+      close(p[1]);
+      dup2(p[0], STDIN_FILENO);
+      close(p[0]);
+      execlp("logger", "logger", "-t", tag, NULL);
+      fprintf(stderr, "exec failed\n");
+      return -1;
+   }
+   close(p[0]);
+
+   return p[1];
+}
+
+void daemonize(int channel)
+{
+   pid_t pid;
+   int logger_fd;
+   char tag[1024];
+
+  /* Become a demon. */
+   if( (pid = fork() ) < 0)
+   {
+        perror("Cannot fork");
+        exit(-1);
+   }
+
+   if( pid > 0) /* Parent exits. */
+   {
+        FILE *pidfile;
+        char pidfilename[26];
+        sprintf(pidfilename, "/var/run/intersync-%d.pid", channel);
+        pidfile = fopen(pidfilename, "w");
+        fprintf(pidfile, "%d\n", pid);
+        fclose(pidfile);
+        exit(0);
+   }
+
+   
+   /* Child continues. */
+   setsid();
+   chroot("/");
+   //   umask(0);
+
+   snprintf(tag, sizeof(tag), "intersync-%d", channel);
+   logger_fd = logger_pipe_open(tag);
+   //close(1);
+   dup2(logger_fd, 1);
+   //close(2);
+   dup2(logger_fd, 2);
+   close(logger_fd);
+   close(0);
+}
 
 int main(int argc, char **argv)
@@ -494,4 +565,8 @@
                 start_server(cache->cache_docroot, cfg.cfg_local_ip, cfg.cfg_local_port);
         }
+
+	if (cfg.cfg_daemon == 1) {
+		daemonize(cache->cache_channel);
+	}
 
         rc = is_init_kernel(cache);



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf