/*
* 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 "defs.h"
#include "opk.h"
#include "ustar.h"
#include "config.h"
#ifdef HAVE_GETOPT_LONG
#include
#else
#include
#endif
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
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':
/* TODO */
break;
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;
}