Back to index

glibc  2.9
Functions
hurdhost.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

ssize_t _hurd_get_host_config (const char *item, char *buf, size_t buflen)
ssize_t _hurd_set_host_config (const char *item, const char *value, size_t valuelen)

Function Documentation

ssize_t _hurd_get_host_config ( const char *  item,
char *  buf,
size_t  buflen 
)

Definition at line 27 of file get-host.c.

{
  error_t err;
  char *data;
  mach_msg_type_number_t nread, more;
  file_t config;

  err = __hurd_file_name_lookup (&_hurd_ports_use, &__getdport, 0,
                             item, O_RDONLY, 0, &config);
  switch (err)
    {
    case 0:                 /* Success; read file contents below.  */
      break;

    case ENOENT:            /* ? Others?  All errors? */
      /* The file does not exist, so no value has been set.  Rather than
        causing gethostname et al to fail with ENOENT, give an empty value
        as other systems do before sethostname has been called.  */
      if (buflen != 0)
       *buf = '\0';
      return 0;

    default:
      return __hurd_fail (err);
    }

  data = buf;
  nread = buflen;
  err = __io_read (config, &data, &nread, -1, buflen);
  if (! err)
    /* Check if there is more in the file we didn't read.  */
    err = __io_readable (config, &more);
  __mach_port_deallocate (__mach_task_self (), config);
  if (err)
    return __hurd_fail (err);
  if (data != buf)
    {
      memcpy (buf, data, nread);
      __vm_deallocate (__mach_task_self (), (vm_address_t) data, nread);
    }

  /* If the file is empty, give an empty value.  */
  if (nread == 0)
    {
      if (buflen != 0)
       *buf = '\0';
      return 0;
    }

  /* Remove newlines in case someone wrote the file by hand.  */
  while (nread > 0 && buf[nread - 1] == '\n')
    buf[--nread] = '\0';

  /* Null-terminate the result if there is enough space.  */
  if (nread < buflen)
    buf[nread] = '\0';
  else
    if (buf[nread - 1] != '\0')
      more = 1;

  if (more)
    /* If we didn't read the whole file, tell the caller to use a bigger
       buffer next time.  */
    return __hurd_fail (ENAMETOOLONG);

  return nread;
}

Here is the call graph for this function:

Here is the caller graph for this function:

ssize_t _hurd_set_host_config ( const char *  item,
const char *  value,
size_t  valuelen 
)

Definition at line 25 of file set-host.c.

{
  error_t err;
  mach_msg_type_number_t nwrote;
  file_t new, dir;
  char *name;

  dir = __file_name_split (item, &name);
  if (dir == MACH_PORT_NULL)
    return -1;

  /* Create a new node.  */
  err = __dir_mkfile (dir, O_WRONLY, 0644, &new);
  if (! err)
    {
      /* Write the contents.  */
      err = __io_write (new, value, valuelen, 0, &nwrote);
      if (! err)
       /* Atomically link the new node onto the name.  */
       err = __dir_link (dir, new, name, 0);
      __mach_port_deallocate (__mach_task_self (), new);
    }
  __mach_port_deallocate (__mach_task_self (), dir);

  return err ? __hurd_fail (err) : nwrote;
}

Here is the call graph for this function:

Here is the caller graph for this function: