Author: jilles
Date: Sun Oct 11 20:19:45 2009
New Revision: 197968
URL: http://svn.freebsd.org/changeset/base/197968

Log:
  Make openat(2) a cancellation point.
  
  This is required by POSIX and matches open(2).
  
  Reviewed by:  kib, jhb
  MFC after:    1 month

Modified:
  head/lib/libc/include/namespace.h
  head/lib/libc/include/un-namespace.h
  head/lib/libc/sys/Symbol.map
  head/lib/libthr/pthread.map
  head/lib/libthr/thread/thr_private.h
  head/lib/libthr/thread/thr_syscalls.c

Modified: head/lib/libc/include/namespace.h
==============================================================================
--- head/lib/libc/include/namespace.h   Sun Oct 11 18:21:55 2009        
(r197967)
+++ head/lib/libc/include/namespace.h   Sun Oct 11 20:19:45 2009        
(r197968)
@@ -80,6 +80,7 @@
 #define                listen                          _listen
 #define                nanosleep                       _nanosleep
 #define                open                            _open
+#define                openat                          _openat
 #define                poll                            _poll
 #define                pthread_atfork                  _pthread_atfork
 #define                pthread_attr_destroy            _pthread_attr_destroy

Modified: head/lib/libc/include/un-namespace.h
==============================================================================
--- head/lib/libc/include/un-namespace.h        Sun Oct 11 18:21:55 2009        
(r197967)
+++ head/lib/libc/include/un-namespace.h        Sun Oct 11 20:19:45 2009        
(r197968)
@@ -61,6 +61,7 @@
 #undef         listen
 #undef         nanosleep
 #undef         open
+#undef         openat
 #undef         poll
 #undef         pthread_atfork
 #undef         pthread_attr_destroy

Modified: head/lib/libc/sys/Symbol.map
==============================================================================
--- head/lib/libc/sys/Symbol.map        Sun Oct 11 18:21:55 2009        
(r197967)
+++ head/lib/libc/sys/Symbol.map        Sun Oct 11 20:19:45 2009        
(r197968)
@@ -769,6 +769,8 @@ FBSDprivate_1.0 {
        __sys_olio_listio;
        _open;
        __sys_open;
+       _openat;
+       __sys_openat;
        _pathconf;
        __sys_pathconf;
        _pipe;

Modified: head/lib/libthr/pthread.map
==============================================================================
--- head/lib/libthr/pthread.map Sun Oct 11 18:21:55 2009        (r197967)
+++ head/lib/libthr/pthread.map Sun Oct 11 20:19:45 2009        (r197968)
@@ -195,6 +195,7 @@ FBSDprivate_1.0 {
        __msync;
        __nanosleep;
        __open;
+       __openat;
        __poll;
        __pthread_cond_timedwait;
        __pthread_cond_wait;
@@ -406,3 +407,7 @@ FBSD_1.1 {
        pthread_mutex_setspinloops_np;
        pthread_mutex_setyieldloops_np;
 };
+
+FBSD_1.2 {
+       openat;
+};

Modified: head/lib/libthr/thread/thr_private.h
==============================================================================
--- head/lib/libthr/thread/thr_private.h        Sun Oct 11 18:21:55 2009        
(r197967)
+++ head/lib/libthr/thread/thr_private.h        Sun Oct 11 20:19:45 2009        
(r197968)
@@ -668,6 +668,7 @@ void        _pthread_cleanup_pop(int);
 #ifdef  _SYS_FCNTL_H_
 int     __sys_fcntl(int, int, ...);
 int     __sys_open(const char *, int, ...);
+int     __sys_openat(int, const char *, int, ...);
 #endif
 
 /* #include <signal.h> */

Modified: head/lib/libthr/thread/thr_syscalls.c
==============================================================================
--- head/lib/libthr/thread/thr_syscalls.c       Sun Oct 11 18:21:55 2009        
(r197967)
+++ head/lib/libthr/thread/thr_syscalls.c       Sun Oct 11 20:19:45 2009        
(r197968)
@@ -139,6 +139,7 @@ int __fsync(int);
 int    __msync(void *, size_t, int);
 int    __nanosleep(const struct timespec *, struct timespec *);
 int    __open(const char *, int,...);
+int    __openat(int, const char *, int,...);
 int    __poll(struct pollfd *, unsigned int, int);
 ssize_t        __read(int, void *buf, size_t);
 ssize_t        __readv(int, const struct iovec *, int);
@@ -341,6 +342,33 @@ __open(const char *path, int flags,...)
        return ret;
 }
 
+__weak_reference(__openat, openat);
+
+int
+__openat(int fd, const char *path, int flags, ...)
+{
+       struct pthread *curthread = _get_curthread();
+       int     ret;
+       int     mode = 0;
+       va_list ap;
+
+       _thr_cancel_enter(curthread);
+       
+       /* Check if the file is being created: */
+       if (flags & O_CREAT) {
+               /* Get the creation mode: */
+               va_start(ap, flags);
+               mode = va_arg(ap, int);
+               va_end(ap);
+       }
+       
+       ret = __sys_openat(fd, path, flags, mode);
+
+       _thr_cancel_leave(curthread);
+
+       return ret;
+}
+
 __weak_reference(__poll, poll);
 
 int
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to