Whamcloud - gitweb
b=23728: gss: fix regression of rule removal.
[fs/lustre-release.git] / libsysio / src / open.c
index 5845009..86426da 100644 (file)
@@ -9,7 +9,7 @@
  *    terms of the GNU Lesser General Public License
  *    (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
  *
- *    Cplant(TM) Copyright 1998-2003 Sandia Corporation. 
+ *    Cplant(TM) Copyright 1998-2006 Sandia Corporation. 
  *    Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
  *    license for use of this work by or on behalf of the US Government.
  *    Export of this program may require a license from the United States
@@ -79,7 +79,7 @@ _sysio_open(struct pnode *pno, int flags, mode_t mode)
        int     err;
        struct inode *ino;
 
-       ro = IS_RDONLY(pno, pno->p_base->pb_ino);
+       ro = IS_RDONLY(pno);
        w = flags & (O_WRONLY|O_RDWR);
        if (w == (O_WRONLY|O_RDWR)) {
                /*
@@ -103,15 +103,16 @@ _sysio_open(struct pnode *pno, int flags, mode_t mode)
                if (!err) {
                        ino = parent->p_base->pb_ino;
                        assert(ino);
-                       err =
-                           !IS_RDONLY(parent, ino)
-                             ? (*ino->i_ops.inop_open)(pno, flags, mode)
-                             : -EROFS;
+                       err = (*ino->i_ops.inop_open)(pno, flags, mode);
                }
        } else if ((flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))
                err = -EEXIST;
        else if (!ino)
                err = _sysio_p_validate(pno, NULL, NULL);
+#ifdef O_NOFOLLOW
+       else if (flags & O_NOFOLLOW && S_ISLNK(ino->i_stbuf.st_mode))
+               err = -ELOOP;
+#endif
        else {
                /*
                 * Simple open of pre-existing file.
@@ -162,13 +163,7 @@ SYSIO_INTERFACE_NAME(open)(const char *path, int flags, ...)
 #endif
                va_end(ap);
                mode &= ~(_sysio_umask & 0777) | 07000; /* apply umask */
-
-               if (flags & O_EXCL) {
-                       /*
-                        * Tell others we intend to create this file.
-                        */
-                       intent.int_opmask |= INT_CREAT;
-               }
+               intent.int_opmask |= INT_CREAT;
        }
 #ifdef O_NOFOLLOW
        if (flags & O_NOFOLLOW)
@@ -216,21 +211,25 @@ error:
 
 #ifdef __GLIBC__
 #undef __open
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open), __open)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(open)))
 #undef open64
 sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open), SYSIO_INTERFACE_NAME(open64))
 #undef __open64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open), __open64)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(open64)))
 #endif
 
 #ifdef REDSTORM
 #undef __libc_open64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open), __libc_open64)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(libc_open64)))
 #endif
 
 #ifdef BSD
 #undef _open
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open), _open)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(open),
+                    PREPEND(_, SYSIO_INTERFACE_NAME(open)))
 #endif
 
 int
@@ -246,43 +245,50 @@ SYSIO_INTERFACE_NAME(close)(int fd)
 
 #ifdef __GLIBC__
 #undef __close
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(close), __close)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(close),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(close)))
 #endif
 
 #ifdef BSD
 #undef _close
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(close), _close)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(close),
+                    PREPEND(_, SYSIO_INTERFACE_NAME(close)))
 #endif
 
 int
 SYSIO_INTERFACE_NAME(creat)(const char *path, mode_t mode)
 {
 
-       return open(path, O_CREAT|O_WRONLY|O_TRUNC, mode);
+       return SYSIO_INTERFACE_NAME(open)(path, O_CREAT|O_WRONLY|O_TRUNC, mode);
 }
 
 #ifdef __GLIBC__
 #undef __creat
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat), __creat)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(creat)))
 #undef creat64
 #ifndef HAVE_LUSTRE_HACK
 sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat), SYSIO_INTERFACE_NAME(creat64))
 #else
 /* XXX workaround SuSE SLES 8, glibc-2.2.5 */
-sysio_sym_strong_alias(SYSIO_INTERFACE_NAME(creat), SYSIO_INTERFACE_NAME(creat64))
+sysio_sym_strong_alias(SYSIO_INTERFACE_NAME(creat),
+                      SYSIO_INTERFACE_NAME(creat64))
 #endif
 #undef __creat64
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat), __creat64)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(creat64)))
 #endif
 
 #ifdef REDSTORM
 #undef __libc_creat
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat), __libc_creat)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(libc_creat)))
 #endif
 
 #ifdef BSD
 #undef _creat
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat), _creat)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(creat),
+                    PREPEND(_, SYSIO_INTERFACE_NAME(creat)))
 #endif
 
 mode_t
@@ -297,5 +303,6 @@ SYSIO_INTERFACE_NAME(umask)(mode_t mask)
 
 #ifdef REDSTORM
 #undef __umask
-sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(umask), __umask)
+sysio_sym_weak_alias(SYSIO_INTERFACE_NAME(umask),
+                    PREPEND(__, SYSIO_INTERFACE_NAME(umask)))
 #endif