Glenn, this clean up patch is still on hold, right?

Olga

On Sun, Sep 1, 2013 at 5:13 AM, Roland Mainz <[email protected]> wrote:
> Hi!
>
> ----
>
> Attached (as "astksh20130829_libcmd_at001.diff.txt") is a patch (the
> first in a series of patches) which switches some of the libcmd APIs
> over to the |*at()| APIs.
>
> * Main purposes are:
> - We need the patches so a |Shell_t| can (in the future) operate
> independently from the process's cwd
> - Olga needs this at least for her "ndbx" (New dbx, which should be
> available as shared library and thus not rely on the global cwd) and
> "kshdbx" (Korn Shell Debugger, which uses two |Shell_t| internally
> (one for the shell which is to be debugged and one for the shell
> hosting the debugger)) work
> - Irek has expressed keen interest in this for GE's "biosh"
> - get a tick more performance (on platforms where |*at()| is native...
> on Solaris this mainly comes from less locking overhead and for
> NFSv4.1 better directory cache utilisation (if more than one directory
> fd+cwd are in use))
> - we need this for OpenCDE's dtksh work- We need the patch so that in
> the future a threaded shell can run a pwdfd per |Shell_t| (each
> representing a shell thread)
>
> * Notes:
> - I've avoided builtins which use fts for now to avoid crashes between
> other work like the fts |*at()| work
> - The changes for tr(1) include a change from |qsort()| to
> |qsort_r()|, mostly to avoid issues with thread-safety on some
> platforms
> - Some changes s/int/bool/ are included... I couldn't resist in some
> very easy cases
> - If I'm not too sleepy we need a |*at()| version of |pathtmp()| ...
>
> ----
>
> Bye,
> Roland
>
> --
>   __ .  . __
>  (o.\ \/ /.o) [email protected]
>   \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
>   /O /==\ O\  TEL +49 641 3992797
>  (;O/ \/ \O;)



-- 
      ,   _                                    _   ,
     { \/`o;====-    Olga Kryzhanovska   -====;o`\/ }
.----'-/`-/     [email protected]   \-`\-'----.
 `'-..-| /       http://twitter.com/fleyta     \ |-..-'`
      /\/\     Solaris/BSD//C/C++ programmer   /\/\
      `--`                                      `--`
diff -r -u original/src/lib/libcmd/cat.c build_libcmd_at/src/lib/libcmd/cat.c
--- src/lib/libcmd/cat.c        2012-06-01 00:04:06.000000000 +0200
+++ src/lib/libcmd/cat.c        2013-09-01 04:06:42.821751526 +0200
@@ -395,6 +395,7 @@
 int
 b_cat(int argc, char** argv, Shbltin_t* context)
 {
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int            n;
        register int            flags = 0;
        register char*          cp;
@@ -522,7 +523,7 @@
                        if (flags&D_FLAG)
                                sfopen(fp, NiL, mode);
                }
-               else if (!(fp = sfopen(NiL, cp, mode)))
+               else if (!(fp = sfopenat(pwdfd, NiL, cp, mode)))
                {
                        if (!(flags&F_FLAG))
                                error(ERROR_system(0), "%s: cannot open", cp);
diff -r -u original/src/lib/libcmd/cksum.c 
build_libcmd_at/src/lib/libcmd/cksum.c
--- src/lib/libcmd/cksum.c      2012-04-20 08:06:55.000000000 +0200
+++ src/lib/libcmd/cksum.c      2013-09-01 04:10:54.912321421 +0200
@@ -118,6 +118,7 @@
 
 typedef struct State_s                 /* program state                */
 {
+       int             pwdfd;          /* workin directory fd          */
        int             all;            /* list all items               */
        Sfio_t*         check;          /* check previous output        */
        int             flags;          /* sumprint() SUM_* flags       */
@@ -146,7 +147,7 @@
  */
 
 static Sfio_t*
-openfile(const char* path, const char* mode)
+openfile(int pwdfd, const char* path, const char* mode)
 {
        Sfio_t*         sp;
 
@@ -155,7 +156,7 @@
                sp = sfstdin;
                sfopen(sp, NiL, mode);
        }
-       else if (!(sp = sfopen(NiL, path, mode)))
+       else if (!(sp = sfopenat(pwdfd, NiL, path, mode)))
                error(ERROR_SYSTEM|2, "%s: cannot read", path);
        return sp;
 }
@@ -303,7 +304,7 @@
                                }
                        }
                }
