示例#1
0
文件: main.c 项目: asegid/rhombus
size_t tmpfs_write(struct robject *self, rp_t source, uint8_t *buffer, size_t size, off_t offset) {
	uint8_t *file_data;
	off_t _file_size = 0;
	off_t *file_size;

	mutex_spin(&self->driver_mutex);

	file_data = robject_data(self, "data");
	file_size = robject_data(self, "size");

	if (!file_size) {
		file_size = &_file_size;
	}

	if (offset + size >= *file_size) {
		file_data = realloc(file_data, offset + size);
		robject_set_data(self, "data", file_data);
		if (file_size == &_file_size) {
			file_size = malloc(sizeof(off_t));
		}
		*file_size = offset + size;
		robject_set_data(self, "size", file_size);
	}

	memcpy(&file_data[offset], buffer, size);

	mutex_free(&self->driver_mutex);
	return size;
}
示例#2
0
void __rdi_class_link_setup() {
	
	rdi_class_link = robject_cons(0, rdi_class_core);

	robject_set_call(rdi_class_link, "find",     _find,     AC_NULL);
	robject_set_call(rdi_class_link, "set-link", _set_link, AC_WRITE);
	robject_set_call(rdi_class_link, "get-link", _get_link, AC_READ);

	robject_set_data(rdi_class_link, "type", (void*) "link");
	robject_set_data(rdi_class_link, "name", (void*) "RDI-class-link");
}
示例#3
0
struct robject *rdi_link_cons(uint32_t index, uint32_t access, const char *link) {
	struct robject *r;

	r = robject_cons(index, rdi_class_link);
	robject_set_default_access(r, access);
	if (link) robject_set_data(r, "link", strdup(link));

	return r;
}
示例#4
0
文件: main.c 项目: asegid/rhombus
struct robject *pipe_file_cons(rp_t source, int argc, char **argv) {
	struct robject *new_r;
	struct pipe *pipe;

	new_r = rdi_file_cons(robject_new_index(), ACCS_READ | ACCS_WRITE);
	pipe = pipe_new();
	robject_set_data(new_r, "pipe", pipe);

