Esempio n. 1
0
File: init.c Progetto: stantona/sash
static void ignore_interactive_signals()
{
  ignore_signal(SIGINT);
  ignore_signal(SIGQUIT);
  ignore_signal(SIGTSTP);
  ignore_signal(SIGTTIN);
}
Esempio n. 2
0
int main()
{
  void *shared_memory = NULL;
  struct shm_buff *shm_buff_inst;
  char buffer[BUFSIZ];
  int shmid,semid;
  ignore_signal();
  semid = semget(ftok(".",'a'),1,0666|IPC_CREAT);
  init_sem(semid,1);
  shmid = shmget(ftok(".",'b'),sizeof(struct shm_buff),0666|IPC_CREAT);
  if(shmid == -1)
   {
    perror("shmget failed");
    del_sem(semid);
    exit(1);
   }
   shared_memory=shmat(shmid,(void*)0,0);
   if(shared_memory==(void*)-1)
   {
    perror("shmat");
    del_sem(semid);
    exit(1);
   }
   printf("memory attached at %X\n",(int)shared_memory);
   shm_buff_inst = (struct shm_buff*)shared_memory;
   do
   {
     sem_p(semid);
     printf("enter some text to the shared memory(enter'quit'to exit):");
     if(fgets(shm_buff_inst->buffer,SHM_BUFF_SZ,stdin)==NULL)
     {
      perror("fgets");
      sem_v(semid);
      break;
     }
     shm_buff_inst->pid=getpid();
     sem_v(semid);
   } while(strncmp(shm_buff_inst->buffer,"quit",4)!=0);
   del_sem(semid);
   if(shmdt(shared_memory)==1)
   {
    perror("shmdt");
    exit(1);
   }
  exit(0); 
}
Esempio n. 3
0
int main(int argc, char *argv[])
{
    int flag;
    int listenfd;

    parse_args(argc, argv);
    ignore_signal();
    verify_authority();
    load_config();
    flag = systemlog_init(isdaemon? OUT_LOGFILE : OUT_SCREEN, LOG_FILENAME);
    if (flag == -1) {
        FATAL("log file can't create!(%s)\n", strerror(errno));
        return 0;
    }

    if (isdaemon)
        daemon(1, 0);
    threadpool = Tpool_new(nthread);
    Tpool_run(threadpool);

    listenfd = anet_tcp_server(listen_ip, listen_port, 0);
    if (listenfd == -1) {
        FATAL("Server Initialize fail!(%s)", strerror(errno));
        goto free;
    }
    INFO("Server Initialize successful!");
    for (;;) {
        long clientfd = anet_tcp_accept(listenfd, 0);
        if (clientfd == -1) {
            FATAL("accept fail!(%s)\n", strerror(errno));
            close(listenfd);
            goto free;
        }
        Tpool_addwork(threadpool, accept_request, (void*)clientfd);
    }
free:
    Tpool_free(threadpool);
    systemlog_close();
    return 0;
}
Esempio n. 4
0
void
failsafe(int level, int ncopies)
{
	pid_t *servers;
	int running;
	int child;
	int i;
	pid_t pid;
	int signo;
	int status;
	time_t last_restart = 0, now;
	int restarts = 0;
	unsigned int backoff = 60;

	servers = (pid_t *) xmalloc((unsigned int) (ncopies * sizeof(int)));
	memset(servers, 0, ncopies * sizeof(pid_t));

	/* Loop forever, until we get SIGTERM */

	running = 0;

	while (1) {
		while (running < ncopies) {
			if ((now = time(NULL)) == last_restart) {
				if (++restarts > 2 * ncopies) {
					dbg_printf(__FILE__, __LINE__,
						   L_ERROR,
						   "Servers restarting too "
						   "quickly, backing off.");
					if (backoff < (60 * 60)) {
						backoff <<= 1;
					}
					sleep(backoff);
				}
			} else {
				last_restart = now;
				restarts = 0;
				backoff = 60;
			}

			/* Locate a free pid slot */

			for (i = 0, child = -1; i < ncopies; i++) {
				if (servers[i] == 0) {
					child = i;
					break;
				}
			}

			if (child < 0) {
				dbg_printf(__FILE__, __LINE__, L_FATAL,
					   "failsafe: no pid slot?!");
			}

			dbg_printf(__FILE__, __LINE__, D_GENERAL,
				   "starting server thread %d...\n",
				   child + 1);

			pid = fork();

			if (pid < 0) {
				dbg_printf(__FILE__, __LINE__, L_FATAL,
					   "Unable to fork for failsafe: %s",
					   strerror(errno));
			}

			if (pid == 0) {
				/* Child process: continue with execution. */
				return;
			}

			servers[child] = pid;
			running++;
		}

		/* Ignore some signals */

		ignore_signal(SIGTERM);
		ignore_signal(SIGHUP);
		ignore_signal(SIGINT);
		ignore_signal(SIGCHLD);

		if ((pid = wait(&status)) < 0) {
			dbg_printf(__FILE__, __LINE__,
				   (errno == ECHILD) ? L_FATAL : L_WARNING,
				   "failsafe: wait(): %s", strerror(errno));
			continue;
		}

		/* Locate the child */

		for (i = 0, child = -1; i < ncopies; i++) {
			if (servers[i] == pid) {
				child = i;
				break;
			}
		}

		if (child < 0) {
			dbg_printf(__FILE__, __LINE__, L_WARNING,
				   "failsafe: unknown child (pid %d) terminated",
				   pid);
			continue;
		}

		/* Book-keeping */

		servers[child] = 0;
		running--;

		if (WIFSIGNALED(status)) {
			signo = WTERMSIG(status);
			if (signo == SIGTERM) {
				dbg_printf(__FILE__, __LINE__, L_NOTICE,
					   "failsafe: "
					   "child %d terminated by SIGTERM. %s.",
					   pid,
					   running ? "Continue" : "Exit");
			} else {
				dbg_printf(__FILE__, __LINE__, L_WARNING,
					   "failsafe: "
					   "child %d terminated by SIG %s. "
					   "Restarting.", pid, signo);
				child = -1;	/* Restart */
			}
		} else if (WIFEXITED(status)) {
			dbg_printf(__FILE__, __LINE__, L_NOTICE, "failsafe: "
				   "child %d exited, status %d.",
				   pid, WEXITSTATUS(status));
		} else {
			dbg_printf(__FILE__, __LINE__, L_ERROR, "failsafe: "
				   "abnormal child termination, "
				   "pid=%d status=%d. Restarting.",
				   pid, status);
			child = -1;	/* Restart */
		}

		/* If child >= 0, we should not restart */

		if (child >= 0) {
			if (!running) {
				dbg_printf(__FILE__, __LINE__, D_GENERAL,
					   "No more children, exiting.");
				exit(0);
			}
			for (i = child; i < ncopies - 1; i++) {
				servers[i] = servers[i + 1];
			}
			ncopies--;	/* Make sure we start no new servers */
		}
	}
}
Esempio n. 5
0
static int run_server(DaemonConfig *c) {
    int r = -1;
    int error;
    const AvahiPoll *poll_api = NULL;
    AvahiWatch *sig_watch = NULL;
    int retval_is_sent = 0;
#ifdef HAVE_INOTIFY
    AvahiWatch *inotify_watch = NULL;
#endif
#ifdef HAVE_KQUEUE
    int i;
    AvahiWatch *kqueue_watch = NULL;
#endif

    assert(c);

    ignore_signal(SIGPIPE);

    if (!(nss_support = avahi_nss_support()))
        avahi_log_warn("WARNING: No NSS support for mDNS detected, consider installing nss-mdns!");

    if (!(simple_poll_api = avahi_simple_poll_new())) {
        avahi_log_error("Failed to create main loop object.");
        goto finish;
    }

    poll_api = avahi_simple_poll_get(simple_poll_api);

    if (daemon_signal_init(SIGINT, SIGHUP, SIGTERM, SIGUSR1, 0) < 0) {
        avahi_log_error("Could not register signal handlers (%s).", strerror(errno));
        goto finish;
    }

    if (!(sig_watch = poll_api->watch_new(poll_api, daemon_signal_fd(), AVAHI_WATCH_IN, signal_callback, simple_poll_api))) {
        avahi_log_error( "Failed to create signal watcher");
        goto finish;
    }

    if (simple_protocol_setup(poll_api) < 0)
        goto finish;

#ifdef HAVE_DBUS
    if (c->enable_dbus) {
        if (dbus_protocol_setup(poll_api,
                                config.disable_user_service_publishing,
                                config.n_clients_max,
                                config.n_objects_per_client_max,
                                config.n_entries_per_entry_group_max,
                                !c->fail_on_missing_dbus
#ifdef ENABLE_CHROOT
                                && !config.use_chroot
#endif
            ) < 0) {

            avahi_log_warn("WARNING: Failed to contact D-Bus daemon.");

            if (c->fail_on_missing_dbus)
                goto finish;
        }
    }
#endif

#ifdef ENABLE_CHROOT

    if (config.drop_root && config.use_chroot) {
        if (chroot(AVAHI_CONFIG_DIR) < 0) {
            avahi_log_error("Failed to chroot(): %s", strerror(errno));
            goto finish;
        }

        avahi_log_info("Successfully called chroot().");
        chdir("/");

        if (avahi_caps_drop_all() < 0) {
            avahi_log_error("Failed to drop capabilities.");
            goto finish;
        }
        avahi_log_info("Successfully dropped remaining capabilities.");
    }

#endif

#ifdef HAVE_INOTIFY
    if ((inotify_fd = inotify_init()) < 0)
        avahi_log_warn( "Failed to initialize inotify: %s", strerror(errno));
    else {
        add_inotify_watches();

        if (!(inotify_watch = poll_api->watch_new(poll_api, inotify_fd, AVAHI_WATCH_IN, inotify_callback, NULL))) {
            avahi_log_error( "Failed to create inotify watcher");
            goto finish;
        }
    }
#endif

#ifdef HAVE_KQUEUE
    if ((kq = kqueue()) < 0)
        avahi_log_warn( "Failed to initialize kqueue: %s", strerror(errno));
    else {
        add_kqueue_watches();

        if (!(kqueue_watch = poll_api->watch_new(poll_api, kq, AVAHI_WATCH_IN, kqueue_callback, NULL))) {
            avahi_log_error( "Failed to create kqueue watcher");
            goto finish;
        }
    }
#endif

    load_resolv_conf();
#ifdef ENABLE_CHROOT
    static_service_load(config.use_chroot);
    static_hosts_load(config.use_chroot);
#else
    static_service_load(0);
    static_hosts_load(0);
#endif

    if (!(avahi_server = avahi_server_new(poll_api, &c->server_config, server_callback, c, &error))) {
        avahi_log_error("Failed to create server: %s", avahi_strerror(error));
        goto finish;
    }

    update_wide_area_servers();
    update_browse_domains();

    if (c->daemonize) {
        daemon_retval_send(0);
        retval_is_sent = 1;
    }

    for (;;) {
        if ((r = avahi_simple_poll_iterate(simple_poll_api, -1)) < 0) {

            /* We handle signals through an FD, so let's continue */
            if (errno == EINTR)
                continue;

            avahi_log_error("poll(): %s", strerror(errno));
            goto finish;
        } else if (r > 0)
            /* Quit */
            break;
    }

    r = 0;

finish:

    static_service_remove_from_server();
    static_service_free_all();

    static_hosts_remove_from_server();
    static_hosts_free_all();

    remove_dns_server_entry_groups();

    simple_protocol_shutdown();

#ifdef HAVE_DBUS
    if (c->enable_dbus)
        dbus_protocol_shutdown();
#endif

    if (avahi_server) {
        avahi_server_free(avahi_server);
        avahi_server = NULL;
    }

    daemon_signal_done();

    if (sig_watch)
        poll_api->watch_free(sig_watch);

#ifdef HAVE_INOTIFY
    if (inotify_watch)
        poll_api->watch_free(inotify_watch);
    if (inotify_fd >= 0)
        close(inotify_fd);
#endif

#ifdef HAVE_KQUEUE
    if (kqueue_watch)
        poll_api->watch_free(kqueue_watch);
    if (kq >= 0)
        close(kq);
    for (i = 0; i < num_kfds; i++) {
        if (kfds[i] >= 0)
            close(kfds[i]);
    }
#endif

    if (simple_poll_api) {
        avahi_simple_poll_free(simple_poll_api);
        simple_poll_api = NULL;
    }

    if (!retval_is_sent && c->daemonize)
        daemon_retval_send(1);

    return r;
}
Esempio n. 6
0
int
main(int argc, char **argv)
{
  int msgfd;
  struct stat statBuf;
  Port_t port;
  char *msg;
  int sockfd, newsockfd;
  socklen_t addrlen = 0;
  union sockaddr_u their_addr;

  if (argc != 3) {
    fprintf(stderr, "Usage: portmsg file port\n");
    return 1;
  }
  port = atoi(argv[2]);
  if (port == 0) {
    fprintf(stderr, "error: bad port number [%s]\n", argv[2]);
    return 1;
  }
  if ((msgfd = open(argv[1], O_RDONLY)) < 0) {
    fprintf(stderr, "error: cannot open message file [%s]: %s\n", argv[1],
            strerror(errno));
    return 1;
  }
  /* read the message */
  fstat(msgfd, &statBuf);
  if (statBuf.st_size <= 0) {
    fprintf(stderr, "error: message file [%s] is empty\n", argv[1]);
    return 1;
  }
  msg = (char *) malloc(statBuf.st_size);
  if (read(msgfd, msg, statBuf.st_size) != statBuf.st_size) {
    fprintf(stderr, "error: cannot read message file [%s]\n", argv[1]);
    return 1;
  }

  /* become a daemon */
  switch (fork()) {
  case -1:
    perror("can't fork");
    return 1;
  case 0:
    break;
  default:
    return 0;
  }
#ifdef HAVE_SETSID
  if (setsid() < 0)
    perror("Unable to create new session id (Harmless)");
#else
  if (new_process_group() < 0)
    perror("Unable to set new process group (Probably harmless)");
#endif

#ifdef USE_TIOCNOTTY
  if ((fd = open("/dev/tty", O_RDWR)) >= 0) {
    ioctl(fd, TIOCNOTTY, NULL);
    close(fd);
  }
#endif

  install_sig_handler(SIGCHLD, wait_on_child);

  if ((sockfd = make_socket(port, SOCK_STREAM, NULL, NULL, host_ip)) < 0) {
    perror("can't make socket");
    return 1;
  }

main_again:
  if (connections > MAX_CONNECTIONS) {
    sleep(1);
    goto main_again;
  }
  addrlen = sizeof(their_addr);
  newsockfd = accept(sockfd, &their_addr.addr, &addrlen);
  if (newsockfd < 0) {
    if (errno == EINTR)
      goto main_again;
    perror("Couldn't accept connection");
    return 1;
  }
  connections++;
  switch (fork()) {
  case -1:
    perror("server can't fork");
    return 1;
  case 0:
    /* child process */
    install_sig_handler(SIGPIPE, lostconn);
    ignore_signal(SIGCHLD);
    send(newsockfd, msg, statBuf.st_size, 0);
    sleep(5);
    closesocket(newsockfd);
    break;
  default:
    closesocket(newsockfd);
    goto main_again;
  }

  return 0;
}
Esempio n. 7
0
int main(int argc, char *argv[])
{
	int error __unused, i, r, s;
	FILE *pidf;
	int ch = 0;

	while ((ch = getopt(argc, argv, "d")) != -1) {
		switch(ch) {
		case 'd':
			debugopt = 1;
			break;
		default:
			usage();
			/* NOT REACHED */
		}
	}
	argc -= optind;
	argv += optind;

	TAILQ_INIT(&pdev_array_list);
	TAILQ_INIT(&udev_monitor_list);

	r = ignore_signal(SIGPIPE);
	if (r != 0)
		err(1, "could not ignore_signal SIGPIPE");

	r = pthread_mutex_init(&(monitor_lock), NULL);
	if (r != 0)
		err(1, "could not allocate a pthread_mutex");

	if ((udevfd = open(UDEV_DEVICE_PATH, O_RDWR | O_NONBLOCK)) == -1)
		err(1, "%s", UDEV_DEVICE_PATH);
	unblock_descriptor(udevfd);

	s = init_local_server(LISTEN_SOCKET_FILE, SOCK_STREAM, 0);
	if (s < 0)
		err(1, "init_local_server");

	pidf = fopen("/var/run/udevd.pid", "w");
#if 0
	if (pidf == NULL)
		err(1, "pidfile");
#endif

	set_signal(SIGTERM, killed);
	set_signal(SIGHUP, hangup);

	if (debugopt == 0)
		if (daemon(0, 0) == -1)
			err(1, "daemon");

	if (pidf != NULL) {
		fprintf(pidf, "%ld\n", (long)getpid());
		fclose(pidf);
	}

	syslog(LOG_ERR, "udevd started");

	pdev_array_entry_insert(udev_getdevs(udevfd));

	memset(fds, 0 , sizeof(fds));
	fds[UDEV_DEVICE_FD_IDX].fd = udevfd;
	fds[UDEV_DEVICE_FD_IDX].events = POLLIN;
	fds[UDEV_SOCKET_FD_IDX].fd = s;
	fds[UDEV_SOCKET_FD_IDX].events = POLLIN | POLLPRI;

	for (;;) {
		r = poll(fds, NFDS, -1);
		if (r < 0) {
			if (hangup_ongoing == 0) {
				if (errno == EINTR) {
					usleep(5000);
					continue;
				} else {
					err(1, "polling...");
				}
			} else {
				usleep(20000); /* 20 ms */
				continue;
			}
		}

		for (i = 0; (i < NFDS) && (r > 0); i++) {
			if (fds[i].revents == 0)
				continue;

			--r;
			switch (i) {
			case UDEV_DEVICE_FD_IDX:
				udev_read_event(udevfd);
				break;
			case UDEV_SOCKET_FD_IDX:
				handle_new_connection(s);
				break;
			default:
				break;
			}
		}
	}

	syslog(LOG_ERR, "udevd is exiting normally");
	return 0;
}