Fixed compilation, applied our style guide, simplified the sources, removed

some cruft and too extensive help text.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10737 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-01-15 00:13:58 +00:00
parent 8359274f30
commit c98d79095b
+81 -141
View File
@@ -1,22 +1,17 @@
// Copyright (c) 2003, OpenBeOS /*
// * Copyright (c) 2003-2005, Haiku
// This software is part of the OpenBeOS distribution and is covered *
// by the OpenBeOS license. * This software is part of the Haiku distribution and is covered
// * by the MIT license.
// File: mkindex.cpp *
// Author: Scott Dellinger ([email protected]) * Authors:
// Description: Adds an index to a volume. * Scott Dellinger ([email protected])
// * Axel Dörfler, [email protected].
// Changelog: */
// 2003-03-08 initial version
// /** Description: Adds an index to a volume. */
// std C includes
#include <stdio.h>
#include <string.h>
#include <errno.h>
// BeOS C includes
#include <fs_info.h> #include <fs_info.h>
#include <fs_index.h> #include <fs_index.h>
#include <TypeConstants.h> #include <TypeConstants.h>
@@ -25,75 +20,79 @@
#include <Volume.h> #include <Volume.h>
#include <getopt.h> #include <getopt.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
// 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 static struct option const kLongOptions[] = {
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[] =
{
{"volume", required_argument, 0, 'd'}, {"volume", required_argument, 0, 'd'},
{"type", required_argument, 0, 't'}, {"type", required_argument, 0, 't'},
{"verbose", no_argument, 0, 'v'}, {"verbose", no_argument, 0, 'v'},
{GETOPT_HELP_OPTION_DECL}, {"help", no_argument, 0, 'h'},
{0, 0, 0, 0} {NULL}
}; };
void usage(int); extern const char *__progname;
static const char *kProgramName = __progname;
int main (int32 argc, char **argv)
void
usage(int status)
{ {
fprintf(stderr,
"Usage: %s [options] <attribute>\n"
"Creates a new index for the specified attribute.\n"
"\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"
"\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; int c;
int verbose = 0; while ((c = getopt_long(argc, argv, "d:ht:v", kLongOptions, NULL)) != -1) {
dev_t vol_device = 0; switch (c) {
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: case 0:
break; break;
case 'd': case 'd':
vol_device = dev_for_path(optarg); device = dev_for_path(optarg);
if (vol_device < 0) if (device < 0) {
{ fprintf(stderr, "%s: can't get information about volume: %s\n",
fprintf(stderr, "%s: can't get information about volume: %s\n", argv[0], optarg); kProgramName, optarg);
return (-1); return -1;
} }
break; break;
case GETOPT_HELP_CHAR: case 'h':
usage(0); usage(0);
break; break;
case 't': case 't':
index_type_str = optarg; indexTypeName = optarg;
if (strncmp("int", optarg, 3) == 0) if (strncmp("int", optarg, 3) == 0)
index_type = B_INT32_TYPE; indexType = B_INT32_TYPE;
else if (strncmp("llong", optarg, 5) == 0) else if (strncmp("llong", optarg, 5) == 0)
index_type = B_INT64_TYPE; indexType = B_INT64_TYPE;
else if (strncmp("string", optarg, 6) == 0) else if (strncmp("string", optarg, 6) == 0)
index_type = B_STRING_TYPE; indexType = B_STRING_TYPE;
else if (strncmp("float", optarg, 5) == 0) else if (strncmp("float", optarg, 5) == 0)
index_type = B_FLOAT_TYPE; indexType = B_FLOAT_TYPE;
else if (strncmp("double", optarg, 6) == 0) else if (strncmp("double", optarg, 6) == 0)
index_type = B_DOUBLE_TYPE; indexType = B_DOUBLE_TYPE;
else else
usage(1); usage(1);
break; break;
@@ -106,95 +105,36 @@ int main (int32 argc, char **argv)
} }
} }
/* Create the index on the volume of the current if (device == 0) {
directory if no volume was specified. */ // Create the index on the volume of the current
if (vol_device == 0) // directory if no volume was specified.
{
index_type_str = "string"; device = dev_for_path(".");
vol_device = dev_for_path("."); if (device < 0) {
if (vol_device < 0) fprintf(stderr, "%s: can't get information about current volume\n", kProgramName);
{ return -1;
fprintf(stderr, "%s: can't get information about current volume\n", argv[0]);
return (-1);
} }
} }
if (argc - optind == 1) // last argument if (argc - optind == 1) {
{ // last argument
index_name = argv[optind]; indexName = argv[optind];
} else } else
{
usage(1); usage(1);
}
if (verbose) if (verbose) {
{
/* Get the mount point of the specified volume. */ /* Get the mount point of the specified volume. */
BVolume volume(vol_device); BVolume volume(device);
BDirectory dir; BDirectory dir;
volume.GetRootDirectory(&dir); volume.GetRootDirectory(&dir);
BPath path(&dir, NULL); 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()); printf("Creating index \"%s\" of type %s on volume mounted at %s.\n",
indexName, indexTypeName, path.Path());
} }
if ((retval = fs_create_index(vol_device, index_name, index_type, 0)) != 0) if (fs_create_index(device, indexName, indexType, 0) != 0)
{ fprintf(stderr, "%s: Could not create index: %s\n", kProgramName, strerror(errno));
switch (errno)
{ return 0;
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"
"\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"
" -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");
exit(status);
}