From 77b9929c5e6613802f89740c9aa93665381a5b44 Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Fri, 10 Apr 2015 09:56:08 +0200 Subject: Generalize erlport interface --- c_src/erlport.c | 44 +++++++++++++++++++++++++++++--------------- c_src/erlport.h | 5 ++++- c_src/fsynchelper.c | 2 +- 3 files changed, 34 insertions(+), 17 deletions(-) (limited to 'c_src') diff --git a/c_src/erlport.c b/c_src/erlport.c index e1a363a..77f1410 100644 --- a/c_src/erlport.c +++ b/c_src/erlport.c @@ -16,9 +16,9 @@ static ssize_t read_length(size_t length_size) { - unsigned char buf[2]; + unsigned char buf[4]; - if (length_size != 2) { + if (length_size != 2 && length_size != 4) { return -1; } @@ -34,15 +34,22 @@ read_length(size_t length_size) return -1; } - return (ssize_t)(((unsigned long)buf[0] << 8) | (unsigned long)buf[1]); + if (length_size == 2) { + return (ssize_t)(((unsigned long)buf[0] << 8) | (unsigned long)buf[1]); + } else { + return (ssize_t)(((unsigned long)buf[0] << 24) | + ((unsigned long)buf[1] << 16) | + ((unsigned long)buf[2] << 8) | + (unsigned long)buf[3]); + } } ssize_t -read_command(char *buf, size_t maxlen) +read_command(unsigned char *buf, size_t maxlen, size_t length_size) { ssize_t len; - len = read_length(2); + len = read_length(length_size); if (len < 0) { return -1; @@ -51,20 +58,27 @@ read_command(char *buf, size_t maxlen) if (len > (ssize_t) maxlen) { return -1; } - return net_read(0, buf, (size_t)len); + return net_read(0, (char *)buf, (size_t)len); } static int write_length(size_t len, size_t length_size) { - unsigned char buf[2]; + unsigned char buf[4]; - if (length_size != 2) { + if (length_size != 2 && length_size != 4) { return -1; } - buf[0] = (len >> 8) & 0xff; - buf[1] = len & 0xff; + if (length_size == 2) { + buf[0] = (len >> 8) & 0xff; + buf[1] = len & 0xff; + } else { + buf[0] = (len >> 24) & 0xff; + buf[1] = (len >> 16) & 0xff; + buf[2] = (len >> 8) & 0xff; + buf[3] = len & 0xff; + } ssize_t ret; @@ -81,16 +95,16 @@ write_length(size_t len, size_t length_size) return 0; } -static int -write_reply(char *msg, size_t len) +int +write_reply(unsigned char *msg, size_t len, size_t length_size) { ssize_t ret; - ret = write_length(len, 2); + ret = write_length(len, length_size); if (ret < 0) { return -1; } - ret = net_write(1, msg, len); + ret = net_write(1, (char *)msg, len); if (ret < 0) { return -1; } @@ -101,5 +115,5 @@ write_reply(char *msg, size_t len) int write_status(char *msg) { - return write_reply(msg, strlen(msg)); + return write_reply((unsigned char *)msg, strlen(msg), 2); } diff --git a/c_src/erlport.h b/c_src/erlport.h index 6226d1f..0a7d3c7 100644 --- a/c_src/erlport.h +++ b/c_src/erlport.h @@ -7,7 +7,10 @@ #define ERLPORT_H ssize_t -read_command(char *buf, size_t len); +read_command(unsigned char *buf, size_t maxlen, size_t length_size); + +int +write_reply(unsigned char *msg, size_t len, size_t length_size); int write_status(char *msg); diff --git a/c_src/fsynchelper.c b/c_src/fsynchelper.c index 6ffa80a..2a942be 100644 --- a/c_src/fsynchelper.c +++ b/c_src/fsynchelper.c @@ -32,7 +32,7 @@ main() /* XXX: exits when command size is 0 */ - while ((len = read_command(buf, sizeof(buf)-1)) > 0) { + while ((len = read_command((unsigned char *)buf, sizeof(buf)-1, 2)) > 0) { buf[len] = '\0'; while (1) { int fd; -- cgit v1.1