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