MIPS defines O_NONBLOCK differently from most other architectures.  The
common definitions use 04000 / 0x800, but MIPS uses 0200 / 0x80 instead.

After seeing a problem report involving one of the O_NONBLOCK
"derivatives," I looked through the tree to see what else might be
affected.  Here is what I found:

O_NONBLOCK: correct
SOCK_NONBLOCK: correct
EPOLL_NONBLOCK: correct
SFD_NONBLOCK: correct (fixed in recent commit f87898ca)
TFD_NONBLOCK: incorrect
IN_NONBLOCK: incorrect

The proposed fix, cribbed from glibc, is to fork {timerfd,inotify}.h
for each architecture that needs special treatment.

Signed-off-by: Kevin Cernekee <cerne...@gmail.com>
---
 libc/sysdeps/linux/mips/sys/inotify.h |  105 +++++++++++++++++++++++++++++++++
 libc/sysdeps/linux/mips/sys/timerfd.h |   60 +++++++++++++++++++
 2 files changed, 165 insertions(+), 0 deletions(-)
 create mode 100644 libc/sysdeps/linux/mips/sys/inotify.h
 create mode 100644 libc/sysdeps/linux/mips/sys/timerfd.h

diff --git a/libc/sysdeps/linux/mips/sys/inotify.h 
b/libc/sysdeps/linux/mips/sys/inotify.h
new file mode 100644
index 0000000..1d5e768
--- /dev/null
+++ b/libc/sysdeps/linux/mips/sys/inotify.h
@@ -0,0 +1,105 @@
+/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef        _SYS_INOTIFY_H
+#define        _SYS_INOTIFY_H  1
+
+#include <stdint.h>
+
+
+/* Flags for the parameter of inotify_init1.  */
+enum
+  {
+    IN_CLOEXEC = 02000000,
+#define IN_CLOEXEC IN_CLOEXEC
+    IN_NONBLOCK = 0200
+#define IN_NONBLOCK IN_NONBLOCK
+  };
+
+
+/* Structure describing an inotify event.  */
+struct inotify_event
+{
+  int wd;              /* Watch descriptor.  */
+  uint32_t mask;       /* Watch mask.  */
+  uint32_t cookie;     /* Cookie to synchronize two events.  */
+  uint32_t len;                /* Length (including NULs) of name.  */
+  char name __flexarr; /* Name.  */
+};
+
+
+/* Supported events suitable for MASK parameter of INOTIFY_ADD_WATCH.  */
+#define IN_ACCESS       0x00000001     /* File was accessed.  */
+#define IN_MODIFY       0x00000002     /* File was modified.  */
+#define IN_ATTRIB       0x00000004     /* Metadata changed.  */
+#define IN_CLOSE_WRITE  0x00000008     /* Writtable file was closed.  */
+#define IN_CLOSE_NOWRITE 0x00000010    /* Unwrittable file closed.  */
+#define IN_CLOSE        (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close.  */
+#define IN_OPEN                 0x00000020     /* File was opened.  */
+#define IN_MOVED_FROM   0x00000040     /* File was moved from X.  */
+#define IN_MOVED_TO      0x00000080    /* File was moved to Y.  */
+#define IN_MOVE                 (IN_MOVED_FROM | IN_MOVED_TO) /* Moves.  */
+#define IN_CREATE       0x00000100     /* Subfile was created.  */
+#define IN_DELETE       0x00000200     /* Subfile was deleted.  */
+#define IN_DELETE_SELF  0x00000400     /* Self was deleted.  */
+#define IN_MOVE_SELF    0x00000800     /* Self was moved.  */
+
+/* Events sent by the kernel.  */
+#define IN_UNMOUNT      0x00002000     /* Backing fs was unmounted.  */
+#define IN_Q_OVERFLOW   0x00004000     /* Event queued overflowed.  */
+#define IN_IGNORED      0x00008000     /* File was ignored.  */
+
+/* Helper events.  */
+#define IN_CLOSE        (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)    /* Close.  */
+#define IN_MOVE                 (IN_MOVED_FROM | IN_MOVED_TO)          /* 
Moves.  */
+
+/* Special flags.  */
+#define IN_ONLYDIR      0x01000000     /* Only watch the path if it is a
+                                          directory.  */
+#define IN_DONT_FOLLOW  0x02000000     /* Do not follow a sym link.  */
+#define IN_MASK_ADD     0x20000000     /* Add to the mask of an already
+                                          existing watch.  */
+#define IN_ISDIR        0x40000000     /* Event occurred against dir.  */
+#define IN_ONESHOT      0x80000000     /* Only send event once.  */
+
+/* All events which a program can wait on.  */
+#define IN_ALL_EVENTS   (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE  \
+                         | IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM        \
+                         | IN_MOVED_TO | IN_CREATE | IN_DELETE               \
+                         | IN_DELETE_SELF | IN_MOVE_SELF)
+
+
+__BEGIN_DECLS
+
+/* Create and initialize inotify instance.  */
+extern int inotify_init (void) __THROW;
+
+/* Create and initialize inotify instance.  */
+extern int inotify_init1 (int __flags) __THROW;
+
+/* Add watch of object NAME to inotify instance FD.  Notify about
+   events specified by MASK.  */
+extern int inotify_add_watch (int __fd, const char *__name, uint32_t __mask)
+  __THROW;
+
+/* Remove the watch specified by WD from the inotify instance FD.  */
+extern int inotify_rm_watch (int __fd, uint32_t __wd) __THROW;
+
+__END_DECLS
+
+#endif /* sys/inotify.h */
diff --git a/libc/sysdeps/linux/mips/sys/timerfd.h 
b/libc/sysdeps/linux/mips/sys/timerfd.h
new file mode 100644
index 0000000..ebd37ff
--- /dev/null
+++ b/libc/sysdeps/linux/mips/sys/timerfd.h
@@ -0,0 +1,60 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef        _SYS_TIMERFD_H
+#define        _SYS_TIMERFD_H  1
+
+#include <time.h>
+
+
+/* Bits to be set in the FLAGS parameter of `timerfd_create'.  */
+enum
+  {
+    TFD_CLOEXEC = 02000000,
+#define TFD_CLOEXEC TFD_CLOEXEC
+    TFD_NONBLOCK = 0200
+#define TFD_NONBLOCK TFD_NONBLOCK
+  };
+
+
+/* Bits to be set in the FLAGS parameter of `timerfd_settime'.  */
+enum
+  {
+    TFD_TIMER_ABSTIME = 1 << 0
+#define TFD_TIMER_ABSTIME TFD_TIMER_ABSTIME
+  };
+
+
+__BEGIN_DECLS
+
+/* Return file descriptor for new interval timer source.  */
+extern int timerfd_create (clockid_t __clock_id, int __flags) __THROW;
+
+/* Set next expiration time of interval timer source UFD to UTMR.  If
+   FLAGS has the TFD_TIMER_ABSTIME flag set the timeout value is
+   absolute.  Optionally return the old expiration time in OTMR.  */
+extern int timerfd_settime (int __ufd, int __flags,
+                           __const struct itimerspec *__utmr,
+                           struct itimerspec *__otmr) __THROW;
+
+/* Return the next expiration time of UFD.  */
+extern int timerfd_gettime (int __ufd, struct itimerspec *__otmr) __THROW;
+
+__END_DECLS
+
+#endif /* sys/timerfd.h */
-- 
1.7.8.3

_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to