chiark / gitweb /
vol_id: fix lib logging glue
[elogind.git] / udev / lib / test-libudev.c
1 /*
2  * test-libudev
3  *
4  * Copyright (C) 2008 Kay Sievers <kay.sievers@vrfy.org>
5  *
6  * This program 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  * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include "config.h"
21
22 #include <stdio.h>
23 #include <stdarg.h>
24 #include <unistd.h>
25 #include <errno.h>
26 #include <string.h>
27 #include <getopt.h>
28 #include <syslog.h>
29 #include <sys/select.h>
30
31 #include "libudev.h"
32
33 static void log_fn(struct udev *udev,
34                    int priority, const char *file, int line, const char *fn,
35                    const char *format, va_list args)
36 {
37         printf("test-libudev: %s %s:%d ", fn, file, line);
38         vprintf(format, args);
39 }
40
41 static int print_devlinks_cb(struct udev_device *udev_device, const char *value, void *data)
42 {
43         printf("link:      '%s'\n", value);
44         return 0;
45 }
46
47 static int print_properties_cb(struct udev_device *udev_device, const char *key, const char *value, void *data)
48 {
49         printf("property:  '%s=%s'\n", key, value);
50         return 0;
51 }
52
53 static void print_device(struct udev_device *device)
54 {
55         const char *str;
56         int count;
57
58         printf("*** device: %p ***\n", device);
59         str = udev_device_get_action(device);
60         printf("action:    '%s'\n", str);
61         str = udev_device_get_syspath(device);
62         printf("syspath:   '%s'\n", str);
63         str = udev_device_get_devpath(device);
64         printf("devpath:   '%s'\n", str);
65         str = udev_device_get_subsystem(device);
66         printf("subsystem: '%s'\n", str);
67         str = udev_device_get_driver(device);
68         printf("driver:    '%s'\n", str);
69         str = udev_device_get_devname(device);
70         printf("devname:   '%s'\n", str);
71         count = udev_device_get_devlinks(device, print_devlinks_cb, NULL);
72         printf("found %i links\n", count);
73         count = udev_device_get_properties(device, print_properties_cb, NULL);
74         printf("found %i properties\n", count);
75         printf("\n");
76 }
77
78 static int test_device(struct udev *udev, const char *syspath)
79 {
80         struct udev_device *device;
81
82         printf("looking at device: %s\n", syspath);
83         device = udev_device_new_from_syspath(udev, syspath);
84         if (device == NULL) {
85                 printf("no device\n");
86                 return -1;
87         }
88         print_device(device);
89         udev_device_unref(device);
90         return 0;
91 }
92
93 static int test_device_parents(struct udev *udev, const char *syspath)
94 {
95         struct udev_device *device;
96         struct udev_device *device_parent;
97
98         printf("looking at device: %s\n", syspath);
99         device = udev_device_new_from_syspath(udev, syspath);
100         if (device == NULL)
101                 return -1;
102
103         device_parent = device;
104         do {
105                 print_device(device_parent);
106                 device_parent = udev_device_get_parent(device_parent);
107         } while (device_parent != NULL);
108
109         device_parent = device;
110         do {
111                 print_device(device_parent);
112                 device_parent = udev_device_get_parent(device_parent);
113         } while (device_parent != NULL);
114         udev_device_unref(device);
115
116         return 0;
117 }
118
119 static int devices_enum_cb(struct udev *udev,
120                            const char *devpath, const char *subsystem, const char *name,
121                            void *data)
122 {
123         printf("device:    '%s' (%s) '%s'\n", devpath, subsystem, name);
124         return 0;
125 }
126
127 static int test_enumerate(struct udev *udev, const char *subsystem)
128 {
129         int count;
130
131         count = udev_enumerate_devices(udev, subsystem, devices_enum_cb, NULL);
132         printf("found %i devices\n\n", count);
133         return count;
134 }
135
136 static int test_monitor(struct udev *udev, const char *socket_path)
137 {
138         struct udev_monitor *udev_monitor;
139         fd_set readfds;
140         int fd;
141
142         udev_monitor = udev_monitor_new_from_socket(udev, socket_path);
143         if (udev_monitor == NULL) {
144                 printf("no socket\n");
145                 return -1;
146         }
147         if (udev_monitor_enable_receiving(udev_monitor) < 0) {
148                 printf("bind failed\n");
149                 return -1;
150         }
151
152         fd = udev_monitor_get_fd(udev_monitor);
153         FD_ZERO(&readfds);
154
155         while (1) {
156                 struct udev_device *device;
157                 int fdcount;
158
159                 FD_SET(STDIN_FILENO, &readfds);
160                 FD_SET(fd, &readfds);
161
162                 printf("waiting for events on %s, press ENTER to exit\n", socket_path);
163                 fdcount = select(fd+1, &readfds, NULL, NULL, NULL);
164                 printf("select fd count: %i\n", fdcount);
165
166                 if (FD_ISSET(fd, &readfds)) {
167                         device = udev_monitor_receive_device(udev_monitor);
168                         if (device == NULL) {
169                                 printf("no device from socket\n");
170                                 continue;
171                         }
172                         print_device(device);
173                         udev_device_unref(device);
174                 }
175
176                 if (FD_ISSET(STDIN_FILENO, &readfds)) {
177                         printf("exiting loop\n");
178                         break;
179                 }
180         }
181
182         udev_monitor_unref(udev_monitor);
183         return 0;
184 }
185
186 int main(int argc, char *argv[], char *envp[])
187 {
188         struct udev *udev = NULL;
189         static const struct option options[] = {
190                 { "syspath", 1, NULL, 'p' },
191                 { "subsystem", 1, NULL, 's' },
192                 { "socket", 1, NULL, 'S' },
193                 { "debug", 0, NULL, 'd' },
194                 { "help", 0, NULL, 'h' },
195                 { "version", 0, NULL, 'V' },
196                 {}
197         };
198         const char *syspath = "/devices/virtual/mem/null";
199         const char *subsystem = NULL;
200         const char *socket = "@/org/kernel/udev/monitor";
201         char path[1024];
202         const char *str;
203
204         udev = udev_new();
205         printf("context: %p\n", udev);
206         if (udev == NULL) {
207                 printf("no context\n");
208                 return 1;
209         }
210         udev_set_log_fn(udev, log_fn);
211         printf("set log: %p\n", log_fn);
212
213         while (1) {
214                 int option;
215
216                 option = getopt_long(argc, argv, "+dhV", options, NULL);
217                 if (option == -1)
218                         break;
219
220                 switch (option) {
221                 case 'p':
222                         syspath = optarg;
223                         break;
224                 case 's':
225                         subsystem = optarg;
226                         break;
227                 case 'S':
228                         socket = optarg;
229                         break;
230                 case 'd':
231                         if (udev_get_log_priority(udev) < LOG_INFO)
232                                 udev_set_log_priority(udev, LOG_INFO);
233                         break;
234                 case 'h':
235                         printf("--debug --syspath= --subsystem= --socket= --help\n");
236                         goto out;
237                 case 'V':
238                         printf("%s\n", VERSION);
239                         goto out;
240                 default:
241                         goto out;
242                 }
243         }
244
245         str = udev_get_sys_path(udev);
246         printf("sys_path: '%s'\n", str);
247         str = udev_get_dev_path(udev);
248         printf("dev_path: '%s'\n", str);
249
250         /* add sys path if needed */
251         if (strncmp(syspath, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) {
252                 snprintf(path, sizeof(path), "%s%s", udev_get_sys_path(udev), syspath);
253                 syspath = path;
254         }
255
256         test_device(udev, syspath);
257         test_device_parents(udev, syspath);
258         test_enumerate(udev, subsystem);
259         test_monitor(udev, socket);
260 out:
261         udev_unref(udev);
262         return 0;
263 }