示例#1
0
int nval_get(const char *xb, int xb_size, const YCHAR *name, char *buf, int bsize)
{
	int pos = nval_find(xb,xb_size,name,NULL);
	int size;

	if(pos >= 0 && pos< xb_size){

		memcpy(&size,xb +pos,sizeof(int));
		pos+=sizeof(int); /* advance past record length */
		size -= sizeof(int);

		/* Advance over name string */
		while(xb[pos] && size > 0 && pos < xb_size){
			pos++;
			size--;
		}
		/*Advance over NUL */
		pos++;
		size--;

		if(size <= bsize){
			memcpy(buf,xb + pos,size);
			return size;
		}

	}
	if(pos >= 0)
		return -ERANGE;
	else
		return -ENODATA;
}
示例#2
0
int nval_del(char *xb, int xb_size, const YCHAR *name)
{
	int pos  = nval_find(xb, xb_size, name, NULL);
	int size;

	if(pos >= 0 && pos < xb_size){
		/* Find size, shift rest over this record, then zero out the rest of buffer */
		memcpy(&size,xb+pos,sizeof(int));
		memcpy(xb + pos, xb + pos + size, xb_size - (pos + size));
		memset(xb + (xb_size - size),0,size);
		return 0;
	} else
		return -ENODATA;
}
int nval_set(char *xb, int xb_size, const YCHAR * name, const char *buf,
	     int bsize, int flags)
{
	int pos;
	int namelen = strnlen(name, xb_size);
	int reclen;
	int size_exist = 0;
	int space;
	int start;

	pos = nval_find(xb, xb_size, name, &size_exist);

	if (flags & XATTR_CREATE && pos >= 0)
		return -EEXIST;
	if (flags & XATTR_REPLACE && pos < 0)
		return -ENODATA;

	start = nval_used(xb, xb_size);
	space = xb_size - start + size_exist;

	reclen = (sizeof(int) + namelen + 1 + bsize);

	if (reclen > space)
		return -ENOSPC;

	if (pos >= 0) {
		nval_del(xb, xb_size, name);
		start = nval_used(xb, xb_size);
	}

	pos = start;

	memcpy(xb + pos, &reclen, sizeof(int));
	pos += sizeof(int);
	strncpy((YCHAR *) (xb + pos), name, reclen);
	pos += (namelen + 1);
	memcpy(xb + pos, buf, bsize);
	return 0;
}