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; }
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; }
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; }