OSDN Git Service

* exceptions.cc (set_signal_mask): Remove useless debugging output.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / fcntl.cc
1 /* fcntl.cc: fcntl syscall
2
3    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2008,
4    2009, 2010, 2011 Red Hat, Inc.
5
6 This file is part of Cygwin.
7
8 This software is a copyrighted work licensed under the terms of the
9 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
10 details. */
11
12 #include "winsup.h"
13 #include <unistd.h>
14 #include "cygerrno.h"
15 #include "security.h"
16 #include "path.h"
17 #include "fhandler.h"
18 #include "dtable.h"
19 #include "cygheap.h"
20 #include "cygtls.h"
21
22 extern "C" int
23 fcntl64 (int fd, int cmd, ...)
24 {
25   int res = -1;
26   void *arg = NULL;
27   va_list args;
28
29   pthread_testcancel ();
30
31   myfault efault;
32   if (efault.faulted (EFAULT))
33     return -1;
34
35   cygheap_fdget cfd (fd, true);
36   if (cfd < 0)
37     goto done;
38
39   va_start (args, cmd);
40   arg = va_arg (args, void *);
41   va_end (args);
42
43   switch (cmd)
44     {
45     case F_DUPFD:
46     case F_DUPFD_CLOEXEC:
47       if ((int) arg >= 0 && (int) arg < OPEN_MAX_MAX)
48         res = dup3 (fd, cygheap_fdnew (((int) arg) - 1),
49                     cmd == F_DUPFD_CLOEXEC ? O_CLOEXEC : 0);
50       else
51         {
52           set_errno (EINVAL);
53           res = -1;
54         }
55       break;
56     case F_GETLK:
57     case F_SETLK:
58     case F_SETLKW:
59       {
60         struct __flock64 *fl = (struct __flock64 *) arg;
61         fl->l_type &= F_RDLCK | F_WRLCK | F_UNLCK;
62         res = cfd->lock (cmd, fl);
63       }
64       break;
65     default:
66       res = cfd->fcntl (cmd, arg);
67       break;
68     }
69 done:
70   syscall_printf ("%R = fcntl(%d, %d, %p)", res, fd, cmd, arg);
71   return res;
72 }
73
74 extern "C" int
75 _fcntl (int fd, int cmd, ...)
76 {
77   void *arg = NULL;
78   va_list args;
79   struct __flock32 *src = NULL;
80   struct __flock64 dst;
81
82   myfault efault;
83   if (efault.faulted (EFAULT))
84     return -1;
85
86   va_start (args, cmd);
87   arg = va_arg (args, void *);
88   va_end (args);
89   if (cmd == F_GETLK || cmd == F_SETLK || cmd == F_SETLKW)
90     {
91       src = (struct __flock32 *) arg;
92       dst.l_type = src->l_type;
93       dst.l_whence = src->l_whence;
94       dst.l_start = src->l_start;
95       dst.l_len = src->l_len;
96       dst.l_pid = src->l_pid;
97       arg = &dst;
98     }
99   int res = fcntl64 (fd, cmd, arg);
100   if (cmd == F_GETLK)
101     {
102       src->l_type = dst.l_type;
103       src->l_whence = dst.l_whence;
104       src->l_start = dst.l_start;
105       src->l_len = dst.l_len;
106       src->l_pid = (short) dst.l_pid;
107     }
108   return res;
109 }