/* Parse a path/file combination */ ZERO_OR_ERROR FS_ParsedNamePlus(const char *path, const char *file, struct parsedname *pn) { ZERO_OR_ERROR ret = 0; char *fullpath; if (path == NO_PATH) { path = "" ; } if (file == NULL) { file = "" ; } fullpath = owmalloc(strlen(file) + strlen(path) + 2); if (fullpath == NO_PATH) { RETURN_CODE_RETURN( 79 ) ; // unable to allocate memory } strcpy(fullpath, path); if (fullpath[strlen(fullpath) - 1] != '/') { strcat(fullpath, "/"); } strcat(fullpath, file); //printf("PARSENAMEPLUS path=%s pre\n",fullpath) ; ret = FS_ParsedName(fullpath, pn); //printf("PARSENAMEPLUS path=%s post\n",fullpath) ; owfree(fullpath); //printf("PARSENAMEPLUS free\n") ; return ret; }
/* Only error is if parsename fails */ GOOD_OR_BAD DS9490_root_dir( struct dirblob * db, struct connection_in * in ) { ASCII path[PATH_MAX] ; struct parsedname pn_root ; UCLIBCLOCK; /* Force this adapter with bus.n path */ snprintf(path, PATH_MAX, "/uncached/bus.%d", in->index); UCLIBCUNLOCK; if ( FS_ParsedName(path, &pn_root) != 0 ) { LEVEL_DATA("Cannot get root directory on [%s] Parsing %s error.", SAFESTRING(DEVICENAME(in)), path); return gbBAD ; } DirblobInit( db ) ; /* First time pretend there are devices */ pn_root.selected_connection->changed_bus_settings |= CHANGED_USB_SPEED ; // Trigger needing new configuration pn_root.selected_connection->overdrive = 0 ; // not overdrive at start pn_root.selected_connection->flex = Globals.usb_flextime ; SetReconnect(&pn_root) ; FS_dir( DS9490_dir_callback, db, &pn_root ) ; LEVEL_DEBUG("Finished FS_dir"); FS_ParsedName_destroy(&pn_root) ; return gbGOOD ; // Dirblob must be cleared by recipient. }
static void WildLexCD(struct cd_parse_s *cps, ASCII * match) { struct parsedname pn; LEVEL_DEBUG("FTP Wildcard patern matching: Path=%s, Pattern=%s, rest=%s", SAFESTRING(cps->buffer), SAFESTRING(match), SAFESTRING(cps->rest)); /* Check potential length */ if (strlen(cps->buffer) + OW_FULLNAME_MAX + 2 > PATH_MAX) { cps->ret = -ENAMETOOLONG; return; } if ( FS_ParsedName(cps->buffer, &pn) != 0 ) { cps->ret = -ENOENT; return; } if (!IsDir(&pn)) { cps->ret = -ENOTDIR; } else { struct wildlexcd wlcd = { NULL, match, cps, }; int root = (cps->buffer[1] == '\0'); wlcd.end = &cps->buffer[strlen(cps->buffer)]; if (root) { --wlcd.end; } wlcd.end[0] = '/'; FS_dir(WildLexCDCallback, &wlcd, &pn); if (root) { ++wlcd.end; } wlcd.end[0] = '\0'; // restore cps->buffer } FS_ParsedName_destroy(&pn); }
/* Create the Parsename structure in owq */ static GOOD_OR_BAD OWQ_parsename(const char *path, struct one_wire_query *owq) { struct parsedname *pn = PN(owq); if ( FS_ParsedName(path, pn) != 0 ) { return gbBAD ; } OWQ_cleanup(owq) |= owq_cleanup_pn ; return gbGOOD ; }
int OW_present(const char *path) { ssize_t ret = -ENOENT; /* current buffer string length */ if (API_access_start() == 0) { /* Check for prior init */ struct parsedname s_pn ; if (FS_ParsedName(path, &s_pn) != 0) { /* Can we parse the path string */ ret = -ENOENT; } else { FS_ParsedName_destroy(&s_pn); } API_access_end(); } return ReturnAndErrno(ret); }
ZERO_OR_ERROR FS_fstat(const char *path, struct stat *stbuf) { struct parsedname pn; ZERO_OR_ERROR ret = 0; LEVEL_CALL("path=%s", SAFESTRING(path)); /* Bad path */ if (FS_ParsedName(path, &pn) != 0 ) { return -ENOENT; } ret = FS_fstat_postparse(stbuf, &pn); FS_ParsedName_destroy(&pn); return ret; }
void FS_ParsedName_Placeholder( struct parsedname * pn ) { FS_ParsedName( NULL, pn ) ; // minimal parsename -- no destroy needed }
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; } } }