]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/rx.c
usb lib: add maxpkt and ntds to Altc struct
[plan9front.git] / sys / src / cmd / rx.c
index 9f849fcbbae040b16a2e0cae9c015985b5d897bc..adb9eda114ffe03f9ed05f9b1a95aea343315801 100644 (file)
@@ -1,6 +1,7 @@
 #include <u.h>
 #include <libc.h>
 #include <auth.h>
+#include <libsec.h>
 
 int    eof;            /* send an eof if true */
 int    crtonl;         /* convert all received \r to \n */
@@ -9,13 +10,13 @@ char *note = "die: yankee dog";
 char   *ruser;         /* for BSD authentication */
 char *key;
 
-void   rex(int, char*, char*);
+void   rex(int, char*);
+void   rcpu(int, char*);
 void   tcpexec(int, char*, char*);
 int    call(char *, char*, char*, char**);
 char   *buildargs(char*[]);
 int    send(int);
 void   error(char*, char*);
-void   sshexec(char*, char*);
 
 void
 usage(void)
@@ -30,6 +31,8 @@ main(int argc, char *argv[])
        char *host, *addr, *args;
        int fd;
 
+       quotefmtinstall();
+
        key = "";
        eof = 1;
        crtonl = 0;
@@ -59,19 +62,14 @@ main(int argc, char *argv[])
        host = argv[0];
        args = buildargs(&argv[1]);
 
+       fd = call(0, host, "rcpu", &addr);
+       if(fd >= 0)
+               rcpu(fd, args);
        fd = call(0, host, "rexexec", &addr);
        if(fd >= 0)
-               rex(fd, args, "p9any");
+               rex(fd, args);
        close(fd);
 
-       /* if there's an ssh port, try that */
-       fd = call("tcp", host, "ssh", &addr);
-       if(fd >= 0){
-               close(fd);
-               sshexec(host, args);
-               /* falls through if no ssh */
-       }
-
        /* specific attempts */
        fd = call("tcp", host, "shell", &addr);
        if(fd >= 0)
@@ -89,18 +87,53 @@ call(char *net, char *host, char *service, char **na)
 }
 
 void
-rex(int fd, char *cmd, char *proto)
+rcpu(int fd, char *cmd)
 {
        char buf[4096];
        int kid, n;
+       TLSconn *conn;
        AuthInfo *ai;
 
-       ai = auth_proxy(fd, auth_getkey, "proto=%s role=client %s", proto, key);
-       if(ai == nil){
-               if(strcmp(proto, "p9any") == 0)
-                       return;
+       ai = auth_proxy(fd, auth_getkey, "proto=p9any role=client %s", key);
+       if(ai == nil)
                error("auth_proxy", nil);
-       }
+
+       conn = (TLSconn*)mallocz(sizeof *conn, 1);
+       conn->pskID = "p9secret";
+       conn->psk = ai->secret;
+       conn->psklen = ai->nsecret;
+       fd = tlsClient(fd, conn);
+       if(fd < 0)
+               error("tlsClient", nil);
+
+       auth_freeAI(ai);
+
+       cmd = smprint("service=rx exec rc -lc %q\n", cmd);
+       if(fprint(fd, "%7ld\n%s", strlen(cmd), cmd) < 0)
+               error("write", nil);
+       free(cmd);
+       
+       kid = send(fd);
+       while((n=read(fd, buf, sizeof buf))>0)
+               if(write(1, buf, n)!=n)
+                       error("write error", 0);
+       sleep(250);
+       postnote(PNPROC, kid, note);/**/
+       exits(0);
+}
+
+void
+rex(int fd, char *cmd)
+{
+       char buf[4096];
+       int kid, n;
+       AuthInfo *ai;
+
+       ai = auth_proxy(fd, auth_getkey, "proto=p9any role=client %s", key);
+       if(ai == nil)
+               error("auth_proxy", nil);
+       auth_freeAI(ai);
+
        write(fd, cmd, strlen(cmd)+1);
 
        kid = send(fd);
@@ -174,27 +207,6 @@ tcpexec(int fd, char *addr, char *cmd)
        exits(0);
 }
 
-void
-sshexec(char *host, char *cmd)
-{
-       char *argv[10];
-       int n;
-
-       n = 0;
-       argv[n++] = "ssh";
-       argv[n++] = "-iCm";
-       if(!returns)
-               argv[n++] = "-r";
-       if(ruser){
-               argv[n++] = "-l";
-               argv[n++] = ruser;
-       }
-       argv[n++] = host;
-       argv[n++] = cmd;
-       argv[n] = 0;
-       exec("/bin/ssh", argv);
-}
-
 int
 send(int fd)
 {
@@ -222,7 +234,7 @@ send(int fd)
 void
 error(char *s, char *z)
 {
-       if(z == 0)
+       if(z == nil)
                fprint(2, "%s: %s: %r\n", argv0, s);
        else
                fprint(2, "%s: %s %s: %r\n", argv0, s, z);