Esempio n. 1
0
/* 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;
}
Esempio n. 2
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;
}
Esempio n. 3
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;
}