[Libsysio-commit] HEAD: libsysio/src inode.c symlink.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2007-11-20 18:01:46
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv4690/src Modified Files: inode.c symlink.c Log Message: Crafted new _sysio_p_symlink routine and modified the symlink library entry-point to use it. Index: inode.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/inode.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -w -b -B -p -r1.33 -r1.34 --- inode.c 20 Nov 2007 17:49:26 -0000 1.33 +++ inode.c 20 Nov 2007 18:01:42 -0000 1.34 @@ -1044,6 +1044,20 @@ _sysio_p_unlink(struct pnode *pno) } /* + * Perform symlink operation; oldpath to new. + */ +int +_sysio_p_symlink(const char *oldpath, struct pnode *new) +{ + + if (new->p_base->pb_ino) + return -EEXIST; + if (IS_RDONLY(new->p_parent)) + return -EROFS; + return PNOP_SYMLINK(new, oldpath); +} + +/* * Perform remove directory operation on some pnode. */ int Index: symlink.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/symlink.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -w -b -B -p -r1.18 -r1.19 --- symlink.c 2 Jul 2007 18:58:17 -0000 1.18 +++ symlink.c 20 Nov 2007 18:01:42 -0000 1.19 @@ -50,8 +50,6 @@ #include "sysio.h" #include "inode.h" -#include "fs.h" -#include "mount.h" #include "sysio-symbols.h" int @@ -63,6 +61,9 @@ SYSIO_INTERFACE_NAME(symlink)(const char SYSIO_INTERFACE_DISPLAY_BLOCK; SYSIO_INTERFACE_ENTER(symlink, "%s%s", oldpath, newpath); + err = 0; + pno = NULL; + do { INTENT_INIT(&intent, INT_CREAT, NULL, NULL); err = _sysio_namei(_sysio_cwd, @@ -71,19 +72,14 @@ SYSIO_INTERFACE_NAME(symlink)(const char &intent, &pno); if (err) - goto out; - if (pno->p_base->pb_ino) { - err = -EEXIST; - goto error; - } + break; err = _sysio_permitted(pno->p_parent, W_OK); if (err) - goto error; - - err = PNOP_SYMLINK(pno, oldpath); -error: + break; + err = _sysio_p_symlink(oldpath, pno); + } while (0); + if (pno) P_RELE(pno); -out: SYSIO_INTERFACE_RETURN(err ? -1 : 0, err, symlink, "%d", 0); } |