示例#1
0
文件: fs-up.c 项目: dpc/rdup
/* make (or delete) an object in the filesystem */
gboolean
mk_obj(FILE * in, char *p, struct rdup * e, GHashTable * uidhash,
       GHashTable * gidhash)
{
	if (opt_verbose >= 1 && e->f_name) {
		if (S_ISLNK(e->f_mode) || e->f_lnk)
			fprintf(stderr, "%s -> %s\n", e->f_name, e->f_target);
		else
			fprintf(stderr, "%s\n", e->f_name);
	}
	if (opt_table)
		rdup_write_table(e, stdout);

	/* split here - or above - return when path is zero length
	 * for links check that the f_size is zero */
	switch (e->plusmin) {
	case MINUS:
		if (opt_dry || !e->f_name)
			return TRUE;

		return rm(e->f_name);
	case PLUS:
		/* opt_dry handled within the subfunctions */

		/* only files, no hardlinks! */
		if (S_ISREG(e->f_mode) && !e->f_lnk)
			return mk_reg(in, e, uidhash, gidhash);

		/* no name, we can exit here - for files this is handled
		 * in mk_reg, because we may need to suck in data */
		if (e->f_name == NULL)
			return TRUE;

		if (S_ISDIR(e->f_mode))
			return mk_dir(e, uidhash, gidhash);

		/* First sym and hardlinks and then regular files */
		if (S_ISLNK(e->f_mode) || e->f_lnk)
			return mk_link(e, p, uidhash, gidhash);

		if (S_ISBLK(e->f_mode) || S_ISCHR(e->f_mode))
			return mk_dev(e, uidhash, gidhash);

		// There's no way to restore a named socket
		if (S_ISSOCK(e->f_mode))
			return TRUE;

		if (S_ISFIFO(e->f_mode))
			return mk_sock(e, uidhash, gidhash);
	}
	/* only reached during the heat death of the universe */
	return TRUE;
}
示例#2
0
int bootup_main(int argc, char **argv) {
	FILE *fp;
	int t=0;
	char cmd[1024], buf[1024], name[1024];
	time_t curtime;
  	struct tm *loctime;
	signal(SIGINT,SIG_IGN);
	putenv("PATH=/bin");
	putenv("TERM=linux");
	umask(0770);
	chdir("/");
	print_file("/etc/banner");
	xsystem("mount -t proc -o ro virtual /proc");
	xsystem("mount -t sysfs -o ro virtual /sys");
	stage1();
	stage2();

	// STAGE 3
	chdir("/");
	read_cmdline();
	xsystem("mdev -s");
	xsystem("mount -t devpts -o \"rw,gid=0,mode=620\"");
	mk_dev("/dev/ppp",108,0);
	if(LCD_PROG==1 && file_exists("/tmp/tools/lcd/lcd.bz2")) {
		mk_dev("/dev/parport0",99,0);
		mk_dev("/dev/lp0",6,0);
		xsystem("tar -C / -jxf /tmp/tools/lcd/lcd.bz2");
	} else {
		LCD_PROG=0;
	}
	rename("/dev/random","/dev/random-block");
	symlink("/dev/urandom","/dev/random");
	xmkdir("/strg");
	if(LCD_DEV[0]!='\0') {
		snprintf(buf,sizeof(buf),"/dev/%s",LCD_DEV);
		if(file_exists(buf)) {
			save_to_file("/var/sys/lcd_dev",buf);
			if(LCD_PROG==1) save_to_file("/var/sys/lcd_proc","%d",LCD_PROG);
			symlink(buf,"/dev/lcd");
			lcd_msg(LCD_PROG,"SYSTEM LOADING..","-> STORAGE ON");
		}
	}
	memset(buf,0x0,sizeof(buf));
	snprintf(buf,sizeof(buf),"mount -t %s -o \"rw,noatime\" %s /strg",STRG_FS,STRG_DEV);
	if(xsystem("mount -t %s -o \"rw,noatime\" %s /strg",STRG_FS,STRG_DEV)==0) {
		if(file_exists("/strg/.mount_strg")) {
			unlink("/strg/.mount_strg");
			if(xsystem("umount /strg")==0) {
				fprintf_stdout("**** MYBOX SYSTEM APPEARS TO HAVE SHUT DOWN UNCLEANLY ****\n");
				lcd_msg(LCD_PROG,"SYSTEM LOADING..","-> FIX STORAGE");
				xsystem("e2fsck -y %s",STRG_DEV);
				t=1;
			}
		}
		if(t==0) xsystem("umount /strg");
	} else {
		fprintf_stdout("**** MOUNTING STORAGE DISK FAILED! ****\n");
		lcd_msg(LCD_PROG,"SYSTEM LOADING..","STORAGE FAILED !");
		xtouch("/strg/.nostrg");
		xtouch("/var/sys/nolog");
	}
	if(!file_exists("/strg/.nostrg")) {
		if(xsystem("mount -t %s -o \"rw,noatime\" %s /strg",STRG_FS,STRG_DEV)==0) {
			memset(buf,0x0,sizeof(buf));
			snprintf(buf,sizeof(buf),"%s:%s\n",STRG_DEV,STRG_FS);
			save_to_file("/strg/.mount_strg",buf);
			save_to_file("/var/sys/.mount_strg",buf);
			save_to_file("/var/sys/.mount_strg","%s:%s\n",BOOT_DEV,BOOT_FS);
		}
	}
	if(xsystem("swapon %s",SWAP_DEV)==0) {
		memset(buf,0x0,sizeof(buf));
		snprintf(buf,sizeof(buf),"%s:swap\n",SWAP_DEV);
		save_to_file("/var/sys/.mount_swap",buf);
	}
	xsystem("chmod 700 *");
	if((fp=fopen("/etc/inittab","w"))!=NULL) {
		fprintf(fp,"::sysinit:/bin/initrc\n");
		fprintf(fp,"tty1::respawn:/bin/getty -h -n -L tty1 9600 linux\n");
		fprintf(fp,"ttyS0::respawn:/bin/getty -h -n -L ttyS0 9600 vt100\n");
		fprintf(fp,"null::respawn:/bin/chkprog\n");
		fprintf(fp,"::restart:/bin/init\n");
		fprintf(fp,"::ctrlaltdel:/bin/bootdown\n");
		fprintf(fp,"::ctrlaltdel:/bin/reset\n");
		fprintf(fp,"::ctrlaltdel:/bin/reboot\n");
		fprintf(fp,"::shutdown:/bin/bootdown\n");
		fclose(fp);
	}
	if((fp=fopen("/etc/profile","a"))!=NULL) {
		fprintf(fp,"xexit() {\n");
		fprintf(fp,"	if [ \"$PPID\" = \"1\" ]; then\n");
		fprintf(fp,"		local logname=\"/strg/mybox/logs/auth-$(date \"+%s\").log\"\n","%Y%m%d");
		fprintf(fp,"		local msg=\"[$(date \"+%s\")] TYPE=console USER=console IP=$(basename $(tty)) MSG=Session logout.\"\n","%d/%m/%Y %H:%M:%S");
		fprintf(fp,"		echo \"$msg\" >> $logname\n");
		fprintf(fp,"		[ ! -z \"$ME\" -a -f \"$ME\" ] && rm -f /tmp/console.session/console_*\n");
		fprintf(fp,"	fi\n");
		fprintf(fp,"	exit\n");
		fprintf(fp,"}\n");
		fprintf(fp,"alias exit='xexit'\n");
		fprintf(fp,"export HISTFILE=/.consolehistory\n");
		fprintf(fp,"lcdd_msg() {\n");
		fprintf(fp,"	if [ -f \"/bin/lcdd\" -a -c \"/dev/lcd\" ]; then\n");
		fprintf(fp,"		if [ -f \"/var/sys/lcd_proc\" ]; then\n");
		fprintf(fp,"			echo \"$2\" > /var/sys/lcd_msg\n");
		fprintf(fp,"		else\n");
		fprintf(fp,"			/bin/lcdd \"$1\" \"$2\"\n");
		fprintf(fp,"		fi\n");
		fprintf(fp,"	fi\n");	
		fprintf(fp,"}\n");
		fprintf(fp,"if [ -z $DO_SINGLE ]; then\n");
		fprintf(fp,"	if [ -f \"/bin/iosh\" ]; then\n");
		fprintf(fp,"		XTTY=\"SSL\";\n");
		fprintf(fp,"		if [ -f \"/var/sys/init_start\" ]; then\n");
		fprintf(fp,"			trap : 1 2 3 15\n");
		fprintf(fp,"			echo \"System loading in progress..please wait or login back in a minute\"\n");
		fprintf(fp,"			while [ -f \"/var/sys/init_start\" ]; do sleep 1;done\n");
		fprintf(fp,"			trap 1 2 3 15\n");
		fprintf(fp,"		fi\n");
		fprintf(fp,"		if [ \"$PPID\" = \"1\" ]; then\n");
		fprintf(fp,"			export ME=\"/tmp/console.session/console_${PPID}_$(basename $(tty))_$(date \"+%s\")\";\n","%d:%m:%Y_%H:%M:%S");
		fprintf(fp,"			touch $ME\n");
		fprintf(fp,"			XTTY=\"console\";\n");
		fprintf(fp,"		fi\n");
		fprintf(fp,"		/bin/iosh $XTTY\n");
		fprintf(fp,"		if [ $? != 5 ]; then\n");
		fprintf(fp,"			clear;reset\n");
		fprintf(fp,"			exit\n");
		fprintf(fp,"		fi\n");
		fprintf(fp,"	else\n");
		fprintf(fp,"		echo \"** FAILED TO RUN IO SHELL **\"\n");
		fprintf(fp,"		read io\n");
		fprintf(fp,"		exit\n");
		fprintf(fp,"	fi\n");
		fprintf(fp,"else \n");
		fprintf(fp,"	echo \"** MAINTENANCE MODE **\"\n");
		fprintf(fp,"	lcdd_msg \"SYSTEM LOADING.." "-> MAINTENANCE\"\n");
		fprintf(fp,"	read io\n");
		fprintf(fp,"fi\n");
		fclose(fp);
	}
	unlink("/strg/mybox/debug.log");
	curtime=time(NULL);
	loctime=localtime(&curtime);


	memset(name,0x0,sizeof(name));
	strftime(name, sizeof(name),"system-%Y%m%d.log",loctime);
	memset(buf,0x0,sizeof(buf));
	snprintf(buf,sizeof(buf),"%s/%s",LOGPATH,name);
	memset(cmd,0x0,sizeof(cmd));
	strftime(cmd, sizeof(cmd), "[%d/%m/%Y %T] TYPE=INFO MSG=****** SYSTEM LOADING ******\n",loctime);
	append_to_file(buf,cmd);
	if(file_exists("/bin/getkey")) {
		if(system("getkey -c 3 -m \"-> Starting Init: %d\" R")==0) {
			fprintf_stdout("\r*** BYPASS CONSOLE LOGIN ***\n");
			lcd_msg(LCD_PROG,"SYSTEM LOADING..","BYPASS CONSOLE !");
			xtouch("/etc/noconsole");
		} else {
			fprintf_stdout("\r* Starting Init. Done.\n");
		}
	}
	memset(buf,0x0,sizeof(buf));
	snprintf(buf,sizeof(buf),"%s\n","/bin/mdev");
	save_to_file("/proc/sys/kernel/hotplug",buf);
	if(NUM_NET!=0) save_to_file("/var/sys/numnet_veto","%d",NUM_NET);
	do_chroot();
	signal(SIGINT,SIG_DFL);
	lcd_msg(LCD_PROG,"SYSTEM LOADING..","ERROR !");
	fprintf_stdout("You are not supposed to be here, something went wrong!\n");
	fprintf_stdout("Press Ctrl+Alt+Del or switch off/on for reboot.\n");
	while(1);
	exit(0);
}