am7xxx: detect unexpected responses to AM7XXX_PACKET_TYPE_DEVINFO requests
[libam7xxx.git] / src / am7xxx.c
index 0daa259..bc671f1 100644 (file)
@@ -239,7 +239,10 @@ static void debug_dump_header(am7xxx_context *ctx, struct am7xxx_header *h)
 
        debug(ctx, "BEGIN\n");
        debug(ctx, "packet_type:     0x%08x (%u)\n", h->packet_type, h->packet_type);
-       debug(ctx, "direction:       0x%02hhx (%hhu)\n", h->direction, h->direction);
+       debug(ctx, "direction:       0x%02hhx (%hhu) (%s)\n", h->direction, h->direction,
+             h->direction == AM7XXX_DIRECTION_IN ? "IN" :
+             h->direction == AM7XXX_DIRECTION_OUT ? "OUT" :
+             "UNKNOWN");
        debug(ctx, "header_data_len: 0x%02hhx (%hhu)\n", h->header_data_len, h->header_data_len);
        debug(ctx, "unknown2:        0x%02hhx (%hhu)\n", h->unknown2, h->unknown2);
        debug(ctx, "unknown3:        0x%02hhx (%hhu)\n", h->unknown3, h->unknown3);
@@ -383,16 +386,17 @@ static int read_header(am7xxx_device *dev, struct am7xxx_header *h)
 
        unserialize_header(dev->buffer, h);
 
-       debug_dump_header(dev->ctx, h);
-
        if (h->direction == AM7XXX_DIRECTION_IN) {
                ret = 0;
        } else {
                error(dev->ctx,
-                     "Received a packet with direction AM7XXX_DIRECTION_OUT, weird!\n");
+                     "Expected an AM7XXX_DIRECTION_IN packet, got one with direction = %d. Weird!\n",
+                     h->direction);
                ret = -EINVAL;
        }
 
+       debug_dump_header(dev->ctx, h);
+
 out:
        return ret;
 }
@@ -403,7 +407,13 @@ static int send_header(am7xxx_device *dev, struct am7xxx_header *h)
 
        debug_dump_header(dev->ctx, h);
 
+       /* For symmetry with read_header() we should check here for
+        * h->direction == AM7XXX_DIRECTION_OUT but we just ensure that in all
+        * the callers and save some cycles here.
+        */
+
        serialize_header(h, dev->buffer);
+
        ret = send_data(dev, dev->buffer, AM7XXX_HEADER_WIRE_SIZE);
        if (ret < 0)
                error(dev->ctx, "failed to send data\n");
@@ -450,8 +460,6 @@ static am7xxx_device *add_new_device(am7xxx_context *ctx)
                return NULL;
        }
 
-       devices_list = &(ctx->devices_list);
-
        new_device = malloc(sizeof(*new_device));
        if (new_device == NULL) {
                fatal("cannot allocate a new device (%s)\n", strerror(errno));
@@ -461,6 +469,8 @@ static am7xxx_device *add_new_device(am7xxx_context *ctx)
 
        new_device->ctx = ctx;
 
+       devices_list = &(ctx->devices_list);
+
        if (*devices_list == NULL) {
                *devices_list = new_device;
        } else {
@@ -742,6 +752,13 @@ AM7XXX_PUBLIC int am7xxx_get_device_info(am7xxx_device *dev,
        if (ret < 0)
                return ret;
 
+       if (h.packet_type != AM7XXX_PACKET_TYPE_DEVINFO) {
+               error(dev->ctx, "expected packet type: %d, got %d instead!\n",
+                     AM7XXX_PACKET_TYPE_DEVINFO, h.packet_type);
+               errno = ENOTSUP;
+               return -ENOTSUP;
+       }
+
        device_info->native_width = h.header_data.devinfo.native_width;
        device_info->native_height = h.header_data.devinfo.native_height;
 #if 0