aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/diff/diff.php
Commit message (Collapse)AuthorAgeFilesLines
* improve code to detect and solve conflicts for code removed from one version ↵Meik Sievertsen2009-09-201-8/+16
| | | | | | to another. git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@10168 89ea8834-ac86-4346-8a33-228a782c2dd0
* Ok, after 20+ hours i think i fixed all grave issues with the updaterMeik Sievertsen2009-09-181-54/+263
| | | | | | | | | | | | | - smaller memory footprint - better checks for already updated files - even less conflicts - fixed automatic conflict resolving after successful merges - no more conflicts for $Id$ changes - fixed skip_whitespace_changes bug where code blocks were added to diff_op_add whereby the previous or next diff_op_copy already had the change - correctly display merged files in diff view (previously it happened that the old file was used for comparision, although the new file was different/newer/merged) git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@10163 89ea8834-ac86-4346-8a33-228a782c2dd0
* phpBB updater now solves common conflicts on it's own. This further reduces ↵Meik Sievertsen2009-09-171-0/+95
| | | | | | | | the chance of conflicts. (tested with some heavily modified files who previously generated a lot of conflicts) git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@10160 89ea8834-ac86-4346-8a33-228a782c2dd0
* stupid me forgot to add a function for backwards compatibility :/Meik Sievertsen2009-05-011-0/+11
| | | | git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9505 89ea8834-ac86-4346-8a33-228a782c2dd0
* and once more with feelingMeik Sievertsen2009-01-261-3/+3
| | | | git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9303 89ea8834-ac86-4346-8a33-228a782c2dd0
* TortoiseMerge seems to mess up the newlines... very very annoying bug.Meik Sievertsen2009-01-131-2/+2
| | | | git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9254 89ea8834-ac86-4346-8a33-228a782c2dd0
* - Allow download of conflicting file for later reference in automatic updaterMeik Sievertsen2009-01-121-28/+29
| | | | | | | | - Default difference view is now 'inline' instead of 'side by side' - Added new option for merging differences to conflicting files in automatic updater git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9252 89ea8834-ac86-4346-8a33-228a782c2dd0
* update diff engine to Text_Diff 1.1.0Meik Sievertsen2009-01-121-1/+43
| | | | git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@9251 89ea8834-ac86-4346-8a33-228a782c2dd0
* 5.3 compatibility.Marek A. R2008-08-161-4/+4
| | | | git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@8765 89ea8834-ac86-4346-8a33-228a782c2dd0
* some diff engine updates (only minor, but will hopefully not break anything)Meik Sievertsen2008-07-281-8/+11
| | | | git-svn-id: file:///svn/phpbb/branches/phpBB-3_0_0@8692 89ea8834-ac86-4346-8a33-228a782c2dd0
* dumdidum... sorry. ;)Meik Sievertsen2007-10-051-4/+5
| | | | git-svn-id: file:///svn/phpbb/trunk@8147 89ea8834-ac86-4346-8a33-228a782c2dd0
* - two new packages... diff and utfMeik Sievertsen2007-08-161-12/+12
| | | | | | | | - only 60 chars for topic title if new post (please see changelog for explanation) - change utf8_wordwrap (had some bugs david and nils spotted - was not really functional, sorry for this. :D) git-svn-id: file:///svn/phpbb/trunk@8034 89ea8834-ac86-4346-8a33-228a782c2dd0
* updates for the updater and the diff engine.Meik Sievertsen2006-11-291-15/+13
| | | | | | | - this update also includes an important change for including the diff engine, since we may need to include an updated engine before updating. This basically means that for a future update (B4 to another version) requires copying the new diff files first... the new include method should prevent this needed handwork for later versions then. git-svn-id: file:///svn/phpbb/trunk@6695 89ea8834-ac86-4346-8a33-228a782c2dd0
* better regexDavid M2006-11-291-5/+2
| | | | git-svn-id: file:///svn/phpbb/trunk@6694 89ea8834-ac86-4346-8a33-228a782c2dd0
* begin working on getting this thing a bit faster. I need to finish the other ↵Meik Sievertsen2006-11-281-2/+9
| | | | | | calls, this commit actually will break the diff engine and the updater. The speed increase noticed is from 89 seconds to 22 seconds as well as saving a lot of memory. git-svn-id: file:///svn/phpbb/trunk@6692 89ea8834-ac86-4346-8a33-228a782c2dd0
* adjust some comments to work with phpdocumentor. :)Meik Sievertsen2006-11-171-8/+3
| | | | git-svn-id: file:///svn/phpbb/trunk@6595 89ea8834-ac86-4346-8a33-228a782c2dd0
* some changes/fixesMeik Sievertsen2006-09-021-2/+4
| | | | git-svn-id: file:///svn/phpbb/trunk@6345 89ea8834-ac86-4346-8a33-228a782c2dd0
* Thanks to the GPL we are able to use the pear package text_diff - now ↵Meik Sievertsen2006-08-221-0/+779
splitted into the diff classes, the renderer and the engine git-svn-id: file:///svn/phpbb/trunk@6313 89ea8834-ac86-4346-8a33-228a782c2dd0
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
/*
 * Guillaume Cottenceau (gc)
 *
 * Copyright 2000-2004 Mandriva
 *
 *
 * This software may be freely redistributed under the terms of the GNU
 * public license.
 *
 * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

/*
 * Portions from Erik Troan (ewt@redhat.com)
 *
 * Copyright 1996 Red Hat Software 
 *
 */

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <stdarg.h>
#include <signal.h>
#include <linux/unistd.h>
#include <libldetect.h>

