os-cmpi-xen

view src/cmpilr.c @ 121:4868ace2726b

Add initial consistence checks in test suite for Xen_MemoryPool, Xen_ProcessorPool and Xen_VirtualSystemManagementService.

Signed-off-by: Luke Szymanski <Lukasz.Szymanski@Unisys.com>
author Jim Fehlig <jfehlig@novell.com>
date Fri Jun 08 10:22:05 2007 -0600 (2007-06-08)
parents 64e363d418df
children ce72210a88c6
line source
1 // Copyright (C) 2007 IBM Corp.
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 // ============================================================================
17 // Authors: Dr. Gareth S. Bestor, <bestor@us.ibm.com>
18 // ============================================================================
20 #include "cmpidt.h"
21 #include "cmpift.h"
22 #include "cmpimacs.h"
23 #include "cmpilr.h"
25 #include "cmpitrace.h"
28 /* Redefine the CMGetCharPtr() macro to better handle NULL CMPI_strings. */
29 #undef CMGetCharPtr
30 #define CMGetCharPtr(s) (((s)==NULL || *((void**)(s))==NULL)? NULL : (char*)((s)->hdl))
32 /* Shortcuts to the resource specific implementation data and function table. */
33 #define _BROKER (((CMPIResource*)(mi->hdl))->brkr)
34 #define _CLASS (((CMPIResource*)(mi->hdl))->cn)
35 #define _FT (((CMPIResource*)(mi->hdl))->ft)
38 /* ------------------------------------------------------------------------- */
40 static int op2res(CMPIObjectPath* op, void** res, CMPIInstanceMI* mi)
41 {
42 CMPIStatus status = {CMPI_RC_OK, NULL};
44 /* Create a new CMPIInstance for the CMPIObjectPath. */
45 CMPIInstance* inst = CMNewInstance(_BROKER, op, &status);
46 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(inst)) return 0;
48 /* Set the CMPIInstance key properties from the CMPIObjectPath keys. */
49 int numkeys = CMGetKeyCount(op, &status);
50 if (status.rc != CMPI_RC_OK) return 0;
51 CMPIString* keyname;
52 int i;
53 for (i=0; i<numkeys; i++) {
54 CMPIData key = CMGetKeyAt(op, i, &keyname, &status);
55 if (status.rc != CMPI_RC_OK) return 0;
56 status = CMSetProperty(inst, CMGetCharPtr(keyname), &(key.value), key.type);
57 if (status.rc != CMPI_RC_OK) return 0;
58 }
60 /* Create a partial resource from the CMPIInstance key properties. */
61 return _FT->inst2res(inst, res, &status);
62 }
64 /* ------------------------------------------------------------------------- */
66 static int getres4op(void** res, CMPIObjectPath* op, CMPIInstanceMI* mi)
67 {
68 CMPIStatus status = {CMPI_RC_OK, NULL};
70 int rc = op2res(op, res, mi);
71 if (!rc || !*res) return 0;
73 void *resList = NULL;
74 /* Get handle to the list of resources. */
75 if (!_FT->beginEnum(&resList, &status))
76 return 0;
79 /* First try to get the target resource directly. */
80 rc = _FT->get(resList, res, &status);
81 if (rc == 0) { /* get() failed */
82 _FT->release(*res);
83 _FT->endEnum(resList);
84 return 0;
85 } else if (rc == -1) { /*get() unsupported */
86 /*FIXME - enumerate all to look for match instead*/
87 _FT->release(*res);
88 _FT->endEnum(resList);
89 return 0;
90 }
92 _FT->endEnum(resList);
93 return 1;
94 }
96 /* ------------------------------------------------------------------------- */
97 /* The generic CMPILR resource-agnostic CMPI instance provider functions. */
98 /* ------------------------------------------------------------------------- */
100 CMPIStatus CMPILR_cleanup
101 (CMPIInstanceMI* mi, const CMPIContext* ctx, CMPIBoolean terminating)
102 {
103 _SBLIM_ENTER("CMPILR_cleanup");
104 CMPIStatus status = {CMPI_RC_OK, NULL};
106 /* Run the provider's unload() routine. */
107 if (!_FT->unload(terminating)) {
108 if (!terminating) CMSetStatusWithChars(_BROKER, &status, CMPI_RC_DO_NOT_UNLOAD, "unload() failed")
109 else CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "unload() failed");
110 }
112 _SBLIM_RETURNSTATUS(status);
113 }
115 /* ------------------------------------------------------------------------- */
117 CMPIStatus CMPILR_enumInstanceNames
118 (CMPIInstanceMI* mi, const CMPIContext* ctx, const CMPIResult* rslt,
119 const CMPIObjectPath* ref)
120 {
121 _SBLIM_ENTER("CMPILR_enumInstanceNames");
122 CMPIStatus status = {CMPI_RC_OK, NULL};
124 /* Get handle to the list of resources. */
125 void* resList = NULL;
126 if (!_FT->beginEnum(&resList, &status)) {
127 /* Set status to FAILED if beginEnum didn't update */
128 if (status.rc == CMPI_RC_OK)
129 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "beginEnum() failed");
130 _SBLIM_RETURNSTATUS(status);
131 }
133 /* Enumerate all the resources and return a CMPIObjectPath for each. */
134 char* ns = CMGetCharPtr(CMGetNameSpace(ref, NULL));
135 int found = 0;
136 while (1) {
137 /* Create a new CMPIObjectPath for the next resource. */
138 CMPIObjectPath* op = CMNewObjectPath(_BROKER, ns, _CLASS, &status);
139 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(op)) {
140 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMNewObjectPath() failed");
141 break;
142 }
144 /* Create a new CMPIInstance for the next resource. */
145 CMPIInstance* inst = CMNewInstance(_BROKER, op, &status);
146 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(inst)) {
147 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMNewInstance() failed");
148 break;
149 }
151 /* Get the next resource. */
152 void* res = NULL;
153 if (!_FT->getNext(resList, &res, &status))
154 break; /* while() loop exit! */
156 /* Set the CMPIInstance properties from the resource data. */
157 int rc = _FT->res2inst(res, inst, &status);
158 _FT->release(res);
159 if (!rc) {
160 /* Honor status set by resource. */
161 if (status.rc == CMPI_RC_OK)
162 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "res2inst() failed");
163 break;
164 }
166 /* Get the CMPIObjectPath for this CMPIInstance. */
167 op = CMGetObjectPath(inst, &status);
168 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(op)) {
169 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMGetObjectPath() failed");
170 break;
171 }
172 status = CMSetNameSpace(op, ns); /* CMGetObjectPath() does not preserve the instance's namespace! */
173 if (status.rc != CMPI_RC_OK) {
174 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMSetNameSpace() failed");
175 break;
176 }
178 /* Return the CMPIObjectPath for the resource. */
179 status = CMReturnObjectPath(rslt, op);
180 if (status.rc != CMPI_RC_OK) {
181 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMReturnObjectPath() failed");
182 break;
183 }
184 found++;
185 } /* while() */
186 _FT->endEnum(resList);
188 _SBLIM_TRACE(_SBLIM_TRACE_LEVEL_INFO,("--- %d instance names found", found));
190 if (status.rc == CMPI_RC_OK)
191 CMReturnDone(rslt);
193 _SBLIM_RETURNSTATUS(status);
194 }
196 /* ------------------------------------------------------------------------- */
198 CMPIStatus CMPILR_enumInstances
199 (CMPIInstanceMI* mi, const CMPIContext* ctx, const CMPIResult* rslt,
200 const CMPIObjectPath* ref, const char** properties)
201 {
202 _SBLIM_ENTER("CMPILR_enumInstances");
203 CMPIStatus status = {CMPI_RC_OK, NULL};
205 /* Get handle to the list of resources. */
206 void* resList = NULL;
207 if (!_FT->beginEnum(&resList, &status)) {
208 /* Set status to FAILED if beginEnum didn't update */
209 if (status.rc == CMPI_RC_OK)
210 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "beginEnum() failed");
211 _SBLIM_RETURNSTATUS(status);
212 }
214 /* Enumerate all the resources and return a CMPIObjectPath for each. */
215 char* ns = CMGetCharPtr(CMGetNameSpace(ref, NULL));
216 int found = 0;
217 while (1) {
218 /* Create a new CMPIObjectPath for the next resource. */
219 CMPIObjectPath* op = CMNewObjectPath(_BROKER, ns, _CLASS, &status);
220 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(op)) {
221 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMNewObjectPath() failed");
222 break;
223 }
225 /* Create a new CMPIInstance for the next resource. */
226 CMPIInstance* inst = CMNewInstance(_BROKER, op, &status);
227 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(inst)) {
228 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMNewInstance() failed");
229 break;
230 }
232 /* Get the next resource. */
233 void* res = NULL;
234 if (!_FT->getNext(resList, &res, &status))
235 break; /* while() loop exit! */
237 /* Set the property filter for this CMPIInstance, if specified. */
238 if (properties != NULL) {
239 status = CMSetPropertyFilter(inst, properties, NULL);
240 if (status.rc != CMPI_RC_OK) {
241 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMSetPropertyFilter() failed");
242 break;
243 }
244 }
246 /* Set the CMPIInstance properties from the resource data. */
247 int rc = _FT->res2inst(res, inst, &status);
248 _FT->release(res);
249 if (!rc) {
250 /* Honor status set by resource. */
251 if (status.rc == CMPI_RC_OK)
252 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "res2inst() failed");
253 break;
254 }
256 /* Return the CMPIInstance for the resource. */
257 status = CMReturnInstance(rslt, inst);
258 if (status.rc != CMPI_RC_OK) {
259 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMReturnInstance() failed");
260 break;
261 }
262 found++;
263 } /* while() */
264 _FT->endEnum(resList);
266 _SBLIM_TRACE(_SBLIM_TRACE_LEVEL_INFO,("--- %d instances found", found));
268 if (status.rc == CMPI_RC_OK)
269 CMReturnDone(rslt);
271 _SBLIM_RETURNSTATUS(status);
272 }
274 /* ------------------------------------------------------------------------- */
276 CMPIStatus CMPILR_getInstance
277 (CMPIInstanceMI* mi, const CMPIContext* ctx, const CMPIResult* rslt,
278 const CMPIObjectPath* ref, const char** properties)
279 {
280 _SBLIM_ENTER("CMPILR_getInstance");
281 CMPIStatus status = {CMPI_RC_OK, NULL};
283 /* Create a new CMPIInstance for the resource. */
284 CMPIInstance* inst = CMNewInstance(_BROKER, ref, &status);
285 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(inst)) {
286 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMNewInstance() failed");
287 _SBLIM_RETURNSTATUS(status);
288 }
290 /* Set the property filter for this CMPIInstance, if specified. */
291 if (properties != NULL) {
292 status = CMSetPropertyFilter(inst, properties, NULL);
293 if (status.rc != CMPI_RC_OK) {
294 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMSetPropertyFilter() failed");
295 _SBLIM_RETURNSTATUS(status);
296 }
297 }
299 /* Try to get the target resource. */
300 void* res;
301 int rc = getres4op(&res, (CMPIObjectPath*)ref, mi);
302 if (!rc) {
303 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_FOUND, "getres4op() failed");
304 _SBLIM_RETURNSTATUS(status);
305 }
307 /* Set the CMPIInstance properties from the resource data. */
308 rc = _FT->res2inst(res, inst, &status);
309 _FT->release(res);
310 if (!rc) {
311 /* Honor status set by resource. */
312 if (status.rc == CMPI_RC_OK)
313 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "res2inst() failed");
314 _SBLIM_RETURNSTATUS(status);
315 }
317 /* Return the CMPIInstance for the resource. */
318 status = CMReturnInstance(rslt, inst);
319 if (status.rc != CMPI_RC_OK) CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMReturnInstance() failed");
321 if (status.rc == CMPI_RC_OK) CMReturnDone(rslt);
323 _SBLIM_RETURNSTATUS(status);
324 }
326 /* ------------------------------------------------------------------------- */
328 CMPIStatus CMPILR_createInstance
329 (CMPIInstanceMI* mi, const CMPIContext* ctx, const CMPIResult* rslt,
330 const CMPIObjectPath* ref, const CMPIInstance* inst)
331 {
332 _SBLIM_ENTER("CMPILR_createInstance");
333 CMPIStatus status = {CMPI_RC_OK, NULL};
335 /* Try to get the target resource. */
336 void* res = NULL;
337 int rc = getres4op(&res, (CMPIObjectPath*)ref, mi);
338 if (rc) {
339 _FT->release(res);
340 CMSetStatus(&status, CMPI_RC_ERR_ALREADY_EXISTS);
341 _SBLIM_RETURNSTATUS(status);
342 }
344 rc = _FT->inst2res((CMPIInstance*)inst, &res, &status);
345 if (!rc || !res) {
346 /* Honor status set by resource. */
347 if (status.rc == CMPI_RC_OK)
348 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "inst2res() failed");
349 _SBLIM_RETURNSTATUS(status);
350 }
352 /* Get handle to the list of resources. */
353 void* resList = NULL;
354 if (!_FT->beginEnum(&resList, &status)) {
355 _FT->release(res);
356 /* Set status to FAILED if beginEnum didn't update */
357 if (status.rc == CMPI_RC_OK)
358 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "beginEnum() failed");
359 _SBLIM_RETURNSTATUS(status);
360 }
362 /* Add the target resource. */
363 rc = _FT->add(&resList, res, &status);
364 if (rc != 1) {
365 /* Honor status set by resource. */
366 if (status.rc == CMPI_RC_OK) {
367 if (rc == -1) {
368 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_SUPPORTED, "add() unsupported");
369 }
370 else {
371 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "add() failed");
372 }
373 }
374 }
376 _FT->release(res);
377 _FT->endEnum(resList);
379 _SBLIM_RETURNSTATUS(status);
380 }
382 /* ------------------------------------------------------------------------- */
384 CMPIStatus CMPILR_modifyInstance
385 (CMPIInstanceMI* mi, const CMPIContext* ctx, const CMPIResult* rslt,
386 const CMPIObjectPath* ref, const CMPIInstance* inst, const char** properties)
387 {
388 _SBLIM_ENTER("CMPILR_modifyInstance");
389 CMPIStatus status = {CMPI_RC_OK, NULL};
391 /* Try to get the target resource. */
392 void* res;
393 int rc = getres4op(&res, (CMPIObjectPath*)ref, mi);
394 if (!rc) {
395 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_FOUND, "getres4op() failed");
396 _SBLIM_RETURNSTATUS(status);
397 }
399 rc = _FT->inst2res((CMPIInstance*)inst, &res, &status);
400 if (!rc || !res) {
401 /* Honor status set by resource. */
402 if (status.rc == CMPI_RC_OK)
403 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "inst2res() failed");
404 _SBLIM_RETURNSTATUS(status);
405 }
407 /* Get handle to the list of resources. */
408 void* resList = NULL;
409 if (!_FT->beginEnum(&resList, &status)) {
410 _FT->release(res);
411 /* Set status to FAILED if beginEnum didn't update */
412 if (status.rc == CMPI_RC_OK)
413 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "beginEnum() failed");
414 _SBLIM_RETURNSTATUS(status);
415 }
417 /* Add the target resource. */
418 rc = _FT->modify(&resList, res, &status);
419 if (rc != 1) {
420 /* Honor status set by resource. */
421 if (status.rc == CMPI_RC_OK) {
422 if (rc == -1) {
423 CMSetStatusWithChars(_BROKER, &status,
424 CMPI_RC_ERR_NOT_SUPPORTED, "add() unsupported");
425 }
426 else {
427 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "add() failed");
428 }
429 }
430 }
432 _FT->release(res);
433 _FT->endEnum(resList);
435 _SBLIM_RETURNSTATUS(status);
436 }
438 /* ------------------------------------------------------------------------- */
440 CMPIStatus CMPILR_deleteInstance
441 (CMPIInstanceMI* mi, const CMPIContext* ctx, const CMPIResult* rslt,
442 const CMPIObjectPath* ref)
443 {
444 _SBLIM_ENTER("CMPILR_deleteInstance");
445 CMPIStatus status = {CMPI_RC_OK, NULL};
447 /* Try to get the target resource. */
448 void* res;
449 int rc = getres4op(&res, (CMPIObjectPath*)ref, mi);
450 if (!rc) {
451 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_FOUND, "getres4op() failed");
452 _SBLIM_RETURNSTATUS(status);
453 }
455 /* Get handle to the list of resources. */
456 void* resList = NULL;
457 if (!_FT->beginEnum(&resList, &status)) {
458 /* Set status to FAILED if beginEnum didn't update */
459 if (status.rc == CMPI_RC_OK)
460 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "beginEnum() failed");
461 _SBLIM_RETURNSTATUS(status);
462 }
464 /* Delete the target resource. */
465 rc = _FT->delete(&resList, res, &status);
466 if (rc != 1) {
467 /* Honor status set by resource. */
468 if (status.rc == CMPI_RC_OK) {
469 if (rc == -1) {
470 CMSetStatusWithChars(_BROKER, &status,
471 CMPI_RC_ERR_NOT_SUPPORTED, "add() unsupported");
472 }
473 else {
474 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "add() failed");
475 }
476 }
477 }
479 _FT->release(res);
480 _FT->endEnum(resList);
482 _SBLIM_RETURNSTATUS(status);
483 }
485 /* ------------------------------------------------------------------------- */
487 CMPIStatus CMPILR_execQuery
488 (CMPIInstanceMI* mi, const CMPIContext* ctx, const CMPIResult* rslt,
489 const CMPIObjectPath* ref, const char* query, const char* lang)
490 {
491 _SBLIM_ENTER("CMPILR_execQuery");
492 CMPIStatus status = {CMPI_RC_OK, NULL};
494 /* Create a new select expression from the query. */
495 CMPISelectExp* expr = CMNewSelectExp(_BROKER, query, lang, NULL, &status);
496 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(expr)) {
497 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_INVALID_QUERY, "CMNewSelectExp() failed");
498 _SBLIM_RETURNSTATUS(status);
499 }
501 /* Get handle to the list of resources. */
502 void* resList = NULL;
503 if (!_FT->beginEnum(&resList, &status)) {
504 /* Set status to FAILED if beginEnum didn't update */
505 if (status.rc == CMPI_RC_OK)
506 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "beginEnum() failed");
507 _SBLIM_RETURNSTATUS(status);
508 }
510 /* Enumerate all the resources and return a CMPIInstance for any that match the query. */
511 char* ns = CMGetCharPtr(CMGetNameSpace(ref, NULL));
512 int found = 0;
513 while (1) {
514 /* Create a new CMPIObjectPath for the next resource. */
515 CMPIObjectPath* op = CMNewObjectPath(_BROKER, ns, _CLASS, &status);
516 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(op)) {
517 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMNewObjectPath() failed");
518 break;
519 }
521 /* Create a new CMPIInstance for the next resource. */
522 CMPIInstance* inst = CMNewInstance(_BROKER, op, &status);
523 if ((status.rc != CMPI_RC_OK) || CMIsNullObject(inst)) {
524 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMNewInstance() failed");
525 break;
526 }
528 /* Get the next resource. */
529 void* res = NULL;
530 if (!_FT->getNext(resList, &res, &status))
531 break; /* while() loop exit! */
533 /* Set the CMPIInstance properties from the resource data. */
534 int rc = _FT->res2inst(res, inst, &status);
535 _FT->release(res);
536 if (!rc) {
537 /* Honor status set by resource. */
538 if (status.rc == CMPI_RC_OK)
539 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "res2inst() failed");
540 break;
541 }
543 /* Evaluate the select expression against this CMPIInstance. */
544 rc = CMEvaluateSelExp(expr, inst, &status);
545 if (status.rc != CMPI_RC_OK) {
546 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMEvaluateSelExp() failed");
547 break;
548 }
550 /* Return the CMPIInstance for the resource if it matches the original query. */
551 if (rc) {
552 status = CMReturnInstance(rslt, inst);
553 if (status.rc != CMPI_RC_OK) {
554 CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_FAILED, "CMReturnInstance() failed");
555 break;
556 }
557 found++;
558 }
559 } /* while() */
560 _FT->endEnum(resList);
562 _SBLIM_TRACE(_SBLIM_TRACE_LEVEL_INFO,("--- %d instances found", found));
564 if (status.rc == CMPI_RC_OK)
565 CMReturnDone(rslt);
567 _SBLIM_RETURNSTATUS(status);
568 }