]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ssh.c
ip/ipconfig: format ipmask with %M instead of %I
[plan9front.git] / sys / src / cmd / ssh.c
index 65c10799bf4d1e46e48398f5421bb9b55e0ece90..92d8d27b5d0340a1c42ec2ca824fed014193f6d9 100644 (file)
@@ -97,7 +97,7 @@ shutdown(void)
 void
 catch(void*, char *msg)
 {
-       if(strstr(msg, "interrupt") != nil){
+       if(strcmp(msg, "interrupt") == 0){
                intr = 1;
                noted(NCONT);
        }
@@ -110,11 +110,9 @@ wasintr(void)
        char err[ERRMAX];
        int r;
 
-       if(intr)
-               return 1;
        memset(err, 0, sizeof(err));
        errstr(err, sizeof(err));
-       r = strstr(err, "interrupt") != nil;
+       r = strcmp(err, "interrupted") == 0;
        errstr(err, sizeof(err));
        return r;
 }
@@ -426,11 +424,6 @@ ssh2rsasig(uchar *data, int len)
        return m;
 }
 
-/* libsec */
-extern mpint* pkcs1padbuf(uchar *buf, int len, mpint *modulus, int blocktype);
-extern int asn1encodedigest(DigestState* (*fun)(uchar*, ulong, uchar*, DigestState*),
-       uchar *digest, uchar *buf, int len);
-
 mpint*
 pkcs1digest(uchar *data, int len, RSApub *pub)
 {
@@ -968,7 +961,14 @@ dispatch(void)
 
        switch(recv.r[0]){
        case MSG_IGNORE:
+               return;
        case MSG_GLOBAL_REQUEST:
+               if(unpack(recv.r, recv.w-recv.r, "_sb", &s, &n, &b) < 0)
+                       break;
+               if(debug)
+                       fprint(2, "%s: global request: %.*s\n", argv0, n, s);
+               if(b != 0)
+                       sendpkt("b", MSG_REQUEST_FAILURE);
                return;
        case MSG_DISCONNECT:
                if(unpack(recv.r, recv.w-recv.r, "_us", &c, &s, &n) < 0)
@@ -1026,14 +1026,20 @@ dispatch(void)
                                break;
                        if(n != 0 && status == nil)
                                status = smprint("%.*s", n, s);
+                       c = MSG_CHANNEL_SUCCESS;
                } else if(n == 11 && memcmp(s, "exit-status", n) == 0){
                        if(unpack(p, recv.w-p, "u", &n) < 0)
                                break;
                        if(n != 0 && status == nil)
                                status = smprint("%d", n);
-               } else if(debug) {
-                       fprint(2, "%s: channel request: %.*s\n", argv0, n, s);
+                       c = MSG_CHANNEL_SUCCESS;
+               } else {
+                       if(debug)
+                               fprint(2, "%s: channel request: %.*s\n", argv0, n, s);
+                       c = MSG_CHANNEL_FAILURE;
                }
+               if(b != 0)
+                       sendpkt("bu", c, recv.chan);
                return;
        case MSG_CHANNEL_EOF:
                recv.eof = 1;
@@ -1073,20 +1079,10 @@ static struct {
 } tty;
 
 void
-rawon(void)
+getdim(void)
 {
-       int ctl;
        char *s;
 
-       close(0);
-       if(open("/dev/cons", OREAD) != 0)
-               sysfatal("open: %r");
-       close(1);
-       if(open("/dev/cons", OWRITE) != 1)
-               sysfatal("open: %r");
-       dup(1, 2);
-       if((ctl = open("/dev/consctl", OWRITE)) >= 0)
-               write(ctl, "rawon", 5);
        if(s = getenv("XPIXELS")){
                tty.xpixels = atoi(s);
                free(s);
@@ -1105,6 +1101,25 @@ rawon(void)
        }
 }
 
+void
+rawon(void)
+{
+       int ctl;
+
+       close(0);
+       if(open("/dev/cons", OREAD) != 0)
+               sysfatal("open: %r");
+       close(1);
+       if(open("/dev/cons", OWRITE) != 1)
+               sysfatal("open: %r");
+       dup(1, 2);
+       if((ctl = open("/dev/consctl", OWRITE)) >= 0){
+               write(ctl, "rawon", 5);
+               write(ctl, "winchon", 7);       /* vt(1): interrupt note on window change */
+       }
+       getdim();
+}
+
 #pragma           varargck    type  "k"   char*
 
 kfmt(Fmt *f)
@@ -1147,7 +1162,9 @@ main(int argc, char *argv[])
        fmtinstall('k', kfmt);
 
        tty.term = getenv("TERM");
-       raw = tty.term != nil && *tty.term != 0;
+       if(tty.term == nil)
+               tty.term = "";
+       raw = *tty.term != 0;
 
        ARGBEGIN {
        case 'd':
@@ -1156,6 +1173,9 @@ main(int argc, char *argv[])
        case 'R':
                raw = 0;
                break;
+       case 'r':
+               raw = 2; /* bloody */
+               break;
        case 'u':
                user = EARGF(usage());
                break;
@@ -1189,8 +1209,9 @@ main(int argc, char *argv[])
        for(cmd = nil; *argv != nil; argv++){
                if(cmd == nil){
                        cmd = strdup(*argv);
-                       raw = 0;
-               }else {
+                       if(raw == 1)
+                               raw = 0;
+               }else{
                        s = smprint("%s %k", cmd, *argv);
                        free(cmd);
                        cmd = s;
@@ -1270,7 +1291,7 @@ Next1:    switch(recvpkt()){
        /* parent reads and dispatches packets */
        if(n > 0) {
                send.pid = n;
-               while((send.eof|recv.eof) == 0){
+               while(recv.eof == 0){
                        recvpkt();
                        qlock(&sl);                                     
                        dispatch();
@@ -1321,8 +1342,19 @@ Next1:   switch(recvpkt()){
                qlock(&sl);
                if(send.eof)
                        break;
-               if(n < 0 && wasintr()){
+               if(n < 0 && wasintr())
+                       intr = 1;
+               if(intr){
                        if(!raw) break;
+                       getdim();
+                       sendpkt("busbuuuu", MSG_CHANNEL_REQUEST,
+                               send.chan,
+                               "window-change", 13,
+                               0,
+                               tty.cols,
+                               tty.lines,
+                               tty.xpixels,
+                               tty.ypixels);
                        sendpkt("busbs", MSG_CHANNEL_REQUEST,
                                send.chan,
                                "signal", 6,