haiku/src/bin/mkindex.cpp
Ingo Weinhold 758b1d0e05 Fixes that make Haiku build with gcc 4. Mainly out of the following
categories:
* Missing includes (like <stdlib.h> and <string.h>).
* Linking against $(TARGET_LIBSTDC++) instead of libstdc++.r4.so.
* Local variables shadowing parameters.
* Default parameters in function definitions (as opposed to function
  declarations).
* All C++ stuff (nothrow, map, set, vector, min, max,...) must be imported
  explicitly from the std:: namespace now.
* "new (sometype)[...]" must read "new sometype[...]", even if sometype is
  something like "const char *".
* __FUNCTION__ is no longer a string literal (but a string expression), i.e.
  'printf(__FUNCTION__ ": ...\n")' is invalid code.
* A type cast results in a non-lvalue. E.g. "(char *)buffer += bytes"
  is an invalid expression.
* "friend class SomeClass" only works when SomeClass is known before.
  Otherwise the an inner class with that name is considered as friend.
  gcc 4 is much pickier about scopes.
* gcc 4 is generally stricter with respect to type conversions in C.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14878 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-11-12 23:27:14 +00:00

191 lines
4.5 KiB
C++

/*
* 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. */
#include <fs_info.h>
#include <fs_index.h>
#include <TypeConstants.h>
#include <Directory.h>
#include <Path.h>
#include <Volume.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
static struct option const kLongOptions[] = {
{"volume", required_argument, 0, 'd'},
{"type", required_argument, 0, 't'},
{"copy-from", required_argument, 0, 'f'},
{"verbose", no_argument, 0, 'v'},
{"help", no_argument, 0, 'h'},
{NULL}
};
extern const char *__progname;
static const char *kProgramName = __progname;
static void
copy_indexes(dev_t from, dev_t to, bool verbose)
{
DIR *indexes = fs_open_index_dir(from);
if (verbose)
puts("Copying indexes:");
while (dirent *dirent = fs_read_index_dir(indexes)) {
if (!strcmp(dirent->d_name, "name")
|| !strcmp(dirent->d_name, "size")
|| !strcmp(dirent->d_name, "last_modified"))
continue;
index_info info;
if (fs_stat_index(from, dirent->d_name, &info) != 0) {
fprintf(stderr, "%s: Skipped index \"%s\": %s\n",
kProgramName, dirent->d_name, strerror(errno));
continue;
}
if (fs_create_index(to, dirent->d_name, info.type, 0) != 0) {
if (errno == B_BAD_VALUE || errno == B_FILE_EXISTS) {
// B_BAD_VALUE is what BeOS returns here...
continue;
}
fprintf(stderr, "%s: Could not create index \"%s\": %s\n",
kProgramName, dirent->d_name, strerror(errno));
} else if (verbose)
printf("\t%s\n", dirent->d_name);
}
}
static 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"
" --copy-from\tpath to volume to copy the indexes from.\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 = -1, copyFromDevice = -1;
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 'f':
copyFromDevice = dev_for_path(optarg);
if (copyFromDevice < 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 == -1) {
// 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 (copyFromDevice != -1) {
copy_indexes(copyFromDevice, device, verbose);
return 0;
}
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;
}