diff --git a/src/apps/bin/mkindex.cpp b/src/apps/bin/mkindex.cpp index 189909068a..90b66637d7 100644 --- a/src/apps/bin/mkindex.cpp +++ b/src/apps/bin/mkindex.cpp @@ -1,22 +1,17 @@ -// Copyright (c) 2003, OpenBeOS -// -// This software is part of the OpenBeOS distribution and is covered -// by the OpenBeOS license. -// -// File: mkindex.cpp -// Author: Scott Dellinger (dellinsd@myrealbox.com) -// Description: Adds an index to a volume. -// -// Changelog: -// 2003-03-08 initial version -// +/* + * Copyright (c) 2003-2005, Haiku + * + * This software is part of the Haiku distribution and is covered + * by the MIT license. + * + * Authors: + * Scott Dellinger (dellinsd@myrealbox.com) + * Axel Dörfler, axeld@pinc-software.de. + */ + +/** Description: Adds an index to a volume. */ -// std C includes -#include -#include -#include -// BeOS C includes #include #include #include @@ -25,176 +20,121 @@ #include #include +#include +#include +#include -// The following enum and #define are copied from gnu/sys2.h, because it -// didn't want to compile when including that directly. Since that file -// is marked as being temporary and getting migrated into system.h, -// assume these'll go away soon. -/* These enum values cannot possibly conflict with the option values - ordinarily used by commands, including CHAR_MAX + 1, etc. Avoid - CHAR_MIN - 1, as it may equal -1, the getopt end-of-options value. */ -enum -{ - GETOPT_HELP_CHAR = (CHAR_MIN - 2), - GETOPT_VERSION_CHAR = (CHAR_MIN - 3) -}; - -#define GETOPT_HELP_OPTION_DECL \ - "help", no_argument, 0, GETOPT_HELP_CHAR - -static struct option const longopts[] = -{ +static struct option const kLongOptions[] = { {"volume", required_argument, 0, 'd'}, {"type", required_argument, 0, 't'}, {"verbose", no_argument, 0, 'v'}, - {GETOPT_HELP_OPTION_DECL}, - {0, 0, 0, 0} + {"help", no_argument, 0, 'h'}, + {NULL} }; -void usage(int); +extern const char *__progname; +static const char *kProgramName = __progname; -int main (int32 argc, char **argv) + +void +usage(int status) { - int c; - int verbose = 0; - dev_t vol_device = 0; - char *index_type_str = NULL; - int index_type = B_STRING_TYPE; - char *index_name = NULL; - int retval; - char *error_message; - - while ((c = getopt_long(argc, argv, "d:ht:v", longopts, NULL)) != -1) - { - switch (c) - { - case 0: - break; - case 'd': - vol_device = dev_for_path(optarg); - if (vol_device < 0) - { - fprintf(stderr, "%s: can't get information about volume: %s\n", argv[0], optarg); - return (-1); - } - break; - case GETOPT_HELP_CHAR: - usage(0); - break; - case 't': - index_type_str = optarg; - if (strncmp("int", optarg, 3) == 0) - index_type = B_INT32_TYPE; - else if (strncmp("llong", optarg, 5) == 0) - index_type = B_INT64_TYPE; - else if (strncmp("string", optarg, 6) == 0) - index_type = B_STRING_TYPE; - else if (strncmp("float", optarg, 5) == 0) - index_type = B_FLOAT_TYPE; - else if (strncmp("double", optarg, 6) == 0) - index_type = B_DOUBLE_TYPE; - else - usage(1); - break; - case 'v': - verbose = 1; - break; - default: - usage(1); - break; - } - } - - /* Create the index on the volume of the current - directory if no volume was specified. */ - if (vol_device == 0) - { - index_type_str = "string"; - vol_device = dev_for_path("."); - if (vol_device < 0) - { - fprintf(stderr, "%s: can't get information about current volume\n", argv[0]); - return (-1); - } - } - - if (argc - optind == 1) // last argument - { - index_name = argv[optind]; - } else - { - usage(1); - } - - if (verbose) - { - /* Get the mount point of the specified volume. */ - BVolume volume(vol_device); - BDirectory dir; - volume.GetRootDirectory(&dir); - BPath path(&dir, NULL); - - fprintf(stdout, "Creating index \"%s\" of type %s on volume mounted at %s.\n", index_name, index_type_str, path.Path()); - } - - if ((retval = fs_create_index(vol_device, index_name, index_type, 0)) != 0) - { - switch (errno) - { - B_BAD_VALUE: - error_message = "The device does not exist, or name is reserved."; - break; - B_NOT_ALLOWED: - error_message = "The device is read-only."; - break; - B_NO_MEMORY: - error_message = "Insufficient memory to complete the operation."; - break; - B_FILE_EXISTS: - error_message = "The index already exists."; - break; - B_DEVICE_FULL: - error_message = "There's not enough room on the device to create the index."; - break; - B_FILE_ERROR: - error_message = "Invalid directory reference."; - break; - B_ERROR: - error_message = "The index type passed isn't supported."; - break; - default: - error_message = "An unknown error has occured."; - break; - } - - fprintf(stderr, "%s\n", error_message); - } - - return (0); -} - -void usage (int status) -{ - fprintf (stderr, - "Usage: mkindex [OPTION]... INDEX_NAME\n" + fprintf(stderr, + "Usage: %s [options] \n" + "Creates a new index for the specified attribute.\n" "\n" - "Creates a new index named INDEX_NAME on a disk volume. Once this has been\n" - "done, adding an attribute named INDEX_NAME to a file causes the file to be\n" - "added to the INDEX_NAME index, such that subsequent queries will be able\n" - "to search for files that contain the INDEX_NAME attribute.\n" - "\n" - " -d, --volume=PATH a path on the volume to which the index will be added\n" - " -h, --help display this help and exit\n" + " -d, --volume=PATH\ta path on the volume to which the index will be added,\n" + "\t\t\tdefaults to current volume.\n" " -t, --type=TYPE the type of the attribute being indexed. One of \"int\",\n" - " \"llong\", \"string\", \"float\", or \"double\".\n" - " -v, --verbose print information about the index being created\n" - "\n" - "INDEX_NAME is the name of a file attribute.\n" - "\n" - "If no volume is specified, the volume of the current directory is assumed.\n" - "If no type is specified, \"string\" is assumed.\n"); + "\t\t\t\"llong\", \"string\", \"float\", or \"double\".\n" + "\t\t\tDefaults to \"string\".\n" + " -v, --verbose\t\tprint information about the index being created\n", + kProgramName); exit(status); } + +int +main(int32 argc, char **argv) +{ + char *indexTypeName = "string"; + int indexType = B_STRING_TYPE; + char *indexName = NULL; + bool verbose = false; + dev_t device = 0; + + int c; + while ((c = getopt_long(argc, argv, "d:ht:v", kLongOptions, NULL)) != -1) { + switch (c) { + case 0: + break; + case 'd': + device = dev_for_path(optarg); + if (device < 0) { + fprintf(stderr, "%s: can't get information about volume: %s\n", + kProgramName, optarg); + return -1; + } + break; + case 'h': + usage(0); + break; + case 't': + indexTypeName = optarg; + if (strncmp("int", optarg, 3) == 0) + indexType = B_INT32_TYPE; + else if (strncmp("llong", optarg, 5) == 0) + indexType = B_INT64_TYPE; + else if (strncmp("string", optarg, 6) == 0) + indexType = B_STRING_TYPE; + else if (strncmp("float", optarg, 5) == 0) + indexType = B_FLOAT_TYPE; + else if (strncmp("double", optarg, 6) == 0) + indexType = B_DOUBLE_TYPE; + else + usage(1); + break; + case 'v': + verbose = 1; + break; + default: + usage(1); + break; + } + } + + if (device == 0) { + // Create the index on the volume of the current + // directory if no volume was specified. + + device = dev_for_path("."); + if (device < 0) { + fprintf(stderr, "%s: can't get information about current volume\n", kProgramName); + return -1; + } + } + + if (argc - optind == 1) { + // last argument + indexName = argv[optind]; + } else + usage(1); + + if (verbose) { + /* Get the mount point of the specified volume. */ + BVolume volume(device); + BDirectory dir; + volume.GetRootDirectory(&dir); + BPath path(&dir, NULL); + + printf("Creating index \"%s\" of type %s on volume mounted at %s.\n", + indexName, indexTypeName, path.Path()); + } + + if (fs_create_index(device, indexName, indexType, 0) != 0) + fprintf(stderr, "%s: Could not create index: %s\n", kProgramName, strerror(errno)); + + return 0; +}