Back to index

glibc  2.9
Functions
xattr.h File Reference
#include <sys/xattr.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

error_t _hurd_xattr_get (io_t port, const char *name, void *value, size_t *size)
error_t _hurd_xattr_set (io_t port, const char *name, const void *value, size_t size, int flags)
error_t _hurd_xattr_remove (io_t port, const char *name)
error_t _hurd_xattr_list (io_t port, void *buffer, size_t *size)

Function Documentation

error_t _hurd_xattr_get ( io_t  port,
const char *  name,
void *  value,
size_t size 
)

Definition at line 37 of file xattr.c.

{
  if (strncmp (name, "gnu.", 4))
    return EOPNOTSUPP;
  name += 4;

  if (!strcmp (name, "author"))
    {
      struct stat64 st;
      error_t err = __io_stat (port, &st);
      if (err)
       return err;
      if (st.st_author == st.st_uid)
       *size = 0;
      else if (value)
       {
         if (*size < sizeof st.st_author)
           return ERANGE;
         memcpy (value, &st.st_author, sizeof st.st_author);
       }
      *size = sizeof st.st_author;
      return 0;
    }

  if (!strcmp (name, "translator"))
    {
      char *buf = value;
      size_t bufsz = value ? *size : 0;
      error_t err = __file_get_translator (port, &buf, &bufsz);
      if (err)
       return err;
      if (value != NULL && *size < bufsz)
       {
         if (buf != value)
           munmap (buf, bufsz);
         return -ERANGE;
       }
      if (buf != value && bufsz > 0)
       {
         if (value != NULL)
           memcpy (value, buf, bufsz);
         munmap (buf, bufsz);
       }
      *size = bufsz;
      return 0;
    }

  return EOPNOTSUPP;
}

Here is the call graph for this function:

Here is the caller graph for this function:

error_t _hurd_xattr_list ( io_t  port,
void *  buffer,
size_t size 
)

Definition at line 175 of file xattr.c.

{
  size_t total = 0;
  char *bufp = buffer;
  inline void add (const char *name, size_t len)
    {
      total += len;
      if (bufp != NULL && total <= *size)
       bufp = __mempcpy (bufp, name, len);
    }
#define add(s) add (s, sizeof s)

  struct stat64 st;
  error_t err = __io_stat (port, &st);
  if (err)
    return err;

  if (st.st_author != st.st_uid)
    add ("gnu.author");
  if (st.st_mode & S_IPTRANS)
    add ("gnu.translator");

  if (buffer != NULL && total > *size)
    return ERANGE;
  *size = total;
  return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

error_t _hurd_xattr_remove ( io_t  port,
const char *  name 
)

Definition at line 169 of file xattr.c.

{
  return _hurd_xattr_set (port, name, NULL, 0, XATTR_REPLACE);
}

Here is the call graph for this function:

Here is the caller graph for this function:

error_t _hurd_xattr_set ( io_t  port,
const char *  name,
const void *  value,
size_t  size,
int  flags 
)

Definition at line 88 of file xattr.c.

{
  if (strncmp (name, "gnu.", 4))
    return EOPNOTSUPP;
  name += 4;

  if (!strcmp (name, "author"))
    switch (size)
      {
      default:
       return EINVAL;
      case 0:               /* "Clear" author by setting to st_uid. */
       {
         struct stat64 st;
         error_t err = __io_stat (port, &st);
         if (err)
           return err;
         if (st.st_author == st.st_uid)
           {
             /* Nothing to do.  */
             if (flags & XATTR_REPLACE)
              return ENODATA;
             return 0;
           }
         if (flags & XATTR_CREATE)
           return EEXIST;
         return __file_chauthor (port, st.st_uid);
       }
      case sizeof (uid_t):  /* Set the author.  */
       {
         uid_t id;
         memcpy (&id, value, sizeof id);
         if (flags & (XATTR_CREATE|XATTR_REPLACE))
           {
             struct stat64 st;
             error_t err = __io_stat (port, &st);
             if (err)
              return err;
             if (st.st_author == st.st_uid)
              {
                if (flags & XATTR_REPLACE)
                  return ENODATA;
              }
             else if (flags & XATTR_CREATE)
              return EEXIST;
             if (st.st_author == id)
              /* Nothing to do.  */
              return 0;
           }
         return __file_chauthor (port, id);
       }
      }

  if (!strcmp (name, "translator"))
    {
      if (flags & XATTR_REPLACE)
       {
         /* Must make sure it's already there.  */
         char *buf = NULL;
         size_t bufsz = 0;
         error_t err = __file_get_translator (port, &buf, &bufsz);
         if (err)
           return err;
         if (bufsz > 0)
           {
             munmap (buf, bufsz);
             return ENODATA;
           }
       }
      return __file_set_translator (port,
                                FS_TRANS_SET | ((flags & XATTR_CREATE)
                                              ? FS_TRANS_EXCL : 0), 0, 0,
                                value, size,
                                MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
    }

  return EOPNOTSUPP;
}

Here is the call graph for this function:

Here is the caller graph for this function: