/*
- * Copyright (C) 2004-2006 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2004-2008 Kay Sievers <kay.sievers@vrfy.org>
* Copyright (C) 2004 Chris Friesen <chris_friesen@sympatico.ca>
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation version 2 of the License.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
*
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
-
#include <stddef.h>
#include <signal.h>
#include <unistd.h>
#include "udev.h"
#include "udev_rules.h"
-#include "udev_selinux.h"
#define UDEVD_PRIORITY -4
#define UDEV_PRIORITY -2
udevice = udev_device_init(msg->udev);
if (udevice == NULL)
return -1;
- strlcpy(udevice->action, msg->action, sizeof(udevice->action));
+ util_strlcpy(udevice->action, msg->action, sizeof(udevice->action));
sysfs_device_set_values(udevice->udev, udevice->dev, msg->devpath, msg->subsystem, msg->driver);
udevice->devpath_old = msg->devpath_old;
udevice->devt = msg->devt;
static void export_event_state(struct udevd_uevent_msg *msg, enum event_state state)
{
- char filename[PATH_SIZE];
- char filename_failed[PATH_SIZE];
+ char filename[UTIL_PATH_SIZE];
+ char filename_failed[UTIL_PATH_SIZE];
size_t start;
/* location of queue file */
snprintf(filename, sizeof(filename), "%s/.udev/queue/%llu", udev_get_dev_path(msg->udev), msg->seqnum);
/* location of failed file */
- strlcpy(filename_failed, udev_get_dev_path(msg->udev), sizeof(filename_failed));
- strlcat(filename_failed, "/", sizeof(filename_failed));
- start = strlcat(filename_failed, ".udev/failed/", sizeof(filename_failed));
- strlcat(filename_failed, msg->devpath, sizeof(filename_failed));
- path_encode(&filename_failed[start], sizeof(filename_failed) - start);
+ util_strlcpy(filename_failed, udev_get_dev_path(msg->udev), sizeof(filename_failed));
+ util_strlcat(filename_failed, "/", sizeof(filename_failed));
+ start = util_strlcat(filename_failed, ".udev/failed/", sizeof(filename_failed));
+ util_strlcat(filename_failed, msg->devpath, sizeof(filename_failed));
+ util_path_encode(&filename_failed[start], sizeof(filename_failed) - start);
switch (state) {
case EVENT_QUEUED:
unlink(filename_failed);
delete_path(msg->udev, filename_failed);
create_path(msg->udev, filename);
- selinux_setfscreatecon(msg->udev, filename, NULL, S_IFLNK);
+ udev_selinux_setfscreatecon(msg->udev, filename, S_IFLNK);
symlink(msg->devpath, filename);
- selinux_resetfscreatecon(msg->udev);
+ udev_selinux_resetfscreatecon(msg->udev);
break;
case EVENT_FINISHED:
if (msg->devpath_old != NULL) {
/* "move" event - rename failed file to current name, do not delete failed */
- char filename_failed_old[PATH_SIZE];
+ char filename_failed_old[UTIL_PATH_SIZE];
- strlcpy(filename_failed_old, udev_get_dev_path(msg->udev), sizeof(filename_failed_old));
- strlcat(filename_failed_old, "/", sizeof(filename_failed_old));
- start = strlcat(filename_failed_old, ".udev/failed/", sizeof(filename_failed_old));
- strlcat(filename_failed_old, msg->devpath_old, sizeof(filename_failed_old));
- path_encode(&filename_failed_old[start], sizeof(filename) - start);
+ util_strlcpy(filename_failed_old, udev_get_dev_path(msg->udev), sizeof(filename_failed_old));
+ util_strlcat(filename_failed_old, "/", sizeof(filename_failed_old));
+ start = util_strlcat(filename_failed_old, ".udev/failed/", sizeof(filename_failed_old));
+ util_strlcat(filename_failed_old, msg->devpath_old, sizeof(filename_failed_old));
+ util_path_encode(&filename_failed_old[start], sizeof(filename) - start);
if (rename(filename_failed_old, filename_failed) == 0)
info(msg->udev, "renamed devpath, moved failed state of '%s' to %s'\n",
exit(1);
exit(0);
case -1:
- err(msg->udev, "fork of child failed: %s\n", strerror(errno));
+ err(msg->udev, "fork of child failed: %m\n");
msg_queue_delete(msg);
break;
default:
static void msg_queue_insert(struct udevd_uevent_msg *msg)
{
- char filename[PATH_SIZE];
+ char filename[UTIL_PATH_SIZE];
int fd;
msg->queue_time = time(NULL);
export_event_state(msg, EVENT_QUEUED);
info(msg->udev, "seq %llu queued, '%s' '%s'\n", msg->seqnum, msg->action, msg->subsystem);
- strlcpy(filename, udev_get_dev_path(msg->udev), sizeof(filename));
- strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
+ util_strlcpy(filename, udev_get_dev_path(msg->udev), sizeof(filename));
+ util_strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
if (fd >= 0) {
char str[32];
{
int i;
- for (i = 0; i < PATH_SIZE; i++) {
+ for (i = 0; i < UTIL_PATH_SIZE; i++) {
/* identical device event found */
if (running[i] == '\0' && waiting[i] == '\0')
return 1;
size = recv(uevent_netlink_sock, &buffer, sizeof(buffer), 0);
if (size < 0) {
if (errno != EINTR)
- err(udev, "unable to receive kernel netlink message: %s\n", strerror(errno));
+ err(udev, "unable to receive kernel netlink message: %m\n");
return NULL;
}
uevent_netlink_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (uevent_netlink_sock == -1) {
- err(udev, "error getting socket: %s\n", strerror(errno));
+ err(udev, "error getting socket: %m\n");
return -1;
}
retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
if (retval < 0) {
- err(udev, "bind failed: %s\n", strerror(errno));
+ err(udev, "bind failed: %m\n");
close(uevent_netlink_sock);
uevent_netlink_sock = -1;
return -1;
static void export_initial_seqnum(struct udev *udev)
{
- char filename[PATH_SIZE];
+ char filename[UTIL_PATH_SIZE];
int fd;
char seqnum[32];
ssize_t len = 0;
- strlcpy(filename, udev_get_sys_path(udev), sizeof(filename));
- strlcat(filename, "/kernel/uevent_seqnum", sizeof(filename));
+ util_strlcpy(filename, udev_get_sys_path(udev), sizeof(filename));
+ util_strlcat(filename, "/kernel/uevent_seqnum", sizeof(filename));
fd = open(filename, O_RDONLY);
if (fd >= 0) {
len = read(fd, seqnum, sizeof(seqnum)-1);
strcpy(seqnum, "0\n");
len = 3;
}
- strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
- strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
+ util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
+ util_strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename));
create_path(udev, filename);
fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
if (fd >= 0) {
logging_init("udevd");
udev_set_log_fn(udev, log_fn);
-
- selinux_init(udev);
dbg(udev, "version %s\n", VERSION);
while (1) {
retval = pipe(signal_pipe);
if (retval < 0) {
- err(udev, "error getting pipes: %s\n", strerror(errno));
+ err(udev, "error getting pipes: %m\n");
goto exit;
}
retval = fcntl(signal_pipe[READ_END], F_GETFL, 0);
if (retval < 0) {
- err(udev, "error fcntl on read pipe: %s\n", strerror(errno));
+ err(udev, "error fcntl on read pipe: %m\n");
goto exit;
}
retval = fcntl(signal_pipe[READ_END], F_SETFL, retval | O_NONBLOCK);
if (retval < 0) {
- err(udev, "error fcntl on read pipe: %s\n", strerror(errno));
+ err(udev, "error fcntl on read pipe: %m\n");
goto exit;
}
retval = fcntl(signal_pipe[WRITE_END], F_GETFL, 0);
if (retval < 0) {
- err(udev, "error fcntl on write pipe: %s\n", strerror(errno));
+ err(udev, "error fcntl on write pipe: %m\n");
goto exit;
}
retval = fcntl(signal_pipe[WRITE_END], F_SETFL, retval | O_NONBLOCK);
if (retval < 0) {
- err(udev, "error fcntl on write pipe: %s\n", strerror(errno));
+ err(udev, "error fcntl on write pipe: %m\n");
goto exit;
}
dbg(udev, "daemonized fork running\n");
break;
case -1:
- err(udev, "fork of daemon failed: %s\n", strerror(errno));
+ err(udev, "fork of daemon failed: %m\n");
rc = 4;
goto exit;
default:
/* OOM_DISABLE == -17 */
fd = open("/proc/self/oom_adj", O_RDWR);
if (fd < 0)
- err(udev, "error disabling OOM: %s\n", strerror(errno));
+ err(udev, "error disabling OOM: %m\n");
else {
write(fd, "-17", 3);
close(fd);
IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
/* watch dynamic rules directory */
- strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
- strlcat(filename, "/.udev/rules.d", sizeof(filename));
+ util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
+ util_strlcat(filename, "/.udev/rules.d", sizeof(filename));
inotify_add_watch(inotify_fd, filename,
IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
}
} else if (errno == ENOSYS)
err(udev, "the kernel does not support inotify, udevd can't monitor rules file changes\n");
else
- err(udev, "inotify_init failed: %s\n", strerror(errno));
+ err(udev, "inotify_init failed: %m\n");
/* maximum limit of forked childs */
value = getenv("UDEVD_MAX_CHILDS");
fdcount = select(maxfd+1, &readfds, NULL, NULL, NULL);
if (fdcount < 0) {
if (errno != EINTR)
- err(udev, "error in select: %s\n", strerror(errno));
+ err(udev, "error in select: %m\n");
continue;
}
exit:
udev_rules_cleanup(&rules);
sysfs_cleanup();
- selinux_exit(udev);
if (signal_pipe[READ_END] >= 0)
close(signal_pipe[READ_END]);