Ejemplo n.º 1
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;
}
Ejemplo n.º 2
0
pid_t process_find_by_cmdline(const char *proc_path, const char *cmdline)
{
	DIR *dir_proc;
	pid_t pid;
	struct dirent *en;
	char pathname[64], *p_name;

	if (proc_path == NULL)
	{
		proc_path = "/proc";
	}

	dir_proc = opendir(proc_path);
	if (dir_proc == NULL)
	{
		print_error("Open directroy %s failed", proc_path);
		return -EFAULT;
	}

	pid = -1;
	p_name = text_path_cat(pathname, sizeof(pathname), proc_path, NULL);

	while ((en = readdir(dir_proc)))
	{
		char buff[1024];
		ssize_t readlen;

		if (text_is_number(en->d_name) == 0)
		{
			continue;
		}

		sprintf(p_name, "%s/cmdline", en->d_name);

		readlen = file_read(pathname, buff, sizeof(buff));
		if (readlen < 0)
		{
			continue;
		}

		buff[readlen] = 0;

		if (text_lhcmp(cmdline, buff) == 0)
		{
			pid = text2value_unsigned(en->d_name, NULL, 10);
			break;
		}
	}

	closedir(dir_proc);

	return pid;
}
Ejemplo n.º 3
0
Archivo: xml.c Proyecto: FuangCao/cavan
static int cavan_xml_document_parse_comment(char **ptext, char *text_end)
{
	int lineno;
	char *text;

	for (text = *ptext, lineno = 0; text < text_end; text++) {
		switch (*text) {
		case '\n':
			lineno++;
			break;

		case '-':
			if (text_lhcmp("->", text + 1) == 0) {
				*text = 0;
				*ptext = text + 2;
				return lineno;
			}
			break;
		}
	}

	return -1;
}
Ejemplo n.º 4
0
int ftp_client_run(struct network_url *url, const char *username, const char *password)
{
	int ret;
	char buff[1024], *p;
	ssize_t wrlen, rdlen;
	struct network_client client;

	ret = network_client_open(&client, url, 0);
	if (ret < 0)
	{
		pr_red_info("network_client_open");
		return ret;
	}

	ret = ftp_client_login(&client, username, password);
	if (ret < 0)
	{
		pr_red_info("ftp_client_login");
		return ret;
	}

	while (1)
	{
		while (1)
		{
			print("cavan-ftp> ");

			for (p = buff; (*p = getchar()) != '\n'; p++);

			if (p > buff)
			{
				p = text_copy(p, "\r\n");
				break;
			}
		}

		if (text_lhcmp("ls", buff) == 0)
		{
			println("list command");
			ftp_client_receive_file(&client, url->hostname, 6789);
		}
		else
		{
			wrlen = client.send(&client, buff, p - buff);
			if (wrlen < 0)
			{
				pr_red_info("inet_send");
				ret = wrlen;
				break;
			}
		}

		rdlen = client.recv(&client, buff, sizeof(buff));
		if (rdlen < 0)
		{
			pr_red_info("client.recv");
			ret = rdlen;
			break;
		}

		buff[rdlen] = 0;
		println("%s", buff);
	}

	network_client_close(&client);

	return ret;
}
Ejemplo n.º 5
0
Archivo: xml.c Proyecto: FuangCao/cavan
static int cavan_xml_document_get_next_token(struct cavan_xml_parser *parser, bool verbose)
{
	char c;
	int ret;
	int lineno;
	char *p, *p_end;
	char *head, *tail, *value;
	struct cavan_xml_attribute *attr;

	parser->prev_token = parser->token;

	if (parser->next_token != CAVAN_XML_TOKEN_NONE) {
		parser->token = parser->next_token;
		parser->next_token = CAVAN_XML_TOKEN_NONE;
		return 0;
	}

	lineno = parser->lineno;;
	parser->name = NULL;
	parser->attr = NULL;
	parser->content = NULL;
	parser->comment = NULL;
	parser->token = CAVAN_XML_TOKEN_NONE;

	p = parser->pos;
	p_end = parser->pos_end;
	head = tail = p;

	while (p < p_end) {
		switch (*p) {
		case 0:
		case '\\':
			break;

		case '\n':
			lineno++;
#if CONFIG_CAVAN_XML_DEBUG
			pr_green_info("lineno = %d", lineno);
#endif
		case ' ':
		case '\t':
		case '\f':
		case '\r':
			p++;

			if (parser->token == CAVAN_XML_TOKEN_NONE) {
				head = p;
			} else {
				if (byte_is_space_or_lf(*head)) {
					head = p;
				}

				*tail = 0;
			}

			tail = p;
			break;

		case '<':
			if (parser->token != CAVAN_XML_TOKEN_NONE) {
				if (verbose) {
					pr_parser_error_info(lineno, "token = %d", parser->token);
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			switch (p[1]) {
			case '/':
				p++;
				parser->token = CAVAN_XML_TOKEN_TAG_END;
				break;

			case '?':
				p++;
				parser->token = CAVAN_XML_TOKEN_TAG_ATTR;
				break;

			case '!':
				if (text_lhcmp("--", p + 2) == 0) {
					p += 4;
					parser->comment = p;
					ret = cavan_xml_document_parse_comment(&p, p_end);
					if (ret < 0) {
						if (verbose) {
							pr_parser_error_info(lineno, "cavan_xml_document_parse_comment");
						}

						ret = -EFAULT;
						goto out_cavan_xml_token_error;
					}

					parser->token = CAVAN_XML_TOKEN_COMMENT;
					parser->pos = p + 1;
					parser->lineno = lineno + ret;
					return 0;
				}
			default:
				parser->token = CAVAN_XML_TOKEN_TAG_BEGIN;
			}

			if (byte_is_named(*++p) == false) {
				if (verbose) {
					pr_parser_error_info(lineno, "tag name is empty");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			parser->name = p;

			p = text_skip_name(p, p_end);
			if (parser->name == p) {
				if (verbose) {
					pr_parser_error_info(lineno, "tag name is empty");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			head = tail = p;
			break;

		case '?':
			if (parser->token == CAVAN_XML_TOKEN_NONE) {
				if (verbose) {
					pr_parser_error_info(lineno, "invalid '?'");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			parser->token = CAVAN_XML_TOKEN_TAG_ATTR;
			goto label_tag_single;

		case '/':
			if (parser->token == CAVAN_XML_TOKEN_NONE) {
				if (verbose) {
					pr_parser_error_info(lineno, "invalid '/'");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			parser->token = CAVAN_XML_TOKEN_TAG_SINGLE;

label_tag_single:
			if (*++p != '>') {
				if (verbose) {
					pr_parser_error_info(lineno, "need '>' by has '%c'", *p);
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			goto label_tag_end;

		case '>':
			if (parser->token == CAVAN_XML_TOKEN_NONE) {
				if (verbose) {
					pr_parser_error_info(lineno, "invalid '>'");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

label_tag_end:
			*tail = 0;
			if (cavan_xml_tag_is_content(parser->name)) {
				*tail = '>';
				parser->token = CAVAN_XML_TOKEN_COTENT;
			} else {
				parser->pos = ++p;
				parser->lineno = lineno;
			}
			return 0;

		case '=':
			p = text_skip_space_and_lf(p + 1, p_end);
			c = *p;
			if (c != '"' && c != '\'') {
				if (verbose) {
					pr_parser_error_info(lineno, "need a '\"' or '");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			value = ++p;

			ret = cavan_xml_attribute_parse_value(c, &p, p_end);
			if (ret < 0) {
				if (verbose) {
					pr_parser_error_info(lineno, "cavan_xml_attribute_parse_value");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			lineno += ret;
			*tail = 0;

			if (cavan_xml_attribute_set(&parser->attr, head, value, 0) == false) {
				if (verbose) {
					pr_parser_error_info(lineno, "cavan_xml_attribute_alloc");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			head = tail = ++p;
			break;

		default:
			if (parser->token == CAVAN_XML_TOKEN_NONE) {
				if (verbose) {
					pr_parser_error_info(lineno, "invalid content");
				}

				ret = -EFAULT;
				goto out_cavan_xml_token_error;
			}

			tail++, p++;
		}
	}

	ret = 0;
	parser->token = CAVAN_XML_TOKEN_EOF;

out_cavan_xml_token_error:
	attr = parser->attr;
	while (attr) {
		struct cavan_xml_attribute *next = attr->next;
		cavan_xml_attribute_free(attr);
		attr = next;
	}

	return ret;
}