Merge branch 'ei' into develop
This commit is contained in:
commit
02776a3fad
2 changed files with 33 additions and 22 deletions
|
@ -282,7 +282,8 @@ defmodule GenMagic.Server do
|
||||||
21 => :eisdir,
|
21 => :eisdir,
|
||||||
20 => :enotdir,
|
20 => :enotdir,
|
||||||
12 => :enomem,
|
12 => :enomem,
|
||||||
24 => :emfile
|
24 => :emfile,
|
||||||
|
36 => :enametoolong,
|
||||||
}
|
}
|
||||||
@errno Map.keys(@errnos)
|
@errno Map.keys(@errnos)
|
||||||
|
|
||||||
|
|
|
@ -57,9 +57,6 @@ magic_t magic_setup(int flags);
|
||||||
|
|
||||||
typedef char byte;
|
typedef char byte;
|
||||||
|
|
||||||
int read_cmd(byte *buf);
|
|
||||||
int write_cmd(byte *buf, int len);
|
|
||||||
|
|
||||||
void setup_environment();
|
void setup_environment();
|
||||||
void setup_options(int argc, char **argv);
|
void setup_options(int argc, char **argv);
|
||||||
void setup_options_file(char *optarg);
|
void setup_options_file(char *optarg);
|
||||||
|
@ -69,6 +66,8 @@ int process_command(byte *buf);
|
||||||
void process_line(char *line);
|
void process_line(char *line);
|
||||||
void process_file(char *path, ei_x_buff *result);
|
void process_file(char *path, ei_x_buff *result);
|
||||||
void process_bytes(char *bytes, int size, ei_x_buff *result);
|
void process_bytes(char *bytes, int size, ei_x_buff *result);
|
||||||
|
size_t read_cmd(byte *buf);
|
||||||
|
size_t write_cmd(byte *buf, size_t len);
|
||||||
void error(ei_x_buff *result, const char *error);
|
void error(ei_x_buff *result, const char *error);
|
||||||
void handle_magic_error(magic_t handle, int errn, ei_x_buff *result);
|
void handle_magic_error(magic_t handle, int errn, ei_x_buff *result);
|
||||||
|
|
||||||
|
@ -91,17 +90,17 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
ei_x_buff ok_buf;
|
ei_x_buff ok_buf;
|
||||||
if (ei_x_new_with_version(&ok_buf) || ei_x_encode_atom(&ok_buf, "ready"))
|
if (ei_x_new_with_version(&ok_buf) || ei_x_encode_atom(&ok_buf, "ready"))
|
||||||
return 5;
|
exit(ERROR_EI);
|
||||||
write_cmd(ok_buf.buff, ok_buf.index);
|
write_cmd(ok_buf.buff, ok_buf.index);
|
||||||
if (ei_x_free(&ok_buf) != 0)
|
if (ei_x_free(&ok_buf) != 0)
|
||||||
exit(ERROR_EI);
|
exit(ERROR_EI);
|
||||||
|
|
||||||
byte buf[4111];
|
byte buf[4112];
|
||||||
while (read_cmd(buf) > 0) {
|
while (read_cmd(buf) > 0) {
|
||||||
process_command(buf);
|
process_command(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
int process_command(byte *buf) {
|
int process_command(byte *buf) {
|
||||||
|
@ -110,12 +109,14 @@ int process_command(byte *buf) {
|
||||||
int index, version, arity, termtype, termsize;
|
int index, version, arity, termtype, termsize;
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
if (ei_decode_version(buf, &index, &version) != 0)
|
if (ei_decode_version(buf, &index, &version) != 0) {
|
||||||
exit(ERROR_BAD_TERM);
|
exit(ERROR_BAD_TERM);
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize result
|
// Initialize result
|
||||||
if (ei_x_new_with_version(&result) || ei_x_encode_tuple_header(&result, 2))
|
if (ei_x_new_with_version(&result) || ei_x_encode_tuple_header(&result, 2)) {
|
||||||
exit(ERROR_EI);
|
exit(ERROR_EI);
|
||||||
|
}
|
||||||
|
|
||||||
if (ei_decode_tuple_header(buf, &index, &arity) != 0) {
|
if (ei_decode_tuple_header(buf, &index, &arity) != 0) {
|
||||||
error(&result, "badarg");
|
error(&result, "badarg");
|
||||||
|
@ -169,8 +170,9 @@ int process_command(byte *buf) {
|
||||||
|
|
||||||
write_cmd(result.buff, result.index);
|
write_cmd(result.buff, result.index);
|
||||||
|
|
||||||
if (ei_x_free(&result) != 0)
|
if (ei_x_free(&result) != 0) {
|
||||||
exit(ERROR_EI);
|
exit(ERROR_EI);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,7 +272,8 @@ void process_bytes(char *path, int size, ei_x_buff *result) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *mime_encoding_result = magic_buffer(magic_mime_encoding, path, size);
|
const char *mime_encoding_result =
|
||||||
|
magic_buffer(magic_mime_encoding, path, size);
|
||||||
int mime_encoding_errno = magic_errno(magic_mime_encoding);
|
int mime_encoding_errno = magic_errno(magic_mime_encoding);
|
||||||
|
|
||||||
if (mime_encoding_errno > 0) {
|
if (mime_encoding_errno > 0) {
|
||||||
|
@ -339,8 +342,11 @@ void process_file(char *path, ei_x_buff *result) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// From https://erlang.org/doc/tutorial/erl_interface.html
|
// Adapted from https://erlang.org/doc/tutorial/erl_interface.html
|
||||||
int read_exact(byte *buf, int len) {
|
// Changed `read_cmd`, the original one was buggy given some length (due to
|
||||||
|
// endinaness).
|
||||||
|
// TODO: Check if `write_cmd` exhibits the same issue.
|
||||||
|
size_t read_exact(byte *buf, size_t len) {
|
||||||
int i, got = 0;
|
int i, got = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -353,7 +359,7 @@ int read_exact(byte *buf, int len) {
|
||||||
return (len);
|
return (len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int write_exact(byte *buf, int len) {
|
size_t write_exact(byte *buf, size_t len) {
|
||||||
int i, wrote = 0;
|
int i, wrote = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -365,16 +371,20 @@ int write_exact(byte *buf, int len) {
|
||||||
return (len);
|
return (len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int read_cmd(byte *buf) {
|
size_t read_cmd(byte *buf) {
|
||||||
int len;
|
int i;
|
||||||
|
if ((i = read(0, buf, sizeof(uint16_t))) <= 0) {
|
||||||
if (read_exact(buf, 2) != 2)
|
return (i);
|
||||||
return (-1);
|
}
|
||||||
len = (buf[0] << 8) | buf[1];
|
uint16_t len16 = *(uint16_t *)buf;
|
||||||
return read_exact(buf, len);
|
len16 = ntohs(len16);
|
||||||
|
if (len16 > 4111) {
|
||||||
|
exit(ERROR_BAD_TERM);
|
||||||
|
}
|
||||||
|
return read_exact(buf, len16);
|
||||||
}
|
}
|
||||||
|
|
||||||
int write_cmd(byte *buf, int len) {
|
size_t write_cmd(byte *buf, size_t len) {
|
||||||
byte li;
|
byte li;
|
||||||
|
|
||||||
li = (len >> 8) & 0xff;
|
li = (len >> 8) & 0xff;
|
||||||
|
|
Loading…
Reference in a new issue