primitiveDirectoryCreate(void)
{
	// FilePlugin>>#primitiveDirectoryCreate
    sqInt dirName;
    char *dirNameIndex;
    sqInt dirNameSize;
    sqInt okToCreate;

	dirName = stackValue(0);
	if (!(isBytes(dirName))) {
		return primitiveFail();
	}
	dirNameIndex = firstIndexableField(dirName);

	/* If the security plugin can be loaded, use it to check for permission.
	   If not, assume it's ok */

	dirNameSize = byteSizeOf(dirName);
	if (sCCPfn != 0) {
		okToCreate =  ((sqInt (*)(char *, sqInt))sCCPfn)(dirNameIndex, dirNameSize);
		if (!okToCreate) {
return primitiveFail();
		}
	}
	if (!(dir_Create(dirNameIndex, dirNameSize))) {
		return primitiveFail();
	}
	pop(1);
}
EXPORT(sqInt) primitiveDirectoryCreate(void) {
    sqInt dirName;
    char * dirNameIndex;
    sqInt okToCreate;
    sqInt dirNameSize;

	dirName = interpreterProxy->stackValue(0);
	if (!(interpreterProxy->isBytes(dirName))) {
		return interpreterProxy->primitiveFail();
	}
	dirNameIndex = interpreterProxy->firstIndexableField(dirName);

	/* If the security plugin can be loaded, use it to check for permission.
	If not, assume it's ok */

	dirNameSize = interpreterProxy->byteSizeOf(dirName);
	if (sCCPfn != 0) {
		okToCreate =  ((sqInt (*)(char *, sqInt))sCCPfn)(dirNameIndex, dirNameSize);
		if (!(okToCreate)) {
			return interpreterProxy->primitiveFail();
		}
	}
	if (!(dir_Create(dirNameIndex, dirNameSize))) {
		return interpreterProxy->primitiveFail();
	}
	interpreterProxy->pop(1);
}
示例#3
0
文件: file.c 项目: kuriel07/Yggdrasil
file_File * file_OpenStatus(uchar * path, fat_FileSystem * fs, uchar status) {
	uchar a = 0x00;
	uchar entry_found = 0;
	file_File * file;
	uint16 i, length, j = 0;
	uint16 c;
	uchar skip;
	uchar file_name[SIZE_MAX_LFN];
	uint32 cluster_no;
	cluster_no = fs->cluster_begin_lba;
	file = (file_File *)efat_malloc(sizeof(file_File));
	file->entry = (fat_DirEntry *)efat_malloc(sizeof(fat_DirEntry));
	file->status = status;
	file->entry->attrib |= FAT_ATTR_DIR;		//set current file to root directory
	i = 0;
	while(entry_found==0) {
		fopen_get_next_entry:
		length = util_DirNameCopy(file_name, path + i);
		if(length == 0) {
			if(file->entry->attrib & FAT_ATTR_DIR) {	//check if directory
				file_Close(file);
				return 0;						//return null if directory
			}
			return file;
		}
		i += length;
		if(file_name[0] != 0) {		//eat empty space ex: \\libraries\\.. --> libraries\\..
			while((skip = fat_GetDirEntry(j, cluster_no, file->entry, fs)) !=0 ) {
				j += skip;
				if(util_DirNameCompare(file_name, file->entry->lfn)) {
					if(file->entry->attrib & FAT_ATTR_DIR) {
						cluster_no = fat_GetDataCluster(file->entry->cluster, fs); 
					} else {
						file->data_cluster = fat_GetDataCluster(file->entry->cluster, fs);
						if(a & FILE_MODE_APPEND) {
							file->file_ptr = file->entry->size - 1;
						} else {
							file->file_ptr = 0;
						}
						(fat_FileSystem *)file->fs = fs;
						file->status |= FILE_OPENED;		//set status
						file->current_cluster = file->data_cluster;		//set current cluster to 1st cluster
						file->current_offset = 0;
						return file;						//asumsi tidak ada file didalam file ??
					}
					j = 0;
					goto fopen_get_next_entry;
				}
			}
			if(status & FILE_OPEN_CREATE) {		//check if creation allowed
				if(path[i - 1] == '\\') {		//is directory?
					//use dir create
					dir_Create(cluster_no, file_name, file->entry, fs);				//create directory
					cluster_no = fat_GetDataCluster(file->entry->cluster, fs);
					j = 0;
					goto fopen_get_next_entry;
				} else {						//then file
					file_Create(cluster_no, file_name, file, fs);
					file->data_cluster = fat_GetDataCluster(file->entry->cluster, fs);
					if(a & FILE_MODE_APPEND) {
						file->file_ptr = file->entry->size - 1;
					} else {
						file->file_ptr = 0;
					}
					(fat_FileSystem *)file->fs = fs;
					file->status |= FILE_OPENED;		//set status
					file->current_cluster = file->data_cluster;		//set current cluster to 1st cluster
					file->current_offset = 0;
					return file;
				}
			}
			//file/directory tidak ditemukan
			file_Close(file);
			return 0;
		}
	}
	file_Close(file);
	return 0;	//file not found
}