Esempio n. 1
0
static int cftp_receive_handle(struct cftp_descriptor *desc, struct cftp_file_request *req)
{
	int ret;

	switch (req->st_mode & S_IFMT)
	{
	case S_IFBLK:
	case S_IFCHR:
		println("Create Device: %s", req->filename);
		remove(req->filename);
		ret = mknod(req->filename, req->st_mode, req->st_rdev);
		break;

	case S_IFLNK:
		println("Create Symlink: %s", req->filename);
		remove(req->filename);
		ret = symlink(req->filename + text_len(req->filename) + 1, req->filename);
		if (ret < 0 && errno == EEXIST)
		{
			ret = 0;
		}
		break;

	case S_IFDIR:
		println("Create Directory: %s", req->filename);
		ret = mkdir(req->filename, req->st_mode);
		if (ret < 0 && errno == EEXIST)
		{
			ret = 0;
		}
		break;

	case S_IFREG:
		println("Receive Regular File: %s", req->filename);
		if (desc->receive_handle)
		{
			return desc->receive_handle(desc->data, req);
		}

		return cftp_server_receive_file(desc, req->filename, req->st_mode, req->offset, req->size);

	default:
		error_msg("unknown file type");
		cftp_send_error_message(desc, (struct cftp_error_message *) req, "unknown file type");
		return -EINVAL;
	}

	if (ret < 0)
	{
		cftp_send_error_message(desc, (struct cftp_error_message *) req, __FUNCTION__);
	}
	else
	{
		cftp_send_ack_message(desc, (struct cftp_ack_message *) req, 0, 0);
	}

	return ret;
}
Esempio n. 2
0
char *uevent_get_property_base(char *props[], int prop_count, const char *prefix, char *buff)
{
	for (prop_count--; prop_count >= 0; prop_count--) {
		if (text_lhcmp(prefix, props[prop_count]) == 0) {
			text_copy(buff, props[prop_count] + text_len(prefix));

			return buff;
		}
	}

	return NULL;
}
Esempio n. 3
0
static int __init hidemod_init(void)
{
	unsigned long **sys_call_table;
	unsigned int cr0, call_offset;
	int len;
	char *page_vaddr, *p;
	char *str = "<1>The module has been removed!\nJust a memory leak\n";

	sys_call_table = (unsigned long **)0xc0798328;	

	/*
	 * I learn it from kernel func: sysenter_setup
	 * (The code of memory management in 2.6 is hard :0)
	 */ 
	page_vaddr = (char *)get_zeroed_page(GFP_ATOMIC);
	if (page_vaddr == NULL) {
		printk(KERN_ALERT "Unable get zero page \n");
		return -1;
	}

	/*copy string(printk()'s argument) to my page*/
	len = strlen(str);
	memcpy(page_vaddr, str, len);

	/*copy code to my page*/
	p = page_vaddr + len + 1;
	len = text_len(hook_337_syscall);
	memcpy(p, (void *)hook_337_syscall, len);


	/*
	 * change the offset 
	 * number 9/14 is counted from the assembled code
	 */
	call_offset = (unsigned int)printk - (unsigned int)(&p[13] + 5);
	*(unsigned int *)&p[9] = (unsigned int)page_vaddr;
	*(unsigned int *)&p[14] = call_offset;

	cr0 = set_cr0();
	sys_call_table[337] = (unsigned long *)p;
	set_back_cr0(cr0);

	return 0;
}