Пример #1
0
rp_t fs_cons(const char *path, const char *type) {
	char *dirname;
	char *name;
	rp_t dir;
	rp_t rp;

	// check for existing entries
	if (fs_find(path)) {
		errno = EEXIST;
		return 1;
	}

	// find parent directory
	dirname = path_parent(path);
	dir = fs_find(dirname);
	free(dirname);
	if (!dir) return RP_NULL;

	// construct new robject
	rp = rp_cons(dir, type);
	if (!rp) return RP_NULL;
	
	// add to directory
	name = path_name(path);
	if (rp_link(dir, name, rp)) {
		free(name);
		return RP_NULL;
	}

	free(name);
	return rp;
}
Пример #2
0
off_t fs_size(const char *path) {
	off_t size;
	rp_t file;

	file = fs_find(path);
	size = rp_size(file);

	return size;
}
Пример #3
0
int fs_link(const char *path, const char *link) {
	uint64_t dir;
	uint64_t rp;
	char *parent;
	char *name;
	int err;

	parent = path_parent(path);
	name   = path_name(path);

	rp  = fs_find(link);
	
	dir = fs_find(parent);
	err = rp_link(dir, name, rp);

	free(parent);
	free(name);

	return err;
}
Пример #4
0
Файл: main.c Проект: UIKit0/flux
int main(int argc, char **argv) {
	char *name, *path, list[1000];
	size_t i, l = 0;
	uint64_t dir;

	if (argc == 1) {
		path = (char*) getenv("PWD");
	}
	else {
		path = argv[1];
	}
	
	dir = fs_find(0, path);
	
	if (!dir) {
		fprintf(stderr, "%s: ", path_simplify(path));
		perror(NULL);
		abort();
	}

	list[0] = '\0';

	for (i = 0;; i++) {
		name = fs_list(dir, i);

		if (name) {
			strlcat(list, name, 1000);
			l += 8 * ((strlen(name) / 8) + 1);
			if (l > 48) {
				strlcat(list, "\n", 1000);
				l = 0;
			}
			else {
				strlcat(list, "\t", 1000);
			}
			free(name);
		}
		else {
			if (errno == ENOTDIR) {
				fprintf(stderr, "%s: ", path);
				perror(NULL);
				abort();
			}

			printf("%s", list);
			if (l) printf("\n");
			return EXIT_SUCCESS;
		}
	}

	return 0;
}
Пример #5
0
int main(int argc, char **argv) {
	char *path, *args, *reply;
	uint64_t ctrl;
	int i;

	if (argc < 2) {
		fprintf(stderr, "%s: missing operand\n", argv[0]);
		return 1;
	}

	if (argv[1][0] == '/') {
		path = strdup(argv[1]);
	}
	else if (argv[1][0] == '@') {
		path = strdup(argv[1]);
	}
	else {
		path = strvcat("/sys/", argv[1]);
	}

	ctrl = fs_find(path);
	
	if (!ctrl) {
		fprintf(stderr, "%s: %s: control file not accessible\n", argv[0], path);
		return 1;
	}

	args = malloc(1000);
	args[0] = '\0';
	for (i = 2; i < argc; i++) {
		strlcat(args, argv[i], 1000);
		strlcat(args, " ", 1000);
	}
	if (args[0]) args[strlen(args)-1] = '\0';

	reply = rcall(ctrl, args);

	if (!reply) {
		printf("! nosys (not implemented)\n");
		return 1;
	}

	if (iserror(reply)) {
		printf("%s (%s)\n", reply, strerror(geterror(reply)));
	}
	else {
		printf("%s\n", reply);
	}

	return 0;
}
Пример #6
0
int main(int argc, char **argv) {
	uint64_t mousefd;

	mousefd = fs_find("/dev/mouse");
	if (!mousefd) {
		fprintf(stderr, "%s: couldn't find mouse\n", argv[0]);
		return 1;
	}

	event_subscribe(mousefd);
	event_hook("mouse", mouse_event);

	_done();
	return 0;
}
Пример #7
0
int fs_ulink(const char *path) {
	uint64_t dir;
	char *parent;
	char *name;
	int err;

	parent = path_parent(path);
	name   = path_name(path);

	dir = fs_find(parent);
	err = rp_ulink(dir, name);

	free(parent);
	free(name);

	return err;
}
Пример #8
0
void *load_exec(const char *name) {
	int fd;
	uint64_t size;
	char *path;
	void *image;

	/* attempt to find requested file */
	if (name[0] == '/' || name[0] == '@') {
		path = strdup(name);
	}
	else {
		path = strvcat(getenv("PATH"), "/", name, NULL);
	}

	fd = ropen(-1, fs_find(path), STAT_READER);

	if (fd < 0 || !rp_type(fd_rp(fd), "file")) {
		/* file not found */
		return NULL;
	}
	else {
		/* read whole file into buffer */
		size = rp_size(fd_rp(fd));

		if (!size) {
			return NULL;
		}

		image = aalloc(size, PAGESZ);
		
		if (!image) {
			return NULL;
		}

		if (rp_read(fd_rp(fd), image, size, 0) != size) {
			free(image);
			close(fd);
			return NULL;
		}

		close(fd);
		return image;
	}
}
Пример #9
0
int fish_cd(int argc, char **argv) {
	char *path;

	if (argc < 2) {
		setenv("PWD", "/");
		return 0;
	}

	path = path_simplify(argv[1]);

	if (path && fs_find(path)) {
		setenv("PWD", path);
	}
	else {
		fprintf(stderr, "%s: %s: no such directory\n", getname_s(), argv[1]);
		free(path);
		return 1;
	}

	free(path);
	return 0;
}
Пример #10
0
int main() {
	struct tar_file *boot_image, *file;
	char const **argv;
	uint64_t temp, temp1, temp2;

	argv = malloc(sizeof(char*) * 4);

	/* Boot Image */
	boot_image = tar_parse((void*) BOOT_IMAGE);

	/* Dynamic Linker */
	file = tar_find(boot_image, "lib/dl.so");
	dl_load(file->start);

	/* Initial Root Filesystem / Device Filesystem / System Filesystem (tmpfs) */
	argv[0] = "tmpfs";
	argv[1] = NULL;
	file = tar_find(boot_image, "sbin/tmpfs");
	fs_root = start(file, argv);
	fs_cons("/dev", "dir");
	fs_cons("/sys", "dir");
	
	/* Serial Driver */
	argv[0] = "serial";
	argv[1] = NULL;
	file = tar_find(boot_image, "sbin/serial");
	fs_plink("/dev/serial", start(file, argv), NULL);
	ropen(1, fs_find("/dev/serial"), STAT_WRITER);
	ropen(2, fs_find("/dev/serial"), STAT_WRITER);
	stdout = fdopen(1, "w");
	stderr = fdopen(2, "w");

	fs_plink("/dev/stderr", fs_find("/dev/serial"), NULL);

	/* Keyboard Driver */
	argv[0] = "kbd";
	argv[1] = NULL;
	file = tar_find(boot_image, "sbin/kbd");
	temp = start(file, argv);

	/* Graphics Driver */
	argv[0] = "svga";
	argv[1] = NULL;
	file = tar_find(boot_image, "sbin/svga");
	start(file, argv);

	/* Init control file */
	fs_plink("/sys/init", RP_CONS(getpid(), 0), NULL);

	/* Initrd */
	initrd_init();
	fs_plink("/dev/initrd", RP_CONS(getpid(), 1), NULL);

	/* Root filesystem (tarfs) */
	argv[0] = "tarfs";
	argv[1] = "/dev/initrd";
	argv[2] = NULL;
	file = tar_find(boot_image, "sbin/tarfs");
	temp = start(file, argv);

	/* Link /dev and /sys and change root */
	temp1 = fs_find("/dev");
	temp2 = fs_find("/sys");
	fs_root = temp;
	fs_plink("/dev", temp1, NULL);
	fs_plink("/sys", temp2, NULL);

	/* Terminal Driver */
	argv[0] = "biterm";
	argv[1] = "/dev/kbd";
	argv[2] = "/dev/svga0";
	argv[3] = NULL;
	file = tar_find(boot_image, "sbin/biterm");
	fs_plink("/dev/tty", start(file, argv), NULL);

	/* Temporary filesystem */
	argv[0] = "tmpfs";
	argv[1] = NULL;
	file = tar_find(boot_image, "sbin/tmpfs");
	fs_plink("/tmp", start(file, argv), NULL);

	/* Time Driver */
	argv[0] = "time";
	argv[1] = NULL;
	file = tar_find(boot_image, "sbin/time");
	fs_plink("/dev/time", start(file, argv), NULL);

	/* Pipe Driver */
	argv[0] = "pipe";
	argv[1] = NULL;
	file = tar_find(boot_image, "sbin/pipe");
	fs_plink("/sys/pipe", start(file, argv), NULL);

	setname("init");
	
	mwait(PORT_CHILD, 0);

	printf("INIT PANIC: system daemon died\n");
	for(;;);
	return 0;
}
Пример #11
0
uint64_t io_find(const char *name) {
	return fs_find(RP_NULL, name);
}