#include "stage1.h"

#include "log.h"
#include "probing.h"
#include "frontend.h"
#include "modules.h"
#include "tools.h"
#include "utils.h"
#include "automatic.h"
#include "mount.h"
#include "thirdparty.h"

#ifdef ENABLE_PCMCIA
#include "pcmcia/pcmcia.h"
#endif

#ifndef DISABLE_CDROM
#include "cdrom.h"
#endif

#ifndef DISABLE_NETWORK
#include "network.h"
#endif

#ifndef DISABLE_DISK
#include "disk.h"
#endif


/************************************************************
 * globals */



void fatal_error(char *msg)
{
	printf("FATAL ERROR IN STAGE1: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg);
	while (1);
}


/************************************************************
 * special frontend functs
 * (the principle is to not pollute frontend code with stage1-specific stuff) */

void stg1_error_message(char *msg, ...)
{
	va_list args;
	va_start(args, msg);
	unset_automatic();
	verror_message(msg, args);
	va_end(args);
}

void stg1_fatal_message(char *msg, ...)
{
	va_list args;
	va_start(args, msg);
	unset_automatic();
	verror_message(msg, args);
	va_end(args);
        exit(1);
}

void stg1_info_message(char *msg, ...)
{
	va_list args;
	va_start(args, msg);
	if (IS_AUTOMATIC) {
		vlog_message(msg, args);
		return;
	}
	vinfo_message(msg, args);
	va_end(args);
}


#ifdef SPAWN_SHELL
static pid_t shell_pid = 0;

/************************************************************
 * spawns a shell on console #2 */
static void spawn_shell(void)
{
	int fd;
	char * shell_name[] = { "/bin/sh", NULL };

	log_message("spawning a shell");

	if (!IS_TESTING) {
		fd = open("/dev/tty2", O_RDWR);
		if (fd == -1) {
			log_message("cannot open /dev/tty2 -- no shell will be provided");
			return;
		}
		else if (access(shell_name[0], X_OK)) {
			log_message("cannot open shell - %s doesn't exist", shell_name[0]);
			return;
		}
		
		if (!(shell_pid = fork())) {
			dup2(fd, 0);
			dup2(fd, 1);
			dup2(fd, 2);
			
			close(fd);
			setsid();
			if (ioctl(0, TIOCSCTTY, NULL))
				log_perror("could not set new controlling tty");

			execv(shell_name[0], shell_name);
			log_message("execve of %s failed: %s", shell_name[0], strerror(errno));
			exit(-1);
		}
		
		close(fd);
	}
}
#endif

#ifdef SPAWN_INTERACTIVE
char * interactive_fifo = "/tmp/stage1-fifo";
static pid_t interactive_pid = 0;

/* spawns my small interactive on console #6 */
static void spawn_interactive(void)
{
	int fd;
	char * dev = "/dev/tty6";

	printf("spawning my interactive on %s\n", dev);

	if (!IS_TESTING) {
		fd = open(dev, O_RDWR);
		if (fd == -1) {
			printf("cannot open %s -- no interactive\n", dev);
			return;
		}

		if (mkfifo(interactive_fifo, O_RDWR)) {
			printf("cannot create fifo -- no interactive\n");
			return;
		}
		
		if (!(interactive_pid = fork())) {
			int fif_out;

			dup2(fd, 0);
			dup2(fd, 1);
			dup2(fd, 2);
			
			close(fd);
			setsid();
			if (ioctl(0, TIOCSCTTY, NULL))
				perror("could not set new controlling tty");

			fif_out = open(interactive_fifo, O_WRONLY);
			printf("Please enter your command (availables: [+,-] [rescue]).\n");
				
			while (1) {
				char s[50];
				int i = 0;
				printf("? ");
				fflush(stdout);
				read(0, &(s[i++]), 1);
				fcntl(0, F_SETFL, O_NONBLOCK);
				while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s));
				fcntl(0, F_SETFL, 0);
				write(fif_out, s, i-2);
				printf("Ok.\n");
			}
		}
		
		close(fd);
	}
}
#endif


