int backup_talker(void) { char fname[6][FNAME_LEN]; int i; set_crash(); switch (double_fork()) { case -1 : sprintf(text,"~OLSYSTEM: backup_talker(): Failed to fork backup process...\n"); write_level(ARCH, 1, text, NULL); write_syslog(ERRLOG, 1, "backup_talker(): Failed to fork process...\n"); return 0; /* double_fork() failed */ case 0 : /* Start Backup Of Files */ sprintf(fname[0], "%s/%s.tgz", BACKUPDIR, BACKUPFILE); sprintf(fname[1], "%s/%s.log1", LOGFILES, BACKUPFILE); sprintf(fname[2], "%s/%s.log2", LOGFILES, BACKUPFILE); sprintf(fname[3], "%s/%s.tgz", TEMPFILES, BACKUPFILE); sprintf(fname[4], "%s/%s.log1", TEMPFILES, BACKUPFILE); sprintf(fname[5], "%s/%s.log2", TEMPFILES, BACKUPFILE); for (i=0; i<6; i++) unlink(fname[i]); write_syslog(SYSLOG, 1, "Backing Up Talker Files To : %s/%s.tgz\n",BACKUPDIR,BACKUPFILE); write_syslog(SYSLOG, 1, "For Zip Progress, Read File: %s/%s.log\n",LOGFILES,BACKUPFILE); // sprintf(text,"zip -v -9 -r %s/%s.zip * > %s/%s/%s.log", BACKUPDIR, BACKUPFILE, ROOTDIR, LOGFILES, BACKUPFILE); sprintf(text, "tar -zcfp '%s' '%s' 1> '%s' 2> '%s'", fname[3], ROOTDIR, fname[4], fname[5]); system(text); for (i=0; i<3; i++) rename(fname[i+3], fname[i]); _exit(1); return 1; } return 0; }
/*** stop zombie processes ***/ int send_email(char *addr, char *subj, char *fname) { set_crash(); switch (double_fork()) { case -1: unlink(fname); return -1; /* double_fork() failed */ case 0: if (subj) sprintf(text, "sendmail -s \"%s\" %s < %s", subj, addr, fname); else sprintf(text, "sendmail %s < %s", addr, fname); system(text); unlink(fname); _exit(1); break; /* should never get here */ default: break; } return 1; }
int main() { /* pid_t pid; signal(SIGCHLD,sig_child); pid=fork(); if(pid<0) { perror("fork error!"); exit(1); } else if(pid==0) { printf("I'm child process(pid:%d ppid:%d),i'm exiting\n",getpid(),getppid()); exit(0); } printf("i'm father process(pid:%d ppid:%d),i will sleep two seconds\n",getpid(),getppid()); sleep(2); system("ps -o pid,ppid,state,command"); printf("father process is exiting\n");*/ double_fork(); }
int main(int argc, char *argv[]) { extern char *optarg; extern int optind; /* The initial '+' instructs GNU getopt not to reorder switches. */ static const char *optflags = "+l:ntr:s:c:d:wh"; int flag; flag = getopt(argc, argv, optflags); while (flag != EOF) { switch (flag) { case 'l': logfile_name = optarg; break; case 'n': stop_always = 1; break; case 't': stop_on_terminate = 1; break; case 'r': parse_int_triplet(optarg, &spam_respawn_count, &spam_respawn_time, &spam_restart_delay_time); break; case 'w': spam_restart_delay_time = atoi(optarg); break; case 's': respawn_script = optarg; break; case 'c': respawn_count_time = atoi(optarg); break; case 'd': respawn_delay_time = atoi(optarg); break; case 'h': help(); return 1; case '?': case '+': usage(); return 1; default: fprintf(stderr, "Unhandled switch: -%c\n", flag); return 1; } flag = getopt(argc, argv, optflags); } argc -= (optind - 1); argv += (optind - 1); if (argc < 2) { fprintf(stderr, "No program to execute given.\n"); usage(); return 1; } params = &argv[1]; if (logfile_name != NULL) { logfile_fd = open(logfile_name, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (logfile_fd < 0) { fprintf(stderr, "Cannot write to logfile %s: %s\n", logfile_name, strerror(errno)); return 1; } fprintf(stderr, "Generating output to %s.\n", logfile_name); } double_fork(); return 0; }
int main(int argc, char *argv[]) { extern char *optarg; extern int optind; /* The initial '+' instructs GNU getopt not to reorder switches. */ static const char *optflags = "+l:p:fntr:s:c:d:W:U:G:D:h"; int flag; flag = getopt(argc, argv, optflags); while (flag != EOF) { switch (flag) { case 'l': logfile_name = optarg; break; case 'p': pidfile_name = optarg; break; case 'f': dont_fork = 1; break; case 'n': stop_always = 1; break; case 't': stop_on_terminate = 1; break; case 'r': parse_int_triplet(optarg, &spam_respawn_count, &spam_respawn_time, &spam_restart_delay_time); break; case 's': respawn_script = optarg; break; case 'c': respawn_count_time = atoi(optarg); break; case 'd': respawn_delay_time = atoi(optarg); break; case 'W': parse_watchdog(optarg); break; case 'U': startup_username = optarg; break; case 'G': startup_groupname = optarg; break; case 'D': startup_chdir = optarg; break; case 'h': help(); return 1; case '?': case '+': usage(); return 1; default: fprintf(stderr, "Unhandled switch: -%c\n", flag); return 1; } flag = getopt(argc, argv, optflags); } argc -= (optind - 1); argv += (optind - 1); if (argc < 2) { fprintf(stderr, "No program to execute given.\n"); usage(); return 1; } params = &argv[1]; if (logfile_name != NULL) { logfile_fd = open(logfile_name, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (logfile_fd < 0) { fprintf(stderr, "Cannot write to logfile %s: %s\n", logfile_name, strerror(errno)); return 1; } fprintf(stderr, "Generating output to %s.\n", logfile_name); } if (startup_chdir != NULL) { if (chdir(startup_chdir) != 0) { perror(startup_chdir); return 1; } } if (startup_groupname != NULL) { struct group *grp; grp = getgrnam(startup_groupname); if (grp == NULL) { perror(startup_groupname); return 1; } if (setgid(grp->gr_gid) != 0) { perror(startup_groupname); return 1; } } if (startup_username != NULL) { struct passwd *pwd; pwd = getpwnam(startup_username); if (pwd == NULL) { perror(startup_username); return 1; } if (setuid(pwd->pw_uid) != 0) { perror(startup_username); return 1; } } if (dont_fork) { do_autorestart(); } else { double_fork(); } return 0; }
int main(int argc, char **argv) { char inpstr[2000], authstr[2000]; char buffer[1000], *miasma; char *next, *current; int len, i, ret; int host_socket; fd_set readmask; pid_t ident_pid; printf("*** ArIdent Daemon Version 2.0.2\n*** Forking...\n"); /* not even think in turning this into a switch. Been there, done that. */ ret = (int) fork(); if (ret == -1) { exit(1); } if (ret != 0) { _exit(0); } setsid(); if (argc) { /* make it look pwetty */ sprintf(argv[0], "[ArIdent Daemon for %s]", TALKERNAME); } host_socket = socket_connect(SERVER, HOSTPORT); if (host_socket < 0) { printf("Error in socket_connect() to %s:%s.\n", SERVER, HOSTPORT); exit(0); } authenticate_host(host_socket); ident_pid = getpid(); printf("*** Booted successfully with PID %d ***\n", ident_pid); for (;;) { FD_ZERO(&readmask); FD_SET(host_socket, &readmask); len = select(1 + host_socket, &readmask, NULL, NULL, NULL); if (len == -1) { continue; } len = recv(host_socket, inpstr, (sizeof inpstr) - 3, 0); if (!len) { #ifdef DEBUG printf("Disconnected from host.\n"); #endif shutdown(host_socket, SHUT_WR); close(host_socket); host_socket = -1; do { sleep(5); host_socket = socket_connect(SERVER, HOSTPORT); } while (host_socket < 0); authenticate_host(host_socket); continue; } inpstr[len] = '\0'; inpstr[len + 1] = 127; #ifdef DEBUG printf("RECEIVED: %s\n", inpstr); #endif next = inpstr - 1; while (*(++next) != 127) { current = next; while (*next && *next != '\n') { ++next; } *next = '\0'; if (!strncmp(current, "EXIT", 4)) { shutdown(host_socket, SHUT_WR); close(host_socket); exit(0); } switch (double_fork()) { case -1: exit(1); /* fork failure */ case 0: break; /* child continues */ default: continue; /* parent carries on the fine family tradition */ } if (argc) { sprintf(argv[0], "[ArIdent Child for %s]", TALKERNAME); } if (!strncmp(current, "PID", 3)) { sprintf(buffer, "PRETURN: %u\n", ident_pid); #ifdef DEBUG printf("[PID] %s\n", buffer); #endif send(host_socket, buffer, strlen(buffer), 0); _exit(0); } if (!strncmp(current, "SITE:", 5)) { /* They want a site. So call the site function and send a message back. */ miasma = current + 6; sprintf(buffer, "RETURN: %s %s\n", miasma, get_proc(miasma)); #ifdef DEBUG printf("[SITE] %s\n", buffer); #endif send(host_socket, buffer, strlen(buffer), 0); _exit(0); } if (!strncmp(current, "AUTH:", 5)) { char word[MAX_WORDS + 1][WORD_LEN + 1]; struct timeval t_struct; int auth_socket; /* They want a username. So setup nice sockets stuff. */ miasma = current + 6; wordfind(miasma, word); miasma = strchr(word[3], '!'); if (miasma) { *miasma = '\0'; } auth_socket = socket_connect(word[3], "113"); if (auth_socket < 0) { _exit(0); } sprintf(buffer, "%s, %s\n", word[1], word[2]); send(auth_socket, buffer, strlen(buffer), 0); for (;;) { FD_ZERO(&readmask); FD_SET(auth_socket, &readmask); t_struct.tv_sec = 10; t_struct.tv_usec = 0; len = select(1 + auth_socket, &readmask, NULL, NULL, &t_struct); if (len == -1) { continue; } if (!len) { shutdown(auth_socket, SHUT_WR); close(auth_socket); _exit(0); } len = recv(auth_socket, authstr, (sizeof authstr) - 3, 0); if (!len) { shutdown(auth_socket, SHUT_WR); close(auth_socket); _exit(0); } if (len > 255 || len < 5) { shutdown(auth_socket, SHUT_WR); close(auth_socket); _exit(0); } authstr[len] = '\0'; /* Find the last "word" in inpstr. */ if (strstr(authstr, "ERROR")) { shutdown(auth_socket, SHUT_WR); close(auth_socket); _exit(0); } for (i = len - 1; i > 2; --i) { if (authstr[i] == ' ' || authstr[i] == ':') { miasma = authstr + i + 1; sprintf(buffer, "ARETURN: %s %s %s\n", word[1], word[0], miasma); #ifdef DEBUG printf("[AUTH] %s\n", buffer); #endif send(host_socket, buffer, strlen(buffer), 0); shutdown(auth_socket, SHUT_WR); close(auth_socket); _exit(0); } } shutdown(auth_socket, SHUT_WR); close(auth_socket); _exit(0); } } _exit(0); } } return 0; }