/* * Copyright (C) 2023 Patrick McDermott * * This file is part of opkg-opk. * * opkg-opk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * opkg-opk is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with opkg-opk. If not, see . */ #include #include #include "defs.h" #include "opk.h" #include "ustar.h" #include "config.h" #ifdef HAVE_GETOPT_LONG #include #else #include #endif extern const char *PACKAGE_VERSION_GIT; const char *_optstring = "I:fchV"; #ifdef HAVE_GETOPT_LONG struct option _longopts[] = { { .name = "info", .has_arg = 1, .flag = NULL, .val = 'I', }, { .name = "control", .has_arg = 0, .flag = NULL, .val = 'f', }, { .name = "contents", .has_arg = 0, .flag = NULL, .val = 'c', }, { .name = "help", .has_arg = 0, .flag = NULL, .val = 'h', }, { .name = "version", .has_arg = 0, .flag = NULL, .val = 'V', }, }; #endif static void _version(void) { printf("%s %s%s\n", PACKAGE_NAME, PACKAGE_VERSION, PACKAGE_VERSION_GIT); printf("Copyright (C) %s %s\n", "2023", "Patrick McDermott"); puts("License GPLv3+: GNU GPL version 3 or later " ".\n" "This is free software: you are free to change and " "redistribute it.\n" "There is NO WARRANTY, to the extent permitted by " "law.\n"); printf("Please report bugs to <%s>.\n", PACKAGE_BUGREPORT); } int main(int argc, char *argv[]) { struct opkg_opk_ustar_seek_name *control_files; int list_members; int opt; struct opkg_opk_opk *opk; control_files = NULL; list_members = 0; #ifdef HAVE_GETOPT_LONG while ((opt = getopt_long(argc, argv, _optstring, _longopts, NULL)) != -1) { #else while ((opt = getopt(argc, argv, _optstring)) != -1) { #endif switch(opt) { case 'I': if (opkg_opk_ustar_add_seek_name(&control_files, optarg) != OPKG_OPK_OK) { goto error0; } break; case 'f': if (opkg_opk_ustar_add_seek_name(&control_files, "control") != OPKG_OPK_OK) { goto error0; } break; case 'c': list_members = 1; break; case 'h': /* TODO */ break; case 'V': _version(); return EXIT_SUCCESS; default: /* TODO */ break; } } argc -= optind; argv += optind; /* Initialize outer archive. */ opk = opkg_opk_opk_init(argv[0]); if (opk == NULL) { goto error0; } /* Read control file. */ if (control_files != NULL) { if (opkg_opk_opk_read_control(opk, control_files) != OPKG_OPK_OK) { goto error1; } } /* List data files. */ if (list_members == 1) { if (opkg_opk_opk_list_members(opk) != OPKG_OPK_OK) { goto error1; } } opkg_opk_opk_free(opk); if (control_files != NULL) { opkg_opk_ustar_free_seek_names(control_files); } return EXIT_SUCCESS; error1: opkg_opk_opk_free(opk); error0: if (control_files != NULL) { opkg_opk_ustar_free_seek_names(control_files); } return EXIT_FAILURE; }