#ifdef ENABLE_PCMCIA
static void handle_pcmcia(void)
{
        char * pcmcia_adapter;

	pcmcia_adapter = pcmcia_probe();
	if (!pcmcia_adapter) {
		log_message("no pcmcia adapter found");
		return;
	}
	my_modprobe("pcmcia_core", ANY_DRIVER_TYPE, NULL);
	my_modprobe(pcmcia_adapter, ANY_DRIVER_TYPE, NULL);
	/* ds is an alias for pcmcia in recent 2.6 kernels
           but we don't have modules.alias in install, so try to load both */
	my_modprobe("ds", ANY_DRIVER_TYPE, NULL);
	my_modprobe("pcmcia", ANY_DRIVER_TYPE, NULL);
	
        /* setup a dynamic resource database for non statically mapped PCMCIA sockets */
	pcmcia_socket_startup(-1);

	add_to_env("PCMCIA", pcmcia_adapter);
}
#endif

#ifndef ENABLE_NETWORK_STANDALONE
static void handle_hid(void)
{
	struct hid_entries entry_list;
	unsigned int i;

	entry_list = hid_probe();
	for (i = 0; i < entry_list.nb; i++) {
		if (entry_list.entries[i].module != NULL)
			my_modprobe(entry_list.entries[i].module, ANY_DRIVER_TYPE, NULL);
	}
	my_modprobe("hid_generic", ANY_DRIVER_TYPE, NULL);
}


/************************************************************
 */

static void method_select_and_prepare(void)
{
	enum return_type results;
	char * choice;
	char * means[10], * means_auto[10];
	int i;

#ifndef DISABLE_DISK
	char * disk_install = "Hard disk"; char * disk_install_auto = "disk";
#endif
#ifndef DISABLE_CDROM
	char * cdrom_install = "CDROM drive"; char * cdrom_install_auto = "cdrom";
#endif
#ifndef DISABLE_NETWORK
	char * network_nfs_install = "NFS server"; char * network_nfs_install_auto = "nfs";
	char * network_ftp_install = "FTP server"; char * network_ftp_install_auto = "ftp";
	char * network_http_install = "HTTP server"; char * network_http_install_auto = "http";
#ifndef DISABLE_KA
	char * network_ka_install = "KA server"; char * network_ka_install_auto = "ka";
#endif
#endif
	char * thirdparty_install = "Load third party modules"; char * thirdparty_install_auto = "thirdparty";

	i = 0;
#ifndef DISABLE_NETWORK
	means[i] = network_nfs_install; means_auto[i++] = network_nfs_install_auto;
	means[i] = network_ftp_install; means_auto[i++] = network_ftp_install_auto;
	means[i] = network_http_install; means_auto[i++] = network_http_install_auto;
#ifndef DISABLE_KA
	means[i] = network_ka_install; means_auto[i++] = network_ka_install_auto;
#endif
#endif
#ifndef DISABLE_CDROM
	means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto;
#endif
#ifndef DISABLE_DISK
	means[i] = disk_install; means_auto[i++] = disk_install_auto;
#endif
	means[i] = thirdparty_install; means_auto[i++] = thirdparty_install_auto;
	means[i] = NULL;

	unlink(IMAGE_LOCATION);

	results = ask_from_list_auto("Please choose the installation method.", means, &choice, "method", means_auto);

	if (results != RETURN_OK)
		return method_select_and_prepare();

#ifndef DISABLE_CDROM
	if (!strcmp(choice, cdrom_install))
		results = cdrom_prepare();
#endif
        
#ifndef DISABLE_DISK
	if (!strcmp(choice, disk_install))
		results = disk_prepare();
#endif
	
#ifndef DISABLE_NETWORK
	if (!strcmp(choice, network_nfs_install))
		results = nfs_prepare();

	if (!strcmp(choice, network_ftp_install))
		results = ftp_prepare();
	
	if (!strcmp(choice, network_http_install))
		results = http_prepare();

#ifndef DISABLE_KA
	if (!strcmp(choice, network_ka_install))
		results = ka_prepare();
#endif
#endif

	if (!strcmp(choice, thirdparty_install)) {
		thirdparty_load_modules();
		return method_select_and_prepare();
        }

	if (results != RETURN_OK)
		return method_select_and_prepare();

        /* try to find third party modules on the install media */
        thirdparty_load_media_modules();
}
#endif

