Back to index

glibc  2.9
Functions | Variables
fcntl.h File Reference
#include <io/fcntl.h>

Go to the source code of this file.

Functions

int __open64 (__const char *__file, int __oflag,...)
 libc_hidden_proto (__open64) extern int __libc_open64(const char *file
int int __libc_open (const char *file, int oflag,...)
 libc_hidden_proto (__libc_open) extern int __libc_creat(const char *file
int __libc_fcntl (int fd, int cmd,...)
int __fcntl_nocancel (int fd, int cmd,...) attribute_hidden
 libc_hidden_proto (__libc_fcntl) extern int __open(__const char *__file
int libc_hidden_proto (__open) extern int __fcntl(int __fd
int int libc_hidden_proto (__fcntl) extern int __openat(int __fd
int int __const char int __nonnull ((2))
 libc_hidden_proto (__openat) extern int __openat64(int __fd
 libc_hidden_proto (__openat64) extern int __open_2(__const char *__path
int __open64_2 (__const char *__path, int __oflag)
int __openat_2 (int __fd, __const char *__path, int __oflag)
int __openat64_2 (int __fd, __const char *__path, int __oflag)
void __atfct_seterrno (int errval, int fd, const char *buf) attribute_hidden
void __atfct_seterrno_2 (int errval, int fd1, const char *buf1, int fd2, const char *buf2) attribute_hidden

Variables

int oflag
mode_t mode
int __oflag
int int __cmd
int int __const char * __file
int __have_atfcts attribute_hidden

Function Documentation

void __atfct_seterrno ( int  errval,
int  fd,
const char *  buf 
)

Definition at line 40 of file openat.c.

{
  if (buf != NULL)
    {
      struct stat64 st;

      if (errval == ENOTDIR || errval == ENOENT)
       {
         /* This can mean either the file descriptor is invalid or
            /proc is not mounted.  */
         if (__fxstat64 (_STAT_VER, fd, &st) != 0)
           /* errno is already set correctly.  */
           return;

         /* If /proc is not mounted there is nothing we can do.  */
         if ((errval != ENOTDIR || S_ISDIR (st.st_mode))
             && (__xstat64 (_STAT_VER, "/proc/self/fd", &st) != 0
                || !S_ISDIR (st.st_mode)))
           errval = ENOSYS;
       }
    }

  __set_errno (errval);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void __atfct_seterrno_2 ( int  errval,
int  fd1,
const char *  buf1,
int  fd2,
const char *  buf2 
)

Definition at line 30 of file renameat.c.

{
  if (buf1 != NULL || buf2 != NULL)
    {
      struct stat64 st;

      if (errval == ENOTDIR)
       {
         /* This can mean either the file descriptor is invalid or
            /proc is not mounted.  */
         if (buf1 != NULL)
           {
             if (__fxstat64 (_STAT_VER, fd1, &st) != 0)
              /* errno is already set correctly.  */
              return;

             /* If /proc is not mounted there is nothing we can do.  */
             if (S_ISDIR (st.st_mode)
                && (__xstat64 (_STAT_VER, "/proc/self/fd", &st) != 0
                    || !S_ISDIR (st.st_mode)))
              {
                errval = ENOSYS;
                goto out;
              }
           }

         if (buf2 != NULL)
           {
             if (__fxstat64 (_STAT_VER, fd2, &st) != 0)
              /* errno is already set correctly.  */
              return;

             /* If /proc is not mounted there is nothing we can do.  */
             if (S_ISDIR (st.st_mode)
                && (__xstat64 (_STAT_VER, "/proc/self/fd", &st) != 0
                    || !S_ISDIR (st.st_mode)))
              errval = ENOSYS;
           }
       }
      else if (errval == ENOENT)
       {
         /* This could mean the file descriptor is not valid.  We
            reuse BUF for the stat call.  Find the slash after the
            file descriptor number.  */
         if (buf1 != NULL)
           {
             *(char *) strchr (buf1 + sizeof "/proc/self/fd", '/') = '\0';

             int e = __lxstat64 (_STAT_VER, buf1, &st);
             if ((e == -1 && errno == ENOENT)
                ||(e == 0 && !S_ISLNK (st.st_mode)))
              {
                errval = EBADF;
                goto out;
              }
           }

         if (buf2 != NULL)
           {
             *(char *) strchr (buf2 + sizeof "/proc/self/fd", '/') = '\0';

             int e = __lxstat64 (_STAT_VER, buf2, &st);
             if ((e == -1 && errno == ENOENT)
                ||(e == 0 && !S_ISLNK (st.st_mode)))
              errval = EBADF;
           }
       }
    }

 out:
  __set_errno (errval);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int __fcntl_nocancel ( int  fd,
int  cmd,
  ... 
)

Definition at line 30 of file fcntl.c.

{
  va_list ap;
  void *arg;

  va_start (ap, cmd);
  arg = va_arg (ap, void *);
  va_end (ap);

  return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int __libc_fcntl ( int  fd,
int  cmd,
  ... 
)

Definition at line 28 of file fcntl.c.

{
  va_list ap;
  struct hurd_fd *d;
  int result;

  d = _hurd_fd_get (fd);

  if (d == NULL)
    return __hurd_fail (EBADF);

  va_start (ap, cmd);

  switch (cmd)
    {
      error_t err;

    default:                /* Bad command.  */
      errno = EINVAL;
      result = -1;
      break;

      /* First the descriptor-based commands, which do no RPCs.  */

    case F_DUPFD:           /* Duplicate the file descriptor.  */
    case F_DUPFD_CLOEXEC:
      {
       struct hurd_fd *new;
       io_t port, ctty;
       struct hurd_userlink ulink, ctty_ulink;
       int flags;

       HURD_CRITICAL_BEGIN;

       /* Extract the ports and flags from the file descriptor.  */
       __spin_lock (&d->port.lock);
       flags = d->flags;
       ctty = _hurd_port_get (&d->ctty, &ctty_ulink);
       port = _hurd_port_locked_get (&d->port, &ulink); /* Unlocks D.  */

       if (cmd == F_DUPFD_CLOEXEC)
         flags |= FD_CLOEXEC;
       else
         /* Duplication clears the FD_CLOEXEC flag.  */
         flags &= ~FD_CLOEXEC;

       /* Get a new file descriptor.  The third argument to __fcntl is the
          minimum file descriptor number for it.  */
       new = _hurd_alloc_fd (&result, va_arg (ap, int));
       if (new == NULL)
         /* _hurd_alloc_fd has set errno.  */
         result = -1;
       else
         {
           /* Give the ports each a user ref for the new descriptor.  */
           __mach_port_mod_refs (__mach_task_self (), port,
                              MACH_PORT_RIGHT_SEND, 1);
           if (ctty != MACH_PORT_NULL)
             __mach_port_mod_refs (__mach_task_self (), ctty,
                                MACH_PORT_RIGHT_SEND, 1);

           /* Install the ports and flags in the new descriptor.  */
           if (ctty != MACH_PORT_NULL)
             _hurd_port_set (&new->ctty, ctty);
           new->flags = flags;
           _hurd_port_locked_set (&new->port, port); /* Unlocks NEW.  */
         }

       HURD_CRITICAL_END;

       _hurd_port_free (&d->port, &ulink, port);
       if (ctty != MACH_PORT_NULL)
         _hurd_port_free (&d->ctty, &ctty_ulink, port);

       break;
      }

      /* Set RESULT by evaluating EXPR with the descriptor locked.
        Check for an empty descriptor and return EBADF.  */
#define LOCKED(expr)                                                 \
      HURD_CRITICAL_BEGIN;                                           \
      __spin_lock (&d->port.lock);                                   \
      if (d->port.port == MACH_PORT_NULL)                            \
       result = __hurd_fail (EBADF);                                        \
      else                                                           \
       result = (expr);                                              \
      __spin_unlock (&d->port.lock);                                        \
      HURD_CRITICAL_END;

    case F_GETFD:           /* Get descriptor flags.  */
      LOCKED (d->flags);
      break;

    case F_SETFD:           /* Set descriptor flags.  */
      LOCKED ((d->flags = va_arg (ap, int), 0));
      break;


      /* Now the real io operations, done by RPCs to io servers.  */

    case F_GETLK:
    case F_SETLK:
    case F_SETLKW:
      {
       /* XXX
          We need new RPCs to support POSIX.1 fcntl file locking!!
          For the time being we support the whole-file case only,
          with all kinds of WRONG WRONG WRONG semantics,
          by using flock.  This is definitely the Wrong Thing,
          but it might be better than nothing (?).  */
       struct flock *fl = va_arg (ap, struct flock *);
       va_end (ap);
       switch (cmd)
         {
         case F_GETLK:
           errno = ENOSYS;
           return -1;
         case F_SETLK:
           cmd = LOCK_NB;
           break;
         default:
           cmd = 0;
           break;
         }
       switch (fl->l_type)
         {
         case F_RDLCK: cmd |= LOCK_SH; break;
         case F_WRLCK: cmd |= LOCK_EX; break;
         case F_UNLCK: cmd |= LOCK_UN; break;
         default:
           errno = EINVAL;
           return -1;
         }
       switch (fl->l_whence)
         {
         case SEEK_SET:
           if (fl->l_start == 0 && fl->l_len == 0) /* Whole file request.  */
             break;
           /* It seems to be common for applications to lock the first
              byte of the file when they are really doing whole-file locking.
              So, since it's so wrong already, might as well do that too.  */
           if (fl->l_start == 0 && fl->l_len == 1)
             break;
           /* FALLTHROUGH */
         case SEEK_CUR:
         case SEEK_END:
           errno = ENOTSUP;
           return -1;
         default:
           errno = EINVAL;
           return -1;
         }

       return __flock (fd, cmd);
      }

    case F_GETFL:           /* Get per-open flags.  */
      if (err = HURD_FD_PORT_USE (d, __io_get_openmodes (port, &result)))
       result = __hurd_dfail (fd, err);
      break;

    case F_SETFL:           /* Set per-open flags.  */
      err = HURD_FD_PORT_USE (d, __io_set_all_openmodes (port,
                                                  va_arg (ap, int)));
      result = err ? __hurd_dfail (fd, err) : 0;
      break;

    case F_GETOWN:          /* Get owner.  */
      if (err = HURD_FD_PORT_USE (d, __io_get_owner (port, &result)))
       result = __hurd_dfail (fd, err);
      break;

    case F_SETOWN:          /* Set owner.  */
      err = HURD_FD_PORT_USE (d, __io_mod_owner (port, va_arg (ap, pid_t)));
      result = err ? __hurd_dfail (fd, err) : 0;
      break;
    }

  va_end (ap);

  return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int int __libc_open ( const char *  file,
int  oflag,
  ... 
)

Definition at line 29 of file open.c.

{
  mode_t mode;
  io_t port;

  if (oflag & O_CREAT)
    {
      va_list arg;
      va_start (arg, oflag);
      mode = va_arg (arg, mode_t);
      va_end (arg);
    }
  else
    mode = 0;

  port = __file_name_lookup (file, oflag, mode);
  if (port == MACH_PORT_NULL)
    return -1;

  return _hurd_intern_fd (port, oflag, 1);
}

Here is the call graph for this function:

Here is the caller graph for this function:

__const char int __nonnull ( (2)  )
int __open64 ( __const char *  __file,
int  __oflag,
  ... 
)

Here is the caller graph for this function:

int __open64_2 ( __const char *  __path,
int  __oflag 
)
int __openat64_2 ( int  __fd,
__const char *  __path,
int  __oflag 
)
int __openat_2 ( int  __fd,
__const char *  __path,
int  __oflag 
)

Variable Documentation

Definition at line 18 of file fcntl.h.

__const char * __file

Definition at line 20 of file fcntl.h.

Definition at line 16 of file fcntl.h.

Definition at line 25 of file init-first.c.

Definition at line 10 of file fcntl.h.

Definition at line 7 of file fcntl.h.