46 lines
		
	
	
		
			829 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			829 B
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
newroot.c
 | 
						|
 | 
						|
Replace the current root with a new one
 | 
						|
*/
 | 
						|
 | 
						|
#include <errno.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <sys/mount.h>
 | 
						|
 | 
						|
void usage(void) {
 | 
						|
	fprintf(stderr, "Usage: newroot [-i] <block-special>\n");
 | 
						|
	fprintf(stderr, "-i: copy mfs binary from boot image to memory\n");
 | 
						|
	exit(1);	
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
	int r;
 | 
						|
	char *dev;
 | 
						|
	int mountflags;
 | 
						|
 | 
						|
	r = 0;
 | 
						|
	mountflags = 0; /* !read-only */
 | 
						|
	
 | 
						|
	if (argc != 2 && argc != 3) usage();
 | 
						|
	if(argc == 2) {
 | 
						|
		dev = argv[1];
 | 
						|
	} else if(argc == 3) {
 | 
						|
		/* -i flag was supposedly entered. Verify.*/		
 | 
						|
		if(strcmp(argv[1], "-i") != 0) usage();
 | 
						|
		mountflags |= MS_REUSE;
 | 
						|
		dev = argv[2];
 | 
						|
	}
 | 
						|
	
 | 
						|
	r = mount(dev, "/", mountflags, NULL, NULL);
 | 
						|
	if (r != 0) {
 | 
						|
		fprintf(stderr, "newroot: mount failed: %s\n",strerror(errno));
 | 
						|
		exit(1);
 | 
						|
	}
 | 
						|
	
 | 
						|
	return 0;
 | 
						|
}
 |