/*
 * dpkg-split - splitting and joining of multipart *.deb archives
 * main.c - main program
 *
 * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
 *
 * This 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 2 of the License, or
 * (at your option) any later version.
 *
 * This 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include <config.h>
#include <compat.h>

#include <sys/types.h>
#include <sys/stat.h>

#include <assert.h>
#include <limits.h>
#include <inttypes.h>
#if HAVE_LOCALE_H
#include <locale.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include <dpkg/macros.h>
#include <dpkg/i18n.h>
#include <dpkg/dpkg.h>
#include <dpkg/dpkg-db.h>
#include <dpkg/options.h>

#include "dpkg-split.h"

static void DPKG_ATTR_NORET
printversion(const struct cmdinfo *cip, const char *value)
{
  printf(_("Debian `%s' package split/join tool; version %s.\n"),
         SPLITTER, DPKG_VERSION_ARCH);
  printf(_("Copyright (C) 1994-1996 Ian Jackson.\n"));
  printf(_(
"This is free software; see the GNU General Public License version 2 or\n"
"later for copying conditions. There is NO warranty.\n"));

  m_output(stdout, _("<standard output>"));

  exit(0);
}

static void DPKG_ATTR_NORET
usage(const struct cmdinfo *cip, const char *value)
{
  printf(_(
"Usage: %s [<option> ...] <command>\n"
"\n"), SPLITTER);

  printf(_(
"Commands:\n"
"  -s|--split <file> [<prefix>]     Split an archive.\n"
"  -j|--join <part> <part> ...      Join parts together.\n"
"  -I|--info <part> ...             Display info about a part.\n"
"  -a|--auto -o <complete> <part>   Auto-accumulate parts.\n"
"  -l|--listq                       List unmatched pieces.\n"
"  -d|--discard [<filename> ...]    Discard unmatched pieces.\n"
"\n"));

  printf(_(
"  -h|--help                        Show this help message.\n"
"  --version                        Show the version.\n"
"\n"));

  printf(_(
"Options:\n"
"  --depotdir <directory>           Use <directory> instead of %s/%s.\n"
"  -S|--partsize <size>             In KiB, for -s (default is 450).\n"
"  -o|--output <file>               Filename, for -j (default is\n"
"                                     <package>_<version>_<arch>.deb).\n"
"  -Q|--npquiet                     Be quiet when -a is not a part.\n"
"  --msdos                          Generate 8.3 filenames.\n"
"\n"), ADMINDIR, PARTSDIR);

  printf(_(
"Exit status:\n"
"  0 = ok\n"
"  1 = with --auto, file is not a part\n"
"  2 = trouble\n"));


  m_output(stdout, _("<standard output>"));

  exit(0);
}

static const char printforhelp[] = N_("Type dpkg-split --help for help.");

struct partqueue *queue= NULL;

off_t opt_maxpartsize = SPLITPARTDEFMAX;
const char *opt_depotdir = ADMINDIR "/" PARTSDIR;
const char *opt_outputfile = NULL;
int opt_npquiet = 0;
int opt_msdos = 0;

void rerreof(FILE *f, const char *fn) {
  if (ferror(f)) ohshite(_("error reading %.250s"),fn);
  ohshit(_("unexpected end of file in %.250s"),fn);
}

static void setpartsize(const struct cmdinfo *cip, const char *value) {
  off_t newpartsize;
  char *endp;

  newpartsize = strtoimax(value, &endp, 10);
  if (value == endp || *endp)
    badusage(_("invalid integer for --%s: `%.250s'"), cip->olong, value);
  if (newpartsize <= 0 || newpartsize > (INT_MAX >> 10))
    badusage(_("part size is far too large or is not positive"));

  opt_maxpartsize = newpartsize << 10;
  if (opt_maxpartsize <= HEADERALLOWANCE)
    badusage(_("part size must be at least %d KiB (to allow for header)"),
             (HEADERALLOWANCE >> 10) + 1);
}

static const struct cmdinfo cmdinfos[]= {
  ACTION("split",   's',  0,  do_split),
  ACTION("join",    'j',  0,  do_join),
  ACTION("info",    'I',  0,  do_info),
  ACTION("auto",    'a',  0,  do_auto),
  ACTION("listq",   'l',  0,  do_queue),
  ACTION("discard", 'd',  0,  do_discard),

  { "help",         'h',  0,  NULL, NULL,             usage               },
  { "version",       0,   0,  NULL, NULL,             printversion        },
  { "depotdir",      0,   1,  NULL, &opt_depotdir,    NULL                },
  { "partsize",     'S',  1,  NULL, NULL,             setpartsize         },
  { "output",       'o',  1,  NULL, &opt_outputfile,  NULL                },
  { "npquiet",      'Q',  0,  &opt_npquiet, NULL,     NULL,           1   },
  { "msdos",         0,   0,  &opt_msdos, NULL,       NULL,           1   },
  {  NULL,              0                                              }
};

int main(int argc, const char *const *argv) {
  int ret;

  setlocale(LC_ALL, "");
  bindtextdomain(PACKAGE, LOCALEDIR);
  textdomain(PACKAGE);

  dpkg_set_progname(SPLITTER);
  standard_startup();
  myopt(&argv, cmdinfos, printforhelp);

  if (!cipaction) badusage(_("need an action option"));

  setvbuf(stdout,NULL,_IONBF,0);

  ret = cipaction->action(argv);

  m_output(stderr, _("<standard error>"));

  standard_shutdown();

  return ret;
}
