summaryrefslogtreecommitdiff
path: root/dpkg-deb/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'dpkg-deb/main.c')
-rw-r--r--dpkg-deb/main.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/dpkg-deb/main.c b/dpkg-deb/main.c
new file mode 100644
index 000000000..0804ac721
--- /dev/null
+++ b/dpkg-deb/main.c
@@ -0,0 +1,151 @@
+/*
+ * dpkg-deb - construction and deconstruction of *.deb archives
+ * main.c - main program
+ *
+ * Copyright (C) 1994,1995 Ian Jackson <iwj10@cus.cam.ac.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,
+ * 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 dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <limits.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "config.h"
+#include "dpkg.h"
+#include "version.h"
+#include "myopt.h"
+#include "dpkg-deb.h"
+
+static void printversion(void) {
+ if (!fputs("Debian GNU/Linux `" BACKEND "' package archive backend "
+ "version " DPKG_VERSION_ARCH ".\n"
+ "Copyright (C) 1994,1995 Ian Jackson. This is free software; see the\n"
+ "GNU General Public Licence version 2 or later for copying conditions.\n"
+ "There is NO warranty. See dpkg-deb --licence for details.\n",
+ stderr)) werr("stderr");
+}
+
+static void usage(void) {
+ if (!fputs("\
+Usage: " BACKEND " -b|--build <directory> [<deb>] Build an archive.\n\
+ " BACKEND " -c|--contents <deb> List contents.\n\
+ " BACKEND " -I|--info <deb> [<cfile>...] Show info to stdout.\n\
+ " BACKEND " -f|--field <deb> [<cfield>...] Show field(s) to stdout.\n\
+ " BACKEND " -e|--control <deb> [<directory>] Extract control info.\n\
+ " BACKEND " -x|--extract <deb> <directory> Extract files.\n\
+ " BACKEND " -X|--vextract <deb> <directory> Extract & list files.\n\
+ " BACKEND " --fsys-tarfile <deb> Output filesystem tarfile.\n\
+ " BACKEND " -h|--help Display this message.\n\
+ " BACKEND " --version | --licence Show version/licence.\n\
+<deb> is the filename of a Debian format archive.\n\
+<cfile> is the name of an administrative file component.\n\
+<cfield> is the name of a field in the main `control' file.\n\
+Options: -D for debugging output; --old or --new controls archive format;\n\
+ --no-check to suppress control file check (build bad package).\n\
+\n\
+Use `" DPKG "' to install and remove packages from your system, or\n\
+`" DSELECT "' for user-friendly package management. Packages unpacked\n\
+using `" BACKEND " --extract' will be incorrectly installed !\n",
+ stderr)) werr("stderr");
+}
+
+const char thisname[]= BACKEND;
+const char printforhelp[]=
+ "Type " BACKEND " --help for help about manipulating *.deb files;\n"
+ "Type " DPKG " --help for help about installing and deinstalling packages.";
+
+int debugflag=0, nocheckflag=0, oldformatflag=BUILDOLDPKGFORMAT;
+const struct cmdinfo *cipaction=0;
+dofunction *action=0;
+
+static void helponly(const struct cmdinfo *cip, const char *value) {
+ usage(); exit(0);
+}
+static void versiononly(const struct cmdinfo *cip, const char *value) {
+ printversion(); exit(0);
+}
+
+static void setaction(const struct cmdinfo *cip, const char *value);
+
+static dofunction *const dofunctions[]= {
+ do_build,
+ do_contents,
+ do_control,
+ do_info,
+ do_field,
+ do_extract,
+ do_vextract,
+ do_fsystarfile
+};
+
+/* NB: the entries using setaction must appear first and be in the
+ * same order as dofunctions:
+ */
+static const struct cmdinfo cmdinfos[]= {
+ { "build", 'b', 0, 0, 0, setaction },
+ { "contents", 'c', 0, 0, 0, setaction },
+ { "control", 'e', 0, 0, 0, setaction },
+ { "info", 'I', 0, 0, 0, setaction },
+ { "field", 'f', 0, 0, 0, setaction },
+ { "extract", 'x', 0, 0, 0, setaction },
+ { "vextract", 'X', 0, 0, 0, setaction },
+ { "fsys-tarfile", 0, 0, 0, 0, setaction },
+ { "new", 0, 0, &oldformatflag, 0, 0, 0 },
+ { "old", 0, 0, &oldformatflag, 0, 0, 1 },
+ { "debug", 'D', 0, &debugflag, 0, 0, 1 },
+ { "nocheck", 0, 0, &nocheckflag, 0, 0, 1 },
+ { "help", 'h', 0, 0, 0, helponly },
+ { "version", 0, 0, 0, 0, versiononly },
+ { "licence", 0, 0, 0, 0, showcopyright }, /* UK spelling */
+ { "license", 0, 0, 0, 0, showcopyright }, /* US spelling */
+ { 0, 0 }
+};
+
+static void setaction(const struct cmdinfo *cip, const char *value) {
+ if (cipaction)
+ badusage("conflicting actions --%s and --%s",cip->olong,cipaction->olong);
+ cipaction= cip;
+ assert(cip-cmdinfos < sizeof(dofunctions)*sizeof(dofunction*));
+ action= dofunctions[cip-cmdinfos];
+}
+
+int main(int argc, const char *const *argv) {
+ jmp_buf ejbuf;
+
+ if (setjmp(ejbuf)) { /* expect warning about possible clobbering of argv */
+ error_unwind(ehflag_bombout); exit(2);
+ }
+ push_error_handler(&ejbuf,print_error_fatal,0);
+
+ myopt(&argv,cmdinfos);
+ if (!cipaction) badusage("need an action option");
+
+ unsetenv("GZIP");
+ action(argv);
+ set_error_display(0,0);
+ error_unwind(ehflag_normaltidy);
+ exit(0);
+}