/* Parse a path/file combination */ ZERO_OR_ERROR FS_ParsedNamePlusText(const char *path, const char *file, const char *extension, struct parsedname *pn) { char name[OW_FULLNAME_MAX]; UCLIBCLOCK; snprintf(name, OW_FULLNAME_MAX, "%s.%s", file, extension ); UCLIBCUNLOCK; return FS_ParsedNamePlus(path, name, pn); }
static GOOD_OR_BAD OWQ_parsename_plus(const char *path, const char * file, struct one_wire_query *owq) { struct parsedname *pn = PN(owq); if ( FS_ParsedNamePlus(path, file, pn) != 0 ) { return gbBAD ; } OWQ_cleanup(owq) |= owq_cleanup_pn ; return gbGOOD ; }
void FileLexCD(struct cd_parse_s *cps) { struct parsedname pn; while (1) { switch (cps->pse) { case parse_status_init: LEVEL_DEBUG("FTP parse_status_init Path<%s> File <%s>", cps->buffer, cps->rest); /* cps->buffer is absolute */ /* trailing / only at root */ cps->ret = 0; cps->solutions = 0; cps->dir = NULL; if (cps->rest == NULL || cps->rest[0] == '\0') { cps->pse = parse_status_tame; } else { if (cps->rest[0] == '/') { // root (absolute) specification cps->buffer[1] = '\0'; ++cps->rest; } cps->pse = parse_status_init2; } break; case parse_status_init2: LEVEL_DEBUG("FTP parse_status_init2 Path<%s> File <%s>", cps->buffer, cps->rest); /* cps->buffer is absolute */ /* trailing / only at root */ if ((cps->rest[0] == '.' && cps->rest[1] == '.') || strpbrk(cps->rest, "*[?")) { cps->pse = parse_status_back; } else { cps->pse = parse_status_tame; } break; case parse_status_back: LEVEL_DEBUG("FTP parse_status_back Path<%s> File <%s>", cps->buffer, cps->rest); /* cps->buffer is absolute */ /* trailing / only at root */ if (cps->rest[0] == '.' && cps->rest[1] == '.') { // Move back ASCII *back = strrchr(cps->buffer, '/'); back[1] = '\0'; // look for next file part if (cps->rest[2] == '\0') { cps->pse = parse_status_last; cps->rest = NULL; } else if (cps->rest[2] == '/') { cps->pse = parse_status_next; cps->rest = &cps->rest[3]; } else { cps->ret = -ENOENT; return; } } else { cps->pse = parse_status_next; // off the double dot trail } break; case parse_status_next: LEVEL_DEBUG("FTP parse_status_next Path<%s> File <%s>", cps->buffer, cps->rest); /* cps->buffer is absolute */ /* trailing / only at root */ if (cps->rest == NULL || cps->rest[0] == '\0') { cps->pse = parse_status_last; } else { ASCII *oldrest = strsep(&cps->rest, "/"); if (strpbrk(oldrest, "*[?")) { WildLexCD(cps, oldrest); return; } else { if (strlen(cps->buffer) + strlen(oldrest) + 4 > PATH_MAX) { cps->ret = -ENAMETOOLONG; return; } if (cps->buffer[1]) { strcat(cps->buffer, "/"); } strcat(cps->buffer, oldrest); cps->pse = parse_status_next; } } break; case parse_status_tame: LEVEL_DEBUG("FTP parse_status_tame Path<%s> File <%s>", cps->buffer, cps->rest); /* cps->buffer is absolute */ /* trailing / only at root */ if (cps->rest && (strlen(cps->buffer) + strlen(cps->rest) + 4 > PATH_MAX)) { cps->ret = -ENAMETOOLONG; return; } if (cps->buffer[1]) { strcat(cps->buffer, "/"); } strcat(cps->buffer, cps->rest); if (FS_ParsedName(cps->buffer, &pn) == 0) { if (IsDir(&pn)) { ++cps->solutions; if (cps->solutions == 1) { cps->dir = strdup(pn.path); } } else { cps->ret = -ENOTDIR; } FS_ParsedName_destroy(&pn); } else { cps->ret = -ENOENT; } return; case parse_status_last: LEVEL_DEBUG("FTP parse_status_last Path<%s> File <%s>", cps->buffer, cps->rest); /* cps->buffer is absolute */ /* trailing / only at root */ if (cps->rest && (strlen(cps->buffer) + strlen(cps->rest) + 4 > PATH_MAX)) { cps->ret = -ENAMETOOLONG; return; } if (FS_ParsedNamePlus(cps->buffer, cps->rest, &pn) == 0) { if (IsDir(&pn)) { ++cps->solutions; if (cps->solutions == 1) { cps->dir = strdup(pn.path); } } else { cps->ret = -ENOTDIR; } FS_ParsedName_destroy(&pn); } return; } } }