X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/b229c8789d8ad902ebc32da0e6f0ec95871b45e8..bcbce09d48ed6b2792fd6128a62c54f9860d9b3a:/hmland.c diff --git a/hmland.c b/hmland.c index fb6f630..f0b07f2 100644 --- a/hmland.c +++ b/hmland.c @@ -43,6 +43,7 @@ #include "version.h" #include "hexdump.h" #include "hmcfgusb.h" +#include "util.h" #define PID_FILE "/var/run/hmland.pid" @@ -141,8 +142,6 @@ static void write_log(char *buf, int len, char *fmt, ...) static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int outlen, int len, int flags) { - const uint8_t nibble[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F'}; uint8_t *buf_out = *outpos; uint8_t *outend = *outpos + outlen; uint8_t *inend = *inpos + inlen; @@ -164,9 +163,9 @@ static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int out CHECK_AVAIL(len); CHECK_SPACE(len*2); for (i = 0; i < len; i++) { - **outpos = nibble[((**inpos) & 0xf0) >> 4]; + **outpos = nibble_to_ascii(((**inpos) & 0xf0) >> 4); *outpos += 1; - **outpos = nibble[((**inpos) & 0xf)]; + **outpos = nibble_to_ascii(((**inpos) & 0xf)); *inpos += 1; *outpos += 1; } } else { @@ -194,21 +193,6 @@ static int format_part_out(uint8_t **inpos, int inlen, uint8_t **outpos, int out return *outpos - buf_out; } -static uint8_t ascii_to_nibble(uint8_t a) -{ - uint8_t c = 0x00; - - if ((a >= '0') && (a <= '9')) { - c = a - '0'; - } else if ((a >= 'A') && (a <= 'F')) { - c = (a - 'A') + 10; - } else if ((a >= 'a') && (a <= 'f')) { - c = (a - 'a') + 10; - } - - return c; -} - static int parse_part_in(uint8_t **inpos, int inlen, uint8_t **outpos, int outlen, int flags) { uint8_t *buf_out = *outpos; @@ -289,7 +273,12 @@ static int hmlan_format_out(uint8_t *buf, int buf_len, void *data) format_part_out(&inpos, (buf_len-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 3, FLAG_FORMAT_HEX | FLAG_COMMA_BEFORE); format_part_out(&inpos, (buf_len-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 3, FLAG_FORMAT_HEX | FLAG_COMMA_BEFORE); format_part_out(&inpos, (buf_len-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 4, FLAG_FORMAT_HEX | FLAG_COMMA_BEFORE); - format_part_out(&inpos, (buf_len-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 2, FLAG_FORMAT_HEX | FLAG_COMMA_BEFORE | FLAG_NL); + if (version < 0x03c7) { + format_part_out(&inpos, (buf_len-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 2, FLAG_FORMAT_HEX | FLAG_COMMA_BEFORE | FLAG_NL); + } else { + format_part_out(&inpos, (buf_len-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 2, FLAG_FORMAT_HEX | FLAG_COMMA_BEFORE); + format_part_out(&inpos, (buf_len-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 1, FLAG_FORMAT_HEX | FLAG_COMMA_BEFORE | FLAG_NL); + } if (!reboot_set) { int new_reboot_seconds; @@ -435,6 +424,11 @@ static int hmlan_parse_one(uint8_t *cmd, int last, void *data) parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), 0); parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), FLAG_LENGTH_BYTE); break; + case '+': + parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), 0); + parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), 0); + parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), 0); + parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), FLAG_LENGTH_BYTE); default: parse_part_in(&inpos, (last-(inpos-cmd)), &outpos, (sizeof(out)-(outpos-out)), FLAG_IGNORE_COMMAS); break; @@ -713,8 +707,6 @@ static int socket_server(char *iface, int port, int flags) exit(EXIT_FAILURE); } - impersonate_hmlanif = 1; - sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) { perror("Can't open socket"); @@ -808,6 +800,7 @@ void hmlan_syntax(char *prog) fprintf(stderr, "\t-D\t\tdebug mode\n"); fprintf(stderr, "\t-d\t\tdaemon mode\n"); fprintf(stderr, "\t-h\t\tthis help\n"); + fprintf(stderr, "\t-I\t\tpretend to be HM-LAN-IF for compatibility with client-software (previous default)\n"); fprintf(stderr, "\t-i\t\tinteractive mode (connect HM-CFG-USB to terminal)\n"); fprintf(stderr, "\t-l ip\t\tlisten on given IP address only (for example 127.0.0.1)\n"); fprintf(stderr, "\t-L logfile\tlog network-communication to logfile\n"); @@ -829,7 +822,7 @@ int main(int argc, char **argv) char *ep; int opt; - while((opt = getopt(argc, argv, "DdhiPp:Rr:l:L:vV")) != -1) { + while((opt = getopt(argc, argv, "DdhIiPp:Rr:l:L:vV")) != -1) { switch (opt) { case 'D': debug = 1; @@ -838,6 +831,9 @@ int main(int argc, char **argv) case 'd': flags |= FLAG_DAEMON; break; + case 'I': + impersonate_hmlanif = 1; + break; case 'i': interactive = 1; break; @@ -889,7 +885,7 @@ int main(int argc, char **argv) break; case 'V': printf("hmland " VERSION "\n"); - printf("Copyright (c) 2013 Michael Gernoth\n\n"); + printf("Copyright (c) 2013-15 Michael Gernoth\n\n"); exit(EXIT_SUCCESS); case 'h': case ':':