AcePerl
view release on metacpan or search on metacpan
acelib/aceclientlib.c view on Meta::CPAN
question.magic = handle->magic ;
question.reponse.reponse_len = 0;
question.reponse.reponse_val = "";
question.question = "Quit";
question.aceError = 0;
question.kBytes = 0;
question.encore = 0;
reponse = ace_server_1(&question, handle->clnt);
if (reponse)
{ xdr_free((xdrproc_t )xdr_ace_reponse, (char *)reponse);
memset (reponse,0, sizeof(ace_reponse)) ;
}
clnt_destroy((CLIENT *)handle->clnt);
}
free((char *)handle);
}
}
/*************************************************************
transfer request to server, and wait for binary answer
INPUT
char * request string containing request
unsigned char ** answer ptr to char ptr, that has to be filled with answer
ace_handle * pointer to structure containing open connection
and client identification information
int chunkSize desired size (in kBytes) of returned data-block
This is only a hint. The server can return more.
The server splits on ace boundaries
a chunkSize of 0 indicates a request for unbuffered answers
OUTPUT
unsigned char ** answer ptr to char ptr. Pointing to allocated memory containing
answer string. This memory will be filled with the
unmodified data handled as binary bytes.
return value:
int error condition
ESUCCESS (0) no error.
EIO (5) no response received from server.
ENOMEM (12) no memory available to store answer.
or a server generated error
JC if the server can return both an encore and an aceError at the same time
I'm in trouble. I use only one int return value for both
*/
int askServerBinary(ace_handle *handle, char *request, unsigned char **answerPtr,
int *answerLength, int *encorep, int chunkSize)
{
ace_data question ;
ace_reponse *reponse = 0 ;
unsigned char *answer, *loop ;
int aceError, length, i, encore = 0 ;
/* generate question structure */
question.clientId = handle->clientId;
question.magic = handle->magic;
question.reponse.reponse_len = 0;
question.reponse.reponse_val = "";
question.kBytes = chunkSize;
question.aceError = 0;
/* check if request contains a local command */
if (!strncasecmp(request,"encore",6))
{
/* encore request */
question.encore = WANT_ENCORE;
question.question = "";
}
else if (!strncasecmp(request,"noencore",8))
{
/* encore request */
question.encore = DROP_ENCORE;
question.question = "";
}
else if (!strncasecmp(request,"quit",4))
{ /* ignore quit request. Must go through closeServer routine */
*answerLength = 0;
*answerPtr = NULL;
return 0;
}
else
{ question.encore = 0;
question.question = request;
}
if (*encorep == 3)
question.encore = -3 ;
reponse = ace_server_1(&question, handle->clnt);
/* validity checking of reponse */
/* no data was received, return error */
if (!reponse)
return EIO ;
/* store server returned error status. Give this to the client */
/* JC answer could contain more info on error, so
continue normal handling of the answer */
aceError = reponse->ace_reponse_u.res_data.aceError;
/* no answer was received, return NULL answer
leave checking for NULL reponse to upper layer
if (reponse->ace_reponse_u.res_data.reponse.reponse_len == 0) {
xdr_free((xdrproc_t )xdr_ace_reponse, (char *)reponse);
memset (reponse,0, sizeof(ace_reponse)) ;
*answerLength = 0;
*answerPtr = NULL;
return aceError;
}
*/
/* answer received. allocate memory and fill with answer */
length = reponse->ace_reponse_u.res_data.reponse.reponse_len;
loop = (unsigned char *) reponse->ace_reponse_u.res_data.reponse.reponse_val;
encore = reponse->ace_reponse_u.res_data.encore ;
if ((answer = (unsigned char *)malloc(sizeof(unsigned char)*(length+1))) == NULL)
{
/* JC Need to tell the server we have a problem ?
I guess if the server gave an encore, we need to cancel it
*/
xdr_free((xdrproc_t )xdr_ace_reponse, (char *)reponse);
return(ENOMEM);
}
( run in 1.174 second using v1.01-cache-2.11-cpan-f56aa216473 )