- switch(buf[0]) {
- case 'S':
- parse_part_in(&inpos, (r-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 0);
- parse_part_in(&inpos, (r-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 0);
- parse_part_in(&inpos, (r-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 0);
- parse_part_in(&inpos, (r-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 0);
- parse_part_in(&inpos, (r-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), 0);
- parse_part_in(&inpos, (r-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), FLAG_LENGTH_BYTE);
- break;
- default:
- parse_part_in(&inpos, (r-(inpos-buf)), &outpos, (sizeof(out)-(outpos-out)), FLAG_IGNORE_COMMAS);
+ memset(out, 0, sizeof(out));
+ *outpos++ = *inpos++;
+
+ switch(*cmd) {
+ case 'S':
+ 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)), 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);
+ break;
+ case 'Y':
+ 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);
+ 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;
+ }
+
+ hmcfgusb_send(dev, out, sizeof(out), 1);
+
+ return 1;
+}
+
+static int hmlan_parse_in(int fd, void *data)
+{
+ uint8_t *newbuf;
+ int r;
+ int i;
+
+ newbuf = realloc(lan_read_buf, lan_read_buflen + LAN_READ_CHUNK_SIZE);
+ if (!newbuf) {
+ perror("realloc");
+ return 0;
+ }
+ lan_read_buf = newbuf;
+ r = read(fd, lan_read_buf + lan_read_buflen, LAN_READ_CHUNK_SIZE);
+ if (r > 0) {
+ lan_read_buflen += r;
+ if (lan_read_buflen > LAN_MAX_BUF_LENGTH) {
+ if (verbose)
+ printf("Our buffer is bigger than %d bytes (%d bytes), closing connection!\n", LAN_MAX_BUF_LENGTH, lan_read_buflen);
+ return -1;
+ }
+ while(lan_read_buflen > 0) {
+ int found = 0;
+
+ for (i = 0; i < lan_read_buflen; i++) {
+ if ((lan_read_buf[i] == '\r') || (lan_read_buf[i] == '\n')) {
+ if (i > 0)
+ hmlan_parse_one(lan_read_buf, i, data);
+ memmove(lan_read_buf, lan_read_buf + i + 1, lan_read_buflen - (i + 1));
+ lan_read_buflen -= (i + 1);
+ found = 1;
+ break;
+ }
+ if (i > LAN_MAX_LINE_LENGTH) {
+ if (verbose)
+ printf("Client sent more than %d bytes without newline, closing connection!\n", LAN_MAX_LINE_LENGTH);
+ return -1;
+ }
+ }
+ if (!found)