summaryrefslogtreecommitdiffstats
path: root/src/eventloop.c
blob: 32b053c7aa307eb4966740a462d8eb346a44338a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <unistd.h>

#include "raw1394.h"
#include "kernel-raw1394.h"
#include "raw1394_private.h"


int raw1394_loop_iterate(struct raw1394_handle *handle)
{
        struct raw1394_request *req = &handle->req;
        int retval = 0;

        if (read(handle->fd, req, sizeof(*req)) < 0) {
                return -1;
        }

        switch (req->type) {
        case RAW1394_REQ_BUS_RESET:
                handle->generation = req->generation;
                handle->num_of_nodes = req->misc & 0xffff;
                handle->local_id = req->misc >> 16;

                if (handle->bus_reset_handler) {
                        retval = handle->bus_reset_handler(handle);
                }
                break;

        case RAW1394_REQ_ISO_RECEIVE:
                if (handle->iso_handler) {
                        retval = handle->iso_handler(handle,
                                                     (handle->buffer[0] >> 8)
                                                     & 0x3f, req->length,
                                                     handle->buffer);
                }
                break;

        default:
                if (handle->tag_handler) {
                        retval = handle->tag_handler(handle, req->tag,
                                                     req->error);
                }
                break;
        }

        return retval;
}


bus_reset_handler_t raw1394_set_bus_reset_handler(struct raw1394_handle *handle,
                                                  bus_reset_handler_t new)
{
        bus_reset_handler_t old;

        old = handle->bus_reset_handler;
        handle->bus_reset_handler = new;

        return old;
}

tag_handler_t raw1394_set_tag_handler(struct raw1394_handle *handle, 
                                      tag_handler_t new)
{
        tag_handler_t old;

        old = handle->tag_handler;
        handle->tag_handler = new;

        return old;
}

iso_handler_t raw1394_set_iso_handler(struct raw1394_handle *handle,
                                      iso_handler_t new)
{
        iso_handler_t old;

        old = handle->iso_handler;
        handle->iso_handler = new;

        return old;
}