From: <dg...@su...> - 2009-01-12 22:49:34
|
Author: ianmartin Date: Mon Jan 12 23:22:19 2009 New Revision: 5127 URL: http://www.opensync.org/changeset/5127 Log: Use getopt_long for option parsing. Ticket #1015 Modified: osynctool/trunk/tools/osynctool.c Modified: osynctool/trunk/tools/osynctool.c ============================================================================== --- osynctool/trunk/tools/osynctool.c Mon Jan 12 21:50:26 2009 (r5126) +++ osynctool/trunk/tools/osynctool.c Mon Jan 12 23:22:19 2009 (r5127) @@ -36,6 +36,7 @@ #include <sys/types.h> #include <glib.h> #include <errno.h> +#include <getopt.h> #include "config.h" @@ -44,9 +45,16 @@ OSyncConflictResolution conflict = OSYNC_CONFLICT_RESOLUTION_UNKNOWN; int winner = 0; +static void short_usage(char *name, int ecode) +{ + fprintf (stderr, "Usage: %s ACTION [OPTIONS]..\n", name); + fprintf (stderr, "Try `%s --help' for more information\n", name); + exit(ecode); +} + static void usage (char *name, int ecode) { - fprintf (stderr, "Usage: %s\n", name); + fprintf (stderr, "Usage: %s ACTION [OPTIONS]..\n", name); fprintf (stderr, "Information about installation:\n"); fprintf (stderr, "--listplugins Lists all plugins\n"); fprintf (stderr, "--listformats Lists all formats\n"); @@ -104,21 +112,23 @@ fprintf (stderr, "Synchronization:\n"); fprintf (stderr, "--sync <groupname>\n"); fprintf (stderr, " Sync all members in a group\n"); - fprintf (stderr, "[--wait]\n"); - fprintf (stderr, " Wait for a client to initialize the sync instead of starting immediately\n"); - fprintf (stderr, "[--multi]\n"); - fprintf (stderr, " Repeat to wait for sync alerts\n"); - fprintf (stderr, "[--slow-sync <objtype>]\n"); - fprintf (stderr, " Perform a slow-sync of all members in the group\n"); - fprintf (stderr, "[--manual]\n"); - fprintf (stderr, " Make manual engine iterations. Only for debugging.\n"); - fprintf (stderr, "[--configdir]\n"); - fprintf (stderr, " Set a different configuration directory than ~/.opensync\n"); - fprintf (stderr, "[--conflict 1-9/d/i/n] \n"); - fprintf (stderr, " Resolve all conflicts as side [1-9] wins, [d]uplicate, [i]gnore, or\n"); - fprintf (stderr, " keep [n]ewer\n"); - fprintf (stderr, "[--always-accept-forecast]\n"); - fprintf (stderr, " Always accept the Synchronization Forecast\n"); + fprintf (stderr, "\n"); + fprintf (stderr, " Synchronization options:\n"); + fprintf (stderr, " [--wait]\n"); + fprintf (stderr, " Wait for a client to initialize the sync instead of starting immediately\n"); + fprintf (stderr, " [--multi]\n"); + fprintf (stderr, " Repeat to wait for sync alerts\n"); + fprintf (stderr, " [--slow-sync <objtype>]\n"); + fprintf (stderr, " Perform a slow-sync of all members in the group\n"); + fprintf (stderr, " [--manual]\n"); + fprintf (stderr, " Make manual engine iterations. Only for debugging.\n"); + fprintf (stderr, " [--configdir]\n"); + fprintf (stderr, " Set a different configuration directory than ~/.opensync\n"); + fprintf (stderr, " [--conflict 1-9/d/i/n] \n"); + fprintf (stderr, " Resolve all conflicts as side [1-9] wins, [d]uplicate, [i]gnore, or\n"); + fprintf (stderr, " keep [n]ewer\n"); + fprintf (stderr, " [--always-accept-forecast]\n"); + fprintf (stderr, " Always accept the Synchronization Forecast\n"); exit (ecode); } @@ -1375,273 +1385,164 @@ osync_trace(TRACE_ENTRY, "%s(%i, %p)", __func__, argc, argv); - if (argc == 1) - usage (argv[0], 1); - - for (i = 1; i < argc; i++) { - char *arg = argv[i]; - if (!strcmp (arg, "--listplugins")) { //Install options - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_INSTALL_LISTPLUGINS; - } else if (!strcmp (arg, "--listformats")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_INSTALL_LISTFORMATS; - } else if (!strcmp (arg, "--version")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_INSTALL_GETVERSION; - } else if (!strcmp (arg, "--listgroups")) { //Group info - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_SHOW_GROUPS; - } else if (!strcmp (arg, "--showgroup")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_SHOW_GROUP; - groupname = argv[i + 1]; - i++; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--showobjtypes")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_SHOW_OBJTYPES; - groupname = argv[i + 1]; - i++; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--showfilter")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_SHOW_FILTER; - groupname = argv[i + 1]; - i++; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--showcapabilities")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_SHOW_CAPABILITIES; - groupname = argv[i + 1]; - i++; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--addgroup")) { //configure options - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_ADDGROUP; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--delgroup")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_DELGROUP; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--addmember")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_ADDMEMBER; - groupname = argv[i + 1]; - pluginname = argv[i + 2]; - i += 2; - if (!groupname || !pluginname) - usage (argv[0], 1); - - if (argc > i) { - membername = argv[i + 1]; - i += 1; - } - } else if (!strcmp (arg, "--configure")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE; - groupname = argv[i + 1]; - membername = argv[i + 2]; - i += 2; - if (!groupname || !membername) - usage (argv[0], 1); - } else if (!strcmp (arg, "--delmember")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_DELMEMBER; - groupname = argv[i + 1]; - membername = argv[i + 2]; - i += 2; - if (!groupname || !membername) - usage (argv[0], 1); - } else if (!strcmp (arg, "--enable-objtype")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_ENABLE_OBJTYPE; - groupname = argv[i + 1]; - objtype = argv[i + 2]; - i += 2; - if (!groupname || !objtype) - usage (argv[0], 1); - } else if (!strcmp (arg, "--disable-objtype")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_DISABLE_OBJTYPE; - groupname = argv[i + 1]; - objtype = argv[i + 2]; - i += 2; - if (!groupname || !objtype) - usage (argv[0], 1); - } else if (!strcmp (arg, "--enable-merger")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_ENABLE_MERGER; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--disable-merger")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_DISABLE_MERGER; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--enable-converter")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_ENABLE_CONVERTER; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--disable-converter")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_DISABLE_CONVERTER; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--configure-filter")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_FILTER; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--configure-capabilities")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_CAPABILITIES; - groupname = argv[i + 1]; - membername = argv[i + 2]; - i += 2; - if (!groupname || !membername) - usage (argv[0], 1); - } else if (!strcmp (arg, "--disable-readonly")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_MEMBER_ENABLE_WRITE; - groupname = argv[i + 1]; - membername = argv[i + 2]; - i += 2; - if (!groupname || !membername) - usage (argv[0], 1); - - if (argc > i) { - objtype = argv[i + 1]; - i += 1; - } - } else if (!strcmp (arg, "--enable-readonly")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_MEMBER_DISABLE_WRITE; - groupname = argv[i + 1]; - membername = argv[i + 2]; - i += 2; - if (!groupname || !membername) - usage (argv[0], 1); - - if (argc > i) { - objtype = argv[i + 1]; - i += 1; + int c; + int option_index = 0; + int action_count = 0; + + struct option long_options[] = { + {"listplugins", no_argument, (int *)&action, OSYNCTOOL_INSTALL_LISTPLUGINS}, + {"listformats", no_argument, (int *)&action, OSYNCTOOL_INSTALL_LISTFORMATS}, + {"version", no_argument, (int *)&action, OSYNCTOOL_INSTALL_GETVERSION}, + {"listgroups", no_argument, (int *)&action, OSYNCTOOL_SHOW_GROUPS}, + {"showgroup", no_argument, (int *)&action, OSYNCTOOL_SHOW_GROUP}, + {"showobjtypes", no_argument, (int *)&action, OSYNCTOOL_SHOW_OBJTYPES}, + {"showfilter", no_argument, (int *)&action, OSYNCTOOL_SHOW_FILTER}, + {"showcapabilities", no_argument, (int *)&action, OSYNCTOOL_SHOW_CAPABILITIES}, + {"addgroup", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_ADDGROUP}, + {"delgroup", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_DELGROUP}, + {"enable-merger", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_ENABLE_MERGER}, + {"disable-merger", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_DISABLE_MERGER}, + {"enable-converter", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_ENABLE_CONVERTER}, + {"disable-converter", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_DISABLE_CONVERTER}, + {"configure-filter", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_FILTER}, + {"configure-capabilities", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_CAPABILITIES}, + {"addmember", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_ADDMEMBER}, + {"configure", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE}, + {"delmember", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_DELMEMBER}, + {"enable-objtype", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_ENABLE_OBJTYPE}, + {"disable-objtype", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_DISABLE_OBJTYPE}, + {"disable-readonly", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_MEMBER_ENABLE_WRITE}, + {"enable-readonly", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_MEMBER_ENABLE_WRITE}, + {"discover", no_argument, (int *)&action, OSYNCTOOL_CONFIGURE_DISCOVER}, + {"sync", no_argument, (int *)&action, OSYNCTOOL_SYNC}, + {"slow-sync", required_argument, 0, 's'}, + {"wait", no_argument, &wait, TRUE}, + {"always-accept-forecast", no_argument, &always_accept_forecast, TRUE}, + {"multi", no_argument, &multi, TRUE}, + {"conflict", required_argument, 0, 'c'}, + {"configdir", required_argument, 0, 'd'}, + {"manual", no_argument, &manual, TRUE}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0} + }; + + while (1) { + c = getopt_long(argc, argv, "", long_options, &option_index); + if (c == -1) + break; + switch(c) { + + case 0: /* flag has been set */ + if (long_options[option_index].flag == (int *)&action) { + if (action_count > 0) { + fprintf(stderr, "Error: Only one action may be given at a time\n"); + short_usage(argv[0], 1); + } + ++action_count; } - } else if (!strcmp (arg, "--discover")) { - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_CONFIGURE_DISCOVER; - groupname = argv[i + 1]; - membername = argv[i + 2]; - i += 2; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--sync")) { //sync options - if (action != NONE) - usage (argv[0], 1); - action = OSYNCTOOL_SYNC; - groupname = argv[i + 1]; - i += 1; - if (!groupname) - usage (argv[0], 1); - } else if (!strcmp (arg, "--slow-sync")) { - objtype = argv[i + 1]; - slow_objects = g_list_append(slow_objects, objtype); - i += 1; - if (action != OSYNCTOOL_SYNC || !objtype) - usage (argv[0], 1); - } else if (!strcmp (arg, "--wait")) { - wait = TRUE; - if (action != OSYNCTOOL_SYNC) - usage (argv[0], 1); - } else if (!strcmp (arg, "--always-accept-forecast")) { - always_accept_forecast = TRUE; - if (action != OSYNCTOOL_SYNC) - usage (argv[0], 1); - } else if (!strcmp (arg, "--multi")) { - multi = TRUE; - if (action != OSYNCTOOL_SYNC) - usage (argv[0], 1); - } else if (!strcmp (arg, "--conflict")) { - const char *conflictstr = argv[i + 1]; - i++; - if (!conflictstr || action != OSYNCTOOL_SYNC) - usage (argv[0], 1); - - if (conflictstr[0] == 'd' || conflictstr[0] == 'D') + break; + case 's': + slow_objects = g_list_append(slow_objects, optarg); + break; + case 'c': + if (optarg[0] == 'd' || optarg[0] == 'D') conflict = OSYNC_CONFLICT_RESOLUTION_DUPLICATE; - else if (conflictstr[0] == 'i' || conflictstr[0] == 'I') + else if (optarg[0] == 'i' || optarg[0] == 'I') conflict = OSYNC_CONFLICT_RESOLUTION_IGNORE; - else if (conflictstr[0] == 'n' || conflictstr[0] == 'N') + else if (optarg[0] == 'n' || optarg[0] == 'N') conflict = OSYNC_CONFLICT_RESOLUTION_NEWER; - else if (strchr("123456789", conflictstr[0]) != NULL) { - winner = atoi(conflictstr) - 1; + else if (strchr("123456789", optarg[0]) != NULL) { + winner = atoi(optarg) - 1; if (winner < 0) usage (argv[0], 1); conflict = OSYNC_CONFLICT_RESOLUTION_SELECT; } else usage (argv[0], 1); - } else if (!strcmp (arg, "--configdir")) { - configdir = argv[i + 1]; - i++; - if (!configdir) - usage (argv[0], 1); - } else if (!strcmp (arg, "--manual")) { - manual = TRUE; - if (action != OSYNCTOOL_SYNC) + break; + case 'd': + configdir = optarg; + break; + case 'h': + usage(argv[0], 0); + break; + case '?': + default: + short_usage(argv[0], 1); + } + } + + switch (action) { + case NONE: + short_usage(argv[0], 1); + break; + case OSYNCTOOL_SHOW_GROUP: + case OSYNCTOOL_SHOW_OBJTYPES: + case OSYNCTOOL_SHOW_FILTER: + case OSYNCTOOL_SHOW_CAPABILITIES: + case OSYNCTOOL_CONFIGURE_ADDGROUP: + case OSYNCTOOL_CONFIGURE_DELGROUP: + case OSYNCTOOL_CONFIGURE_ENABLE_MERGER: + case OSYNCTOOL_CONFIGURE_DISABLE_MERGER: + case OSYNCTOOL_CONFIGURE_ENABLE_CONVERTER: + case OSYNCTOOL_CONFIGURE_DISABLE_CONVERTER: + case OSYNCTOOL_CONFIGURE_FILTER: + case OSYNCTOOL_SYNC: + if (argc - optind != 1) + usage(argv[0], 1); + groupname = argv[optind]; + break; + case OSYNCTOOL_CONFIGURE: + case OSYNCTOOL_CONFIGURE_DELMEMBER: + case OSYNCTOOL_CONFIGURE_CAPABILITIES: + if (argc - optind != 2) + usage(argv[0], 1); + groupname = argv[optind]; + membername = argv[optind + 1]; + break; + case OSYNCTOOL_CONFIGURE_ENABLE_OBJTYPE: + case OSYNCTOOL_CONFIGURE_DISABLE_OBJTYPE: + if (argc - optind != 2) usage (argv[0], 1); - } else if (!strcmp (arg, "--help")) { - usage (argv[0], 0); - } else if (!strcmp (arg, "--")) { + groupname = argv[optind]; + objtype = argv[optind + 1]; break; - } else if (arg[0] == '-') { - usage (argv[0], 1); - } else { - usage (argv[0], 1); + case OSYNCTOOL_CONFIGURE_ADDMEMBER: + if (argc - optind < 2 || argc - optind > 3) + usage(argv[0], 1); + groupname = argv[optind]; + pluginname = argv[optind + 1]; + if (argc - optind == 3) + membername = argv[optind + 2]; + break; + case OSYNCTOOL_CONFIGURE_MEMBER_ENABLE_WRITE: + case OSYNCTOOL_CONFIGURE_MEMBER_DISABLE_WRITE: + if (argc - optind < 2 || argc - optind > 3) + usage(argv[0], 1); + groupname = argv[optind]; + membername = argv[optind + 1]; + if (argc - optind == 3) + objtype = argv[optind + 2]; + break; + case OSYNCTOOL_CONFIGURE_DISCOVER: + if (argc - optind < 1 || argc - optind > 2) + usage(argv[0], 1); + groupname = argv[optind]; + if (argc - optind == 2) + membername = argv[optind + 1]; + break; + default: + if (argc != optind) + usage(argv[0], 1); + } + + if (action != OSYNCTOOL_SYNC) { + if (slow_objects != NULL || + wait == TRUE || + multi == TRUE || + conflict != OSYNC_CONFLICT_RESOLUTION_UNKNOWN || + manual == TRUE || + always_accept_forecast == TRUE) { + usage(argv[0], 1); } } @@ -1811,6 +1712,9 @@ case NONE: osync_error_set(&error, OSYNC_ERROR_GENERIC, "No action given"); goto error_free_plugin_env; + default: + osync_error_set(&error, OSYNC_ERROR_GENERIC, "Internal error, unhandled action selected"); + goto error_free_plugin_env; } g_list_free(slow_objects); |