e7bfb01a16f19a50096a54360a0928265c57165e
[libsamsung-ipc.git] / samsung-ipc / util.c
1 /*
2  * This file is part of libsamsung-ipc.
3  *
4  * Copyright (C) 2013 Paul Kocialkowski <contact@paulk.fr>
5  *
6  * libsamsung-ipc is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * libsamsung-ipc is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with libsamsung-ipc.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <stdint.h>
24 #include <string.h>
25 #include <fcntl.h>
26 #include <ctype.h>
27 #include <sys/ioctl.h>
28 #include <sys/stat.h>
29 #include <sys/types.h>
30 #include <sys/socket.h>
31 #include <asm/types.h>
32 #include <linux/netlink.h>
33 #include <net/if.h>
34
35 #include "util.h"
36
37 void *file_data_read(char *path, int size, int block_size)
38 {
39     void *data = NULL;
40     int fd = -1;
41
42     unsigned char *p;
43     int count;
44     int rc;
45
46     if (path == NULL || size <= 0 || block_size <= 0)
47         return NULL;
48
49     fd = open(path, O_RDONLY);
50     if (fd < 0)
51         goto error;
52
53     data = malloc(size);
54     memset(data, 0, size);
55
56     p = (unsigned char *) data;
57
58     count = 0;
59     while (count < size) {
60         rc = read(fd, p, size - count > block_size ? block_size : size - count);
61         if (rc < 0)
62             goto error;
63
64         p += rc;
65         count += rc;
66     }
67
68     goto complete;
69
70 error:
71     if (data != NULL)
72         free(data);
73     data = NULL;
74
75 complete:
76     if (fd >= 0)
77         close(fd);
78
79     return data;
80 }
81
82 int network_iface_up(char *iface, int domain, int type)
83 {
84     struct ifreq ifr;
85     int fd = -1;
86     int rc;
87
88     if (iface == NULL)
89         return -1;
90
91     memset(&ifr, 0, sizeof(ifr));
92     strncpy(ifr.ifr_name, iface, IFNAMSIZ);
93
94     fd = socket(domain, type, 0);
95     if (fd < 0)
96         goto error;
97
98     rc = ioctl(fd, SIOCGIFFLAGS, &ifr);
99     if (rc < 0)
100         goto error;
101
102     ifr.ifr_flags |= IFF_UP;
103
104     rc = ioctl(fd, SIOCSIFFLAGS, &ifr);
105     if (rc < 0)
106         goto error;
107
108     rc = 0;
109     goto complete;
110
111 error:
112     rc = -1;
113
114 complete:
115     if (fd >= 0)
116         close(fd);
117
118     return rc;
119 }
120
121 int network_iface_down(char *iface, int domain, int type)
122 {
123     struct ifreq ifr;
124     int fd = -1;
125     int rc;
126
127     if (iface == NULL)
128         return -1;
129
130     memset(&ifr, 0, sizeof(ifr));
131     strncpy(ifr.ifr_name, iface, IFNAMSIZ);
132
133     fd = socket(domain, type, 0);
134     if (fd < 0)
135         goto error;
136
137     rc = ioctl(fd, SIOCGIFFLAGS, &ifr);
138     if (rc < 0)
139         goto error;
140
141     ifr.ifr_flags = (ifr.ifr_flags & (~IFF_UP));
142
143     rc = ioctl(fd, SIOCSIFFLAGS, &ifr);
144     if (rc < 0)
145         goto error;
146
147     rc = 0;
148     goto complete;
149
150 error:
151     rc = -1;
152
153 complete:
154     if (fd >= 0)
155         close(fd);
156
157     return rc;
158 }
159
160 int sysfs_value_read(char *path)
161 {
162     char buffer[100];
163     int value;
164     int fd = -1;
165     int rc;
166
167     if (path == NULL)
168         return -1;
169
170     fd = open(path, O_RDONLY);
171     if (fd < 0)
172         goto error;
173
174     rc = read(fd, &buffer, sizeof(buffer));
175     if (rc <= 0)
176         goto error;
177
178     value = atoi(buffer);
179     goto complete;
180
181 error:
182     value = -1;
183
184 complete:
185     if (fd >= 0)
186         close(fd);
187
188     return value;
189 }
190
191 int sysfs_value_write(char *path, int value)
192 {
193     char buffer[100];
194     int fd = -1;
195     int rc;
196
197     if (path == NULL)
198         return -1;
199
200     fd = open(path, O_WRONLY);
201     if (fd < 0)
202         goto error;
203
204     snprintf((char *) &buffer, sizeof(buffer), "%d\n", value);
205
206     rc = write(fd, buffer, strlen(buffer));
207     if (rc < (int) strlen(buffer))
208         goto error;
209
210     rc = 0;
211     goto complete;
212
213 error:
214     rc = -1;
215
216 complete:
217     if (fd >= 0)
218         close(fd);
219
220     return rc;
221 }
222
223 int sysfs_string_read(char *path, char *buffer, int length)
224 {
225     int fd = -1;
226     int rc;
227
228     if (path == NULL || buffer == NULL || length <= 0)
229         return -1;
230
231     fd = open(path, O_RDONLY);
232     if (fd < 0)
233         goto error;
234
235     rc = read(fd, buffer, length);
236     if (rc <= 0)
237         goto error;
238
239     rc = 0;
240     goto complete;
241
242 error:
243     rc = -1;
244
245 complete:
246     if (fd >= 0)
247         close(fd);
248
249     return rc;
250 }
251
252 int sysfs_string_write(char *path, char *buffer, int length)
253 {
254     int fd = -1;
255     int rc;
256
257     if (path == NULL || buffer == NULL || length <= 0)
258         return -1;
259
260     fd = open(path, O_WRONLY);
261     if (fd < 0)
262         goto error;
263
264     rc = write(fd, buffer, length);
265     if (rc <= 0)
266         goto error;
267
268     rc = 0;
269     goto complete;
270
271 error:
272     rc = -1;
273
274 complete:
275     if (fd >= 0)
276         close(fd);
277
278     return rc;
279 }
280
281 // vim:ts=4:sw=4:expandtab