~cyphermox/ubuntu/natty/ofono/release-0.41

« back to all changes in this revision

Viewing changes to gisi/socket.c

  • Committer: Mathieu Trudel-Lapierre
  • Date: 2011-02-11 02:17:20 UTC
  • mfrom: (1.3.2 upstream)
  • Revision ID: mathieu-tl@ubuntu.com-20110211021720-cvxc3erw1keomunj
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
#include <unistd.h>
31
31
#include <net/if.h>
32
32
#include <fcntl.h>
33
 
#include "modem.h"
 
33
#include <glib.h>
 
34
 
34
35
#include "phonet.h"
35
 
#include <glib.h>
36
 
 
37
36
#include "socket.h"
38
37
 
39
 
GIOChannel *phonet_new(GIsiModem *modem, uint8_t resource)
 
38
GIOChannel *g_isi_phonet_new(unsigned ifindex)
40
39
{
41
40
        GIOChannel *channel;
42
41
        struct sockaddr_pn addr = {
43
42
                .spn_family = AF_PHONET,
44
 
                .spn_resource = resource,
45
43
        };
46
 
        unsigned ifi = g_isi_modem_index(modem);
47
44
        char buf[IF_NAMESIZE];
48
45
 
49
46
        int fd = socket(PF_PHONET, SOCK_DGRAM, 0);
50
47
        if (fd == -1)
51
48
                return NULL;
 
49
 
52
50
        fcntl(fd, F_SETFD, FD_CLOEXEC);
53
51
        /* Use blocking mode on purpose. */
54
52
 
55
 
        if (ifi == 0)
56
 
                g_warning("Unspecified GIsiModem!");
57
 
        else if (if_indextoname(ifi, buf) == NULL ||
 
53
        if (ifindex == 0)
 
54
                g_warning("Unspecified modem interface index");
 
55
        else if (if_indextoname(ifindex, buf) == NULL ||
58
56
                setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, buf, IF_NAMESIZE))
59
57
                goto error;
 
58
 
60
59
        if (bind(fd, (void *)&addr, sizeof(addr)))
61
60
                goto error;
62
61
 
65
64
        g_io_channel_set_encoding(channel, NULL, NULL);
66
65
        g_io_channel_set_buffered(channel, FALSE);
67
66
        return channel;
 
67
 
68
68
error:
69
69
        close(fd);
70
70
        return NULL;
71
71
}
72
72
 
73
 
size_t phonet_peek_length(GIOChannel *channel)
 
73
size_t g_isi_phonet_peek_length(GIOChannel *channel)
74
74
{
75
75
        int len;
76
76
        int fd = g_io_channel_unix_get_fd(channel);
 
77
 
77
78
        return ioctl(fd, FIONREAD, &len) ? 0 : len;
78
79
}
79
80
 
80
 
ssize_t phonet_read(GIOChannel *channel, void *restrict buf, size_t len,
81
 
                        uint16_t *restrict obj, uint8_t *restrict res)
 
81
ssize_t g_isi_phonet_read(GIOChannel *channel, void *restrict buf, size_t len,
 
82
                                struct sockaddr_pn *addr)
82
83
{
83
 
        struct sockaddr_pn addr;
84
 
        socklen_t addrlen = sizeof(addr);
 
84
        socklen_t addrlen = sizeof(struct sockaddr_pn);
85
85
        ssize_t ret;
86
86
 
87
87
        ret = recvfrom(g_io_channel_unix_get_fd(channel), buf, len,
88
 
                        MSG_DONTWAIT, (void *)&addr, &addrlen);
 
88
                        MSG_DONTWAIT, (void *)addr, &addrlen);
89
89
        if (ret == -1)
90
90
                return -1;
91
91
 
92
 
        if (obj != NULL)
93
 
                *obj = (addr.spn_dev << 8) | addr.spn_obj;
94
 
        if (res != NULL)
95
 
                *res = addr.spn_resource;
96
92
        return ret;
97
93
}