tallow - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 8538a66037f31e4c685a76244e3693bc85832805
 (DIR) parent f1bfc54e12efe488e355debf696dbd999c62fe07
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri, 14 May 2004 18:25:49 +0000
       
       allow
       
               sam -r machine filelist...
       
       from presotto
       
       Diffstat:
         M src/cmd/sam/io.c                    |      27 +++++++++++++++++++++++----
         M src/cmd/sam/sam.c                   |       2 +-
         M src/cmd/sam/sam.h                   |       2 +-
       
       3 files changed, 25 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/sam/io.c b/src/cmd/sam/io.c
       t@@ -219,10 +219,28 @@ bootterm(char *machine, char **argv, char **end)
        }
        
        void
       -connectto(char *machine)
       +connectto(char *machine, char **argv)
        {
                int p1[2], p2[2];
       +        char **av;
       +        int ac;
        
       +        // count args
       +        for(av = argv; *av; av++)
       +                ;
       +        av = malloc(sizeof(char*)*((av-argv) + 5));
       +        if(av == nil){
       +                dprint("out of memory\n");
       +                exits("fork/exec");
       +        }
       +        ac = 0;
       +        av[ac++] = RX;
       +        av[ac++] = machine;
       +        av[ac++] = rsamname;
       +        av[ac++] = "-R";
       +        while(*argv)
       +                av[ac++] = *argv++;
       +        av[ac] = 0;
                if(pipe(p1)<0 || pipe(p2)<0){
                        dprint("can't pipe\n");
                        exits("pipe");
       t@@ -237,7 +255,7 @@ connectto(char *machine)
                        close(p1[1]);
                        close(p2[0]);
                        close(p2[1]);
       -                execlp(RXPATH, RX, machine, rsamname, "-R", (char*)0);
       +                execvp(RXPATH, av);
                        dprint("can't exec %s\n", RXPATH);
                        exits("exec");
        
       t@@ -245,15 +263,16 @@ connectto(char *machine)
                        dprint("can't fork\n");
                        exits("fork");
                }
       +        free(av);
                close(p1[1]);
                close(p2[0]);
        }
        
        void
       -startup(char *machine, int Rflag, char **argv, char **end)
       +startup(char *machine, int Rflag, char **argv, char **end, char **files)
        {
                if(machine)
       -                connectto(machine);
       +                connectto(machine, files);
                if(!Rflag)
                        bootterm(machine, argv, end);
                downloaded = 1;
 (DIR) diff --git a/src/cmd/sam/sam.c b/src/cmd/sam/sam.c
       t@@ -107,7 +107,7 @@ main(int argc, char *argv[])
                if(home == 0)
                        home = "/";
                if(!dflag)
       -                startup(machine, Rflag, arg, argv);
       +                startup(machine, Rflag, arg, ap, argv);
                notify(notifyf);
                getcurwd();
                if(argc>1){
 (DIR) diff --git a/src/cmd/sam/sam.h b/src/cmd/sam/sam.h
       t@@ -292,7 +292,7 @@ void        settempfile(void);
        int        skipbl(void);
        void        snarf(File*, Posn, Posn, Buffer*, int);
        void        sortname(File*);
       -void        startup(char*, int, char**, char**);
       +void        startup(char*, int, char**, char**, char**);
        void        state(File*, int);
        int        statfd(int, ulong*, uvlong*, long*, long*, long*);
        int        statfile(char*, ulong*, uvlong*, long*, long*, long*);