/*
 *  This program 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 program 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 Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include "unarchive.h"
#include "busybox.h"

extern int dpkg_deb_main(int argc, char **argv)
{
	char *prefix = NULL;
	char *filename = NULL;
	char *output_buffer = NULL;
	int opt = 0;
	int arg_type = 0;
	int deb_extract_funct = extract_create_leading_dirs | extract_unconditional;	
	
	const int arg_type_prefix = 1;
	const int arg_type_field = 2;
	const int arg_type_filename = 4;
//	const int arg_type_un_ar_gz = 8;

	while ((opt = getopt(argc, argv, "ceftXxI")) != -1) {
		switch (opt) {
			case 'c':
				deb_extract_funct |= extract_data_tar_gz;
				deb_extract_funct |= extract_verbose_list;
				break;
			case 'e':
				arg_type = arg_type_prefix;
				deb_extract_funct |= extract_control_tar_gz;
				deb_extract_funct |= extract_all_to_fs;
				break;
			case 'f':
				arg_type = arg_type_field;
				deb_extract_funct |= extract_control_tar_gz;
				deb_extract_funct |= extract_one_to_buffer;
				filename = xstrdup("./control");
				break;
			case 't': /* --fsys-tarfile, i just made up this short name */
				/* Integrate the functionality needed with some code from ar.c */
				error_msg_and_die("Option disabled");
//				arg_type = arg_type_un_ar_gz;
				break;
			case 'X':
				arg_type = arg_type_prefix;
				deb_extract_funct |= extract_data_tar_gz;
				deb_extract_funct |= extract_all_to_fs;
				deb_extract_funct |= extract_list;
			case 'x':
				arg_type = arg_type_prefix;
				deb_extract_funct |= extract_data_tar_gz;
				deb_extract_funct |= extract_all_to_fs;
				break;
			case 'I':
				arg_type = arg_type_filename;
				deb_extract_funct |= extract_control_tar_gz;
				deb_extract_funct |= extract_one_to_buffer;
				break;
			default:
				show_usage();
		}
	}

	if (optind == argc)  {
		show_usage();
	}

	/* Workout where to extract the files */
	if (arg_type == arg_type_prefix) {
		/* argument is a dir name */
		if ((optind + 1) == argc ) {
			prefix = xstrdup("./DEBIAN/");
		} else {
			prefix = (char *) xmalloc(strlen(argv[optind + 1]) + 2);
			strcpy(prefix, argv[optind + 1]);
			/* Make sure the directory has a trailing '/' */
			if (last_char_is(prefix, '/') == NULL) {
				strcat(prefix, "/");
			}
		}
		mkdir(prefix, 0777);
	}

	if (arg_type == arg_type_filename) {
		if ((optind + 1) != argc) {
			filename = xstrdup(argv[optind + 1]);
		} else {
			error_msg_and_die("-I currently requires a filename to be specified");
		}
	}

	output_buffer = deb_extract(argv[optind], stdout, deb_extract_funct, prefix, filename);

	if ((arg_type == arg_type_filename) && (output_buffer != NULL)) {
		puts(output_buffer);
	}
	else if (arg_type == arg_type_field) {
		char *field = NULL;
		char *name;
		char *value;
		int field_start = 0;

		while (1) {
			field_start += read_package_field(&output_buffer[field_start], &name, &value);
			if (name == NULL) {
				break;
			}
			if (strcmp(name, argv[optind + 1]) == 0) {
				puts(value);
			}
			free(field);
		}
	}

	return(EXIT_SUCCESS);
}
