udev-builtin.c revision c3cfed0d6cd9f537aa998096a43b80e98d99c6c4
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering/***
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering This file is part of systemd.
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering Copyright 2007-2012 Kay Sievers <kay@vrfy.org>
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering systemd is free software; you can redistribute it and/or modify it
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering under the terms of the GNU Lesser General Public License as published by
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering (at your option) any later version.
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering systemd is distributed in the hope that it will be useful, but
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering Lesser General Public License for more details.
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering You should have received a copy of the GNU Lesser General Public License
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering***/
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#include <unistd.h>
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#include <stdio.h>
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#include <stdlib.h>
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#include <stddef.h>
8b43440b7ef4b81c69c31de7ff820dc07a780254Lennart Poettering#include <string.h>
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#include <errno.h>
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#include <getopt.h>
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#include "udev.h"
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poetteringstatic bool initialized;
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poetteringstatic const struct udev_builtin *builtins[] = {
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_BLKID] = &udev_builtin_blkid,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_BTRFS] = &udev_builtin_btrfs,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_FIRMWARE] = &udev_builtin_firmware,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_HWDB] = &udev_builtin_hwdb,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_INPUT_ID] = &udev_builtin_input_id,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_KMOD] = &udev_builtin_kmod,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_PATH_ID] = &udev_builtin_path_id,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_USB_ID] = &udev_builtin_usb_id,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#ifdef HAVE_ACL
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering [UDEV_BUILTIN_UACCESS] = &udev_builtin_uaccess,
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering#endif
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering};
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poetteringvoid udev_builtin_init(struct udev *udev)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering{
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering unsigned int i;
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering if (initialized)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering return;
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering for (i = 0; i < ELEMENTSOF(builtins); i++)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering if (builtins[i]->init)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering builtins[i]->init(udev);
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering initialized = true;
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering}
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poetteringvoid udev_builtin_exit(struct udev *udev)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering{
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering unsigned int i;
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering if (!initialized)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering return;
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering for (i = 0; i < ELEMENTSOF(builtins); i++)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering if (builtins[i]->exit)
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering builtins[i]->exit(udev);
78f22b973fa2c9b09bd974680836df17163d9ee0Lennart Poettering
initialized = false;
}
bool udev_builtin_validate(struct udev *udev)
{
unsigned int i;
for (i = 0; i < ELEMENTSOF(builtins); i++)
if (builtins[i]->validate && builtins[i]->validate(udev))
return true;
return false;
}
void udev_builtin_list(struct udev *udev)
{
unsigned int i;
for (i = 0; i < ELEMENTSOF(builtins); i++)
fprintf(stderr, " %-12s %s\n", builtins[i]->name, builtins[i]->help);
}
const char *udev_builtin_name(enum udev_builtin_cmd cmd)
{
return builtins[cmd]->name;
}
bool udev_builtin_run_once(enum udev_builtin_cmd cmd)
{
return builtins[cmd]->run_once;
}
enum udev_builtin_cmd udev_builtin_lookup(const char *command)
{
char name[UTIL_PATH_SIZE];
enum udev_builtin_cmd i;
char *pos;
util_strscpy(name, sizeof(name), command);
pos = strchr(name, ' ');
if (pos)
pos[0] = '\0';
for (i = 0; i < ELEMENTSOF(builtins); i++)
if (strcmp(builtins[i]->name, name) == 0)
return i;
return UDEV_BUILTIN_MAX;
}
int udev_builtin_run(struct udev_device *dev, enum udev_builtin_cmd cmd, const char *command, bool test)
{
char arg[UTIL_PATH_SIZE];
int argc;
char *argv[128];
/* we need '0' here to reset the internal state */
optind = 0;
util_strscpy(arg, sizeof(arg), command);
udev_build_argv(udev_device_get_udev(dev), arg, &argc, argv);
return builtins[cmd]->cmd(dev, argc, argv, test);
}
int udev_builtin_add_property(struct udev_device *dev, bool test, const char *key, const char *val)
{
struct udev_list_entry *entry;
entry = udev_device_add_property(dev, key, val);
/* store in db, skip private keys */
if (key[0] != '.')
udev_list_entry_set_num(entry, true);
if (test)
printf("%s=%s\n", key, val);
return 0;
}