]>
git.ipfire.org Git - thirdparty/systemd.git/blob - udev/test-udev.c
2 * Copyright (C) 2003-2004 Greg Kroah-Hartman <greg@kroah.com>
3 * Copyright (C) 2004-2008 Kay Sievers <kay.sievers@vrfy.org>
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
34 #include "udev_rules.h"
36 static void asmlinkage
sig_handler(int signum
)
47 int main(int argc
, char *argv
[])
50 struct sysfs_device
*dev
;
51 struct udevice
*udevice
;
52 const char *maj
, *min
;
53 struct udev_rules rules
;
56 const char *subsystem
;
63 dbg(udev
, "version %s\n", VERSION
);
65 /* set signal handlers */
66 memset(&act
, 0x00, sizeof(act
));
67 act
.sa_handler
= (void (*)(int)) sig_handler
;
68 sigemptyset (&act
.sa_mask
);
70 sigaction(SIGALRM
, &act
, NULL
);
71 sigaction(SIGINT
, &act
, NULL
);
72 sigaction(SIGTERM
, &act
, NULL
);
74 /* trigger timeout to prevent hanging processes */
75 alarm(UDEV_EVENT_TIMEOUT
);
77 action
= getenv("ACTION");
78 devpath
= getenv("DEVPATH");
79 subsystem
= getenv("SUBSYSTEM");
80 /* older kernels passed the SUBSYSTEM only as argument */
81 if (subsystem
== NULL
&& argc
== 2)
84 if (action
== NULL
|| subsystem
== NULL
|| devpath
== NULL
) {
85 err(udev
, "action, subsystem or devpath missing\n");
89 /* export log_priority , as called programs may want to do the same as udev */
90 if (udev_get_log_priority(udev
) > 0) {
93 sprintf(priority
, "%i", udev_get_log_priority(udev
));
94 setenv("UDEV_LOG", priority
, 1);
98 udev_rules_init(udev
, &rules
, 0);
100 dev
= sysfs_device_get(udev
, devpath
);
102 info(udev
, "unable to open '%s'\n", devpath
);
106 udevice
= udev_device_init(udev
);
110 /* override built-in sysfs device */
112 strlcpy(udevice
->action
, action
, sizeof(udevice
->action
));
114 /* get dev_t from environment, which is needed for "remove" to work, "add" works also from sysfs */
115 maj
= getenv("MAJOR");
116 min
= getenv("MINOR");
117 if (maj
!= NULL
&& min
!= NULL
)
118 udevice
->devt
= makedev(atoi(maj
), atoi(min
));
120 udevice
->devt
= udev_device_get_devt(udevice
);
122 retval
= udev_device_event(&rules
, udevice
);
124 /* rules may change/disable the timeout */
125 if (udevice
->event_timeout
>= 0)
126 alarm(udevice
->event_timeout
);
128 if (retval
== 0 && !udevice
->ignore_device
&& udev_get_run(udev
))
129 udev_rules_run(udevice
);
131 udev_device_cleanup(udevice
);
133 udev_rules_cleanup(&rules
);