extern cms_entries_res * cms_enumerate_sequence_5_svc(cms_enumerate_args *args, struct svc_req *svcrq) { static cms_entries_res res; _DtCmsCalendar *cal; char *user; uint access; if (debug) fprintf(stderr, "cms_enumerate_sequence_5_svc called\n"); if (res.entries) { _DtCm_free_cms_entries(res.entries); res.entries = NULL; } if ((res.stat = _DtCmsV5LoadAndCheckAccess(svcrq, args->cal, &user, &access, &cal)) != CSA_SUCCESS) return (&res); if (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION && !_DTCMS_HAS_VIEW_ACCESS(access)) { res.stat = CSA_E_NO_AUTHORITY; return (&res); } /* do lookup */ if (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION) { res.stat = _DtCmsEnumerateSequenceById(cal, user, access, B_FALSE, B_TRUE, args->start, args->end, 0, 0, args->id, 0, NULL, NULL, &res.entries); } else { Range_4 prange; Appt_4 *appt = NULL; res.stat = _DtCmsLookupKeyrangeV4(cal, user, access, B_FALSE, B_TRUE, args->start, args->end, 0, 0, args->id, NULL, 0, NULL, NULL, &appt, NULL); if (res.stat == CSA_SUCCESS && appt) { res.stat = _DtCmsAppt4ToCmsentriesForClient(args->cal, appt, &res.entries); _DtCm_free_appt4(appt); } } return (&res); }
extern cms_entry_res * cms_insert_entry_5_svc(cms_insert_args *args, struct svc_req *svcrq) { static cms_entry_res res; _DtCmsCalendar *cal; cms_entry *entry; cms_key key; char *user; uint access, needaccess; Appt_4 *appt; if (debug) fprintf(stderr, "cms_insert_entry_5_svc called\n"); if (res.entry != NULL) { res.entry->num_attrs--; _DtCm_free_cms_entry(res.entry); res.entry = NULL; } if ((res.stat = _DtCmsV5LoadAndCheckAccess(svcrq, args->cal, &user, &access, &cal)) != CSA_SUCCESS) return (&res); if ((cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION && !_DTCMS_HAS_INSERT_ACCESS(access)) || (cal->fversion < _DtCM_FIRST_EXTENSIBLE_DATA_VERSION && !_DTCMS_HAS_V4_WRITE_ACCESS(access))) { res.stat = CSA_E_NO_AUTHORITY; return (&res); } /* check argument */ if (args->cal == NULL || args->num_attrs == 0) { res.stat = CSA_E_INVALID_PARAMETER; return (&res); } /* check validity of attribute values */ if ((res.stat = _DtCm_check_entry_cms_attributes( (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION ? cal->fversion : _DtCM_FIRST_EXTENSIBLE_DATA_VERSION - 1), args->num_attrs, args->attrs, CSA_CB_ENTRY_ADDED, B_TRUE)) != CSA_SUCCESS) return (&res); if (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION) { if ((res.stat = _DtCmsMakeHashedEntry(cal, args->num_attrs, args->attrs, &entry)) != CSA_SUCCESS) return (&res); if ((res.stat = _DtCmsCheckInitialAttributes(entry)) != CSA_SUCCESS) { _DtCm_free_cms_entry(entry); return (&res); } /* check access rights */ needaccess = _DtCmsClassToInsertAccess(entry); if ((access & (CSA_OWNER_RIGHTS | needaccess)) == 0) { _DtCm_free_cms_entry(entry); res.stat = CSA_E_NO_AUTHORITY; return (&res); } /* set organizer */ if ((res.stat = _DtCm_set_string_attrval(user, &entry->attrs[CSA_ENTRY_ATTR_ORGANIZER_I].value, CSA_VALUE_CALENDAR_USER)) != CSA_SUCCESS) { _DtCm_free_cms_entry(entry); return (&res); } /* insert entry and log it */ if ((res.stat = _DtCmsInsertEntryAndLog(cal, entry)) != CSA_SUCCESS) { _DtCm_free_cms_entry(entry); return (&res); } key = entry->key; } else { if ((appt = _DtCm_make_appt4(B_TRUE)) == NULL) { res.stat = CSA_E_INSUFFICIENT_MEMORY; return (&res); } if ((res.stat = _DtCmsAttrsToAppt4(args->num_attrs, args->attrs, appt, B_TRUE)) != CSA_SUCCESS) { _DtCm_free_appt4(appt); return (&res); } if (appt->author) free(appt->author); if ((appt->author = strdup(user)) == NULL) { _DtCm_free_appt4(appt); return (&res); } /* * calculate the correct start day, */ _DtCms_adjust_appt_startdate(appt); if ((res.stat = _DtCmsInsertApptAndLog(cal, appt)) != CSA_SUCCESS) { _DtCm_free_appt4(appt); return (&res); } key.id = appt->appt_id.key; key.time = appt->appt_id.tick; } if (res.stat == CSA_SUCCESS) cal->modified = B_TRUE; else return (&res); /* do callback */ cal->rlist = _DtCmsDoV1CbForV4Data(cal->rlist, user, args->pid, &key, NULL); cal->rlist = _DtCmsDoInsertEntryCallback(cal->rlist, cal->calendar, user, key.id, args->pid); /* reply */ if (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION || (cal->fversion < _DtCM_FIRST_EXTENSIBLE_DATA_VERSION && (res.stat = _DtCmsAppt4ToCmsentriesForClient(cal->calendar, appt, &entry)) == CSA_SUCCESS)) { res.stat = _DtCmsGetCmsEntryForClient(entry, &res.entry, B_FALSE); _DtCm_free_cms_entry(entry); } return (&res); }
extern cms_entries_res * cms_lookup_entries_5_svc(cms_lookup_entries_args *args, struct svc_req *svcrq) { static cms_entries_res res; _DtCmsCalendar *cal; char *user; uint access; time_t start1, start2, end1, end2; long id = 0; boolean_t no_match; boolean_t no_start_time_range, no_end_time_range; CSA_uint32 hnum; cms_attribute *hattrs; CSA_enum *hops; if (debug) fprintf(stderr, "cms_lookup_entries_5_svc called\n"); if (res.entries) { _DtCm_free_cms_entries(res.entries); res.entries = NULL; } if ((res.stat = _DtCmsV5LoadAndCheckAccess(svcrq, args->cal, &user, &access, &cal)) != CSA_SUCCESS) return (&res); if (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION && !_DTCMS_HAS_VIEW_ACCESS(access)) { res.stat = CSA_E_NO_AUTHORITY; return (&res); } /* check operator */ if ((res.stat = _DtCm_check_operator(args->num_attrs, NULL, args->attrs, args->ops)) != CSA_SUCCESS) return (&res); /* get time range */ if ((res.stat = _DtCmHashCriteria( cal->fversion < _DtCM_FIRST_EXTENSIBLE_DATA_VERSION ? _DtCm_entry_name_tbl : cal->entry_tbl, args->num_attrs, NULL, args->attrs, args->ops, &no_match, &no_start_time_range, &no_end_time_range, &start1, &start2, &end1, &end2, &id, &hnum, &hattrs, &hops)) == CSA_E_INVALID_ATTRIBUTE) { /* attribute not defined in this calendar specified, * return NULL list */ res.stat = CSA_SUCCESS; return (&res); } else if (res.stat != CSA_SUCCESS || no_match == B_TRUE) return (&res); /* do lookup */ if (cal->fversion >= _DtCM_FIRST_EXTENSIBLE_DATA_VERSION) { if (id > 0) res.stat = _DtCmsLookupEntriesById(cal, user, access, no_start_time_range, no_end_time_range, start1, start2, end1, end2, id, hnum, hattrs, hops, &res.entries); else res.stat = _DtCmsLookupEntries(cal, user, access, start1, start2, no_end_time_range, end1, end2, hnum, hattrs, hops, &res.entries); } else { Range_4 prange; Appt_4 *appt = NULL;; if (id > 0) { res.stat = _DtCmsLookupKeyrangeV4(cal, user, access, no_start_time_range, no_end_time_range, start1, start2, end1, end2, id, _DtCm_match_one_appt, hnum, hattrs, hops, &appt, NULL); } else { prange.key1 = start1; prange.key2 = start2; prange.next = NULL; res.stat = _DtCmsLookupRangeV4(cal, user, access, &prange, no_end_time_range, end1, end2, _DtCm_match_one_appt, hnum, hattrs, hops, &appt, NULL); } if (res.stat == CSA_SUCCESS && appt) { res.stat = _DtCmsAppt4ToCmsentriesForClient(args->cal, appt, &res.entries); _DtCm_free_appt4(appt); } } _DtCmFreeHashedArrays(hnum, hattrs, hops); return (&res); }
extern CSA_return_code _DtCm_table_update( Calendar *cal, _DtCm_libentry *oentry, uint num_attrs, CSA_attribute * attrs, CSA_enum scope, _DtCm_libentry **nentry) { CSA_return_code stat = CSA_SUCCESS; Table_Res_4 *res = NULL; _DtCm_Connection *conn; Id_4 key; Options_4 opt; Appt_4 *appt4; _DtCm_libentry *temp; DP(("table.c: _DtCm_table_update_one\n")); if (cal == NULL || oentry == NULL || nentry == NULL) return (CSA_E_INVALID_PARAMETER); /* convert scope to option */ if ((stat = _DtCm_scope_to_options4(scope, &opt)) != CSA_SUCCESS) return (stat); _csa_iso8601_to_tick(oentry->e->attrs[CSA_ENTRY_ATTR_START_DATE_I].\ value->item.string_value, &key.tick); key.key = oentry->e->key.id; /* create new appt4 from old entry and new attribute values */ temp = oentry->next; oentry->next = NULL; stat = _DtCm_libentries_to_appt4(oentry, &appt4); oentry->next = temp; if (stat != CSA_SUCCESS) return (stat); /* use do_all for old backends */ if (appt4->period.period == single_4) opt = do_all_4; /* apply the new attribute values to the appointment */ if ((stat = _DtCm_attrs_to_apptdata(num_attrs, attrs, appt4)) != CSA_SUCCESS) { _DtCm_free_appt4(appt4); return (stat); } /* if the backend's version is less than 4, then it does * not support repeating event types beyond yearly * nor does it support do_forward */ conn = &cal->conn; if (conn->ci->vers_out < TABLEVERS_4 && (appt4->period.period > yearly_4 || scope >= CSA_SCOPE_FORWARD)) { _DtCm_free_appt4(appt4); return (CSA_E_NOT_SUPPORTED); } conn->retry = B_FALSE; switch(conn->ci->vers_out) { Table_Args_2 a2; Table_Args_3 a3; Table_Args_4 a4; Table_Res_2 *res2; Table_Res_3 *res3; case TABLEVERS_2: a2.target = cal->name; a2.args.tag = APPTID_2; a2.args.Args_2_u.apptid.oid = (Id_2 *)calloc(1, sizeof(Id_2)); _DtCm_id4_to_id2(&key, a2.args.Args_2_u.apptid.oid); a2.args.Args_2_u.apptid.new_appt = _DtCm_appt4_to_appt2(appt4); if (opt == do_all_4) res2 = _DtCm_rtable_change_2(&a2, conn); else res2 = _DtCm_rtable_change_instance_2(&a2, conn); res = _DtCm_tableres2_to_tableres4(res2); free(a2.args.Args_2_u.apptid.oid); if (a2.args.Args_2_u.apptid.new_appt != NULL) _DtCm_free_appt2(a2.args.Args_2_u.apptid.new_appt); if (res2 != NULL) xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2); break; case TABLEVERS_3: a3.target = cal->name; a3.args.tag = APPTID_3; a3.args.Args_3_u.apptid.oid = (Id_3 *)calloc(1, sizeof(Id_3)); _DtCm_id4_to_id3(&key, a3.args.Args_3_u.apptid.oid); a3.args.Args_3_u.apptid.new_appt = _DtCm_appt4_to_appt3(appt4); a3.pid = getpid(); if (opt == do_all_4) res3 = _DtCm_rtable_change_3(&a3, conn); else res3 = _DtCm_rtable_change_instance_3(&a3, conn); res = _DtCm_tableres3_to_tableres4(res3); free(a3.args.Args_3_u.apptid.oid); if (a3.args.Args_3_u.apptid.new_appt != NULL) _DtCm_free_appt3(a3.args.Args_3_u.apptid.new_appt); if (res3 != NULL) xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3); break; case TABLEVERS_4: a4.target = cal->name; a4.args.tag = APPTID_4; a4.args.Args_4_u.apptid.oid = &key; a4.args.Args_4_u.apptid.new_appt = appt4; a4.args.Args_4_u.apptid.option = opt; a4.pid = getpid(); res = _DtCm_rtable_change_4(&a4, conn); break; default: stat = CSA_E_FAILURE; break; } _DtCm_free_appt4(appt4); if (res != NULL) { switch(res->status) { case access_ok_4: if (res->res.Table_Res_List_4_u.a) { stat = _DtCm_appt4_to_libentries(cal->name, res->res.Table_Res_List_4_u.a, nentry); } break; case access_failed_4: stat = CSA_E_NO_AUTHORITY; break; case access_notable_4: stat = CSA_E_CALENDAR_NOT_EXIST; break; case access_other_4: case access_partial_4: case access_incomplete_4: stat = CSA_E_FAILURE; break; default: /* remote system error */ DP((errfmt, "_DtCm_table_update", res->status)); stat = CSA_E_FAILURE; break; } xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res); } else { stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE : _DtCm_clntstat_to_csastat(conn->stat); } return(stat); }
extern CSA_return_code _DtCm_table_insert( Calendar *cal, uint num_attrs, CSA_attribute * attrs, _DtCm_libentry **entry_r) { CSA_return_code stat = CSA_SUCCESS; Table_Res_4 *res = NULL; _DtCm_Connection *conn; Appt_4 *appt4; DP(("table.c: _DtCm_table_insert\n")); if (cal == NULL || num_attrs == 0 || attrs == NULL || entry_r == NULL) return (CSA_E_INVALID_PARAMETER); if ((stat = _DtCm_attrs_to_appt4(num_attrs, attrs, &appt4)) != CSA_SUCCESS) return (stat); /* if the backend's version is less than 4, then it * does not support repeating event types beyond yearly */ conn = &cal->conn; if (conn->ci->vers_out < TABLEVERS_4 && appt4->period.period > yearly_4) { _DtCm_free_appt4(appt4); return (CSA_E_NOT_SUPPORTED); } /* for old backend, insert one appt at a time * in order to match appointments with the new id */ conn->retry = B_FALSE; switch(conn->ci->vers_out) { Table_Args_2 a2; Table_Args_3 a3; Table_Args_4 a4; Table_Res_2 *res2; Table_Res_3 *res3; case TABLEVERS_2: a2.target = cal->name; a2.args.tag = APPT_2; a2.args.Args_2_u.appt = _DtCm_appt4_to_appt2(appt4); res2 = _DtCm_rtable_insert_2(&a2, conn); res = _DtCm_tableres2_to_tableres4(res2); if (a2.args.Args_2_u.appt != NULL) _DtCm_free_appt2(a2.args.Args_2_u.appt); if (res2 != NULL) xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2); break; case TABLEVERS_3: a3.target = cal->name; a3.args.tag = APPT_3; a3.args.Args_3_u.appt = _DtCm_appt4_to_appt3(appt4); a3.pid = getpid(); res3 = _DtCm_rtable_insert_3(&a3, conn); res = _DtCm_tableres3_to_tableres4(res3); if (a3.args.Args_3_u.appt != NULL) _DtCm_free_appt3(a3.args.Args_3_u.appt); if (res3 != NULL) xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3); break; case TABLEVERS_4: a4.target = cal->name; a4.args.tag = APPT_4; a4.args.Args_4_u.appt = appt4; a4.pid = getpid(); res = _DtCm_rtable_insert_4(&a4, conn); break; default: stat = CSA_E_FAILURE; break; } if (res != NULL) { switch(res->status) { case access_ok_4: if (res->res.Table_Res_List_4_u.a) { stat = _DtCm_appt4_to_libentries(cal->name, res->res.Table_Res_List_4_u.a, entry_r); } break; case access_failed_4: stat = CSA_E_NO_AUTHORITY; break; case access_other_4: stat = CSA_E_INVALID_PARAMETER; break; case access_notable_4: stat = CSA_E_CALENDAR_NOT_EXIST; break; case access_partial_4: case access_incomplete_4: stat = CSA_E_FAILURE; break; default: /* remote system error */ DP((errfmt, "table_insert_one", res->status)); stat = CSA_E_FAILURE; break; } xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res); } else { stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE : _DtCm_clntstat_to_csastat(conn->stat); } _DtCm_free_appt4(appt4); return(stat); }
extern CSA_return_code _DtCm_table_lookup_range( Calendar *cal, long start1, long start2, boolean_t no_end_time_range, long end1, long end2, long id, uint num_attrs, cms_attribute *attrs, CSA_enum *ops, _DtCm_libentry **entries) { CSA_return_code stat = CSA_SUCCESS; Table_Res_4 *res = NULL; _DtCm_Connection *conn; Range_4 new_range, old_range; Appt_4 *appts = NULL, *lptr = NULL, *tptr = NULL, *rptr = NULL; DP(("table.c: _DtCm_table_lookup_range\n")); if (cal == NULL || entries == NULL) return (CSA_E_INVALID_PARAMETER); *entries = NULL; old_range.key1 = start1; old_range.key2 = start2; new_range.key1 = old_range.key1; new_range.key2 = old_range.key2; new_range.next = NULL; conn = &cal->conn; conn->retry = B_TRUE; if (conn->use == udp_transport) if ((new_range.key1 + MAXDAY_LOOKUP_SECS) < old_range.key2) new_range.key2 = new_range.key1 + MAXDAY_LOOKUP_SECS; do { switch(conn->ci->vers_out) { Table_Args_2 a2; Table_Args_3 a3; Table_Args_4 a4; Table_Res_2 *res2; Table_Res_3 *res3; case TABLEVERS_2: a2.target = cal->name; a2.args.tag = RANGE_2; a2.args.Args_2_u.range = _DtCm_range4_to_range2(&new_range); res2 = _DtCm_rtable_lookup_range_2(&a2, conn); res = _DtCm_tableres2_to_tableres4(res2); if (a2.args.Args_2_u.range != NULL) free(a2.args.Args_2_u.range); if (res2 != NULL) xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_2, (char*)res2); break; case TABLEVERS_3: a3.target = cal->name; a3.args.tag = RANGE_3; a3.args.Args_3_u.range = _DtCm_range4_to_range3(&new_range); a3.pid = getpid(); res3 = _DtCm_rtable_lookup_range_3(&a3, conn); res = _DtCm_tableres3_to_tableres4(res3); if (a3.args.Args_3_u.range != NULL) free(a3.args.Args_3_u.range); if (res3 != NULL) xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_3, (char*)res3); break; case TABLEVERS_4: a4.target = cal->name; a4.args.tag = RANGE_4; a4.args.Args_4_u.range = &new_range; a4.pid = getpid(); res = _DtCm_rtable_lookup_range_4(&a4, conn); break; default: stat = CSA_E_FAILURE; break; } if (res != NULL) { switch(res->status) { case access_ok_4: case access_failed_4: tptr = _DtCm_copy_appt4(res->res.Table_Res_List_4_u.a); if (stat == CSA_SUCCESS) { if (conn->use == tcp_transport) appts = tptr; else { /* udp transport */ if (appts == NULL) appts = lptr = tptr; else { /* traverse from the last res ptr */ for (rptr = lptr; rptr != NULL && rptr->next != NULL; rptr = rptr->next); if (tptr != NULL) rptr->next = lptr = tptr; else lptr = rptr; } } } break; case access_other_4: stat = CSA_E_INVALID_PARAMETER; break; case access_notable_4: stat = CSA_E_CALENDAR_NOT_EXIST; break; default: /* remote system error */ DP ((errfmt, "table_lookup_range", res->status)); stat = CSA_E_FAILURE; break; } xdr_free((xdrproc_t)_DtCm_xdr_Table_Res_4, (char*)res); res = NULL; /* range must encompass interested ticks */ new_range.key1 = new_range.key2-1; if ((new_range.key2 = (new_range.key1+MAXDAY_LOOKUP_SECS)) > old_range.key2) new_range.key2 = old_range.key2; } else { /* res == NULL */ stat = (conn->stat == RPC_SUCCESS) ? CSA_E_SERVICE_UNAVAILABLE : _DtCm_clntstat_to_csastat(conn->stat); } } while (stat == CSA_SUCCESS && new_range.key1 < old_range.key2 && (new_range.key1+1) != old_range.key2); if (stat == CSA_SUCCESS) { /* * if attrs are specified, return only those * appts that matches the values */ if (id > 0 || num_attrs > 0 || !no_end_time_range) appts = _DtCm_match_appts(appts, id, no_end_time_range, end1, end2, num_attrs, attrs, ops); stat = _DtCm_appt4_to_libentries(cal->name, appts, entries); _DtCm_free_appt4(appts); } else if (appts != NULL) { /* this happens if udp is used and some rpc calls succeeded */ _DtCm_free_appt4(appts); } return(stat); }