summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2022-04-11 17:28:29 +0200
committerGerd Hoffmann <kraxel@redhat.com>2022-04-22 14:52:30 +0200
commit7c8c91d808bbbfb4eab57a68fc73ccb32046b5f1 (patch)
tree245e601569cbbf34e33f666076a4687295a82eb9
parent9cf44be87fb50ce116e1cbfbff1fa3e8771c15a4 (diff)
downloadamtterm-7c8c91d808bbbfb4eab57a68fc73ccb32046b5f1.tar.gz
redir: reshuffle functions
-rw-r--r--redir.c85
-rw-r--r--redir.h3
2 files changed, 68 insertions, 20 deletions
diff --git a/redir.c b/redir.c
index 780a065..ac41212 100644
--- a/redir.c
+++ b/redir.c
@@ -327,6 +327,69 @@ int redir_sol_stop(struct redir *r)
return redir_write(r, request, sizeof(request));
}
+int redir_sol_send(struct redir *r, unsigned char *buf, int blen)
+{
+ int len = 10+blen;
+ int rc;
+ unsigned char *request = malloc(len);
+
+ memset(request, 0, len);
+ request[0] = SOL_DATA_TO_HOST;
+ request[8] = blen & 0xff;
+ request[9] = blen >> 8;
+ memcpy(request + 10, buf, blen);
+ rc = redir_write(r, request, len);
+ free(request);
+ return rc;
+}
+
+int redir_sol_recv(struct redir *r)
+{
+ unsigned char msg[64];
+ int count, len, bshift;
+ int flags;
+
+ len = r->buf[8] + (r->buf[9] << 8);
+ count = r->blen - 10;
+ if (count > len)
+ count = len;
+ bshift = count + 10;
+ if (r->cb_recv)
+ r->cb_recv(r->cb_data, r->buf + 10, count);
+ len -= count;
+
+ while (len) {
+ if (r->trace)
+ fprintf(stderr, "in+: need %d more data bytes\n", len);
+ count = sizeof(msg);
+ if (count > len)
+ count = len;
+ /* temporarily switch to blocking. the actual data may not be
+ ready yet, but should be here Real Soon Now. */
+ flags = fcntl(r->sock,F_GETFL);
+ fcntl(r->sock,F_SETFL, flags & (~O_NONBLOCK));
+ count = sslread(r->ctx, msg, count);
+ fcntl(r->sock,F_SETFL, flags);
+
+ switch (count) {
+ case -1:
+ snprintf(r->err, sizeof(r->err), "read(socket): %s", strerror(errno));
+ return -1;
+ case 0:
+ snprintf(r->err, sizeof(r->err), "EOF from socket");
+ return -1;
+ default:
+ if (r->trace)
+ hexdump("in+", msg, count);
+ if (r->cb_recv)
+ r->cb_recv(r->cb_data, msg, count);
+ len -= count;
+ }
+ }
+
+ return bshift;
+}
+
int redir_ider_start(struct redir *r)
{
unsigned char request[START_IDER_REDIRECTION_LENGTH] = {
@@ -380,23 +443,7 @@ int redir_ider_stop(struct redir *r)
return redir_write(r, request, sizeof(request));
}
-int redir_sol_send(struct redir *r, unsigned char *buf, int blen)
-{
- int len = 10+blen;
- int rc;
- unsigned char *request = malloc(len);
-
- memset(request, 0, len);
- request[0] = SOL_DATA_TO_HOST;
- request[8] = blen & 0xff;
- request[9] = blen >> 8;
- memcpy(request + 10, buf, blen);
- rc = redir_write(r, request, len);
- free(request);
- return rc;
-}
-
-int redir_recv(struct redir *r)
+int redir_ider_recv(struct redir *r)
{
unsigned char msg[64];
int count, len, bshift;
@@ -527,7 +574,7 @@ repeat:
case SOL_DATA_FROM_HOST:
if (r->blen < 10) /* header length */
goto again;
- bshift = redir_recv(r);
+ bshift = redir_sol_recv(r);
if (bshift < 0)
goto err;
break;
@@ -623,7 +670,7 @@ repeat:
case IDER_DATA_FROM_HOST:
if (r->blen < 10) /* header length */
goto again;
- bshift = redir_recv(r);
+ bshift = redir_ider_recv(r);
if (bshift < 0)
goto err;
break;
diff --git a/redir.h b/redir.h
index 9644441..d170562 100644
--- a/redir.h
+++ b/redir.h
@@ -66,13 +66,14 @@ int redir_connect(struct redir *r);
int redir_start(struct redir *r);
int redir_stop(struct redir *r);
int redir_auth(struct redir *r);
-int redir_recv(struct redir *r);
int redir_sol_start(struct redir *r);
int redir_sol_stop(struct redir *r);
int redir_sol_send(struct redir *r, unsigned char *buf, int blen);
+int redir_sol_recv(struct redir *r);
int redir_ider_start(struct redir *r);
int redir_ider_config(struct redir *r);
int redir_ider_reset(struct redir *r);
int redir_ider_stop(struct redir *r);
int redir_ider_send(struct redir *r, unsigned char *buf, int blen);
+int redir_ider_recv(struct redir *r);
int redir_data(struct redir *r);