int ml_mkdir(struct afp_volume * vol, const char * path, mode_t mode) { int ret,rc; unsigned int result_did; char basename[AFP_MAX_PATH]; char converted_path[AFP_MAX_PATH]; unsigned int dirid; if (convert_path_to_afp(vol->server->path_encoding, converted_path,(char *) path,AFP_MAX_PATH)) return -EINVAL; if (invalid_filename(vol->server,path)) return -ENAMETOOLONG; if (volume_is_readonly(vol)) return -EACCES; ret=appledouble_mkdir(vol,path,mode); if (ret<0) return ret; if (ret==1) return 0; get_dirid(vol,converted_path,basename,&dirid); rc = afp_createdir(vol,dirid, basename,&result_did); switch (rc) { case kFPAccessDenied: ret = EACCES; break; case kFPDiskFull: ret = ENOSPC; break; case kFPObjectNotFound: ret = ENOENT; break; case kFPObjectExists: ret = EEXIST; break; case kFPVolLocked: ret = EBUSY; break; case kFPFlatVol: case kFPMiscErr: case kFPParamErr: case -1: ret = EFAULT; break; default: ret =0; } return -ret; }
int createdir(AFPObj *obj, uint16_t vid, cnid_t did, const char *name) { const int bufsize = 256; char buf[bufsize]; char *p = buf; int len = 0; ADD(p, len , 2); PUSHVAL(p, uint16_t, vid, len); PUSHVAL(p, cnid_t, did, len); len += push_path(&p, name); return afp_createdir(obj, buf, len, rbuf, &rbuflen); }