	return new_r;
}
示例#5
0
文件: main.c 项目: asegid/rhombus
char *tmpfs_reset(struct robject *self, rp_t source, int argc, char **argv) {
	uint8_t *file_data;
	off_t *file_size;

	mutex_spin(&self->driver_mutex);

	file_data = robject_data(self, "data");
	file_size = robject_data(self, "size");

	free(file_data);
	free(file_size);

	robject_set_data(self, "data", NULL);
	robject_set_data(self, "size", NULL);

	mutex_free(&self->driver_mutex);

	return strdup("T");
}
示例#6
0
static char *_set_link(struct robject *r, rp_t src, int argc, char **argv) {
	char *link;
	char *old;

	if (argc == 2) {
		link = argv[1];

		old = robject_get_data(r, "link");
		robject_set_data(r, "link", strdup(link));
		free(old);

		return strdup("T");
	}

	return errorstr(EINVAL);
}
示例#7
0
文件: main.c 项目: asegid/rhombus
int main(int argc, char **argv) {
	uint32_t slot, func, bus;
	struct pci_header *hdr;
	struct robject *root;
	struct robject *device;
	char *name;

	rdi_init();

	root = rdi_dir_cons(1, ACCS_READ | ACCS_WRITE);

	for (bus = 0; bus < 256; bus++) {
		for (slot = 0; slot < 32; slot++) {
			for (func = 0; func < 8; func++) {
				if (_pci_ping(bus, slot, func)) {

					hdr = malloc(sizeof(struct pci_header));
					_pci_read(bus, slot, func, hdr);

					device = rdi_file_cons((bus << 16) | (slot << 11) | (func << 8) + 2, ACCS_READ);
					robject_set_data(device, "pci-header", hdr);
					name = saprintf("/b%2Xs%2Xf%1X", bus, slot, func);
					rdi_vfs_add(root, name, device);
					free(name);

					printf("%02x:%02x.%x :\n", bus, slot, func);
					printf("\tdevice ID: %X\n", hdr->device_id);
					printf("\tvendor ID: %X\n", hdr->vendor_id);
					printf("\tclass: %X %X\n", hdr->class_code, hdr->subclass);

					for (int i = 0; i < 5; i++) {
						printf("\tBAR%d: %X\n", i, hdr->bar[i]);
					}
				}
			}
		}
	}

	rdi_global_read_hook = pci_read;

	msendb(getppid(), ACTION_CHILD);
	_done();

	return 0;
}
示例#8
0
文件: main.c 项目: jrepan/rhombus
int main(int argc, char **argv) {
	struct robject *canvas;
	char *modesstr0;
	char *modestr;
	int i;

	rdi_init();

	canvas = rdi_file_cons(robject_new_index(), ACCS_READ | ACCS_WRITE | ACCS_EVENT);
	robject_set_data(canvas, "type", (void*) "canvas share");

	svga_init();

	// generate list of modes
	modesstr = strdup("");
	for (i = 0; i < modelist_count; i++) {
		modesstr0 = modesstr;
		modestr = malloc(16);
		sprintf(modestr, "%d:%d:%d ", modelist[i].w, modelist[i].h, modelist[i].d);
		modesstr = strvcat(modesstr, modestr, NULL);
		free(modesstr0);
	}

	svga_set_mode(svga_find_mode(640, 480, 24));
	buffer = malloc(svga.w * svga.h * 4);

	/* set up driver interface */
	robject_set_call(canvas, "getmode",   svga_rcall_getmode,   STAT_READER);
	robject_set_call(canvas, "listmodes", svga_rcall_listmodes, STAT_READER);
	robject_set_call(canvas, "unshare",   svga_rcall_unshare,   STAT_WRITER);
	robject_set_call(canvas, "setmode",   svga_rcall_setmode,   STAT_WRITER);
	robject_set_call(canvas, "syncrect",  svga_rcall_syncrect,  STAT_WRITER);
	robject_set_call(canvas, "sync",      svga_rcall_sync,      STAT_WRITER);
	rdi_global_share_hook = svga_share;

	/* register the driver as /dev/svga0 */
	fs_plink("/dev/svga0", RP_CONS(getpid(), canvas->index), NULL);
	msendb(RP_CONS(getppid(), 0), PORT_CHILD);
	_done();

	return 0;
}
示例#9
0
文件: main.c 项目: asegid/rhombus
int main(int argc, char **argv) {
	struct tar_block *block;
	struct robject *root;
	struct robject *file;
	size_t i, n;
	off_t *poff, *size;

	/* reject if no parent is speicified */
	if (argc < 2) {
		fprintf(stderr, "%s: no parent driver specified\n", argv[0]);
		abort();
	}
	else {

		/* get parent driver stream */
		parent = fopen(argv[1], "r");

		if (!parent) {
			/* parent does not exist - fail */
			fprintf(stderr, "%s: no parent driver %s\n", argv[0], argv[1]);
			abort();
		}
	}

	rdi_init();

	/* create root directory */
	root = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE);

	/* allocate buffer space for header block */
	block = malloc(512);

	for (i = 0, n = 1;; n++) {

		/* read in file header block */
		fseek(parent, i, SEEK_SET);
		fread(block, 1, 512, parent);

		/* break if it's a terminating block */
		if (block->filename[0] == '\0' || block->filename[0] == ' ') {
			break;
		}

		if (block->filename[strlen(block->filename) - 1] == '/') {

			/* add directory to VFS */
			block->filename[strlen(block->filename) - 1] = 0;
			file = rdi_dir_cons(robject_new_index(), ACCS_READ | ACCS_WRITE);
			rdi_vfs_add(root, block->filename, file);
	
			/* move to next file header */
			i += 512;
		}
		else {

			/* add file to VFS */
			file = rdi_file_cons(robject_new_index(), ACCS_READ);
			rdi_vfs_add(root, block->filename, file);

			poff = malloc(sizeof(off_t));
			size = malloc(sizeof(off_t));
			*poff = i + 512;
			*size = getvalue(block->filesize, 12);
			robject_set_data(file, "size", size);
			robject_set_data(file, "parent-offset", poff);
			
			/* move to next file header */
			i += ((*size / 512) + 1) * 512;
			if (*size % 512) i += 512;
		}
	}

	free(block);

	/* set up interface */
	rdi_global_read_hook = tarfs_read;
	rdi_global_cons_link_hook = tarfs_link_cons;

	/* daemonize */
	msendb(RP_CONS(getppid(), 0), ACTION_CHILD);
	_done();

	return EXIT_SUCCESS;
}