Ejemplo n.º 1
0
int hddDread(iop_file_t *f, iox_dirent_t *dirent)
{
	int				rv;
	hdd_file_slot_t *fileSlot=f->privdata;
	apa_cache_t 		*clink;

	if(!(f->mode & O_DIROPEN))
		return -ENOTDIR;

	if(fileSlot->parts[0].start==-1)
		return 0;// end :)

	WaitSema(fioSema);
	if((clink=apaCacheGetHeader(f->unit, fileSlot->parts[0].start, APA_IO_MODE_READ, &rv)) &&
		clink->header->length)
	{
		if(clink->header->flags & APA_FLAG_SUB) {
			// if sub get id from main header...
			apa_cache_t *cmain=apaCacheGetHeader(f->unit, clink->header->main, APA_IO_MODE_READ, &rv);
			if(cmain!=NULL){
			/*	This was the SONY original, which didn't do bounds-checking:
				rv=strlen(cmain->header->id);
				strcpy(dirent->name, cmain->header->id); */
				strncpy(dirent->name, cmain->header->id, APA_IDMAX);
				dirent->name[APA_IDMAX] = '\0';
				rv=strlen(dirent->name);

				apaCacheFree(cmain);
			}
		}
		else {
		/*	This was the SONY original, which didn't do bounds-checking:
			rv=strlen(clink->header->id);
			strcpy(dirent->name, clink->header->id); */
			strncpy(dirent->name, clink->header->id, APA_IDMAX);
			dirent->name[APA_IDMAX] = '\0';
			rv=strlen(dirent->name);
		}
		fioGetStatFiller(clink, &dirent->stat);
		if(clink->header->next==0)
			fileSlot->parts[0].start=-1;		// mark end
		else
			fileSlot->parts[0].start=clink->header->next;// set next
		apaCacheFree(clink);
	}
	SignalSema(fioSema);
	return rv;
}
Ejemplo n.º 2
0
int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat)
{
	apa_cache_t	*clink;
	apa_params_t	params;
	int			rv;

	if((rv=fioGetInput(name, &params))<0)
		return rv;

	WaitSema(fioSema);
	if((clink=apaFindPartition(f->unit, params.id, &rv))){
		if((rv=apaPassCmp(clink->header->fpwd, params.fpwd))==0 || (rv=apaPassCmp(clink->header->rpwd, params.rpwd))==0)
				fioGetStatFiller(clink, stat);
		apaCacheFree(clink);
	}
	SignalSema(fioSema);
	return rv;
}
Ejemplo n.º 3
0
int hddGetStat(iop_file_t *f, const char *name, iox_stat_t *stat)
{
	apa_cache	*clink;
	input_param	params;
	int			rv;

	if((rv=fioGetInput(name, &params))<0)
		return rv;

	WaitSema(fioSema);
	if((clink=apaFindPartition(f->unit, params.id, &rv))){
		if((rv=passcmp(clink->header->rpwd, NULL))==0)
				fioGetStatFiller(clink, stat);
		cacheAdd(clink);
	}
	SignalSema(fioSema);
	return rv;
}
Ejemplo n.º 4
0
int hddDread(iop_file_t *f, iox_dirent_t *dirent)
{
	int				rv;
	hdd_file_slot_t *fileSlot=f->privdata;
	apa_cache 		*clink;

	if(!(f->mode & O_DIROPEN))
		return -ENOTDIR;

	if(fileSlot->start==-1)
		return 0;// end :)

	WaitSema(fioSema);
	if((clink=cacheGetHeader(f->unit, fileSlot->start, 0, &rv)) &&
		clink->header->length)
	{
		if(clink->header->flags & APA_FLAG_SUB) {
			// if sub get id from main header...
			apa_cache *cmain=cacheGetHeader(f->unit, clink->header->main, 0, &rv);
			if(cmain!=NULL){
				rv=strlen(cmain->header->id);
				strcpy(dirent->name, cmain->header->id);
				cacheAdd(cmain);
			}
		}
		else {
			rv=strlen(clink->header->id);
			strcpy(dirent->name, clink->header->id);
		}
		fioGetStatFiller(clink, &dirent->stat);
		if(clink->header->next==0)
			fileSlot->start=-1;		// mark end
		else
			fileSlot->start=clink->header->next;// set next
		cacheAdd(clink);
	}
	SignalSema(fioSema);
	return rv;
}