89 | 89 |
static PyObject *import_class(const char *module, const char *cls)
|
90 | 90 |
{
|
91 | 91 |
PyObject *s = PyImport_ImportModule(module);
|
|
92 |
if (s == NULL) {
|
|
93 |
return NULL;
|
|
94 |
}
|
92 | 95 |
return (PyObject *) PyObject_GetAttrString(s, cls);
|
93 | 96 |
}
|
94 | 97 |
|
|
137 | 140 |
return NULL;
|
138 | 141 |
}
|
139 | 142 |
|
140 | |
void
|
141 | |
pyeclib_c_seterr(int ret, const char * prefix)
|
142 | |
{
|
|
143 |
void pyeclib_c_seterr(int ret, const char * prefix) {
|
|
144 |
char *err_class;
|
|
145 |
char *err_msg;
|
143 | 146 |
char err[255];
|
144 | |
PyObject *eo = NULL;
|
145 | |
|
146 | |
strcpy(err, prefix);
|
|
147 |
|
|
148 |
// If any error was previously set, we're explicitly ignoring it
|
|
149 |
// to raise something new
|
|
150 |
PyErr_Clear();
|
|
151 |
|
147 | 152 |
switch (ret) {
|
148 | 153 |
case -EBACKENDNOTAVAIL:
|
149 | |
eo = import_class("pyeclib.ec_iface",
|
150 | |
"ECBackendInstanceNotAvailable");
|
151 | |
strcat(err, "Backend instance not found");
|
|
154 |
err_class = "ECBackendInstanceNotAvailable";
|
|
155 |
err_msg = "Backend instance not found";
|
152 | 156 |
break;
|
153 | 157 |
case -EINSUFFFRAGS:
|
154 | |
eo = import_class("pyeclib.ec_iface",
|
155 | |
"ECInsufficientFragments");
|
156 | |
strcat(err, "Insufficient number of fragments");
|
|
158 |
err_class = "ECInsufficientFragments";
|
|
159 |
err_msg = "Insufficient number of fragments";
|
157 | 160 |
break;
|
158 | 161 |
case -EBACKENDNOTSUPP:
|
159 | |
eo = import_class("pyeclib.ec_iface",
|
160 | |
"ECBackendNotSupported");
|
161 | |
strcat(err, "Backend not supported");
|
|
162 |
err_class = "ECBackendNotSupported";
|
|
163 |
err_msg = "Backend not supported";
|
162 | 164 |
break;
|
163 | 165 |
case -EINVALIDPARAMS:
|
164 | |
eo = import_class("pyeclib.ec_iface",
|
165 | |
"ECInvalidParameter");
|
166 | |
strcat(err, "Invalid arguments");
|
|
166 |
err_class = "ECInvalidParameter";
|
|
167 |
err_msg = "Invalid arguments";
|
167 | 168 |
break;
|
168 | 169 |
case -EBADCHKSUM:
|
169 | |
eo = import_class("pyeclib.ec_iface",
|
170 | |
"ECBadFragmentChecksum");
|
171 | |
strcat(err, "Fragment integrity check failed");
|
|
170 |
err_class = "ECBadFragmentChecksum";
|
|
171 |
err_msg = "Fragment integrity check failed";
|
172 | 172 |
break;
|
173 | 173 |
case -EBADHEADER:
|
174 | |
eo = import_class("pyeclib.ec_iface",
|
175 | |
"ECInvalidFragmentMetadata");
|
176 | |
strcat(err, "Fragment integrity check failed");
|
|
174 |
err_class = "ECInvalidFragmentMetadata";
|
|
175 |
err_msg = "Fragment integrity check failed";
|
177 | 176 |
break;
|
178 | 177 |
case -ENOMEM:
|
179 | |
eo = import_class("pyeclib.ec_iface",
|
180 | |
"ECOutOfMemory");
|
181 | |
strcat(err, "Out of memory");
|
|
178 |
err_class = "ECOutOfMemory";
|
|
179 |
err_msg = "Out of memory";
|
182 | 180 |
break;
|
183 | 181 |
default:
|
184 | |
eo = import_class("pyeclib.ec_iface",
|
185 | |
"ECDriverError");
|
186 | |
strcat(err, "Unknown error");
|
|
182 |
err_class = "ECDriverError";
|
|
183 |
err_msg = "Unknown error";
|
187 | 184 |
break;
|
188 | 185 |
}
|
189 | |
strcat(err, ". Please inspect syslog for liberasurecode error report.");
|
190 | |
PyErr_SetString(eo, err);
|
|
186 |
PyObject *eo = import_class("pyeclib.ec_iface", err_class);
|
|
187 |
if (eo != NULL) {
|
|
188 |
snprintf(err, 255,
|
|
189 |
"%s ERROR: %s. Please inspect syslog for liberasurecode error report.",
|
|
190 |
prefix, err_msg);
|
|
191 |
PyErr_SetString(eo, err);
|
|
192 |
}
|
191 | 193 |
}
|
192 | 194 |
|
193 | 195 |
static int stderr_fd;
|
|
238 | 240 |
if (!PyArg_ParseTuple(args, "iii|iiiii",
|
239 | 241 |
&k, &m, &backend_id, &hd, &use_inline_chksum,
|
240 | 242 |
&use_algsig_chksum, &validate)) {
|
241 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_init ERROR: ");
|
|
243 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_init");
|
242 | 244 |
return NULL;
|
243 | 245 |
}
|
244 | 246 |
|
245 | 247 |
/* Allocate and initialize the pyeclib object */
|
246 | 248 |
pyeclib_handle = (pyeclib_t *) alloc_zeroed_buffer(sizeof(pyeclib_t));
|
247 | 249 |
if (NULL == pyeclib_handle) {
|
248 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_init ERROR: ");
|
|
250 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_init");
|
249 | 251 |
goto cleanup;
|
250 | 252 |
}
|
251 | 253 |
|
|
261 | 263 |
if (pyeclib_handle->ec_desc <= 0) {
|
262 | 264 |
/* liberasurecode returns status in ec_desc as one of the error codes
|
263 | 265 |
* (LIBERASURECODE_ERROR_CODES) defined in erasurecode.h */
|
264 | |
pyeclib_c_seterr(pyeclib_handle->ec_desc, "pyeclib_c_init ERROR: ");
|
|
266 |
pyeclib_c_seterr(pyeclib_handle->ec_desc, "pyeclib_c_init");
|
265 | 267 |
goto cleanup;
|
266 | 268 |
}
|
267 | 269 |
|
|
277 | 279 |
|
278 | 280 |
/* Clean up the allocated memory on error, or update the ref count */
|
279 | 281 |
if (pyeclib_obj_handle == NULL) {
|
280 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_init ERROR: ");
|
|
282 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_init");
|
281 | 283 |
goto cleanup;
|
282 | 284 |
} else {
|
283 | 285 |
Py_INCREF(pyeclib_obj_handle);
|
|
304 | 306 |
pyeclib_t *pyeclib_handle = NULL; /* pyeclib object to destroy */
|
305 | 307 |
|
306 | 308 |
if (!PyCapsule_CheckExact(obj)) {
|
307 | |
pyeclib_c_seterr(-1, "pyeclib_c_destructor ERROR: ");
|
|
309 |
pyeclib_c_seterr(-1, "pyeclib_c_destructor");
|
308 | 310 |
return;
|
309 | 311 |
}
|
310 | 312 |
|
311 | 313 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(obj, PYECC_HANDLE_NAME);
|
312 | 314 |
if (pyeclib_handle == NULL) {
|
313 | |
pyeclib_c_seterr(-1, "pyeclib_c_destructor ERROR: ");
|
|
315 |
pyeclib_c_seterr(-1, "pyeclib_c_destructor");
|
314 | 316 |
} else {
|
315 | 317 |
check_and_free_buffer(pyeclib_handle);
|
316 | 318 |
}
|
|
354 | 356 |
pyeclib_t *pyeclib_handle = NULL;
|
355 | 357 |
PyObject *ret_dict = NULL; /* python dictionary to return */
|
356 | 358 |
|
357 | |
// Prepare variables for return dict to cleanup on exit
|
358 | |
PyObject *segment_size_key = NULL;
|
359 | |
PyObject *segment_size_value = NULL;
|
360 | |
PyObject *last_segment_size_key = NULL;
|
361 | |
PyObject *last_segment_size_value = NULL;
|
362 | |
PyObject *fragment_size_key = NULL;
|
363 | |
PyObject *fragment_size_value = NULL;
|
364 | |
PyObject *last_fragment_size_key = NULL;
|
365 | |
PyObject *last_fragment_size_value = NULL;
|
366 | |
PyObject *num_segments_key = NULL;
|
367 | |
PyObject *num_segments_value = NULL;
|
368 | |
|
369 | 359 |
int data_len; /* data length from user in bytes */
|
370 | 360 |
int segment_size, last_segment_size; /* segment sizes in bytes */
|
371 | 361 |
int num_segments; /* total number of segments */
|
|
374 | 364 |
|
375 | 365 |
/* Obtain and validate the method parameters */
|
376 | 366 |
if (!PyArg_ParseTuple(args, "Oii", &pyeclib_obj_handle, &data_len, &segment_size)) {
|
377 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
|
|
367 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info");
|
378 | 368 |
return NULL;
|
379 | 369 |
}
|
380 | 370 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(pyeclib_obj_handle, PYECC_HANDLE_NAME);
|
381 | 371 |
if (pyeclib_handle == NULL) {
|
382 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
|
|
372 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info");
|
383 | 373 |
return NULL;
|
384 | 374 |
}
|
385 | 375 |
|
386 | 376 |
/* The minimum segment size depends on the EC algorithm */
|
387 | 377 |
min_segment_size = liberasurecode_get_minimum_encode_size(pyeclib_handle->ec_desc);
|
388 | 378 |
if (min_segment_size < 0) {
|
389 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
|
|
379 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info");
|
390 | 380 |
return NULL;
|
391 | 381 |
}
|
392 | 382 |
|
|
415 | 405 |
|
416 | 406 |
fragment_size = liberasurecode_get_fragment_size(pyeclib_handle->ec_desc, data_len);
|
417 | 407 |
if (fragment_size < 0) {
|
418 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
|
|
408 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info");
|
419 | 409 |
return NULL;
|
420 | 410 |
}
|
421 | 411 |
|
|
431 | 421 |
|
432 | 422 |
fragment_size = liberasurecode_get_fragment_size(pyeclib_handle->ec_desc, segment_size);
|
433 | 423 |
if (fragment_size < 0) {
|
434 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
|
|
424 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info");
|
435 | 425 |
return NULL;
|
436 | 426 |
}
|
437 | 427 |
|
|
451 | 441 |
|
452 | 442 |
last_fragment_size = liberasurecode_get_fragment_size(pyeclib_handle->ec_desc, last_segment_size);
|
453 | 443 |
if (fragment_size < 0) {
|
454 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info ERROR: ");
|
|
444 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_segment_info");
|
455 | 445 |
return NULL;
|
456 | 446 |
}
|
457 | 447 |
}
|
|
461 | 451 |
fragment_size += sizeof(fragment_header_t);
|
462 | 452 |
|
463 | 453 |
/* Create and return the python dictionary of segment info */
|
464 | |
ret_dict = PyDict_New();
|
|
454 |
ret_dict = Py_BuildValue(
|
|
455 |
"{s:i, s:i, s:i, s:i, s:i}",
|
|
456 |
"segment_size", segment_size,
|
|
457 |
"last_segment_size", last_segment_size,
|
|
458 |
"fragment_size", fragment_size,
|
|
459 |
"last_fragment_size", last_fragment_size,
|
|
460 |
"num_segments", num_segments);
|
465 | 461 |
if (NULL == ret_dict) {
|
466 | 462 |
goto error;
|
467 | |
} else {
|
468 | |
if((segment_size_key = PyString_FromString("segment_size\0")) == NULL ||
|
469 | |
(segment_size_value = PyInt_FromLong(segment_size)) == NULL ||
|
470 | |
PyDict_SetItem(ret_dict, segment_size_key, segment_size_value)) goto error;
|
471 | |
|
472 | |
if((last_segment_size_key = PyString_FromString("last_segment_size\0")) == NULL ||
|
473 | |
(last_segment_size_value = PyInt_FromLong(last_segment_size)) == NULL ||
|
474 | |
PyDict_SetItem(ret_dict, last_segment_size_key, last_segment_size_value)) goto error;
|
475 | |
|
476 | |
if((fragment_size_key = PyString_FromString("fragment_size\0")) == NULL ||
|
477 | |
(fragment_size_value = PyInt_FromLong(fragment_size)) == NULL ||
|
478 | |
PyDict_SetItem(ret_dict, fragment_size_key, fragment_size_value)) goto error;
|
479 | |
|
480 | |
if((last_fragment_size_key = PyString_FromString("last_fragment_size\0")) == NULL ||
|
481 | |
(last_fragment_size_value = PyInt_FromLong(last_fragment_size)) == NULL ||
|
482 | |
PyDict_SetItem(ret_dict, last_fragment_size_key, last_fragment_size_value)) goto error;
|
483 | |
|
484 | |
if((num_segments_key = PyString_FromString("num_segments\0")) == NULL ||
|
485 | |
(num_segments_value = PyInt_FromLong(num_segments)) == NULL ||
|
486 | |
PyDict_SetItem(ret_dict, num_segments_key, num_segments_value)) goto error;
|
487 | 463 |
}
|
488 | 464 |
|
489 | 465 |
exit:
|
490 | |
Py_XDECREF(segment_size_key);
|
491 | |
Py_XDECREF(segment_size_value);
|
492 | |
Py_XDECREF(last_segment_size_key);
|
493 | |
Py_XDECREF(last_segment_size_value);
|
494 | |
Py_XDECREF(fragment_size_key);
|
495 | |
Py_XDECREF(fragment_size_value);
|
496 | |
Py_XDECREF(last_fragment_size_key);
|
497 | |
Py_XDECREF(last_fragment_size_value);
|
498 | |
Py_XDECREF(num_segments_key);
|
499 | |
Py_XDECREF(num_segments_value);
|
500 | 466 |
return ret_dict;
|
501 | 467 |
|
502 | 468 |
error:
|
503 | 469 |
// To prevent unexpected call, this is placed after return call
|
504 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_segment_info ERROR: ");
|
|
470 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_segment_info");
|
505 | 471 |
Py_XDECREF(ret_dict);
|
506 | 472 |
ret_dict = NULL;
|
507 | 473 |
goto exit;
|
|
532 | 498 |
|
533 | 499 |
/* Assume binary data (force "byte array" input) */
|
534 | 500 |
if (!PyArg_ParseTuple(args, ENCODE_ARGS, &pyeclib_obj_handle, &data, &data_len)) {
|
535 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode ERROR: ");
|
|
501 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode");
|
536 | 502 |
return NULL;
|
537 | 503 |
}
|
538 | 504 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(pyeclib_obj_handle, PYECC_HANDLE_NAME);
|
539 | 505 |
if (pyeclib_handle == NULL) {
|
540 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode ERROR: ");
|
|
506 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode");
|
541 | 507 |
return NULL;
|
542 | 508 |
}
|
543 | 509 |
|
544 | 510 |
ret = liberasurecode_encode(pyeclib_handle->ec_desc, data, data_len, &encoded_data, &encoded_parity, &fragment_len);
|
545 | 511 |
if (ret < 0) {
|
546 | |
pyeclib_c_seterr(ret, "pyeclib_c_encode ERROR: ");
|
|
512 |
pyeclib_c_seterr(ret, "pyeclib_c_encode");
|
547 | 513 |
return NULL;
|
548 | 514 |
}
|
549 | 515 |
|
550 | 516 |
/* Create the python list of fragments to return */
|
551 | 517 |
list_of_strips = PyList_New(pyeclib_handle->ec_args.k + pyeclib_handle->ec_args.m);
|
552 | 518 |
if (NULL == list_of_strips) {
|
553 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_encode ERROR: ");
|
|
519 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_encode");
|
554 | 520 |
return NULL;
|
555 | 521 |
}
|
556 | 522 |
|
|
600 | 566 |
|
601 | 567 |
/* Obtain and validate the method parameters */
|
602 | 568 |
if (!PyArg_ParseTuple(args, "OOO", &pyeclib_obj_handle, &reconstruct_list, &exclude_list)) {
|
603 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_required_fragments ERROR: ");
|
|
569 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_required_fragments");
|
604 | 570 |
return NULL;
|
605 | 571 |
}
|
606 | 572 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(pyeclib_obj_handle, PYECC_HANDLE_NAME);
|
607 | 573 |
if (pyeclib_handle == NULL) {
|
608 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_required_fragments ERROR: ");
|
|
574 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_required_fragments");
|
609 | 575 |
return NULL;
|
610 | 576 |
}
|
611 | 577 |
k = pyeclib_handle->ec_args.k;
|
|
615 | 581 |
num_missing = (int) PyList_Size(reconstruct_list);
|
616 | 582 |
c_reconstruct_list = (int *) alloc_zeroed_buffer((num_missing + 1) * sizeof(int));
|
617 | 583 |
if (NULL == c_reconstruct_list) {
|
618 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments ERROR: ");
|
|
584 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments");
|
619 | 585 |
return NULL;
|
620 | 586 |
}
|
621 | 587 |
c_reconstruct_list[num_missing] = -1;
|
|
628 | 594 |
num_exclude = (int) PyList_Size(exclude_list);
|
629 | 595 |
c_exclude_list = (int *) alloc_zeroed_buffer((num_exclude + 1) * sizeof(int));
|
630 | 596 |
if (NULL == c_exclude_list) {
|
631 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments ERROR: ");
|
|
597 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments");
|
632 | 598 |
goto exit;
|
633 | 599 |
}
|
634 | 600 |
c_exclude_list[num_exclude] = -1;
|
|
640 | 606 |
|
641 | 607 |
fragments_needed = alloc_zeroed_buffer(sizeof(int) * (k + m));
|
642 | 608 |
if (NULL == fragments_needed) {
|
643 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments ERROR: ");
|
|
609 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments");
|
644 | 610 |
goto exit;
|
645 | 611 |
}
|
646 | 612 |
|
647 | 613 |
ret = liberasurecode_fragments_needed(pyeclib_handle->ec_desc, c_reconstruct_list,
|
648 | 614 |
c_exclude_list, fragments_needed);
|
649 | 615 |
if (ret < 0) {
|
650 | |
pyeclib_c_seterr(ret, "pyeclib_c_get_required_fragments ERROR: ");
|
|
616 |
pyeclib_c_seterr(ret, "pyeclib_c_get_required_fragments");
|
651 | 617 |
goto exit;
|
652 | 618 |
}
|
653 | 619 |
|
654 | 620 |
/* Post-process into a Python list */
|
655 | 621 |
fragment_idx_list = PyList_New(0);
|
656 | 622 |
if (NULL == fragment_idx_list) {
|
657 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments ERROR: ");
|
|
623 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_get_required_fragments");
|
658 | 624 |
goto exit;
|
659 | 625 |
}
|
660 | 626 |
|
|
703 | 669 |
/* Obtain and validate the method parameters */
|
704 | 670 |
if (!PyArg_ParseTuple(args, "OOii", &pyeclib_obj_handle, &fragments,
|
705 | 671 |
&fragment_len, &destination_idx)) {
|
706 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_reconstruct ERROR: ");
|
|
672 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_reconstruct");
|
707 | 673 |
return NULL;
|
708 | 674 |
}
|
709 | 675 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(pyeclib_obj_handle, PYECC_HANDLE_NAME);
|
710 | 676 |
if (pyeclib_handle == NULL) {
|
711 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_reconstruct ERROR: ");
|
|
677 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_reconstruct");
|
712 | 678 |
return NULL;
|
713 | 679 |
}
|
714 | 680 |
|
715 | 681 |
/* Pre-processing Python data structures */
|
716 | 682 |
if (!PyList_Check(fragments)) {
|
717 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_reconstruct ERROR: ");
|
|
683 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_reconstruct");
|
718 | 684 |
return NULL;
|
719 | 685 |
}
|
720 | 686 |
|
|
722 | 688 |
|
723 | 689 |
c_fragments = (char **) alloc_zeroed_buffer(sizeof(char *) * num_fragments);
|
724 | 690 |
if (NULL == c_fragments) {
|
725 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_reconstruct ERROR: ");
|
|
691 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_reconstruct");
|
726 | 692 |
goto error;
|
727 | 693 |
}
|
728 | 694 |
|
729 | 695 |
c_reconstructed = (char*) alloc_zeroed_buffer(sizeof(char) * fragment_len);
|
730 | 696 |
if (NULL == c_fragments) {
|
731 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_reconstruct ERROR: ");
|
|
697 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_reconstruct");
|
732 | 698 |
goto error;
|
733 | 699 |
}
|
734 | 700 |
|
|
746 | 712 |
destination_idx,
|
747 | 713 |
c_reconstructed);
|
748 | 714 |
if (ret < 0) {
|
749 | |
pyeclib_c_seterr(ret, "pyeclib_c_reconstruct ERROR: ");
|
|
715 |
pyeclib_c_seterr(ret, "pyeclib_c_reconstruct");
|
750 | 716 |
reconstructed = NULL;
|
751 | 717 |
} else {
|
752 | 718 |
reconstructed = PY_BUILDVALUE_OBJ_LEN(c_reconstructed, fragment_len);
|
|
798 | 764 |
/* Obtain and validate the method parameters */
|
799 | 765 |
if (!PyArg_ParseTuple(args, "OOi|OO",&pyeclib_obj_handle, &fragments,
|
800 | 766 |
&fragment_len, &ranges, &metadata_checks_obj)) {
|
801 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode ERROR: ");
|
|
767 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode");
|
802 | 768 |
return NULL;
|
803 | 769 |
}
|
804 | 770 |
|
|
814 | 780 |
|
815 | 781 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(pyeclib_obj_handle, PYECC_HANDLE_NAME);
|
816 | 782 |
if (pyeclib_handle == NULL) {
|
817 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode ERROR: ");
|
|
783 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode");
|
818 | 784 |
return NULL;
|
819 | 785 |
}
|
820 | 786 |
if (!PyList_Check(fragments)) {
|
821 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode ERROR: ");
|
|
787 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode");
|
822 | 788 |
return NULL;
|
823 | 789 |
}
|
824 | 790 |
|
|
829 | 795 |
}
|
830 | 796 |
|
831 | 797 |
if (pyeclib_handle->ec_args.k > num_fragments) {
|
832 | |
pyeclib_c_seterr(-EINSUFFFRAGS, "pyeclib_c_decode ERROR: ");
|
|
798 |
pyeclib_c_seterr(-EINSUFFFRAGS, "pyeclib_c_decode");
|
833 | 799 |
return NULL;
|
834 | 800 |
}
|
835 | 801 |
|
836 | 802 |
if (num_ranges > 0) {
|
837 | 803 |
c_ranges = (pyeclib_byte_range_t*)malloc(sizeof(pyeclib_byte_range_t) * num_ranges);
|
838 | 804 |
if (NULL == c_ranges) {
|
839 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_decode ERROR: ");
|
|
805 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_decode");
|
840 | 806 |
goto error;
|
841 | 807 |
}
|
842 | 808 |
for (i = 0; i < num_ranges; i++) {
|
|
853 | 819 |
begin = PyInt_AsLong(py_begin);
|
854 | 820 |
#endif
|
855 | 821 |
else {
|
856 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range ERROR: ");
|
|
822 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range");
|
857 | 823 |
goto error;
|
858 | 824 |
}
|
859 | 825 |
if (PyLong_Check(py_end))
|
|
863 | 829 |
end = PyInt_AsLong(py_end);
|
864 | 830 |
#endif
|
865 | 831 |
else {
|
866 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range ERROR: ");
|
|
832 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range");
|
867 | 833 |
goto error;
|
868 | 834 |
}
|
869 | 835 |
|
|
872 | 838 |
|
873 | 839 |
range_payload_size += c_ranges[i].length;
|
874 | 840 |
} else {
|
875 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range ERROR: ");
|
|
841 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range");
|
876 | 842 |
goto error;
|
877 | 843 |
}
|
878 | 844 |
}
|
|
899 | 865 |
&orig_data_size);
|
900 | 866 |
|
901 | 867 |
if (ret < 0) {
|
902 | |
pyeclib_c_seterr(ret, "pyeclib_c_decode ERROR: ");
|
|
868 |
pyeclib_c_seterr(ret, "pyeclib_c_decode");
|
903 | 869 |
goto error;
|
904 | 870 |
}
|
905 | 871 |
|
|
908 | 874 |
} else {
|
909 | 875 |
ret_payload = PyList_New(num_ranges);
|
910 | 876 |
if (NULL == ret_payload) {
|
911 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_decode ERROR: ");
|
|
877 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_decode");
|
912 | 878 |
goto error;
|
913 | 879 |
}
|
914 | 880 |
range_payload_size = 0;
|
915 | 881 |
for (i = 0; i < num_ranges; i++) {
|
916 | 882 |
/* Check that range is within the original buffer */
|
917 | 883 |
if (c_ranges[i].offset + c_ranges[i].length > orig_data_size) {
|
918 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range ERROR: ");
|
|
884 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_decode invalid range");
|
919 | 885 |
goto error;
|
920 | 886 |
}
|
921 | 887 |
PyList_SET_ITEM(ret_payload, i,
|
|
1005 | 971 |
break;
|
1006 | 972 |
case 7:
|
1007 | 973 |
backend_id_str = "isa_l_rs_cauchy\0";
|
|
974 |
break;
|
|
975 |
case 8:
|
|
976 |
backend_id_str = "libphazr\0";
|
1008 | 977 |
break;
|
1009 | 978 |
default:
|
1010 | 979 |
backend_id_str = "unknown\0";
|
|
1048 | 1017 |
"backend_version", fragment_metadata->backend_version);
|
1049 | 1018 |
encoded_chksum = check_and_free_buffer(encoded_chksum);
|
1050 | 1019 |
if (metadata_dict == NULL) {
|
1051 | |
pyeclib_c_seterr(-ENOMEM, "fragment_metadata_to_dict ERROR: ");
|
|
1020 |
pyeclib_c_seterr(-ENOMEM, "fragment_metadata_to_dict");
|
1052 | 1021 |
return NULL;
|
1053 | 1022 |
}
|
1054 | 1023 |
return metadata_dict;
|
|
1076 | 1045 |
|
1077 | 1046 |
/* Obtain and validate the method parameters */
|
1078 | 1047 |
if (!PyArg_ParseTuple(args, GET_METADATA_ARGS, &pyeclib_obj_handle, &fragment, &fragment_len, &formatted)) {
|
1079 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_metadata ERROR: ");
|
|
1048 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_metadata");
|
1080 | 1049 |
return NULL;
|
1081 | 1050 |
}
|
1082 | 1051 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(pyeclib_obj_handle, PYECC_HANDLE_NAME);
|
1083 | 1052 |
if (pyeclib_handle == NULL) {
|
1084 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_metadata ERROR: ");
|
|
1053 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_get_metadata");
|
1085 | 1054 |
return NULL;
|
1086 | 1055 |
}
|
1087 | 1056 |
|
1088 | 1057 |
ret = liberasurecode_get_fragment_metadata(fragment, &c_fragment_metadata);
|
1089 | 1058 |
|
1090 | 1059 |
if (ret < 0) {
|
1091 | |
pyeclib_c_seterr(ret, "pyeclib_c_get_metadata ERROR: ");
|
|
1060 |
pyeclib_c_seterr(ret, "pyeclib_c_get_metadata");
|
1092 | 1061 |
fragment_metadata = NULL;
|
1093 | 1062 |
} else {
|
1094 | 1063 |
if (formatted) {
|
|
1132 | 1101 |
|
1133 | 1102 |
/* Obtain and validate the method parameters */
|
1134 | 1103 |
if (!PyArg_ParseTuple(args, "OO", &pyeclib_obj_handle, &fragment_metadata_list)) {
|
1135 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode ERROR: ");
|
|
1104 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode");
|
1136 | 1105 |
return NULL;
|
1137 | 1106 |
}
|
1138 | 1107 |
pyeclib_handle = (pyeclib_t*)PyCapsule_GetPointer(pyeclib_obj_handle, PYECC_HANDLE_NAME);
|
1139 | 1108 |
if (pyeclib_handle == NULL) {
|
1140 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode ERROR: ");
|
|
1109 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode");
|
1141 | 1110 |
return NULL;
|
1142 | 1111 |
}
|
1143 | 1112 |
k = pyeclib_handle->ec_args.k;
|
1144 | 1113 |
m = pyeclib_handle->ec_args.m;
|
1145 | 1114 |
num_fragments = k + m;
|
1146 | 1115 |
if (num_fragments != PyList_Size(fragment_metadata_list)) {
|
1147 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode ERROR: ");
|
|
1116 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_encode");
|
1148 | 1117 |
return NULL;
|
1149 | 1118 |
}
|
1150 | 1119 |
|
|
1152 | 1121 |
size = sizeof(char * ) * num_fragments;
|
1153 | 1122 |
c_fragment_metadata_list = (char **) alloc_zeroed_buffer(size);
|
1154 | 1123 |
if (NULL == c_fragment_metadata_list) {
|
1155 | |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_encode ERROR: ");
|
|
1124 |
pyeclib_c_seterr(-ENOMEM, "pyeclib_c_encode");
|
1156 | 1125 |
goto error;
|
1157 | 1126 |
}
|
1158 | 1127 |
|
|
1203 | 1172 |
const ec_backend_id_t backend_id;
|
1204 | 1173 |
|
1205 | 1174 |
if (!PyArg_ParseTuple(args, "i", &backend_id)) {
|
1206 | |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_check_backend_available ERROR: ");
|
|
1175 |
pyeclib_c_seterr(-EINVALIDPARAMS, "pyeclib_c_check_backend_available");
|
1207 | 1176 |
return NULL;
|
1208 | 1177 |
}
|
1209 | 1178 |
|
|
1216 | 1185 |
|
1217 | 1186 |
static PyObject*
|
1218 | 1187 |
pyeclib_c_liberasurecode_version(PyObject *self, PyObject *args) {
|
1219 | |
return PyInt_FromLong(LIBERASURECODE_VERSION);
|
|
1188 |
void *hLib;
|
|
1189 |
char *err;
|
|
1190 |
uint32_t (*hGetVersion)(void);
|
|
1191 |
|
|
1192 |
dlerror();
|
|
1193 |
hLib = dlopen("liberasurecode.so", RTLD_LAZY);
|
|
1194 |
/* It's important that we clear the last error before calling dysym */
|
|
1195 |
err = dlerror();
|
|
1196 |
if (err) {
|
|
1197 |
/* This should never actually get hit; since we're using various
|
|
1198 |
symbols already, liberasurecode.so should *already* be loaded. */
|
|
1199 |
return PyInt_FromLong(LIBERASURECODE_VERSION);
|
|
1200 |
}
|
|
1201 |
|
|
1202 |
hGetVersion = dlsym(hLib, "liberasurecode_get_version");
|
|
1203 |
err = dlerror();
|
|
1204 |
if (err) {
|
|
1205 |
/* This is the important bit. Old version, doesn't have get_version
|
|
1206 |
support; fall back to old behavior. */
|
|
1207 |
dlclose(hLib);
|
|
1208 |
return PyInt_FromLong(LIBERASURECODE_VERSION);
|
|
1209 |
}
|
|
1210 |
|
|
1211 |
uint32_t version = (*hGetVersion)();
|
|
1212 |
dlclose(hLib);
|
|
1213 |
return Py_BuildValue("k", version);
|
1220 | 1214 |
}
|
1221 | 1215 |
|
1222 | 1216 |
static PyMethodDef PyECLibMethods[] = {
|