int main(int argc, char *argv[]) { setlocale (LC_ALL, ""); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); textdomain (GETTEXT_PACKAGE); gboolean explicit_username = FALSE; gboolean explicit_message = FALSE; int error = 0; int m = 0, i = 1; guint counter = 0; gchar *command = NULL; gchar *command_run = NULL; gchar *username = NULL; gchar *password = NULL; uid_t whoami; struct passwd *pw; char err_msg[256]; gchar *message = NULL; char **cmd_argv = NULL; GError *cmd_error = NULL; GtkWidget *dialog; GtkSizeGroup *sizegroup; GtkWidget *hbox; GtkWidget *image; GtkWidget *align; GtkWidget *label; GtkWidget *user; GtkWidget *pass; gtk_init(&argc, &argv); /* Parse arguments */ while (i < argc) { if (argv[i][0] != '-') break; if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) say_help(argv[0]); if (!strcmp(argv[i], "--version") || !strcmp(argv[i], "-v")) say_about(); if (!strcmp(argv[i], "--user") || !strcmp(argv[i], "-u")) { if ((username = argv[i + 1]) == NULL) Werror(ERR_MISSING_USER_AND_COMMAND, NULL, 1, 1); explicit_username = TRUE; i += 1; } if (!strcmp(argv[i], "--message") || !strcmp(argv[i], "-m")) { if ((message = argv[i + 1]) == NULL) Werror(ERR_MISSING_MESSAGE_AND_COMMAND, NULL, 1, 1); explicit_message = TRUE; i += 1; } i += 1; } if (argv[i] == NULL) Werror(ERR_MISSING_COMMAND, NULL, 1, 1); /* handle arguments and spaces in the subcommand correctly */ if (! g_shell_parse_argv(argv[i], NULL, &cmd_argv, &cmd_error)) /* Something bad has happened */ Werror(ERR_INVALID_COMMAND, cmd_error->message, 1, 1); /* Get the full path command */ command = get_real_name(cmd_argv[0]); if (command == NULL) Werror(ERR_INVALID_COMMAND, cmd_argv[0], 1, 1); /* Sanity check */ whoami = getuid(); if ((pw = getpwuid(whoami)) == NULL) exit(2 + 0 * fprintf(stderr, "Who you think you are? Houdini?\n")); if (!explicit_username) username = g_strdup("root"); if (username && !strcmp(pw->pw_name, username)) { /* username was me so let's just run it and get the hell out */ if (execvp(command, &(cmd_argv[0])) == -1) { Werror(ERR_PERMISSION_DENIED, NULL, 1, 1); exit(1); } /* We should never get here, but just in case */ exit(0); } if (explicit_username && !explicit_message) message = g_strdup_printf(gettext("Please enter the\npassword for %s:"), username); else if (!explicit_message) message = g_strdup(gettext("Please enter the desired\nusername and password:"******"ktsuss"); gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), 5); gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 5); hbox = gtk_hbox_new(FALSE, 6); #if GTK_CHECK_VERSION(2, 10, 0) image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG); #else image = gtk_image_new_from_icon_name("ktsuss", GTK_ICON_SIZE_DIALOG); #endif gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); label = gtk_label_new(message); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); if (!explicit_username) { hbox = gtk_hbox_new(FALSE, 6); label = gtk_label_new(gettext("Username")); align = gtk_alignment_new(0, 0.5, 0, 0); gtk_container_add(GTK_CONTAINER(align), label); gtk_size_group_add_widget(sizegroup, align); gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0); user = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(user), username ? username : "******"); gtk_box_pack_start(GTK_BOX(hbox), user, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); } hbox = gtk_hbox_new(FALSE, 6); label = gtk_label_new(gettext("Password")); align = gtk_alignment_new(0, 0.5, 0, 0); gtk_container_add(GTK_CONTAINER(align), label); gtk_size_group_add_widget(sizegroup, align); gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0); pass = gtk_entry_new_with_max_length(32); gtk_entry_set_visibility(GTK_ENTRY(pass), FALSE); gtk_box_pack_start(GTK_BOX(hbox), pass, FALSE, FALSE, 0); gtk_entry_set_activates_default(GTK_ENTRY(pass), TRUE); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); gtk_widget_grab_focus(pass); gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); /* Show the dialog up to 3 times */ while (counter < 3) { if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { if (!explicit_username) username = strdup(gtk_entry_get_text(GTK_ENTRY(user))); password = strdup(gtk_entry_get_text(GTK_ENTRY(pass))); #ifdef SUDOPATH if ((error = check_password_sudo(username, password)) == ERR_SUCCESS) { #else if ((error = check_password_su(username, password)) == ERR_SUCCESS) { #endif gtk_widget_destroy(dialog); while (gtk_events_pending()) gtk_main_iteration(); dialog = NULL; /* using argv instead of cmd_argv is fine, because 'su' is going * to implement its only parsing nevertheless */ command_run = g_strjoinv(" ", &argv[i]); #ifdef SUDOPATH run_sudo(username, password, command_run); #else run_su(username, password, command_run); #endif g_free(command_run); counter = 3; } if (!explicit_username) { free(username); username = NULL; } memset(password, '\0', strlen(password)); free(password); if (error != ERR_SUCCESS) { snprintf(err_msg, sizeof(err_msg), gettext("Could not run '%s'"), command); Werror(error, err_msg, 0, 0); counter++; } } else break; if (counter < 3) gtk_widget_grab_focus(pass); } /* Clean up process */ if (dialog) gtk_widget_destroy(dialog); if ((explicit_username && !explicit_message) || !explicit_message) free(message); if (!explicit_username && username) g_free(username); g_strfreev(cmd_argv); if (cmd_error) g_error_free(cmd_error); return 0; }
int main(int argc, char *argv[]) { int i = 1; int ret = 0; char *renv = NULL; Database = NULL; /* Basic environment variables */ if ((renv = getenv("KPKG_DB_HOME"))) dbname = strdup(renv); else dbname = strdup(KPKG_DB_HOME_DEFAULT); if ((renv = getenv("ROOT"))) { HOME_ROOT = strdup(renv); MIRRORS_DIRECTORY = malloc(sizeof(char)*PATH_MAX); PACKAGES_DIRECTORY = malloc(sizeof(char)*PATH_MAX); snprintf(MIRRORS_DIRECTORY, PATH_MAX, "%s/%s", HOME_ROOT, MIRRORS_DIRECTORY_DEFAULT); snprintf(PACKAGES_DIRECTORY, PATH_MAX, "%s/%s", HOME_ROOT, PACKAGES_DIRECTORY_DEFAULT); } else { HOME_ROOT = strdup("/"); MIRRORS_DIRECTORY = strdup(MIRRORS_DIRECTORY_DEFAULT); PACKAGES_DIRECTORY = strdup(PACKAGES_DIRECTORY_DEFAULT); } noreadme = 0; if ((renv = getenv("NOREADME"))) if (*renv) noreadme = 1; signal(SIGINT, cleanup); signal(SIGTERM, cleanup); /* Commands parsing */ if (argc == 1) { free(dbname); free(HOME_ROOT); say_help(1); } LoadExceptions(INIT); if (!strcmp(argv[1], "help")) { free(dbname); free(HOME_ROOT); say_help(0); } else if (!strcmp(argv[1], "install")) while (argv[++i] != NULL) ret |= ret != 0 ? ret : InstallPkg(argv[i]); else if (!strcmp(argv[1], "remove")) while (argv[++i] != NULL) ret |= ret != 0 ? ret : RemovePkg(argv[i], 0); else if (!strcmp(argv[1], "search")) while (argv[++i] != NULL) ret |= SearchPkg(argv[i]); else if (!strcmp(argv[1], "provides")) while (argv[++i] != NULL) ret |= SearchFileInPkgDB(argv[i]); else if (!strcmp(argv[1], "download")) while (argv[++i] != NULL) ret |= DownloadPkg(argv[i], NULL); else if (!strcmp(argv[1], "instkdb")) while (argv[++i] != NULL) ret |= InstKpkgDB(argv[i]); else if (!strcmp(argv[1], "update")) { if (argv[2] == NULL) UpdateMirrorDB(NULL); else while (argv[++i] != NULL) ret |= UpdateMirrorDB(argv[i]); } else if (!strcmp(argv[1], "upgrade")) { LoadExceptions(DEFAULT); if (argv[2] == NULL) UpgradePkg(NULL); else while (argv[++i] != NULL) ret |= UpgradePkg(argv[i]); FreeExceptions(); } else if (!strcmp(argv[1], "diff")) { UpgradeSystem(1); } free(dbname); free(HOME_ROOT); free(MIRRORS_DIRECTORY); free(PACKAGES_DIRECTORY); return ret; }
int main ( int argc, char **argv ) { // Backtrace handler signal(SIGSEGV, SIGSEGV_handler); char *expr, *input; // Unset flags (value -1). int showdist_flag = -1; int showpos_flag = -1; int printline_flag = -1; int matchonly_flag = -1; int showline_flag = -1; int count_flag = -1; int invert_flag = -1; int compact_flag = -1; int dist_flag = -1; int verbose_flag = -1; int endline_flag = -1; int prefix_flag = -1; int best_flag = -1; int nondna_flag = -1; int memory_flag = -1; int all_flag = -1; // Unset options (value 'UNSET'). input = NULL; if (argc == 1) { say_version(); say_usage(); return EXIT_SUCCESS; } int c; while (1) { int option_index = 0; static struct option long_options[] = { {"positions", no_argument, 0, 'p'}, {"match-only", no_argument, 0, 'm'}, {"no-printline", no_argument, 0, 'n'}, {"print-dist", no_argument, 0, 'k'}, {"nondna", required_argument, 0, 'x'}, {"lines", no_argument, 0, 'l'}, {"count", no_argument, 0, 'c'}, {"invert", no_argument, 0, 'i'}, {"format-compact",no_argument, 0, 'f'}, {"verbose", no_argument, 0, 'z'}, {"version", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {"end", no_argument, 0, 'e'}, {"prefix", no_argument, 0, 'r'}, {"best", no_argument, 0, 'b'}, {"all", no_argument, 0, 'a'}, {"memory", required_argument, 0, 'y'}, {"distance",required_argument, 0, 'd'}, {0, 0, 0, 0} }; c = getopt_long(argc, argv, "apmnilczfvkherby:d:x:", long_options, &option_index); /* Detect the end of the options. */ if (c == -1) break; switch (c) { case 'd': if (dist_flag < 0) { int dist = atoi(optarg); if (dist < 0) { say_version(); fprintf(stderr, "error: distance must be a positive integer.\n"); say_help(); return EXIT_FAILURE; } dist_flag = atoi(optarg); } else { say_version(); fprintf(stderr, "error: distance option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'y': if (memory_flag < 0) { int memory = atoi(optarg); if (memory < 0) { say_version(); fprintf(stderr, "error: memory limit must be a positive integer.\n"); say_help(); return EXIT_FAILURE; } memory_flag = atoi(optarg); } else { say_version(); fprintf(stderr, "error: memory option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'v': say_version(); return EXIT_SUCCESS; case 'z': if (verbose_flag < 0) { verbose_flag = 1; } else { say_version(); fprintf(stderr, "error: verbose option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'r': if (prefix_flag < 0) { prefix_flag = 1; } else { say_version(); fprintf(stderr, "error: 'prefix' option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'a': if (all_flag < 0) { all_flag = 1; } else { say_version(); fprintf(stderr, "error: 'all' option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'x': if (nondna_flag < 0) { int nondna = atoi(optarg); if (nondna < 0 || nondna > 2) { say_version(); fprintf(stderr, "error: nondna value must be either 0, 1 or 2.\n"); say_help(); return EXIT_FAILURE; } nondna_flag = nondna; } else { say_version(); fprintf(stderr, "error: 'nondna' option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'b': if (best_flag < 0) { best_flag = 1; } else { say_version(); fprintf(stderr, "error: 'best' option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'e': if (endline_flag < 0) { endline_flag = 1; } else { say_version(); fprintf(stderr, "error: line-end option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'p': if (showpos_flag < 0) { showpos_flag = 1; } else { say_version(); fprintf(stderr, "error: show-position option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'm': if (matchonly_flag < 0) { matchonly_flag = 1; } else { say_version(); fprintf(stderr, "error: match-only option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'n': if (printline_flag < 0) { printline_flag = 0; } else { say_version(); fprintf(stderr, "error: no-printline option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'k': if (showdist_flag < 0) { showdist_flag = 1; } else { say_version(); fprintf(stderr, "error: show-distance option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'l': if (showline_flag < 0) { showline_flag = 1; } else { say_version(); fprintf(stderr, "error: show-line option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'c': if (count_flag < 0) { count_flag = 1; } else { say_version(); fprintf(stderr, "error: count option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'i': if (invert_flag < 0) { invert_flag = 1; } else { say_version(); fprintf(stderr, "error: invert option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'f': if (compact_flag < 0) { compact_flag = 1; } else { say_version(); fprintf(stderr, "error: format-compact option set more than once.\n"); say_help(); return EXIT_FAILURE; } break; case 'h': say_version(); say_usage(); exit(0); default: break; } } if (optind == argc) { say_version(); fprintf(stderr, "error: not enough arguments.\n"); say_help(); return EXIT_FAILURE; } expr = argv[optind++]; if (optind < argc) { if ((optind == argc - 1) && (input == NULL)) { input = argv[optind]; } else { say_version(); fprintf(stderr, "error: too many options.\n"); say_help(); return EXIT_FAILURE; } } if (count_flag == -1) count_flag = 0; if (showdist_flag == -1) showdist_flag = 0; if (showpos_flag == -1) showpos_flag = 0; if (matchonly_flag == -1) matchonly_flag = 0; if (showline_flag == -1) showline_flag = 0; if (invert_flag == -1) invert_flag = 0; if (compact_flag == -1) compact_flag = 0; if (dist_flag == -1) dist_flag = 0; if (verbose_flag == -1) verbose_flag = 0; if (endline_flag == -1) endline_flag = 0; if (prefix_flag == -1) prefix_flag = 0; if (best_flag == -1) best_flag = 0; if (nondna_flag == -1) nondna_flag = 0; if (memory_flag == -1) memory_flag = 0; if (all_flag == -1) all_flag = 0; if (printline_flag == -1) printline_flag = (!matchonly_flag && !endline_flag && !prefix_flag); if (!showdist_flag && !showpos_flag && !printline_flag && !matchonly_flag && !showline_flag && !count_flag && !compact_flag && !prefix_flag && !endline_flag) { say_version(); fprintf(stderr, "Invalid options: No output will be generated.\n"); say_help(); return EXIT_FAILURE; } int maskcnt = !count_flag; int maskinv = !invert_flag * maskcnt; struct seeqarg_t args; args.showdist = showdist_flag * maskinv; args.showpos = showpos_flag * maskinv; args.showline = showline_flag * maskcnt; args.printline = printline_flag * maskinv; args.matchonly = matchonly_flag * maskinv; args.count = count_flag; args.compact = compact_flag * maskinv; args.dist = dist_flag; args.verbose = verbose_flag; args.endline = endline_flag * maskinv; args.prefix = prefix_flag * maskinv; args.invert = invert_flag * maskcnt; args.best = best_flag * maskinv; args.non_dna = nondna_flag; args.all = all_flag; args.memory = (size_t)memory_flag * 1024*1024; return seeq(expr, input, args); }