X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libsysio%2Fsrc%2Fmknod.c;h=51e5f7fa015ea53d3f4c5aa2d66f501ffe443cc0;hb=6e17f3dceb11704d15bafc6b80f5973ced3235df;hp=35ca0f982a6e76596990f1879e9f8e3ad5f02d3e;hpb=faeac6115689ab87067e90058a3d5ad249898451;p=fs%2Flustre-release.git diff --git a/libsysio/src/mknod.c b/libsysio/src/mknod.c index 35ca0f9..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,6 +58,30 @@ #undef mknod #undef __xmknod +/* + * 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, const char *path, @@ -79,33 +99,17 @@ PREPEND(__, SYSIO_INTERFACE_NAME(xmknod))(int __ver, goto out; } - /* - * Support only regular, character-special and fifos right now. - * (mode & S_IFMT) == 0 is the same as S_IFREG. - */ - if ((mode & S_IFMT) && - !(S_ISREG(mode) || S_ISCHR(mode) || S_ISFIFO(mode))) { - err = -EINVAL; - goto out; - } - - mode &= ~(_sysio_umask & 0777); /* apply umask */ + 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: