monitor_close (fd);
close (fd);
conf_reinit (void){  struct conf_binding *cb = 0;  int fd, trans;  unsigned int i;  size_t sz;  char *new_conf_addr = 0;  struct stat sb;  if ((stat (conf_path, &sb) == 0) || (errno != ENOENT))    {      if (check_file_secrecy (conf_path, &sz))	return;      fd = monitor_open (conf_path, O_RDONLY, 0);      if (fd == -1)        {	  log_error ("conf_reinit: open (\"%s\", O_RDONLY) failed", conf_path);	  return;	}      new_conf_addr = malloc (sz);      if (!new_conf_addr)        {	  log_error ("conf_reinit: malloc (%lu) failed", (unsigned long)sz);	  goto fail;	}      /* XXX I assume short reads won't happen here.  */      if (read (fd, new_conf_addr, sz) != (int)sz)        {	    log_error ("conf_reinit: read (%d, %p, %lu) failed",		       fd, new_conf_addr, (unsigned long)sz);	    goto fail;	}      monitor_close (fd);      trans = conf_begin ();      /* XXX Should we not care about errors and rollback?  */      conf_parse (trans, new_conf_addr, sz);    }  else    trans = conf_begin ();  /* Load default configuration values.  */  conf_load_defaults (trans);  /* Free potential existing configuration.  */  if (conf_addr)    {      for (i = 0; i < sizeof conf_bindings / sizeof conf_bindings[0]; i++)	for (cb = LIST_FIRST (&conf_bindings[i]); cb;	     cb = LIST_FIRST (&conf_bindings[i]))	  conf_remove_now (cb->section, cb->tag);      free (conf_addr);    }  conf_end (trans, 1);  conf_addr = new_conf_addr;  return; fail:  if (new_conf_addr)    free (new_conf_addr);  close (fd);}