udevadm-test-builtin.c revision 7c85d636e646a5c2021d1daaab10282f340e0134
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste/*
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * Copyright (C) 2011 Kay Sievers <kay.sievers@vrfy.org>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste *
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * This program is free software: you can redistribute it and/or modify
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * it under the terms of the GNU General Public License as published by
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * the Free Software Foundation, either version 2 of the License, or
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * (at your option) any later version.
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste *
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * This program is distributed in the hope that it will be useful,
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * but WITHOUT ANY WARRANTY; without even the implied warranty of
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * GNU General Public License for more details.
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste *
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste * You should have received a copy of the GNU General Public License
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste * along with this program. If not, see <http://www.gnu.org/licenses/>.
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste */
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste#include <stdlib.h>
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste#include <stddef.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <string.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <stdio.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <unistd.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <errno.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <dirent.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <fcntl.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <syslog.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <getopt.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <signal.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <time.h>
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste#include <sys/inotify.h>
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste#include <sys/poll.h>
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste#include <sys/stat.h>
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste#include <sys/types.h>
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste#include "udev.h"
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste
74b502cf428d057e78572e9fd66fb2f1861887b0Jaco Joostestatic void help(struct udev *udev)
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste{
104d5b346fdf1a88aa9f936fdf56e644cd65ff7dPhill Cunnington fprintf(stderr, "\n");
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste fprintf(stderr, "Usage: udevadm builtin [--help] <command> <syspath>\n");
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste udev_builtin_list(udev);
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste fprintf(stderr, "\n");
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste}
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Joostestatic int adm_builtin(struct udev *udev, int argc, char *argv[])
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste{
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste static const struct option options[] = {
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste { "help", no_argument, NULL, 'h' },
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste {}
7197110fbdb6deb7868581c455516161cbcf7e0fJaco Jooste };
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste char *command = NULL;
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste char *syspath = NULL;
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste char filename[UTIL_PATH_SIZE];
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste struct udev_device *dev = NULL;
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste enum udev_builtin_cmd cmd;
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste int rc = EXIT_SUCCESS;
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste dbg(udev, "version %s\n", VERSION);
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste for (;;) {
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste int option;
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste option = getopt_long(argc, argv, "h", options, NULL);
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste if (option == -1)
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste break;
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste
0a915e9189b4078b8b3763451da6dc5d9b7edbdeJaco Jooste switch (option) {
919ca0cd7bf1dee3c8021e1c80bd699c7a386001Andrew Forrest case 'h':
919ca0cd7bf1dee3c8021e1c80bd699c7a386001Andrew Forrest help(udev);
abffea1c30ac3b8508f7d708cdd90d9198b64e04Jaco Jooste goto out;
abffea1c30ac3b8508f7d708cdd90d9198b64e04Jaco Jooste }
abffea1c30ac3b8508f7d708cdd90d9198b64e04Jaco Jooste }
293be0e6009d95ca88490bdc847a5bb5888b0162Jonathan
abffea1c30ac3b8508f7d708cdd90d9198b64e04Jaco Jooste command = argv[optind++];
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste if (command == NULL) {
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste fprintf(stderr, "command missing\n");
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste help(udev);
019fc51742057c34c398811286fff5d4f6ee355cJaco Jooste rc = 2;
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste goto out;
b9e697e180c323785bf1cb8a29f5ec6288da8ec4Jaco Jooste }
abffea1c30ac3b8508f7d708cdd90d9198b64e04Jaco Jooste
6eefcf04dec389f6f8514d5cc5bf172fc2549638David Luna syspath = argv[optind++];
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste if (syspath == NULL) {
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste fprintf(stderr, "syspath missing\n\n");
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste rc = 3;
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste goto out;
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste }
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste
019fc51742057c34c398811286fff5d4f6ee355cJaco Jooste udev_builtin_init(udev);
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste cmd = udev_builtin_lookup(command);
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste if (cmd >= UDEV_BUILTIN_MAX) {
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste fprintf(stderr, "unknown command '%s'\n", command);
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste help(udev);
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste rc = 5;
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste goto out;
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste }
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste /* add /sys if needed */
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste if (strncmp(syspath, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0)
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste util_strscpyl(filename, sizeof(filename), udev_get_sys_path(udev), syspath, NULL);
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste else
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste util_strscpy(filename, sizeof(filename), syspath);
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste util_remove_trailing_chars(filename, '/');
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste dev = udev_device_new_from_syspath(udev, filename);
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste if (dev == NULL) {
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste fprintf(stderr, "unable to open device '%s'\n\n", filename);
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste rc = 4;
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste goto out;
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste }
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste if (udev_builtin_run(dev, cmd, command, true) < 0) {
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste fprintf(stderr, "error executing '%s'\n\n", command);
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste rc = 6;
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste }
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Joosteout:
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste udev_device_unref(dev);
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste udev_builtin_exit(udev);
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste return rc;
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste}
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Joosteconst struct udevadm_cmd udevadm_test_builtin = {
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste .name = "test-builtin",
ece5a262d20a50d0abf584d0f7ec73929ede9cfdJaco Jooste .cmd = adm_builtin,
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste .help = "test a built-in command",
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste .debug = true,
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste};
590e03a0114f53c994d970cfb356dadaaa57e39dJaco Jooste