X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Ffloppy%2Fcreate_floppy_devices.c;h=0698fcd3e83cf629f0e3173aa70eb0eed9afb7e5;hp=f4003c2ce2944b5bb5ac1f77d81a5b5d6616ea44;hb=5d89ef7bf94d8a708a1159be22eb1cf458a1d101;hpb=bf375e3af65f0e9728516a3627613fb95288c1d1 diff --git a/extras/floppy/create_floppy_devices.c b/extras/floppy/create_floppy_devices.c index f4003c2ce..0698fcd3e 100644 --- a/extras/floppy/create_floppy_devices.c +++ b/extras/floppy/create_floppy_devices.c @@ -6,22 +6,12 @@ * * Copyright(C) 2005, SUSE Linux Products GmbH * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Author: Hannes Reinecke + * Author: + * Hannes Reinecke * + * 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. */ #include @@ -31,6 +21,10 @@ #include #include #include +#include +#include + +#include "../../udev/udev.h" static char *table[] = { "", "d360", "h1200", "u360", "u720", "h360", "h720", @@ -41,45 +35,64 @@ static char *table[] = { NULL }; -static int t360[] = { 1 }; -static int t1200[] = { 2, 5, 6, 10, 12, 14, 16, 18, 20, 23 }; -static int t3in[] = { 8, 9, 26, 27, 28, 7, 11, 15, 19, 24, 25, 29, 31, 3, 4, 13, 17, 21, 22, 30 }; +static int t360[] = { 1, 0 }; +static int t1200[] = { 2, 5, 6, 10, 12, 14, 16, 18, 20, 23, 0 }; +static int t3in[] = { 8, 9, 26, 27, 28, 7, 11, 15, 19, 24, 25, 29, 31, 3, 4, 13, 17, 21, 22, 30, 0 }; +static int *table_sup[] = { NULL, t360, t1200, t3in+5+8, t3in+5, t3in, t3in }; -static int *table_sup[] = { NULL, t360, t1200, t3in + 5 + 8, t3in + 5, t3in, t3in }; +static void log_fn(struct udev *udev, int priority, + const char *file, int line, const char *fn, + const char *format, va_list args) +{ + vsyslog(priority, format, args); +} int main(int argc, char **argv) { + struct udev *udev; char *dev; + char *devname; char node[64]; int type = 0, i, fdnum, c; int major = 2, minor; - int mode = 0; + uid_t uid = 0; + gid_t gid = 0; + mode_t mode = 0660; int create_nodes = 0; int print_nodes = 0; - int unlink_nodes = 0; int is_err = 0; - while ((c = getopt(argc, argv, "cdm:M:t:u")) != -1) { + udev = udev_new(); + if (udev == NULL) + goto exit; + + logging_init("create_floppy_devices"); + udev_set_log_fn(udev, log_fn); + udev_selinux_init(udev); + + while ((c = getopt(argc, argv, "cudm:U:G:M:t:")) != -1) { switch (c) { case 'c': create_nodes = 1; - unlink_nodes = 0; break; case 'd': print_nodes = 1; break; + case 'U': + uid = util_lookup_user(udev, optarg); + break; + case 'G': + gid = util_lookup_group(udev, optarg); + break; case 'M': - mode = strtol(optarg, NULL, 10); + mode = strtol(optarg, NULL, 0); + mode = mode & 0666; break; case 'm': - major = strtol(optarg, NULL, 10); + major = strtol(optarg, NULL, 0); break; case 't': - type = strtol(optarg, NULL, 10); - break; - case 'u': - unlink_nodes = 1; - create_nodes = 0; + type = strtol(optarg, NULL, 0); break; default: is_err++; @@ -88,31 +101,43 @@ int main(int argc, char **argv) } if (is_err || optind >= argc) { - fprintf(stderr,"Usage: %s [-d|-c|-u|-m |-t ] \n", - argv[0]); + printf("Usage: %s [OPTION] device\n" + " -c create\n" + " -d debug\n" + " -m Major number\n" + " -t floppy type number\n" + " -U device node user ownership\n" + " -G device node group owner\n" + " -M device node mode\n" + "\n", argv[0]); return 1; } dev = argv[optind]; - if (dev[strlen(dev) - 3] != 'f' || dev[strlen(dev) -2 ] != 'd') { + devname = strrchr(dev, '/'); + if (devname != NULL) + devname = &devname[1]; + else + devname = dev; + if (strncmp(devname, "fd", 2) != 0) { fprintf(stderr,"Device '%s' is not a floppy device\n", dev); return 1; } - fdnum = strtol(dev + 2, NULL, 10); + fdnum = strtol(&devname[2], NULL, 10); if (fdnum < 0 || fdnum > 7) { fprintf(stderr,"Floppy device number %d out of range (0-7)\n", fdnum); return 1; } if (fdnum > 3) - fdnum += 128; + fdnum += 124; if (major < 1) { fprintf(stderr,"Invalid major number %d\n", major); return 1; } - if (type < 0 || type > (int) sizeof(table)) { + if (type < 0 || type >= (int) ARRAY_SIZE(table_sup)) { fprintf(stderr,"Invalid CMOS type %d\n", type); return 1; } @@ -122,15 +147,23 @@ int main(int argc, char **argv) i = 0; while (table_sup[type][i]) { - sprintf(node,"%s%s",dev,table[table_sup[type][i]]); + sprintf(node, "%s%s", dev, table[table_sup[type][i]]); minor = (table_sup[type][i] << 2) + fdnum; if (print_nodes) - printf("%s b %d %d %d\n", node, mode, major, minor); - if (create_nodes) + printf("%s b %.4o %d %d\n", node, mode, major, minor); + if (create_nodes) { + unlink(node); + udev_selinux_setfscreatecon(udev, node, S_IFBLK | mode); mknod(node, S_IFBLK | mode, makedev(major,minor)); + udev_selinux_resetfscreatecon(udev); + chown(node, uid, gid); + chmod(node, S_IFBLK | mode); + } i++; } + udev_selinux_exit(udev); + udev_unref(udev); +exit: return 0; } -