static int ioctl2AttrDelete(pfs_cache_t *clink, void *arg) { pfs_aentry_t *aentry; if ((aentry = getAentry(clink, arg, NULL, PFS_AENTRY_MODE_DELETE)) == NULL) return -ENOENT; clink->flags |= PFS_CACHE_FLAG_DIRTY; return 0; }
int ioctl2AttrDelete(pfs_cache_t *clink, void *arg) { pfs_aentry_t *aentry; if((aentry=getAentry(clink, arg, 0, 2))==NULL) return -ENOENT; clink->flags|=CACHE_FLAG_DIRTY; return 0; }
static int ioctl2AttrLookUp(pfs_cache_t *clink, char *key, char *value) { pfs_aentry_t *aentry; if ((aentry = getAentry(clink, key, NULL, PFS_AENTRY_MODE_LOOKUP)) != NULL) { memcpy(value, &aentry->str[aentry->kLen], aentry->vLen); value[aentry->vLen] = 0; return aentry->vLen; } return -ENOENT; }
int ioctl2AttrLoopUp(pfs_cache_t *clink, char *key, char *value) { pfs_aentry_t *aentry; if((aentry=getAentry(clink, key, 0, 0))){ memcpy(value, &aentry->str[aentry->kLen], aentry->vLen); value[aentry->vLen]=0; return aentry->vLen; } return -ENOENT; }
static int ioctl2AttrAdd(pfs_cache_t *clink, pfs_ioctl2attr_t *attr) { u32 kLen, vLen; pfs_aentry_t *aentry; u32 tmp; // input check kLen = strlen(attr->key); vLen = strlen(attr->value); if (kLen >= PFS_AENTRY_KEY_MAX || vLen >= PFS_AENTRY_VALUE_MAX) // max size bounds check return -EINVAL; if (kLen == 0 || vLen == 0) // no input check return -EINVAL; if (getAentry(clink, attr->key, NULL, PFS_AENTRY_MODE_LOOKUP)) return -EEXIST; if ((aentry = getAentry(clink, attr->key, attr->value, PFS_AENTRY_MODE_ADD)) == NULL) return -ENOSPC; if (aentry->kLen == 0) tmp = aentry->aLen; else tmp = aentry->aLen - ((aentry->kLen + (aentry->vLen + 7)) & 0x3FC); //The only case that uses 0x3FC within the whole PFS driver. aentry->aLen -= tmp; aentry = (pfs_aentry_t *)((u8 *)aentry + aentry->aLen); aentry->kLen = kLen; aentry->vLen = vLen; aentry->aLen = tmp; memcpy(&aentry->str[0], attr->key, aentry->kLen); memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen); clink->flags |= PFS_CACHE_FLAG_DIRTY; return 0; }
int ioctl2AttrAdd(pfs_cache_t *clink, pfs_ioctl2attr_t *attr) { u32 kLen, vLen; pfs_aentry_t *aentry; u32 tmp; // input check kLen=strlen(attr->key); vLen=strlen(attr->value); if(kLen>=256 || vLen>=256) // max size safe e check return -EINVAL; if(kLen==0 || vLen==0) // no input check return -EINVAL; if(getAentry(clink, attr->key, NULL, 0)) return -EEXIST; if(!(aentry=getAentry(clink, attr->key, attr->value, 1))) return -ENOSPC; if(aentry->kLen==0) tmp=aentry->aLen; else tmp=aentry->aLen-((aentry->kLen+(aentry->vLen + 7)) & ~3); aentry->aLen-=tmp; (char *)aentry+=aentry->aLen; aentry->kLen=kLen; aentry->vLen=vLen; aentry->aLen=tmp; memcpy(&aentry->str[0], attr->key, aentry->kLen); memcpy(&aentry->str[aentry->kLen], attr->value, aentry->vLen); clink->flags|=CACHE_FLAG_DIRTY; return 0; }