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 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) (limited to 'c_src/erlport.c') 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); } -- cgit v1.1