summaryrefslogtreecommitdiffstats
path: root/common/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/utils.c')
-rw-r--r--common/utils.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/common/utils.c b/common/utils.c
new file mode 100644
index 0000000..6803941
--- /dev/null
+++ b/common/utils.c
@@ -0,0 +1,117 @@
1/*
2 usbmuxd - iPhone/iPod Touch USB multiplex server daemon
3
4Copyright (C) 2009 Hector Martin "marcan" <hector@marcansoft.com>
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation, either version 2 or version 3.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19*/
20
21#ifdef HAVE_CONFIG_H
22#include <config.h>
23#endif
24
25#include <stdlib.h>
26#include <string.h>
27#include <stdio.h>
28#include "utils.h"
29
30#ifdef USBMUXD_DAEMON
31# include "log.h"
32# define util_error(...) usbmuxd_log(LL_ERROR, __VA_ARGS__)
33#else
34# define util_error(...) fprintf(stderr, __VA_ARGS__)
35#endif
36
37void fdlist_create(struct fdlist *list)
38{
39 list->count = 0;
40 list->capacity = 4;
41 list->owners = malloc(sizeof(*list->owners) * list->capacity);
42 list->fds = malloc(sizeof(*list->fds) * list->capacity);
43}
44void fdlist_add(struct fdlist *list, enum fdowner owner, int fd, short events)
45{
46 if(list->count == list->capacity) {
47 list->capacity *= 2;
48 list->owners = realloc(list->owners, sizeof(*list->owners) * list->capacity);
49 list->fds = realloc(list->fds, sizeof(*list->fds) * list->capacity);
50 }
51 list->owners[list->count] = owner;
52 list->fds[list->count].fd = fd;
53 list->fds[list->count].events = events;
54 list->fds[list->count].revents = 0;
55 list->count++;
56}
57
58void fdlist_free(struct fdlist *list)
59{
60 list->count = 0;
61 list->capacity = 0;
62 free(list->owners);
63 list->owners = NULL;
64 free(list->fds);
65 list->fds = NULL;
66}
67
68void collection_init(struct collection *col)
69{
70 col->list = malloc(sizeof(void *));
71 memset(col->list, 0, sizeof(void *));
72 col->capacity = 1;
73}
74
75void collection_free(struct collection *col)
76{
77 free(col->list);
78 col->list = NULL;
79 col->capacity = 0;
80}
81
82void collection_add(struct collection *col, void *element)
83{
84 int i;
85 for(i=0; i<col->capacity; i++) {
86 if(!col->list[i]) {
87 col->list[i] = element;
88 return;
89 }
90 }
91 col->list = realloc(col->list, sizeof(void*) * col->capacity * 2);
92 memset(&col->list[col->capacity], 0, sizeof(void *) * col->capacity);
93 col->list[col->capacity] = element;
94 col->capacity *= 2;
95}
96
97void collection_remove(struct collection *col, void *element)
98{
99 int i;
100 for(i=0; i<col->capacity; i++) {
101 if(col->list[i] == element) {
102 col->list[i] = NULL;
103 return;
104 }
105 }
106 util_error("collection_remove: element %p not present in collection %p (cap %d)", element, col, col->capacity);
107}
108
109int collection_count(struct collection *col)
110{
111 int i, cnt = 0;
112 for(i=0; i<col->capacity; i++) {
113 if(col->list[i])
114 cnt++;
115 }
116 return cnt;
117}