[Ovirt-devel] [PATCH-node 1/2] Add ovirt-listen-awake daemon. This is a very small daemon that oVirt

Jim Meyering jim at meyering.net
Wed Sep 10 14:17:30 UTC 2008


Chris Lalancette <clalance at redhat.com> wrote:
...
> diff --git a/ovirt-listen-awake/ovirt-listen-awake.c b/ovirt-listen-awake/ovirt-listen-awake.c
...
> +static void usage(int exitcode)
> +{
> +  printf("Usage: ovirt-listen-awake [OPTIONS]\n");
> +  printf("OPTIONS:\n");
> +  printf(" -h\t\tShow this help message\n");
> +  printf(" -n\t\tDo not daemonize (useful for debugging)\n");
> +  exit(exitcode);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +  int listen_socket, conn;
> +  struct sockaddr_in client_address;
> +  unsigned int addrlen;
> +  FILE *conn_stream;
> +  FILE *logfile;
> +  char buffer[BUFLEN];
> +  int c;
> +  int do_daemon;
> +  int i;
> +
> +  do_daemon = 1;
> +
> +  while ((c=getopt(argc, argv, ":hn")) != -1) {
> +    switch(c) {
> +    case 'h':
> +      usage(0);
> +      break;
> +    case 'n':
> +      do_daemon = 0;
> +      break;
> +    default:
> +      usage(1);
> +    }
> +  }
> +
> +  if ((argc-optind) != 0) {
> +    for (i = optind; i < argc ; i ++) {
> +      fprintf(stderr, "Extra operand %s\n", argv[i]);
> +    }
> +    error(1, 0, "Try --help for more information");

s/--help/-h/
(or overkill: switch to getopt_long and accept --help)

> +  }
> +
> +  listen_socket = listenSocket(7777);
> +  if (listen_socket < 0)
> +    return 2;
> +
> +  if (do_daemon) {
> +    logfile = fopen(LOGFILE,"a+");
> +    if (logfile == NULL)
> +      error(3, errno, "Error opening logfile %s", LOGFILE);
> +
> +    // NOTE: this closes stdout and stderr
> +    if (daemon(0, 0) < 0)
> +      error(4, errno, "Error daemonizing");
> +
> +    // so re-open them to the logfile here
> +    dup2(fileno(logfile), STDOUT_FILENO);
> +    dup2(fileno(logfile), STDERR_FILENO);

Oops.  I missed this the first time around.
Each of these dup2 calls can fail, so best to check for that.

> +  }
> +
> +  while (1) {
> +    addrlen = sizeof(client_address);
> +    memset(&client_address, 0, addrlen);
> +    memset(buffer, 0, BUFLEN);

This use of memset still looks unnecessary.

...
> +  }
> +
> +  close(listen_socket);
> +  fclose(logfile);

How about detecting write failure (e.g., disk full):

     if (fclose (logfile) != 0)
       return 1;

> +  return 0;
> +}
> diff --git a/ovirt-node.spec b/ovirt-node.spec
...




More information about the ovirt-devel mailing list