summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2015-04-10 09:56:08 +0200
committerMagnus Ahltorp <map@kth.se>2015-04-10 10:29:04 +0200
commit77b9929c5e6613802f89740c9aa93665381a5b44 (patch)
tree73289b2b640d2ed584ab2774d49b6b23b3d78bb7
parentbf0cd7334e9ed63f6e5c08f5aa1068b52e4aded4 (diff)
Generalize erlport interface
-rw-r--r--c_src/erlport.c44
-rw-r--r--c_src/erlport.h5
-rw-r--r--c_src/fsynchelper.c2
3 files changed, 34 insertions, 17 deletions
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;