void finish_preparing(void)
{
#ifdef SPAWN_SHELL
	if (shell_pid != 0) {
		int fd;
		const char *clear = "\033[H\033[J";
		kill(shell_pid, 9);
		log_message("killed shell");
		fd = open("/dev/tty2", O_RDWR);
		write(fd, clear, strlen(clear));
		close(fd);
        }
#endif
}

int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)), char **env)
{
#ifdef ENABLE_NETWORK_STANDALONE
	open_log();
	init_frontend("");

	unlink("/etc/resolv.conf"); /* otherwise it is read-only */
	set_param(MODE_AUTOMATIC);
	grab_automatic_params("network:dhcp");

	intf_select_and_up();
	finish_frontend();
	return 0;
#else
	if (getenv("DEBUGSTAGE1")) {
		set_param(MODE_DEBUGSTAGE1);
		set_param(MODE_TESTING);
        }

#ifdef SPAWN_INTERACTIVE
	spawn_interactive();
#endif

	open_log();
	log_message("welcome to the " DISTRIB_NAME " install (mdk-stage1, version " DISTRIB_VERSION " built " __DATE__ " " __TIME__")");
	process_cmdline();
#ifdef SPAWN_SHELL
	spawn_shell();
#endif
	init_modules_insmoding();
	init_frontend("Welcome to " DISTRIB_DESCR ", " __DATE__ " " __TIME__);

	probe_that_type(VIRTIO_DEVICES, BUS_ANY);

        /* load usb interface as soon as possible, helps usb mouse detection in stage2 */
	probe_that_type(USB_CONTROLLERS, BUS_USB);

	if (IS_THIRDPARTY)
		thirdparty_load_modules();

#ifdef ENABLE_PCMCIA
	if (!IS_NOAUTO)
		handle_pcmcia();
#endif
        
	handle_hid();

	if (IS_CHANGEDISK)
		stg1_info_message("You are starting the installation with an alternate booting method. "
				  "Please change your disk, and insert the Installation disk.");

	if (IS_RESCUE && total_memory() < MEM_LIMIT_RESCUE) {
		stg1_error_message("You are starting the rescue with a low memory configuration. "
				   "Our experience shows that your system may crash at any point "
				   "or lock up for no apparent reason. Continue at "
				   "your own risk. Alternatively, you may reboot your system now.");
	}

        method_select_and_prepare();

	thirdparty_destroy();

	if (access(STAGE2_LOCATION, R_OK) != 0)
		if (symlink(IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL, STAGE2_LOCATION) != 0)
			log_perror("symlink from " IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL " to " STAGE2_LOCATION " failed");

#ifdef SPAWN_INTERACTIVE
	if (interactive_pid != 0)
		kill(interactive_pid, 9);
#endif

	finish_preparing();

	finish_frontend();
	close_log();

	if (IS_RESCUE)
		return 66; /* ask init to exec new init */

	return 0;
#endif
}