int cmd_init() { /* initial cmd vector */ cmd_vec = cmd_vector_init(1); /* install cmd */ cmd_install(); /* initial vty */ vty = cmd_vty_init(); if (vty == NULL) { return OS_ERR; } return OS_OK; }
int main(const int ac, const char* av[]) { poptContext optCon=0; gint rc; gint status = 0; const gchar* arg; struct error* err; #ifdef __DEBUG g_mem_set_vtable(glib_mem_profiler_table); #endif err = e_new(); /* check if we have enough privileges */ #ifndef __WIN32__ unsetenv("LD_LIBRARY_PATH"); #else putenv("LD_LIBRARY_PATH"); putenv("LD_LIBRARY_PATH="); #endif /* load blacklists from SPKG_CONFDIR */ gchar** bl_symopts = load_blacklist(SPKG_CONFDIR "/symopts_blacklist"); if (bl_symopts) cmd_opts.bl_symopts = bl_symopts; /* preset ROOT */ cmd_opts.root = getenv("ROOT"); /* initialize popt context */ optCon = poptGetContext("spkg", ac, av, opts, 0); poptSetOtherOptionHelp(optCon, "<command> [options] [packages...]"); /* parse options */ while ((rc = poptGetNextOpt(optCon)) != -1) { if (rc == 1) verbose++; else if (rc == 2) quiet++; if (rc < -1) { fprintf(stderr, "ERROR: Invalid argument: %s (%s)\n", poptStrerror(rc), poptBadOption(optCon, POPT_BADOPTION_NOALIAS)); goto err_1; } } /* these are help handlers */ if (help) { printf( PACKAGE_STRING "\n" "\n" "Written by Ondrej Jirman, 2005-2006.\n" "\n" "This is free software. Not like a beer or like in a \"freedom\",\n" "but like in \"I don't care what you are going to do with it.\"\n" "\n" ); poptPrintHelp(optCon, stdout, 0); printf( "\n" "Examples:\n" " spkg -i <packages> [--install]\n" " spkg -u <packages> [--upgrade]\n" " spkg -vd <packages> [--verbose --remove]\n" " spkg -l kde* [--list]\n" " spkg -vnu <packages> [--upgrade --verbose --dry-run]\n" "\n" "Official website: http://spkg.megous.com\n" "Bug reports can be sent to <*****@*****.**>.\n" ); goto out; } if (usage) { printf("Usage: spkg [-i|-u|-d|-l] [--root=ROOT] [-n] [-s] [-q] [-v] [packages...]\n"); goto out; } if (version) { printf("%s\n", PACKAGE_STRING); goto out; } /* check verbosity options */ if (verbose && quiet) { fprintf(stderr, "ERROR: Verbose or quiet?\n"); goto err_1; } cmd_opts.verbosity += verbose; cmd_opts.verbosity -= quiet; /* check command options */ switch (command) { case CMD_INSTALL: if (!cmd_opts.dryrun && !is_root()) goto err_noroot; if (poptPeekArg(optCon) == 0) goto err_nopackages; break; case CMD_UPGRADE: if (!cmd_opts.dryrun && !is_root()) goto err_noroot; if (poptPeekArg(optCon) == 0) goto err_nopackages; break; case CMD_REMOVE: if (!cmd_opts.dryrun && !is_root()) goto err_noroot; if (poptPeekArg(optCon) == 0) goto err_nopackages; break; case CMD_LIST: break; case 0: if (poptPeekArg(optCon) == 0) { printf("Usage: spkg [-i|-u|-d|-l] [--root=ROOT] [-n] [-s] [-q] [-v] [packages...]\n"); goto out; } if (!cmd_opts.dryrun && !is_root()) goto err_noroot; command = CMD_UPGRADE; install_new = TRUE; break; default: fprintf(stderr, "ERROR: Schizofrenic command usage.\n"); goto err_1; } /* init signal trap */ if (sig_trap(err)) goto err_2; /* open db */ gboolean readonly = cmd_opts.dryrun || !is_root(); if (db_open(cmd_opts.root, readonly, err)) goto err_2; switch (command) { case CMD_INSTALL: { while ((arg = poptGetArg(optCon)) != 0 && !sig_break) { if (cmd_install(arg, &cmd_opts, err)) { if (e_errno(err) & CMD_EXIST) { gchar* pkgname = parse_pkgname(arg, 5); _inform("Skipping package %s (package with same base name is already installed)...", pkgname ? pkgname : arg); g_free(pkgname); e_clean(err); } else { e_print(err); e_clean(err); status = 2; } } } } break; case CMD_UPGRADE: { while ((arg = poptGetArg(optCon)) != 0 && !sig_break) { if (cmd_upgrade(arg, &cmd_opts, err)) { if (install_new && (e_errno(err) & CMD_NOTEX)) { e_clean(err); if (cmd_install(arg, &cmd_opts, err)) { e_print(err); e_clean(err); status = 2; } } else if (e_errno(err) & CMD_NOTEX) { gchar* pkgname = parse_pkgname(arg, 5); _inform("Skipping package %s (package with same base name is NOT installed)...", pkgname ? pkgname : arg); g_free(pkgname); e_clean(err); } else if (e_errno(err) & CMD_EXIST) { gchar* pkgname = parse_pkgname(arg, 5); _inform("Skipping package %s (already uptodate)...", pkgname ? pkgname : arg); g_free(pkgname); e_clean(err); } else { e_print(err); e_clean(err); status = 2; } } } } break; case CMD_REMOVE: { while ((arg = poptGetArg(optCon)) != 0 && !sig_break) { if (cmd_remove(arg, &cmd_opts, err)) { e_print(err); e_clean(err); status = 2; } } } break; case CMD_LIST: { GSList* arglist = NULL; while ((arg = poptGetArg(optCon)) != 0) arglist = g_slist_append(arglist, g_strdup(arg)); if (cmd_list(arglist, &cmd_opts, err)) { e_print(err); e_clean(err); status = 2; } g_slist_foreach(arglist, (GFunc)g_free, 0); g_slist_free(arglist); } break; } db_close(); out: poptFreeContext(optCon); e_free(err); #ifdef __DEBUG g_mem_profile(); #endif /* 0 = all ok * 1 = command line error * 2 = package manager error */ return status; err_1: status = 1; goto out; err_2: status = 2; e_print(err); goto out; err_nopackages: fprintf(stderr, "ERROR: No packages specified.\n"); goto err_1; err_noroot: fprintf(stderr, "ERROR: You need root privileges to run this command. Try using --dry-run.\n"); goto err_1; }