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; }
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; }
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; }
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; }
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; }