/* FIXME: should do bounds checking */ int parse_reply_block(struct afp_server *server, char * buf, unsigned int size, unsigned char isdir, unsigned int filebitmap, unsigned int dirbitmap, struct afp_file_info * filecur) { unsigned short bitmap; char * p2; memset(filecur,0,sizeof(struct afp_file_info)); filecur->isdir=isdir; p2=buf; if (isdir) bitmap=dirbitmap ; else bitmap=filebitmap; if (bitmap & kFPAttributeBit) { unsigned short * attr = (void *) p2; filecur->attributes=ntohs(*attr); p2+=2; } if (bitmap & kFPParentDirIDBit) { unsigned int * did= (void *) p2; filecur->did=ntohl(*did); p2+=4; } if (bitmap & kFPCreateDateBit) { unsigned int * date= (void *) p2; filecur->creation_date=AD_DATE_TO_UNIX(*date); p2+=4; } if (bitmap & kFPModDateBit) { unsigned int * date= (void *) p2; filecur->modification_date=AD_DATE_TO_UNIX(*date); p2+=4; } if (bitmap & kFPBackupDateBit) { unsigned int * date= (void *) p2; filecur->backup_date=AD_DATE_TO_UNIX(*date); p2+=4; } if (bitmap & kFPFinderInfoBit) { memcpy(filecur->finderinfo,p2,32); p2+=32; } if (bitmap & kFPLongNameBit) { unsigned short *offset = (void *) p2; copy_from_pascal(filecur->name,buf+(ntohs(*offset)),AFP_MAX_PATH); p2+=2; } if (bitmap & kFPShortNameBit) { p2+=2; } if (bitmap & kFPNodeIDBit) { unsigned int * id = (void *) p2; filecur->fileid=ntohl(*id); p2+=4; } if (isdir) { if (bitmap & kFPOffspringCountBit) { unsigned short *offspring = (void *) p2; filecur->offspring=ntohs(*offspring); p2+=2; } if (bitmap & kFPOwnerIDBit) { unsigned int * owner= (void *) p2; filecur->unixprivs.uid=ntohl(*owner); p2+=4; } if (bitmap & kFPGroupIDBit) { unsigned int * group= (void *) p2; filecur->unixprivs.gid=ntohl(*group); p2+=4; } if (bitmap & kFPAccessRightsBit) { unsigned int * access= (void *) p2; filecur->accessrights=ntohl(*access); p2+=4; } } else { if (bitmap & kFPDataForkLenBit) { unsigned int * len = (void *) p2; filecur->size=ntohl(*len); p2+=4; } if (bitmap & kFPRsrcForkLenBit) { unsigned int * size = (void *) p2; filecur->resourcesize=ntohl(*size); p2+=4; } if (bitmap & kFPExtDataForkLenBit) { unsigned long long * len = (void *) p2; filecur->size=ntoh64(*len); p2+=8; } if (bitmap & kFPLaunchLimitBit) { p2+=2; } } if (bitmap & kFPUTF8NameBit) { unsigned short *offset = (void *) p2; copy_from_pascal_two(filecur->name,buf+(ntohs(*offset))+4, AFP_MAX_PATH); p2+=2; p2+=4; } if (bitmap & kFPExtRsrcForkLenBit) { unsigned long long * size = (void *) p2; filecur->resourcesize=ntoh64(*size); p2+=8; } if (bitmap & kFPUnixPrivsBit) { struct afp_unixprivs *unixpriv = (void *) p2; filecur->unixprivs.uid=ntohl(unixpriv->uid); filecur->unixprivs.gid=ntohl(unixpriv->gid); filecur->unixprivs.permissions=ntohl(unixpriv->permissions); filecur->unixprivs.ua_permissions=ntohl(unixpriv->ua_permissions); p2+=sizeof(*unixpriv); } return 0; }
static int parse_volbitmap_reply(struct afp_server * server, struct afp_volume * tmpvol, unsigned short bitmap,char * msg,unsigned int size) { char * p = msg; unsigned short name_offset = 0; #define checksize { if (p>msg+size) return -1; } if (bitmap & kFPVolAttributeBit) { unsigned short *attr = (void *) p; checksize tmpvol->attributes=ntohs(*attr); p+=2; } if (bitmap & kFPVolSignatureBit) { unsigned short *sig = (void *) p; tmpvol->signature=ntohs(*sig); p+=2; } if (bitmap & kFPVolCreateDateBit) { unsigned int *date = (void *) p; tmpvol->creation_date = AD_DATE_TO_UNIX(*date); p+=4; } if (bitmap & kFPVolModDateBit) { unsigned int *date = (void *) p; tmpvol->modification_date = AD_DATE_TO_UNIX(*date); p+=4; } if (bitmap & kFPVolBackupDateBit) { unsigned int *date = (void *) p; tmpvol->backup_date = AD_DATE_TO_UNIX(*date); p+=4; } if (bitmap & kFPVolIDBit) { unsigned short *discovered_volid = (void *) p; tmpvol->volid=ntohs(*discovered_volid); p+=2; } if (bitmap & kFPVolBytesFreeBit) { unsigned int * size = (void *) p; tmpvol->stat.f_bfree=ntohl(*size); p+=4; } if (bitmap & kFPVolBytesTotalBit) { unsigned int * size = (void *) p; tmpvol->stat.f_blocks=ntohl(*size); p+=4; } if (bitmap & kFPVolNameBit) { unsigned short * name_offset_p = (void *) p; name_offset = ntohs(*name_offset_p); p+=2; } if (bitmap & kFPVolExtBytesFreeBit) { uint64_t * size = (void *) p; tmpvol->stat.f_bfree=ntoh64(*size); p+=8; } if (bitmap & kFPVolExtBytesTotalBit) { uint64_t * size = (void *) p; tmpvol->stat.f_blocks=ntoh64(*size); p+=8; } if (bitmap & kFPVolBlockSizeBit) { unsigned int *size = (void *) p; tmpvol->stat.f_bsize=ntohl(*size); p+=4; } return 0; }
/* uname - UNIX name * fname - our fname (translated to UNIX) * cidx - index in directory stack */ static int crit_check(struct vol *vol, struct path *path) { int result = 0; u_int16_t attr, flags = CONV_PRECOMPOSE; struct finderinfo *finfo = NULL, finderinfo; struct adouble *adp = NULL; time_t c_date, b_date; u_int32_t ac_date, ab_date; static char convbuf[514]; /* for convert_charset dest_len parameter +2 */ size_t len; int islnk; islnk=S_ISLNK(path->st.st_mode); if (S_ISDIR(path->st.st_mode)) { if (!c1.dbitmap) return 0; } else { if (!c1.fbitmap) return 0; /* compute the Mac name * first try without id (it's slow to find it) * An other option would be to call get_id in utompath but * we need to pass parent dir */ if (!(path->m_name = utompath(vol, path->u_name, 0 , utf8_encoding()) )) { /*retry with the right id */ cnid_t id; adp = adl_lkup(vol, path, adp); id = get_id(vol, adp, &path->st, path->d_dir->d_did, path->u_name, strlen(path->u_name)); if (!id) { /* FIXME */ return 0; } /* save the id for getfilparm */ path->id = id; if (!(path->m_name = utompath(vol, path->u_name, id , utf8_encoding()))) { return 0; } } } /* Kind of optimization: * -- first check things we've already have - filename * -- last check things we get from ad_open() * FIXME strmcp strstr (icase) */ /* Check for filename */ if ((c1.rbitmap & (1<<DIRPBIT_LNAME))) { if ( (size_t)(-1) == (len = convert_string(vol->v_maccharset, CH_UCS2, path->m_name, -1, convbuf, 512)) ) goto crit_check_ret; if ((c1.rbitmap & (1<<CATPBIT_PARTIAL))) { if (strcasestr_w( (ucs2_t*) convbuf, (ucs2_t*) c1.lname) == NULL) goto crit_check_ret; } else if (strcasecmp_w((ucs2_t*) convbuf, (ucs2_t*) c1.lname) != 0) goto crit_check_ret; } if ((c1.rbitmap & (1<<FILPBIT_PDINFO))) { if ( (size_t)(-1) == (len = convert_charset( CH_UTF8_MAC, CH_UCS2, CH_UTF8, path->m_name, strlen(path->m_name), convbuf, 512, &flags))) { goto crit_check_ret; } if (c1.rbitmap & (1<<CATPBIT_PARTIAL)) { if (strcasestr_w((ucs2_t *) convbuf, (ucs2_t*)c1.utf8name) == NULL) goto crit_check_ret; } else if (strcasecmp_w((ucs2_t *)convbuf, (ucs2_t*)c1.utf8name) != 0) goto crit_check_ret; } /* FIXME */ if ((unsigned)c2.mdate > 0x7fffffff) c2.mdate = 0x7fffffff; if ((unsigned)c2.cdate > 0x7fffffff) c2.cdate = 0x7fffffff; if ((unsigned)c2.bdate > 0x7fffffff) c2.bdate = 0x7fffffff; /* Check for modification date */ if ((c1.rbitmap & (1<<DIRPBIT_MDATE))) { if (path->st.st_mtime < c1.mdate || path->st.st_mtime > c2.mdate) goto crit_check_ret; } /* Check for creation date... */ if ((c1.rbitmap & (1<<DIRPBIT_CDATE))) { c_date = path->st.st_mtime; adp = adl_lkup(vol, path, adp); if (adp && ad_getdate(adp, AD_DATE_CREATE, &ac_date) >= 0) c_date = AD_DATE_TO_UNIX(ac_date); if (c_date < c1.cdate || c_date > c2.cdate) goto crit_check_ret; } /* Check for backup date... */ if ((c1.rbitmap & (1<<DIRPBIT_BDATE))) { b_date = path->st.st_mtime; adp = adl_lkup(vol, path, adp); if (adp && ad_getdate(adp, AD_DATE_BACKUP, &ab_date) >= 0) b_date = AD_DATE_TO_UNIX(ab_date); if (b_date < c1.bdate || b_date > c2.bdate) goto crit_check_ret; } /* Check attributes */ if ((c1.rbitmap & (1<<DIRPBIT_ATTR)) && c2.attr != 0) { if ((adp = adl_lkup(vol, path, adp))) { ad_getattr(adp, &attr); if ((attr & c2.attr) != c1.attr) goto crit_check_ret; } else goto crit_check_ret; } /* Check file type ID */ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.f_type != 0) { finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); if (finfo->f_type != c1.finfo.f_type) goto crit_check_ret; } /* Check creator ID */ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.creator != 0) { if (!finfo) { finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); } if (finfo->creator != c1.finfo.creator) goto crit_check_ret; } /* Check finder info attributes */ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.attrs != 0) { if (!finfo) { finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); } if ((finfo->attrs & c2.finfo.attrs) != c1.finfo.attrs) goto crit_check_ret; } /* Check label */ if ((c1.rbitmap & (1<<DIRPBIT_FINFO)) && c2.finfo.label != 0) { if (!finfo) { finfo = unpack_finderinfo(vol, path, &adp, &finderinfo,islnk); } if ((finfo->label & c2.finfo.label) != c1.finfo.label) goto crit_check_ret; } /* FIXME: Attributes check ! */ /* All criteria are met. */ result |= 1; crit_check_ret: if (adp != NULL) ad_close_metadata(adp); return result; }