X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libsysio%2Fsrc%2Fmknod.c;h=51e5f7fa015ea53d3f4c5aa2d66f501ffe443cc0;hb=66f92c5a237fe24066c4f2482a6ff464c15b1bae;hp=4c947d2c14447a54ef8a9a89eafe18fa83c98d93;hpb=b8292c00324fbe9a25910ce53d03569186ea3e2c;p=fs%2Flustre-release.git diff --git a/libsysio/src/mknod.c b/libsysio/src/mknod.c index 4c947d2..51e5f7f 100644 --- a/libsysio/src/mknod.c +++ b/libsysio/src/mknod.c @@ -41,10 +41,6 @@ * lee@sandia.gov */ -#if defined(__linux__) -#define _BSD_SOURCE -#endif - #include #include #include @@ -62,9 +58,29 @@ #undef mknod #undef __xmknod -#if defined(BSD) || defined(REDSTORM) -#define _MKNOD_VER 0 -#endif +/* + * Internal routine to make a device node. + */ +int +_sysio_mknod(struct pnode *pno, mode_t mode, dev_t dev) +{ + + if (pno->p_base->pb_ino) + return -EEXIST; + + /* + * Support only regular, character-special and fifos right now. + * (mode & S_IFMT) == 0 is the same as S_IFREG. + */ + if (!(S_ISREG(mode) || S_ISCHR(mode) || S_ISFIFO(mode))) + return -EINVAL; + + if (IS_RDONLY(pno)) + return -EROFS; + return (*pno->p_parent->p_base->pb_ino->i_ops.inop_mknod)(pno, + mode, + dev); +} int PREPEND(__, SYSIO_INTERFACE_NAME(xmknod))(int __ver, @@ -83,29 +99,17 @@ PREPEND(__, SYSIO_INTERFACE_NAME(xmknod))(int __ver, goto out; } - /* - * Support only character-special and fifos right now. - */ - if (!(S_ISCHR(mode) || S_ISFIFO(mode))) { - err = -EINVAL; - goto out; - } + mode &= ~(_sysio_umask & 0777); /* apply umask */ INTENT_INIT(&intent, INT_CREAT, &mode, NULL); err = _sysio_namei(_sysio_cwd, path, ND_NEGOK, &intent, &pno); if (err) goto out; - if (pno->p_base->pb_ino) { - err = -EEXIST; - goto error; - } - if (IS_RDONLY(pno, pno->p_base->pb_ino)) { - err = -EROFS; + err = _sysio_permitted(pno->p_parent, W_OK); + if (err) goto error; - } - err = - (*pno->p_parent->p_base->pb_ino->i_ops.inop_mknod)(pno, mode, *dev); + err = _sysio_mknod(pno, mode, *dev); error: P_RELE(pno); out: