Esempio n. 1
0
static int get_unixprivs(struct afp_volume * volume,
	unsigned int dirid, 
	const char * path, struct afp_file_info * fp) 
{
	
	switch (ll_get_directory_entry(volume,(char *)path,
		dirid, kFPUnixPrivsBit,kFPUnixPrivsBit,fp)) {
	case kFPAccessDenied:
		return -EACCES;
	case kFPObjectNotFound:
		return -ENOENT;
	case kFPNoErr:
		break;
	case kFPBitmapErr:
	case kFPMiscErr:
	case kFPParamErr:
	default:
		return -EIO;

	}
	return 0;
}
Esempio n. 2
0
int appledouble_read(struct afp_volume * volume, struct afp_file_info *fp,
	char * buf, size_t size, off_t offset, size_t * amount_read,
	int * eof)
{
	int tocopy;
	int ret;
	struct afp_comment comment;
	*amount_read=0;
	*eof=0;

	comment.data=malloc(size);
	comment.maxsize=size;

	switch(fp->resource) {
		case AFP_META_RESOURCE:
			ret=ll_read(volume,buf,size,offset,fp->forkid,eof);
			return ret;
		case AFP_META_APPLEDOUBLE:
			return -EBADF;
		case AFP_META_FINDERINFO:
			if (offset>32) return -EFAULT;
			ret=ll_get_directory_entry(volume,fp->basename,fp->did,
				kFPFinderInfoBit,kFPFinderInfoBit,fp);
			if (ret<0) return ret;
			tocopy=min(size,(32-offset));
			memcpy(buf+offset,fp->finderinfo,tocopy);
			if (offset+tocopy==32) *eof=1;
			*amount_read=tocopy;
		case AFP_META_COMMENT:
			if (fp->eof)  ret=1;  else 
			switch(afp_getcomment(volume,fp->did, fp->basename, &comment)) {
				case kFPAccessDenied:
					ret=-EACCES;
					break;
				case kFPMiscErr:
				case kFPParamErr:
					ret=-EIO;
					break;
				case kFPItemNotFound:
				case kFPObjectNotFound:
					ret=-ENOENT;
					break;
				case kFPNoErr:
					memcpy(buf,comment.data,comment.size);
					*amount_read =comment.size;
					ret=1;
					*eof=1;
					fp->eof=1;
				default:
				break;
			}
			free(comment.data);
			return ret;
		case AFP_META_SERVER_ICON:
			if (offset>256) return -EFAULT;
			tocopy=min(size,(256-offset));
			memcpy(buf+offset,volume->server->basic.icon,tocopy);
			*eof=1;
			fp->eof=1;
			*amount_read=tocopy;
			return 1;
	}
	return 0;
}
Esempio n. 3
0
int appledouble_write(struct afp_volume * volume, struct afp_file_info *fp,
                const char *data, size_t size, off_t offset, size_t *totalwritten)
{
	int ret;
	int towrite=size;
	unsigned int did;
	struct afp_file_info fp2;

	switch(fp->resource) {
		case AFP_META_RESOURCE:
			ret=ll_write(volume,data,size,offset,
				fp->forkid,totalwritten);
			return ret;
		case AFP_META_APPLEDOUBLE:
			return -EBADF;
		case AFP_META_FINDERINFO:
			if (offset>=32) return -EINVAL;
			if (towrite>(32-offset)) towrite=32-offset;

			/* Get the previous finderinfo */
			ret=ll_get_directory_entry(volume,fp->basename,fp->did,
				kFPFinderInfoBit,kFPFinderInfoBit,&fp2);
			if (ret<0) return ret;

			/* Copy in only the parts we got */
			memcpy(fp->finderinfo+offset,data,towrite);

			ret=afp_setfiledirparms(volume,
					fp->did,fp->basename,
					kFPFinderInfoBit, fp);
			switch(ret) {
				case kFPNoErr:
					break;
				case kFPAccessDenied:
					return -EACCES;
				case kFPObjectNotFound:
					return -ENOENT;
				case kFPBitmapErr:
				case kFPMiscErr:
				case kFPObjectTypeErr:
				case kFPParamErr:
				default:
					break;

			}
			*totalwritten=towrite;

			return 1;
		case AFP_META_COMMENT:
			switch(afp_addcomment(volume, fp->did,fp->basename,
				(char *)data,(uint64_t *) totalwritten)) {
			case kFPAccessDenied:
				return -EACCES;
			case kFPObjectNotFound:
				return -ENOENT;
			case kFPNoErr:
                		*totalwritten=size;
				return 1;
			case kFPMiscErr:
			default:
				return -EIO;
			}
		case AFP_META_SERVER_ICON:
			return -EPERM;

	}
	return 0;


}