[Libsysio-commit] HEAD: libsysio/src init.c
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2004-06-24 19:58:37
|
Update of /cvsroot/libsysio/libsysio/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32257/src Modified Files: init.c Log Message: Mods to namespace boot. Added the "open" command in order to pre-open a file on a given file descriptor. Usage: open, nm=<path>,fd=<#>,m=<#> Where: nm is the path to the file -- it should already exist fd is the desired fildes m mode flags to open -- only one of O_RDONLY, O_WRONLY, O_RDWR supported Index: init.c =================================================================== RCS file: /cvsroot/libsysio/libsysio/src/init.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -w -b -B -p -r1.9 -r1.10 --- init.c 28 May 2004 12:48:26 -0000 1.9 +++ init.c 24 Jun 2004 19:58:28 -0000 1.10 @@ -549,6 +549,69 @@ do_chmd(char *args) return err; } +static int +do_open(char *args) +{ + size_t len; + struct named_argument v[] = { + { "nm", NULL }, /* path */ + { "fd", NULL }, /* fildes */ + { "m", NULL }, /* mode */ + { NULL, NULL } + }; + char *cp; + int fd; + mode_t m; + struct pnode *dir, *pno; + struct intent intent; + int err; + struct file *fil; + + len = strlen(args); + if (get_args(args, v) - args != (ssize_t )len || + !(v[0].value && v[1].value && v[2].value)) + return -EINVAL; + fd = strtol(v[1].value, (char **)&cp, 0); + if (*cp || + (((fd == LONG_MIN || fd == LONG_MAX) && errno == ERANGE)) || + fd < 0) + return -EINVAL; + m = strtoul(v[1].value, (char **)&cp, 0); + if (*cp || + (m == LONG_MAX && errno == ERANGE)) + return -EINVAL; + m &= O_RDONLY|O_WRONLY|O_RDWR; + + if (!(dir = _sysio_cwd) && !(dir = _sysio_root)) + return -ENOENT; + INTENT_INIT(&intent, INT_OPEN, &m, NULL); + pno = NULL; + err = _sysio_namei(dir, v[0].value, 0, &intent, &pno); + if (err) + return err; + fil = NULL; + do { + err = _sysio_open(pno, m, 0); + if (err) + break; + fil = _sysio_fnew(pno->p_base->pb_ino, m); + if (!fil) { + err = -ENOMEM; + break; + } + err = _sysio_fd_set(fil, fd); + if (err < 0) + break; + P_RELE(pno); + return 0; + } while (0); + if (fil) + F_RELE(fil); + if (pno) + P_RELE(pno); + return err; +} + /* * Execute the given cmd. * @@ -571,6 +634,8 @@ do_command(char *buf) return do_cd(args); if (strcmp("chmd", cmd) == 0) return do_chmd(args); + if (strcmp("open", cmd) == 0) + return do_open(args); } return -EINVAL; } |