X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libsysio%2Fsrc%2Fopen.c;h=86426dace65312f7b4f441c1fd4aad7feb3d9d07;hb=1f8b7d9dd5ecf9eecaf52327f114201c3c171554;hp=a7c31276de452e4cd14f4ae12167056ab19f948e;hpb=b8292c00324fbe9a25910ce53d03569186ea3e2c;p=fs%2Flustre-release.git diff --git a/libsysio/src/open.c b/libsysio/src/open.c index a7c3127..86426da 100644 --- a/libsysio/src/open.c +++ b/libsysio/src/open.c @@ -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 @@ -62,8 +62,6 @@ #include "mount.h" #include "sysio-symbols.h" -#include "sysio-symbols.h" - /* * Open file support. */ @@ -81,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)) { /* @@ -105,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. @@ -164,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) @@ -200,7 +193,7 @@ SYSIO_INTERFACE_NAME(open)(const char *path, int flags, ...) rtn = -ENOMEM; goto error; } - rtn = _sysio_fd_set(fil, -1); + rtn = _sysio_fd_set(fil, -1, 0); if (rtn < 0) goto error; @@ -218,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 @@ -248,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 @@ -299,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