X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fmcreate.c;h=8774b6b8e2d7b08756e30d41b0809abb36ad074a;hb=c05656557353954b2a9799c4e702329db2d38851;hp=bc18aa73ab6456389ab8a3882b2359dd31961d5f;hpb=2e4a75ce419c2e954cda881bc4dc8466ff651c0a;p=fs%2Flustre-release.git diff --git a/lustre/tests/mcreate.c b/lustre/tests/mcreate.c index bc18aa7..8774b6b 100644 --- a/lustre/tests/mcreate.c +++ b/lustre/tests/mcreate.c @@ -1,23 +1,109 @@ +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.gnu.org/licenses/gpl-2.0.html + * + * GPL HEADER END + */ +/* + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + */ + #include -#include +#include +#include #include #include #include #include #include +#include + +void usage(const char *prog, int status) +{ + fprintf(status == 0 ? stdout : stderr, + "Usage: %s [OPTION]... FILE\n" + " -d, --device=DEV use device number DEV\n" + " -h, --help dispaly help\n" + " -m, --mode=MODE use mode MODE\n" + " -M, --major=MAJOR use device major MAJOR\n" + " -N, --minor=MINOR use device minor MINOR\n", + prog); + + exit(status); +} int main(int argc, char ** argv) { + struct option opts[] = { + { .name = "device", .has_arg = required_argument, .val = 'd' }, + { .name = "help", .has_arg = no_argument, .val = 'h' }, + { .name = "mode", .has_arg = required_argument, .val = 'm' }, + { .name = "major", .has_arg = required_argument, .val = 'M' }, + { .name = "minor", .has_arg = required_argument, .val = 'N' }, + { .name = NULL } + }; + const char *path; + mode_t mode = S_IFREG | 0644; + dev_t dev = 0; int rc; - if (argc < 2) { - printf("Usage %s filename\n", argv[0]); - return 1; + int c; + while ((c = getopt_long(argc, argv, "d:hm:M:N:", opts, NULL)) != -1) { + switch (c) { + case 'd': + dev = strtoul(optarg, NULL, 0); + break; + case 'h': + usage(argv[0], 0); + case 'm': + mode = strtoul(optarg, NULL, 0); + break; + case 'M': + dev = makedev(strtoul(optarg, NULL, 0), minor(dev)); + break; + case 'N': + dev = makedev(major(dev), strtoul(optarg, NULL, 0)); + break; + case '?': + usage(argv[0], 1); + } } - rc = mknod(argv[1], S_IFREG| 0444, 0); - if (rc) { - printf("mknod(%s) error: %s\n", argv[1], strerror(errno)); - } + if (argc - optind != 1) + usage(argv[0], 1); + + path = argv[optind]; + + if ((mode & S_IFMT) == S_IFDIR) + rc = mkdir(path, mode & ~S_IFMT); + else if ((mode & S_IFMT) == S_IFLNK) + rc = symlink("oldpath", path); + else + rc = mknod(path, mode, dev); + + if (rc) + fprintf(stderr, "%s: cannot create `%s' with mode %#o: %s\n", + argv[0], path, mode, strerror(errno)); + return rc; -} +}