Going on
This commit is contained in:
parent
b68d1167da
commit
7a243fdb8d
|
@ -95,7 +95,7 @@ static int _new_append(AppInterface * ai, AppInterfaceCallType type,
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "%s%s%s%d%s", "interface supports ", function, "(",
|
fprintf(stderr, "%s%s%s%d%s", "AppInterface supports ", function, "(",
|
||||||
args_cnt, ")\n");
|
args_cnt, ")\n");
|
||||||
#endif
|
#endif
|
||||||
for(i = 0; i < ai->calls_cnt; i++)
|
for(i = 0; i < ai->calls_cnt; i++)
|
||||||
|
@ -138,11 +138,16 @@ static int _new_hello(AppInterface * appinterface)
|
||||||
|
|
||||||
|
|
||||||
/* appinterface_new_server */
|
/* appinterface_new_server */
|
||||||
|
/* FIXME */
|
||||||
|
extern void * handle;
|
||||||
AppInterface * appinterface_new_server(char const * app)
|
AppInterface * appinterface_new_server(char const * app)
|
||||||
{
|
{
|
||||||
AppInterface * appinterface;
|
AppInterface * appinterface;
|
||||||
void * handle;
|
void * handle;
|
||||||
int i;
|
int i;
|
||||||
|
#ifdef DEBUG
|
||||||
|
char * error;
|
||||||
|
#endif
|
||||||
|
|
||||||
if((handle = dlopen(NULL, RTLD_LAZY)) == NULL)
|
if((handle = dlopen(NULL, RTLD_LAZY)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -150,12 +155,14 @@ AppInterface * appinterface_new_server(char const * app)
|
||||||
return NULL;
|
return NULL;
|
||||||
for(i = 0; i < appinterface->calls_cnt; i++)
|
for(i = 0; i < appinterface->calls_cnt; i++)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
dlerror();
|
||||||
|
#endif
|
||||||
appinterface->calls[i].func = dlsym(handle,
|
appinterface->calls[i].func = dlsym(handle,
|
||||||
appinterface->calls[i].name);
|
appinterface->calls[i].name);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if(appinterface->calls[i].func == NULL)
|
if((error = dlerror()) != NULL)
|
||||||
fprintf(stderr, "%s%s%s", "AppServer lacks function \"",
|
fprintf(stderr, "%s%s\n", "AppServer: ", error);
|
||||||
appinterface->calls[i].name, "\"\n");
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
dlclose(handle);
|
dlclose(handle);
|
||||||
|
@ -206,6 +213,7 @@ int appinterface_call(AppInterface * appinterface, char * call, char buf[],
|
||||||
{
|
{
|
||||||
switch(aic->args[i])
|
switch(aic->args[i])
|
||||||
{
|
{
|
||||||
|
case AICT_BOOL:
|
||||||
case AICT_INT8:
|
case AICT_INT8:
|
||||||
case AICT_UINT8:
|
case AICT_UINT8:
|
||||||
size = sizeof(int8_t);
|
size = sizeof(int8_t);
|
||||||
|
@ -270,6 +278,8 @@ static int _send_string(char * string, char buf[], int buflen, int * pos)
|
||||||
|
|
||||||
/* appinterface_receive */
|
/* appinterface_receive */
|
||||||
static char * _read_string(char buf[], int buflen, int * pos);
|
static char * _read_string(char buf[], int buflen, int * pos);
|
||||||
|
static int _receive_args(AppInterfaceCall * calls, char buf[], int buflen,
|
||||||
|
int * pos);
|
||||||
int appinterface_receive(AppInterface * appinterface, char buf[], int buflen)
|
int appinterface_receive(AppInterface * appinterface, char buf[], int buflen)
|
||||||
{
|
{
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
@ -284,8 +294,11 @@ int appinterface_receive(AppInterface * appinterface, char buf[], int buflen)
|
||||||
for(i = 0; i < appinterface->calls_cnt; i++)
|
for(i = 0; i < appinterface->calls_cnt; i++)
|
||||||
if(string_compare(appinterface->calls[i].name, func) == 0)
|
if(string_compare(appinterface->calls[i].name, func) == 0)
|
||||||
break;
|
break;
|
||||||
|
string_delete(func);
|
||||||
if(i == appinterface->calls_cnt)
|
if(i == appinterface->calls_cnt)
|
||||||
return -1;
|
return -1;
|
||||||
|
if(_receive_args(&appinterface->calls[i], buf, buflen, &pos) != 0)
|
||||||
|
return -1;
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -295,5 +308,108 @@ static char * _read_string(char buf[], int buflen, int * pos)
|
||||||
if(*pos == buflen)
|
if(*pos == buflen)
|
||||||
return NULL;
|
return NULL;
|
||||||
(*pos)++;
|
(*pos)++;
|
||||||
return buf;
|
return string_new(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _read_buffer(char ** data, int datalen, char buf[], int buflen,
|
||||||
|
int * pos);
|
||||||
|
static int _receive_args(AppInterfaceCall * calls, char buf[], int buflen,
|
||||||
|
int * pos)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char ** args;
|
||||||
|
size_t size;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
if((args = malloc(sizeof(char*) * calls->args_cnt)) == NULL)
|
||||||
|
return 1;
|
||||||
|
for(i = 0; i < calls->args_cnt; i++)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "%s%d%s", "_receive_args() reading ", i,
|
||||||
|
" arg\n");
|
||||||
|
#endif
|
||||||
|
switch(calls->args[i])
|
||||||
|
{
|
||||||
|
case AICT_VOID:
|
||||||
|
continue;
|
||||||
|
case AICT_BOOL:
|
||||||
|
case AICT_INT8:
|
||||||
|
case AICT_UINT8:
|
||||||
|
size = sizeof(int8_t);
|
||||||
|
break;
|
||||||
|
case AICT_INT16:
|
||||||
|
case AICT_UINT16:
|
||||||
|
size = sizeof(int16_t);
|
||||||
|
break;
|
||||||
|
case AICT_INT32:
|
||||||
|
case AICT_UINT32:
|
||||||
|
size = sizeof(int32_t);
|
||||||
|
break;
|
||||||
|
case AICT_INT64:
|
||||||
|
case AICT_UINT64:
|
||||||
|
size = sizeof(int64_t);
|
||||||
|
break;
|
||||||
|
case AICT_STRING:
|
||||||
|
args[i] = _read_string(buf, buflen, pos);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(sizeof(char*) < size)
|
||||||
|
{
|
||||||
|
if((args[i] = malloc(size)) == NULL)
|
||||||
|
break;
|
||||||
|
if(_read_buffer(args[i], size, buf, buflen, pos) != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if(_read_buffer(&args[i], size, buf, buflen, pos) != 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FIXME exec target code */
|
||||||
|
/* FIXME free everything allocated */
|
||||||
|
for(j = 0; j < i; j++)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "%s%d%s", "_receive_args() freeing ", j,
|
||||||
|
" arg\n");
|
||||||
|
#endif
|
||||||
|
switch(calls->args[j])
|
||||||
|
{
|
||||||
|
case AICT_VOID:
|
||||||
|
continue;
|
||||||
|
case AICT_BOOL:
|
||||||
|
case AICT_INT8:
|
||||||
|
case AICT_UINT8:
|
||||||
|
size = sizeof(int8_t);
|
||||||
|
break;
|
||||||
|
case AICT_INT16:
|
||||||
|
case AICT_UINT16:
|
||||||
|
size = sizeof(int16_t);
|
||||||
|
break;
|
||||||
|
case AICT_INT32:
|
||||||
|
case AICT_UINT32:
|
||||||
|
size = sizeof(int32_t);
|
||||||
|
break;
|
||||||
|
case AICT_INT64:
|
||||||
|
case AICT_UINT64:
|
||||||
|
size = sizeof(int64_t);
|
||||||
|
break;
|
||||||
|
case AICT_STRING:
|
||||||
|
free(args[j]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(sizeof(char*) < size)
|
||||||
|
free(args[i]);
|
||||||
|
}
|
||||||
|
free(args);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _read_buffer(char ** data, int datalen, char buf[], int buflen,
|
||||||
|
int * pos)
|
||||||
|
{
|
||||||
|
if(datalen > buflen - *pos)
|
||||||
|
return 1;
|
||||||
|
memcpy(data, buf, datalen);
|
||||||
|
(*pos)+=datalen;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,7 +162,12 @@ static int _read_process(AppServer * appserver, AppServerClient * asc)
|
||||||
static int _appserver_receive(AppServer * appserver, AppServerClient * asc);
|
static int _appserver_receive(AppServer * appserver, AppServerClient * asc);
|
||||||
static int _read_logged(AppServer * appserver, AppServerClient * asc)
|
static int _read_logged(AppServer * appserver, AppServerClient * asc)
|
||||||
{
|
{
|
||||||
return _appserver_receive(appserver, asc);
|
if(_appserver_receive(appserver, asc) != 0)
|
||||||
|
{
|
||||||
|
close(asc->fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _appserver_receive(AppServer * appserver, AppServerClient * asc)
|
static int _appserver_receive(AppServer * appserver, AppServerClient * asc)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user