/* * This routine assumes that the attributes are hashed already */ static CSA_return_code _DtCmsGetOldCalAttrNames( _DtCmsCalendar *cal, uint *num_names_r, cms_attr_name **names_r) { CSA_return_code stat = CSA_SUCCESS; cms_attr_name *names; uint i, j; if ((names = (cms_attr_name *)calloc(1, sizeof(cms_attr_name)*_DtCM_OLD_CAL_ATTR_SIZE)) == NULL) return (CSA_E_INSUFFICIENT_MEMORY); for (i = 1, j = 0; i <= _DtCM_DEFINED_CAL_ATTR_SIZE; i++) { if ((_CSA_cal_attr_info[i].fst_vers > 0 && _CSA_cal_attr_info[i].fst_vers <= cal->fversion) || i == CSA_CAL_ATTR_CALENDAR_SIZE_I) { if ((names[j].name = strdup(_CSA_calendar_attribute_names[i])) == NULL) { _DtCmsFreeCmsAttrNames(j, names); return (CSA_E_INSUFFICIENT_MEMORY); } else { names[j].num = i; j++; } } } *num_names_r = j; *names_r = names; return (CSA_SUCCESS); }
extern CSA_return_code _DtCmsGetCalAttrNames( _DtCmsCalendar *cal, uint *num_names_r, cms_attr_name **names_r) { CSA_return_code stat = CSA_SUCCESS; cms_attribute *attrs = cal->attrs; cms_attr_name *names; uint i, j, num_attrs = cal->num_attrs; if ((names = calloc(1, sizeof(cms_attr_name)*num_attrs)) == NULL) return (CSA_E_INSUFFICIENT_MEMORY); /* first element is not used */ for (i = 1, j = 0; i <= num_attrs; i++) { if (attrs[i].value || (i == CSA_CAL_ATTR_CALENDAR_SIZE_I || i == CSA_CAL_ATTR_NUMBER_ENTRIES_I || i == CSA_X_DT_CAL_ATTR_SERVER_VERSION_I || i == CSA_X_DT_CAL_ATTR_DATA_VERSION_I || i == CSA_CAL_ATTR_ACCESS_LIST_I)) { if (names[j].name = strdup(attrs[i].name.name)) { names[j].num = attrs[i].name.num; j++; } else { _DtCmsFreeCmsAttrNames(j, names); return (CSA_E_INSUFFICIENT_MEMORY); } } } if (j > 0) { *num_names_r = j; *names_r = names; } else { *num_names_r = 0; *names_r = NULL; free(names); } return (CSA_SUCCESS); }
extern cms_enumerate_calendar_attr_res * cms_enumerate_calendar_attr_5_svc(buffer *args, struct svc_req *svcrq) { static cms_enumerate_calendar_attr_res res; _DtCmsCalendar *cal; char *user; uint access; if (debug) fprintf(stderr, "cms_enumerate_calendar_attr_5_svc called\n"); if (res.num_names > 0) { _DtCmsFreeCmsAttrNames(res.num_names, res.names); res.num_names = 0; } if ((res.stat = _DtCmsV5LoadAndCheckAccess(svcrq, *args, &user, &access, &cal)) != CSA_SUCCESS) return (&res); if (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION) { if (!_DTCMS_HAS_VIEW_CALENDAR_ATTR_ACCESS(access)) { res.stat = CSA_E_NO_AUTHORITY; return (&res); } res.stat = _DtCmsGetCalAttrNames(cal, &res.num_names, &res.names); } else { res.stat = _DtCmsGetOldCalAttrNames(cal, &res.num_names, &res.names); } return (&res); }