2 * Copyright (c) 2010 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Alex Hornung <ahornung@gmail.com>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #include <sys/types.h>
35 #include <sys/device.h>
37 #include <sys/socket.h>
38 #include <sys/ioctl.h>
40 #include <sys/queue.h>
43 #include <cpu/inttypes.h>
59 #include <libprop/proplib.h>
64 struct udev
*udev_ctx
;
65 prop_dictionary_t dict
;
71 udev_device_new_from_dictionary(struct udev
*udev_ctx
, prop_dictionary_t dict
)
73 struct udev_device
*udev_dev
;
75 udev_dev
= malloc(sizeof(struct udev_device
));
80 udev_dev
->ev_type
= UDEV_EVENT_NONE
;
83 prop_object_retain(dict
);
85 udev_dev
->dict
= dict
;
86 udev_dev
->udev_ctx
= udev_ref(udev_ctx
);
92 udev_device_ref(struct udev_device
*udev_device
)
94 atomic_add_int(&udev_device
->refs
, 1);
100 udev_device_unref(struct udev_device
*udev_device
)
104 refcount
= atomic_fetchadd_int(&udev_device
->refs
, -1);
107 atomic_subtract_int(&udev_device
->refs
, 0x400); /* in destruction */
108 if (udev_device
->dict
!= NULL
)
109 prop_object_release(udev_device
->dict
);
111 udev_unref(udev_device
->udev_ctx
);
117 udev_device_set_action(struct udev_device
*udev_device
, int action
)
119 udev_device
->ev_type
= action
;
123 udev_device_get_action(struct udev_device
*udev_device
)
127 switch (udev_device
->ev_type
) {
128 case UDEV_EVENT_ATTACH
:
132 case UDEV_EVENT_DETACH
:
145 udev_device_get_devnum(struct udev_device
*udev_device
)
150 if (udev_device
->dict
== NULL
)
153 pn
= prop_dictionary_get(udev_device
->dict
, "devnum");
157 devnum
= prop_number_unsigned_integer_value(pn
);
163 udev_device_get_kptr(struct udev_device
*udev_device
)
168 if (udev_device
->dict
== NULL
)
171 pn
= prop_dictionary_get(udev_device
->dict
, "kptr");
175 kptr
= prop_number_unsigned_integer_value(pn
);
181 udev_device_get_major(struct udev_device
*udev_device
)
186 if (udev_device
->dict
== NULL
)
189 pn
= prop_dictionary_get(udev_device
->dict
, "major");
193 major
= (int32_t)prop_number_integer_value(pn
);
199 udev_device_get_minor(struct udev_device
*udev_device
)
204 if (udev_device
->dict
== NULL
)
207 pn
= prop_dictionary_get(udev_device
->dict
, "minor");
211 minor
= (int32_t)prop_number_integer_value(pn
);
217 udev_device_get_devnode(struct udev_device
*udev_device
)
221 devnum
= udev_device_get_devnum(udev_device
);
225 return devname(devnum
, S_IFCHR
);
229 udev_device_get_property_value(struct udev_device
*udev_device
,
235 static char buf
[128]; /* XXX: might cause trouble */
236 const char *str
= NULL
;
238 if (udev_device
->dict
== NULL
)
241 if ((po
= prop_dictionary_get(udev_device
->dict
, key
)) == NULL
)
244 if (prop_object_type(po
) == PROP_TYPE_STRING
) {
246 str
= __DECONST(char *, prop_string_cstring_nocopy(ps
));
247 } else if (prop_object_type(po
) == PROP_TYPE_NUMBER
) {
249 if (prop_number_unsigned(pn
)) {
250 snprintf(buf
, sizeof(buf
), "%" PRIu64
, prop_number_unsigned_integer_value(pn
));
252 snprintf(buf
, sizeof(buf
), "%" PRIi64
, prop_number_integer_value(pn
));
260 udev_device_get_subsystem(struct udev_device
*udev_device
)
262 return udev_device_get_property_value(udev_device
, "subsystem");
266 udev_device_get_driver(struct udev_device
*udev_device
)
268 return udev_device_get_property_value(udev_device
, "driver");
272 udev_device_get_dictionary(struct udev_device
*udev_device
)
274 return udev_device
->dict
;
278 udev_device_get_udev(struct udev_device
*udev_device
)
280 return udev_device
->udev_ctx
;