示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
文件: table.c 项目: juddy/edcde
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);
}
示例#5
0
文件: table.c 项目: juddy/edcde
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);
}
示例#6
0
文件: table.c 项目: juddy/edcde
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);
}