/******************** * extension_run ********************/ static void extension_run(int id, extension_t *extension, char *command) { int release; if (!grabbed) { command_grab(id, ""); release = TRUE; } else release = FALSE; extension->handler(command); if (release) command_release(id, ""); }
int main(int argc, char *argv[]) { char buf[1024]; int i; #ifdef TIOCGWINSZ struct winsize ws; if (ioctl(fileno(stdout), TIOCGWINSZ, &ws) == 0 && ws.ws_col > 0) TERMWIDTH = ws.ws_col; #endif /* Start handling the arguments. * monetdb [monetdb_options] command [options] [database [...]] * this means we first scout for monetdb_options which stops as soon * as we find a non-option argument, which then must be command */ /* first handle the simple no argument case */ if (argc <= 1) { command_help(0, NULL); return(1); } /* handle monetdb_options */ for (i = 1; argc > i && argv[i][0] == '-'; i++) { switch (argv[i][1]) { case 'v': command_version(); return(0); case 'q': monetdb_quiet = 1; break; case 'h': if (strlen(&argv[i][2]) > 0) { mero_host = &argv[i][2]; } else { if (i + 1 < argc) { mero_host = argv[++i]; } else { fprintf(stderr, "monetdb: -h needs an argument\n"); return(1); } } break; case 'p': if (strlen(&argv[i][2]) > 0) { mero_port = atoi(&argv[i][2]); } else { if (i + 1 < argc) { mero_port = atoi(argv[++i]); } else { fprintf(stderr, "monetdb: -p needs an argument\n"); return(1); } } break; case 'P': /* take care we remove the password from argv so it * doesn't show up in e.g. ps -ef output */ if (strlen(&argv[i][2]) > 0) { mero_pass = strdup(&argv[i][2]); memset(&argv[i][2], 0, strlen(mero_pass)); } else { if (i + 1 < argc) { mero_pass = strdup(argv[++i]); memset(argv[i], 0, strlen(mero_pass)); } else { fprintf(stderr, "monetdb: -P needs an argument\n"); return(1); } } break; case '-': /* skip -- */ if (argv[i][2] == '\0') break; if (strcmp(&argv[i][2], "version") == 0) { command_version(); return(0); } else if (strcmp(&argv[i][2], "help") == 0) { command_help(0, NULL); return(0); } default: fprintf(stderr, "monetdb: unknown option: %s\n", argv[i]); command_help(0, NULL); return(1); break; } } /* check consistency of -h -p and -P args */ if (mero_pass != NULL && (mero_host == NULL || *mero_host == '/')) { fprintf(stderr, "monetdb: -P requires -h to be used with a TCP hostname\n"); exit(1); } else if (mero_host != NULL && *mero_host != '/' && mero_pass == NULL) { fprintf(stderr, "monetdb: -h requires -P to be used\n"); exit(1); } /* see if we still have arguments at this stage */ if (i >= argc) { command_help(0, NULL); return(1); } /* commands that do not need merovingian to be running */ if (strcmp(argv[i], "help") == 0) { command_help(argc - i, &argv[i]); return(0); } else if (strcmp(argv[i], "version") == 0) { command_version(); return(0); } /* use UNIX socket if no hostname given */ if (mero_host == NULL || *mero_host == '/') { /* a socket looks like /tmp/.s.merovingian.<tcpport>, try * finding such port. If mero_host is set, it is the location * where we should search, which defaults to '/tmp' */ if (mero_host == NULL) mero_host = "/tmp"; /* first try the port given (or else its default) */ snprintf(buf, sizeof(buf), "%s/.s.merovingian.%d", mero_host, mero_port == -1 ? 50000 : mero_port); if (control_ping(buf, -1, NULL) == 0) { mero_host = buf; } else { /* if port wasn't given, we can try and search * for available sockets */ if (mero_port == -1) { DIR *d; struct dirent *e; struct stat s; d = opendir(mero_host); if (d == NULL) { fprintf(stderr, "monetdb: cannot find a control socket, use -h and/or -p\n"); exit(1); } while ((e = readdir(d)) != NULL) { if (strncmp(e->d_name, ".s.merovingian.", 15) != 0) continue; snprintf(buf, sizeof(buf), "%s/%s", mero_host, e->d_name); if (stat(buf, &s) == -1) continue; if (S_ISSOCK(s.st_mode)) { if (control_ping(buf, -1, NULL) == 0) { mero_host = buf; break; } } } closedir(d); } } if (mero_host != buf) { fprintf(stderr, "monetdb: cannot find a control socket, use -h and/or -p\n"); exit(1); } /* don't confuse control_send lateron */ mero_port = -1; } /* for TCP connections */ if (mero_host != NULL && *mero_host != '/' && mero_port == -1) mero_port = 50000; /* handle regular commands */ if (strcmp(argv[i], "create") == 0) { command_create(argc - i, &argv[i]); } else if (strcmp(argv[i], "destroy") == 0) { command_destroy(argc - i, &argv[i]); } else if (strcmp(argv[i], "lock") == 0) { command_lock(argc - i, &argv[i]); } else if (strcmp(argv[i], "release") == 0) { command_release(argc - i, &argv[i]); } else if (strcmp(argv[i], "status") == 0) { command_status(argc - i, &argv[i]); } else if (strcmp(argv[i], "start") == 0) { command_startstop(argc - i, &argv[i], START); } else if (strcmp(argv[i], "stop") == 0) { command_startstop(argc - i, &argv[i], STOP); } else if (strcmp(argv[i], "kill") == 0) { command_startstop(argc - i, &argv[i], KILL); } else if (strcmp(argv[i], "set") == 0) { command_set(argc - i, &argv[i], SET); } else if (strcmp(argv[i], "get") == 0) { command_get(argc - i, &argv[i]); } else if (strcmp(argv[i], "inherit") == 0) { command_set(argc - i, &argv[i], INHERIT); } else if (strcmp(argv[i], "discover") == 0) { command_discover(argc - i, &argv[i]); } else { fprintf(stderr, "monetdb: unknown command: %s\n", argv[i]); command_help(0, NULL); } if (mero_pass != NULL) free(mero_pass); return(0); }