예제 #1
0
파일: ow_parsename.c 프로젝트: M-o-a-T/owfs
/* 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);
}
예제 #2
0
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 ;
}
예제 #3
0
파일: file_cd.c 프로젝트: M-o-a-T/owfs
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;
		}
	}
}