static char * encrypt_by_prog (const unsigned char *str, size_t *len, Crypt *key) { char *ret = NULL, *input; char * args[3]; int iplen; args[0] = malloc_strdup(key->prog); args[1] = malloc_strdup("encrypt"); args[2] = NULL; input = malloc_strdup2(key->key, "\n"); iplen = strlen(input); new_realloc((void**)&input, *len + iplen); memmove(input + iplen, str, *len); *len += iplen; ret = exec_pipe(key->prog, input, len, args); new_free(&args[0]); new_free(&args[1]); new_free((char**)&input); new_realloc((void**)&ret, 1+*len); ret[*len] = 0; return ret; }
char * perlcall (char* sub, char* in, char* out, long item, char* input) { char *retval=NULL; int count, foo; an_array *array; dSP ; if (!isperlrunning) RETURN_MSTR(retval); ++perlcalldepth; ENTER; SAVETMPS; PUSHMARK(SP); if (input && *input) XPUSHs(sv_2mortal(newSVpv(input, 0))); if (in && *in && (array=get_array(in))) { for (foo=0; foo<array->size; foo++) { XPUSHs(sv_2mortal(newSVpv(array->item[foo], 0))); } } PUTBACK ; if (out && *out) { long size; upper(out); size=(array=get_array(out))?array->size:0; if (0>item) item=size-~item; if (item>size) item=-1; } else { item=-1; } if (0<=item) { I32 ax; count = perl_call_pv(sub, G_EVAL|G_ARRAY); SPAGAIN ; SP -= count ; ax = (SP - PL_stack_base) + 1 ; for (foo=0; foo<count; foo++) { set_item(out, item+foo, (char*)SvPV_nolen(ST(foo)), 1); } retval=(void*)new_realloc((void**)(&retval),32); snprintf(retval,31,"%u",count); } else { SV *sv; count = perl_call_pv(sub, G_EVAL|G_SCALAR); SPAGAIN ; sv=POPs ; SV2STR(sv,retval); } PUTBACK ; FREETMPS; LEAVE; --perlcalldepth; RETURN_MSTR(retval); }