-               if (sp = openfile(file, "rb"))
+               if (sp = openfile(state->pwdfd, file, "rb"))
                {
                        pr(state, rp, sp, file, -1, NiL, NiL);
                        if (!(t = sfstruse(rp)))
@@ -409,7 +410,7 @@
        register Sfio_t*        sp;
 
        while (file = sfgetr(lp, '\n', 1))
-               if (sp = openfile(file, state->check ? "rt" : "rb"))
+               if (sp = openfile(state->pwdfd, file, state->check ? "rt" : 
"rb"))
                {
                        pr(state, sfstdout, sp, file, state->permissions, NiL, 
state->check);
                        closefile(sp);
@@ -441,6 +442,7 @@
 int
 b_cksum(int argc, register char** argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int    flags;
        char*           file;
        char*           method;
@@ -456,6 +458,7 @@
        flags = fts_flags() | FTS_META | FTS_TOP | FTS_NOPOSTORDER;
        state.flags = SUM_SIZE;
        state.warn = 1;
+       state.pwdfd = pwdfd;
        logical = 1;
        method = 0;
        optinit(&optdisc, optinfo);
@@ -575,13 +578,13 @@
                if (*argv)
                {
                        while (file = *argv++)
-                               if (sp = openfile(file, "rt"))
+                               if (sp = openfile(pwdfd, file, "rt"))
                                {
                                        list(&state, sp);
                                        closefile(sp);
                                }
                }
-               else if (sp = openfile(NiL, "rt"))
+               else if (sp = openfile(pwdfd, NiL, "rt"))
                {
                        list(&state, sp);
                        closefile(sp);
@@ -601,7 +604,7 @@
                                        fts_set(NiL, ent, FTS_FOLLOW);
                                break;
                        case FTS_F:
-                               if (sp = openfile(ent->fts_accpath, "rb"))
+                               if (sp = openfile(pwdfd, ent->fts_accpath, 
"rb"))
                                {
                                        pr(&state, sfstdout, sp, ent->fts_path, 
state.permissions, ent->fts_statp, state.check);
                                        closefile(sp);
diff -r -u original/src/lib/libcmd/cmp.c build_libcmd_at/src/lib/libcmd/cmp.c
--- src/lib/libcmd/cmp.c        2012-01-10 19:50:49.000000000 +0100
+++ src/lib/libcmd/cmp.c        2013-09-01 03:33:43.254043620 +0200
@@ -247,6 +247,7 @@
 int
 b_cmp(int argc, register char** argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        char*           s;
        char*           e;
        char*           file1;
@@ -315,7 +316,7 @@
        n = 2;
        if (streq(file1, "-"))
                f1 = sfstdin;
-       else if (!(f1 = sfopen(NiL, file1, "r")))
+       else if (!(f1 = sfopenat(pwdfd, NiL, file1, "r")))
        {
                if (!(flags & CMP_SILENT))
                        error(ERROR_system(0), "%s: cannot open", file1);
@@ -323,7 +324,7 @@
        }
        if (streq(file2, "-"))
                f2 = sfstdin;
-       else if (!(f2 = sfopen(NiL, file2, "r")))
+       else if (!(f2 = sfopenat(pwdfd, NiL, file2, "r")))
        {
                if (!(flags & CMP_SILENT))
                        error(ERROR_system(0), "%s: cannot open", file2);
diff -r -u original/src/lib/libcmd/comm.c build_libcmd_at/src/lib/libcmd/comm.c
--- src/lib/libcmd/comm.c       2012-01-10 19:50:55.000000000 +0100
+++ src/lib/libcmd/comm.c       2013-09-01 04:18:01.335558771 +0200
@@ -147,9 +147,10 @@
 int
 b_comm(int argc, char *argv[], Shbltin_t* context)
 {
-       register int mode = C_FILE1|C_FILE2|C_COMMON;
-       register char *cp;
-       Sfio_t *f1, *f2;
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
+       register int    mode = C_FILE1|C_FILE2|C_COMMON;
+       register char   *cp;
+       Sfio_t          *f1, *f2;
 
        cmdinit(argc, argv, context, ERROR_CATALOG, 0);
        for (;;)
@@ -181,12 +182,12 @@
        cp = *argv++;
        if(streq(cp,"-"))
                f1 = sfstdin;
-       else if(!(f1 = sfopen(NiL, cp,"r")))
+       else if(!(f1 = sfopenat(pwdfd, NiL, cp,"r")))
                error(ERROR_system(1),"%s: cannot open",cp);
        cp = *argv;
        if(streq(cp,"-"))
                f2 = sfstdin;
-       else if(!(f2 = sfopen(NiL, cp,"r")))
+       else if(!(f2 = sfopenat(pwdfd, NiL, cp,"r")))
                error(ERROR_system(1),"%s: cannot open",cp);
        if(mode)
        {
diff -r -u original/src/lib/libcmd/cut.c build_libcmd_at/src/lib/libcmd/cut.c
--- src/lib/libcmd/cut.c        2012-05-29 15:07:42.000000000 +0200
+++ src/lib/libcmd/cut.c        2013-09-01 03:35:59.938857386 +0200
@@ -568,6 +568,7 @@
 int
 b_cut(int argc, char** argv, Shbltin_t* context)
 {
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register char*          cp = 0;
        register Sfio_t*        fp;
        char*                   s;
@@ -682,7 +683,7 @@
        {
                if(!cp || streq(cp,"-"))
                        fp = sfstdin;
-               else if(!(fp = sfopen(NiL,cp,"r")))
+               else if(!(fp = sfopenat(pwdfd, NiL, cp, "r")))
                {
                        error(ERROR_system(0),"%s: cannot open",cp);
                        continue;
diff -r -u original/src/lib/libcmd/date.c build_libcmd_at/src/lib/libcmd/date.c
--- src/lib/libcmd/date.c       2012-01-10 19:52:21.000000000 +0100
+++ src/lib/libcmd/date.c       2013-09-01 03:37:37.229705753 +0200
@@ -276,6 +276,7 @@
 int
 b_date(int argc, register char** argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int    n;
        register char*  s;
        register Fmt_t* f;
@@ -440,7 +441,7 @@
                n = argv[1] != 0;
                while (s = *argv++)
                {
-                       if (stat(s, &st))
+                       if (fstatat(pwdfd, s, &st, 0))
                                error(2, "%s: not found", s);
                        else
                        {
diff -r -u original/src/lib/libcmd/fmt.c build_libcmd_at/src/lib/libcmd/fmt.c
--- src/lib/libcmd/fmt.c        2012-01-10 19:53:20.000000000 +0100
+++ src/lib/libcmd/fmt.c        2013-09-01 04:05:08.558049682 +0200
@@ -564,6 +564,7 @@
 int
 b_fmt(int argc, char** argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int    n;
        char*           cp;
        Fmt_t           fmt;
@@ -618,7 +619,7 @@
        do {
                if (!cp || streq(cp, "-"))
                        fmt.in = sfstdin;
-               else if (!(fmt.in = sfopen(NiL, cp, "r")))
+               else if (!(fmt.in = sfopenat(pwdfd, NiL, cp, "r")))
                {
                        error(ERROR_system(0), "%s: cannot open", cp);
                        error_info.errors = 1;
diff -r -u original/src/lib/libcmd/fold.c build_libcmd_at/src/lib/libcmd/fold.c
--- src/lib/libcmd/fold.c       2012-01-10 19:53:36.000000000 +0100
+++ src/lib/libcmd/fold.c       2013-09-01 03:39:37.707709439 +0200
@@ -169,6 +169,7 @@
 int
 b_fold(int argc, char** argv, Shbltin_t* context)
 {
+       int pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int n, width=WIDTH;
        register Sfio_t *fp;
        register char *cp;
@@ -225,7 +226,7 @@
        {
                if(!cp || streq(cp,"-"))
                        fp = sfstdin;
-               else if(!(fp = sfopen(NiL,cp,"r")))
+               else if(!(fp = sfopenat(pwdfd, NiL, cp, "r")))
                {
                        error(ERROR_system(0),"%s: cannot open",cp);
                        error_info.errors = 1;
diff -r -u original/src/lib/libcmd/head.c build_libcmd_at/src/lib/libcmd/head.c
--- src/lib/libcmd/head.c       2012-06-01 00:04:49.000000000 +0200
+++ src/lib/libcmd/head.c       2013-09-01 04:03:50.055133127 +0200
@@ -72,6 +72,7 @@
 {
        static const char       header_fmt[] = "\n==> %s <==\n";
 
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register Sfio_t*        fp;
        register char*          cp;
        register off_t          keep = 10;
@@ -129,7 +130,7 @@
                        fp = sfstdin;
                        sfset(fp, SF_SHARE, 1);
                }
-               else if (!(fp = sfopen(NiL, cp, "r")))
+               else if (!(fp = sfopenat(pwdfd, NiL, cp, "r")))
                {
                        error(ERROR_system(0), "%s: cannot open", cp);
                        continue;
diff -r -u original/src/lib/libcmd/iconv.c 
build_libcmd_at/src/lib/libcmd/iconv.c
--- src/lib/libcmd/iconv.c      2012-10-15 10:19:27.000000000 +0200
+++ src/lib/libcmd/iconv.c      2013-09-01 04:03:04.217848207 +0200
@@ -144,6 +144,7 @@
 int
 b_iconv(int argc, register char** argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        char*           file;
        char*           from;
        char*           to;
@@ -239,7 +240,7 @@
                        file = "/dev/stdin";
                        ip = sfstdin;
                }
-               else if (!(ip = sfopen(NiL, file, "r")))
+               else if (!(ip = sfopenat(pwdfd, NiL, file, "r")))
                {
                        error(ERROR_SYSTEM|2, "%s: cannot open", file);
                        continue;
diff -r -u original/src/lib/libcmd/join.c build_libcmd_at/src/lib/libcmd/join.c
--- src/lib/libcmd/join.c       2013-08-15 07:26:47.000000000 +0200
+++ src/lib/libcmd/join.c       2013-09-01 04:01:57.642526716 +0200
@@ -814,6 +814,7 @@
 int
 b_join(int argc, char** argv, Shbltin_t* context)
 {
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int            n;
        register char*          cp;
        register Join_t*        jp;
@@ -941,7 +942,7 @@
                }
                jp->file[0].iop = sfstdin;
        }
-       else if (!(jp->file[0].iop = sfopen(NiL, cp, "r")))
+       else if (!(jp->file[0].iop = sfopenat(pwdfd, NiL, cp, "r")))
        {
                done(jp);
                error(ERROR_system(1),"%s: cannot open",cp);
@@ -958,7 +959,7 @@
                }
                jp->file[1].iop = sfstdin;
        }
-       else if (!(jp->file[1].iop = sfopen(NiL, cp, "r")))
+       else if (!(jp->file[1].iop = sfopenat(pwdfd, NiL, cp, "r")))
        {
                done(jp);
                error(ERROR_system(1),"%s: cannot open",cp);
diff -r -u original/src/lib/libcmd/mkdir.c 
build_libcmd_at/src/lib/libcmd/mkdir.c
--- src/lib/libcmd/mkdir.c      2012-01-10 19:54:47.000000000 +0100
+++ src/lib/libcmd/mkdir.c      2013-09-01 04:18:41.712569380 +0200
@@ -64,14 +64,15 @@
 int
 b_mkdir(int argc, char** argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register char*  path;
        register int    n;
        register mode_t mode = DIRMODE;
        register mode_t mask = 0;
-       register int    mflag = 0;
-       register int    pflag = 0;
-       register int    vflag = 0;
-       int             made;
+       bool            mflag = false;
+       bool            pflag = false;
+       bool            vflag = false;
+       bool            made;
        char*           part;
        mode_t          dmode;
        struct stat     st;
@@ -82,16 +83,16 @@
                switch (optget(argv, usage))
                {
                case 'm':
-                       mflag = 1;
+                       mflag = true;
                        mode = strperm(opt_info.arg, &part, mode);
                        if (*part)
                                error(ERROR_exit(0), "%s: invalid mode", 
opt_info.arg);
                        continue;
                case 'p':
-                       pflag = 1;
+                       pflag = true;
                        continue;
                case 'v':
-                       vflag = 1;
+                       vflag = true;
                        continue;
                case ':':
                        error(2, "%s", opt_info.arg);
@@ -121,11 +122,11 @@
        }
        while (path = *argv++)
        {
-               if (!mkdir(path, mode))
+               if (!mkdirat(pwdfd, path, mode))
                {
                        if (vflag)
                                error(0, "%s: directory created", path);
-                       made = 1;
+                       made = true;
                }
                else if (!pflag || !(errno == ENOENT || errno == EEXIST || 
errno == ENOTDIR))
                {
@@ -141,7 +142,7 @@
                         * first eliminate trailing /'s
                         */
 
-                       made = 0;
+                       made = false;
                        n = strlen(path);
                        while (n > 0 && path[--n] == '/');
                        path[n + 1] = 0;
@@ -154,7 +155,7 @@
                                while ((n = *part) && n != '/')
                                        part++;
                                *part = 0;
-                               if (mkdir(path, n ? dmode : mode) < 0 && errno 
!= EEXIST && access(path, F_OK) < 0)
+                               if (mkdirat(pwdfd, path, n ? dmode : mode) < 0 
&& errno != EEXIST && access(path, F_OK) < 0)
                                {
                                        error(ERROR_system(0), "%s: cannot 
create intermediate directory", path);
                                        *part = n;
@@ -164,14 +165,14 @@
                                        error(0, "%s: directory created", path);
                                if (!(*part = n))
                                {
-                                       made = 1;
+                                       made = true;
                                        break;
                                }
                        }
                }
                if (made && (mode & (S_ISVTX|S_ISUID|S_ISGID)))
                {
-                       if (stat(path, &st))
+                       if (fstatat(pwdfd, path, &st, 0))
                        {
                                error(ERROR_system(0), "%s: cannot stat", path);
                                break;
diff -r -u original/src/lib/libcmd/mkfifo.c 
build_libcmd_at/src/lib/libcmd/mkfifo.c
--- src/lib/libcmd/mkfifo.c     2012-01-10 19:54:56.000000000 +0100
+++ src/lib/libcmd/mkfifo.c     2013-09-01 03:59:33.506337341 +0200
@@ -52,10 +52,11 @@
 int
 b_mkfifo(int argc, char** argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register char*  arg;
        register mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
        register mode_t mask = 0;
-       register int    mflag = 0;
+       bool            mflag = false;
 
        cmdinit(argc, argv, context, ERROR_CATALOG, 0);
        for (;;)
@@ -63,7 +64,7 @@
                switch (optget(argv, usage))
                {
                case 'm':
-                       mflag = 1;
+                       mflag = true;
                        mode = strperm(arg = opt_info.arg, &opt_info.arg, mode);
                        if (*opt_info.arg)
                                error(ERROR_exit(0), "%s: invalid mode", arg);
@@ -88,7 +89,7 @@
                mask = 0;
        }
        while (arg = *argv++)
-               if (mkfifo(arg, mode) < 0)
+               if (mkfifoat(pwdfd, arg, mode) < 0)
                        error(ERROR_system(0), "%s:", arg);
        if (mask)
                umask(mask);
diff -r -u original/src/lib/libcmd/od.c build_libcmd_at/src/lib/libcmd/od.c
--- src/lib/libcmd/od.c 2012-10-19 14:40:51.000000000 +0200
+++ src/lib/libcmd/od.c 2013-09-01 03:57:17.807567179 +0200
@@ -236,6 +236,7 @@
        size_t          size;
        }               dup;
        unsigned char*  eob;
+       int             pwdfd;
        char*           file;
        Format_t*       form;
        Format_t*       last;
@@ -949,7 +950,7 @@
                        state->file = "/dev/stdin";
                        ip = sfstdin;
                }
-               else if (!(ip = sfopen(NiL, state->file, "r")))
+               else if (!(ip = sfopenat(state->pwdfd, NiL, state->file, "r")))
                {
                        error(ERROR_system(0), "%s: cannot open", state->file);
                        error_info.errors = 1;
@@ -1303,6 +1304,7 @@
 int
 b_od(int argc, char** argv, Shbltin_t* context)
 {
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int            n;
        register char*          s;
        register Format_t*      fp;
@@ -1319,7 +1321,8 @@
                error(ERROR_SYSTEM|2, "out of space");
                return 1;
        }
-       state.context = context;
+       state.context   = context;
+       state.pwdfd     = pwdfd;
        optinit(&optdisc, optinfo);
        per = 0;
        state.map = ccmap(CC_ASCII, CC_ASCII);
diff -r -u original/src/lib/libcmd/paste.c 
build_libcmd_at/src/lib/libcmd/paste.c
--- src/lib/libcmd/paste.c      2012-01-10 19:55:31.000000000 +0100
+++ src/lib/libcmd/paste.c      2013-09-01 03:53:47.602076053 +0200
@@ -174,7 +174,9 @@
 int
 b_paste(int argc, char** argv, Shbltin_t* context)
 {
-       register int            n, sflag=0;
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
+       register int            n;
+       bool                    sflag = false;
        register Sfio_t         *fp, **streams;
        register char           *cp, *delim;
        char                    *ep;
@@ -192,7 +194,7 @@
                        delim = opt_info.arg;
                        continue;
                case 's':
-                       sflag++;
+                       sflag = true;
                        continue;
                case ':':
                        error(2, "%s", opt_info.arg);
@@ -261,7 +263,7 @@
        {
                if(!cp || streq(cp,"-"))
                        fp = sfstdin;
-               else if(!(fp = sfopen(NiL,cp,"r")))
+               else if(!(fp = sfopenat(pwdfd, NiL, cp, "r")))
                        error(ERROR_system(0),"%s: cannot open",cp);
                if(fp && sflag)
                {
diff -r -u original/src/lib/libcmd/rev.c build_libcmd_at/src/lib/libcmd/rev.c
--- src/lib/libcmd/rev.c        2012-01-10 19:55:48.000000000 +0100
+++ src/lib/libcmd/rev.c        2013-09-01 03:51:16.046513593 +0200
@@ -116,6 +116,7 @@
 int
 b_rev(int argc, register char** argv, Shbltin_t* context)
 {
+       int pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register Sfio_t *fp;
        register char *cp;
        register int n, line=0;
@@ -148,7 +149,7 @@
        {
                if(!cp || streq(cp,"-"))
                        fp = sfstdin;
-               else if(!(fp = sfopen((Sfio_t*)0,cp,"r")))
+               else if(!(fp = sfopenat(pwdfd, (Sfio_t*)0, cp, "r")))
                {
                        error(ERROR_system(0),"%s: cannot open",cp);
                        n=1;
diff -r -u original/src/lib/libcmd/tail.c build_libcmd_at/src/lib/libcmd/tail.c
--- src/lib/libcmd/tail.c       2012-10-10 06:16:54.000000000 +0200
+++ src/lib/libcmd/tail.c       2013-09-01 03:48:51.297298287 +0200
@@ -141,6 +141,7 @@
        long            dev;
        long            ino;
        int             fifo;
+       int             pwdfd;
 };
 
 static const char      header_fmt[] = "\n==> %s <==\n";
@@ -274,7 +275,7 @@
                tp->name = "/dev/stdin";
                tp->sp = sfstdin;
        }
-       else if (!(tp->sp = sfopen(tp->sp, tp->name, "r")))
+       else if (!(tp->sp = sfopenat(tp->pwdfd, tp->sp, tp->name, "r")))
        {
                error(ERROR_system(0), "%s: cannot open", tp->name);
                return -1;
@@ -400,6 +401,7 @@
 int
 b_tail(int argc, char** argv, Shbltin_t* context)
 {
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register Sfio_t*        ip;
        register int            n;
        register int            i;
@@ -617,6 +619,7 @@
                {
                        fp->name = s;
                        fp->sp = 0;
+                       fp->pwdfd = pwdfd;
                        if (!init(fp, number, delim, flags, &format))
                        {
                                fp->expire = timeout ? (NOW + timeout + 1) : 0;
@@ -685,7 +688,7 @@
                                        if (flags & LOG)
                                        {
                                                i = 3;
-                                               while (--i && stat(fp->name, 
&st))
+                                               while (--i && fstatat(pwdfd, 
fp->name, &st, 0))
                                                        if 
(sh_checksig(context))
                                                        {
                                                                
error_info.errors++;
@@ -735,7 +738,7 @@
                                file = "/dev/stdin";
                                ip = sfstdin;
                        }
-                       else if (!(ip = sfopen(NiL, file, "r")))
+                       else if (!(ip = sfopenat(pwdfd, NiL, file, "r")))
                        {
                                error(ERROR_system(0), "%s: cannot open", file);
                                continue;
diff -r -u original/src/lib/libcmd/tee.c build_libcmd_at/src/lib/libcmd/tee.c
--- src/lib/libcmd/tee.c        2012-06-19 21:40:02.000000000 +0200
+++ src/lib/libcmd/tee.c        2013-09-01 03:45:40.047766906 +0200
@@ -109,6 +109,7 @@
 int
 b_tee(int argc, register char** argv, Shbltin_t* context)
 {
+       int                     pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register Tee_t*         tp = 0;
        register int            oflag = 
O_WRONLY|O_TRUNC|O_CREAT|O_BINARY|O_cloexec;
        register int*           hp;
@@ -177,7 +178,7 @@
                        hp = tp->fd;
                        while (cp = *argv++)
                        {
-                               while ((*hp = open(cp, oflag, 
S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0 && errno == EINTR)
+                               while ((*hp = openat(pwdfd, cp, oflag, 
S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0 && errno == EINTR)
                                        errno = 0;
                                if (*hp < 0)
                                        error(ERROR_system(0), "%s: cannot 
create", cp);
diff -r -u original/src/lib/libcmd/tr.c build_libcmd_at/src/lib/libcmd/tr.c
--- src/lib/libcmd/tr.c 2013-07-18 15:47:52.000000000 +0200
+++ src/lib/libcmd/tr.c 2013-09-01 03:44:31.316342345 +0200
@@ -468,7 +468,7 @@
                                col[n].chr = set[n];
                                wcsxfrm(col[n].seq, w, sizeof(col[n].seq));
                        }
-                       qsort(col, c, sizeof(col[0]), (Compare_f)wcscmp);
+                       qsort_r(col, c, sizeof(col[0]), (Compare_f)wcscmp, 
NULL);
                        for (n = 0; n < c; n++)
                                set[n] = col[n].chr;
                }
diff -r -u original/src/lib/libcmd/uniq.c build_libcmd_at/src/lib/libcmd/uniq.c
--- src/lib/libcmd/uniq.c       2012-03-08 02:38:36.000000000 +0100
+++ src/lib/libcmd/uniq.c       2013-09-01 03:41:42.351921772 +0200
@@ -245,6 +245,7 @@
 int
 b_uniq(int argc, char** argv, Shbltin_t* context)
 {
+       int pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register int mode=0;
        register char *cp;
        int fields=0, chars=0, width=-1;
@@ -314,7 +315,7 @@
                error(ERROR_usage(2), "%s", optusage(NiL));
        if((cp = *argv) && (argv++,!streq(cp,"-")))
        {
-               if(!(fpin = sfopen(NiL,cp,"r")))
+               if(!(fpin = sfopenat(pwdfd, NiL, cp, "r")))
                        error(ERROR_system(1),"%s: cannot open",cp);
        }
        else
@@ -322,7 +323,7 @@
        if(cp = *argv)
        {
                argv++;
-               if(!(fpout = sfopen(NiL,cp,"w")))
+               if(!(fpout = sfopenat(pwdfd, NiL, cp, "w")))
                        error(ERROR_system(1),"%s: cannot create",cp);
        }
        else
diff -r -u original/src/lib/libcmd/wc.c build_libcmd_at/src/lib/libcmd/wc.c
--- src/lib/libcmd/wc.c 2012-11-21 22:25:48.000000000 +0100
+++ src/lib/libcmd/wc.c 2013-09-01 03:38:54.381552281 +0200
@@ -93,6 +93,7 @@
 int
 b_wc(int argc,register char **argv, Shbltin_t* context)
 {
+       int             pwdfd = (context)?context->pwdfd:AT_FDCWD;
        register char   *cp;
        register int    mode=0, n;
        register Wc_t   *wp;
@@ -162,7 +163,7 @@
        {
                if (!cp || streq(cp,"-"))
                        fp = sfstdin;
-               else if (!(fp = sfopen(NiL,cp,"r")))
+               else if (!(fp = sfopenat(pwdfd, NiL, cp, "r")))
                {
                        error(ERROR_system(0),"%s: cannot open",cp);
                        continue;
_______________________________________________
ast-developers mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to