Exemplo n.º 1
0
Arquivo: nftw.c Projeto: vocho/openqnx
static int directory(struct nftw *state, struct stat64 *st)
{
struct dirent64	*dp;
#ifndef FTW_USE_SEEKDIR
struct dirent64	*cached;
#endif
int				prefix, result;

	if ((result = enterdir(state)) == 0) {
		if ((state->flags & FTW_DEPTH) || ((result = (*state->invoke)(state, st, (!(state->flags & FTW_CHDIR) || eaccess(state->pathname, X_OK) != -1) ? FTW_D : FTW_DNR)) == 0 && state->action != FTW_SKD)) {
			if (!(state->flags & FTW_CHDIR) || (result = chdir(state->pathname)) == 0) {
				state->stem += strlen(&state->pathname[prefix = state->stem]) + (state->stem != 0 ? 1 : 0);
				++state->depth;
#ifdef FTW_USE_SEEKDIR
				while ((result = direntry(state, state->dirs, &dp)) == 0 && dp != NULL) {
					if ((result = process(state, dp)) != 0 || state->action == FTW_SKR)
						break;
					if (state->dirs->dir == NULL && (result = unspillfds(state, &state->pathname[(state->stem > 1) ? state->stem - 1 : 1])) != 0)
						break;
				}
#else
				while ((result = direntry(state, state->dirs, &dp)) == 0 && dp != NULL) {
					if ((result = process(state, dp)) != 0 || state->action == FTW_SKR)
						break;
					if (state->dirs->dir == NULL) {
						if ((cached = state->dirs->contents) != NULL) {
							do {
								if ((result = process(state, cached)) != 0 || state->action == FTW_SKR)
									break;
							} while ((cached = (struct dirent64 *)((char *)cached + cached->d_reclen)) < (struct dirent64 *)((char *)state->dirs->contents + state->dirs->size));
						}
						break;
					}
				}
#endif
				--state->depth;
				state->pathname[(state->stem > 1) ? state->stem - 1 : 1] = '\0', state->stem = prefix;
				if (result == 0 && (!(state->flags & FTW_CHDIR) || (result = cd(state, &state->pathname[(prefix > 1) ? prefix - 1 : 1])) == 0)) {
					if (state->flags & FTW_DEPTH)
						result = (*state->invoke)(state, st, FTW_DP);
				}
			}
			else if (errno == EACCES) {
				result = (state->flags & FTW_DEPTH) ? (*state->invoke)(state, st, FTW_DNR) : 0;
			}
			else {
				state->error = errno;
			}
		}
		exitdir(state);
	}
	else if (state->error == EACCES) {
		result = (*state->invoke)(state, st, FTW_DNR);
	}
	return(result);
}
Exemplo n.º 2
0
Arquivo: nftw.c Projeto: vocho/openqnx
static int spillfds(struct nftw *state)
{
struct directory	*d;
#ifndef FTW_USE_SEEKDIR
struct dirent64		*dp, *grow;
int					len, result;
#endif

	for (d = state->dirs; d->dir == NULL; d = d->link)
		;
#ifdef FTW_USE_SEEKDIR
	if ((d->posn = telldir(d->dir)) == -1)
		return(-1);
#else
	(void)dircntl(d->dir, D_SETFLAG, dircntl(d->dir, D_GETFLAG) & ~D_FLAG_STAT);
	for (len = 0; (result = direntry(state, d, &dp)) == 0 && dp != NULL; len += dp->d_reclen) {
		if (len + dp->d_reclen > d->size) {
			if ((grow = realloc(d->contents, d->size += PATH_MAX)) == NULL) {
				free(d->contents), d->contents = NULL, d->size = 0;
				return(-1);
			}
			d->contents = grow;
		}
		memcpy((char *)d->contents + len, dp, dp->d_reclen);
	}
	if (result != 0) {
		free(d->contents), d->contents = NULL, d->size = 0;
		return(-1);
	}
	d->contents = (len != 0) ? realloc(d->contents, d->size = len) : NULL;
#endif
	closedir(d->dir), d->dir = NULL;
	++state->limit;
	return(0);
}
Exemplo n.º 3
0
void Directory::AddInfo(Biop::Directory &dir) {
    for (std::list<Biop::Binding>::iterator it=dir.bindings.begin(); it != dir.bindings.end(); ++it) {
        TemporaryDirectoryEntry::Ptr direntry(new TemporaryDirectoryEntry( ((Biop::BiopProfileBody *)(*it).ior.body.getPointer())->obj_loc.carousel_id,
                                              ((Biop::BiopProfileBody *)(*it).ior.body.getPointer())->obj_loc.module_id,
                                              ((Biop::BiopProfileBody *)(*it).ior.body.getPointer())->obj_loc.objkey,
                                              (*it).name.comps.front().id ) );
        //std::list<CacheObject::Ptr> *izgosh=&toBeAssigned;
        toBeAssigned.push_back(direntry);
    }
}
Exemplo n.º 4
0
int
fatfindfile(char *fname)
{
	int		rc, i, j;

	putstr("--MBR--\n");
	rc = readblock(DOSBBSECTOR, buf);

	if (dos_partition(0)->dp_typ != 6) {
		putstr("bad partition type\n");
		return -1;
	};

	start = getulong(dos_partition(0)->dp_start);
	dump_long("start ", start);

	putstr("--BOOT--\n");
	rc = readblock(start, buf);
	if (getushort(bootsector->bpbBytesPerSec) != 512) {
		putstr("bad sector size\n");
		return -1;
	};

	cluster_size = bootsector->bpbSecPerClust;
	dump_long("cluster_size ", cluster_size);

	start_fat = start + getushort(bootsector->bpbResSectors);
	dump_long("start_fat ", start_fat);

	root_size = getushort(bootsector->bpbRootDirEnts);
	root_size = (root_size * 32+511)/512;
	dump_long("root_size ", root_size);

	dump_long("FATsecs ", getushort(bootsector->bpbFATsecs));
	dump_long("FATs ", bootsector->bpbFATs);
	start_root = start_fat + bootsector->bpbFATs * getushort(bootsector->bpbFATsecs);
	start = start_root + root_size - 2 * cluster_size; /* first data sector for 0-based clusters */
	dump_long("start_root ", start_root);

	current_cluster = 0;

	putstr("--ROOT--\n");
	for(j = 0; j<root_size; j++) {
		rc = readblock(start_root + j, buf);
		for(i = 0; i<16; i++) {
			rc = (direntry(i)->deName)[0];
			if (rc == SLOT_EMPTY || rc == SLOT_DELETED) continue;

			rc = direntry(i)->deAttributes & (ATTR_VOLUME|ATTR_DIRECTORY);
			if (rc) continue;

			current_cluster = getushort(direntry(i)->deStartCluster);
			bytes_left = getulong(direntry(i)->deFileSize);

			putstr(direntry(i)->deName);
			putnl();
			/* printf("%12s %02x %ld %ld\n", 
					direntry(i)->deName, 
					direntry(i)->deAttributes & 0x18, 
					current_cluster,
					bytes_left
					); */

			if (!strncmp(direntry(i)->deName, fname, 11)) {
				break;
			};
			current_cluster = 0;
		};
		if (current_cluster) break;
	};

	if (!current_cluster) {
		putstr("file not found\n");
		return -1;
	};
	current_sector = 0;
	putstr("File ok\n");
	return 0;
}
Exemplo n.º 5
0
//returns true if the specified file exists
UtlBoolean OsFileSystem::exists(const OsPath& filename)
{
    OsDir direntry(filename);

    return direntry.exists();
}