blob: e3b8c4a8eb6f02162745279acb4910dac9c8e988 [file] [log] [blame]
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include<sys/wait.h>
#include <pthread.h>
#include <unistd.h>
#include <log/log.h>
#include <string.h>
#include <binder/Parcel.h>
#define SERVER_PORT 8088
#define BUFFER_SIZE 8192
#define LOG_TAG "PLUGIN_MAIN"
using::android::Parcel;
int server_socket_fd;
struct sockaddr_in client_addr;
static int s_started =0;
static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
static pthread_t s_tid_dispatch;
int plugin_StartSerSocket()
{
struct sockaddr_in server_addr;
bool count = true;
int ret = 0;
int dataSize = 0;
bzero(&server_addr, sizeof(server_addr));
Parcel parcel;
int32_t type= 0;
int32_t request = 0;
int32_t error = 0;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
/* create socket */
//int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(server_socket_fd == -1)
{
RLOGE("Create Socket Failed:");
exit(1);
}
/* bind socket port*/
if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
{
RLOGE("Server Bind Failed:");
exit(1);
}
/* tranlate data */
while(true)
{
/* define address to catch the client addreess*/
//struct sockaddr_in client_addr;
socklen_t client_addr_length = sizeof(client_addr);
printf("read socket 8088!!\n");
/* receive the data */
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
ret = recvfrom(server_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&client_addr, &client_addr_length);
if(ret == -1)
{
RLOGE("Receive Data Failed:");
continue;
}
if(count)
{
//uint8_t datalength[]=
uint8_t *datalength = (uint8_t *)buffer;
printf("PLUGIN:%s, receve: datalength[0] %x,datalength length = %d\n", inet_ntoa(client_addr.sin_addr),(datalength[0]<<8),ret);
if(ret==4)
{
if(((datalength[0]<<8)==0x5500)&&(datalength[1]==0xAA))
{
RLOGD("PLUGIN:%s, receve: dataSize1= %x,dataSize2= %x", inet_ntoa(client_addr.sin_addr), (datalength[2]<<8),datalength[3]);
printf("PLUGIN:%s, receve: dataSize1= %d,dataSize2= %d,dataSize = %d\n", inet_ntoa(client_addr.sin_addr), (datalength[2]<<8),datalength[3],((datalength[2]<<8)+datalength[3]));
dataSize = datalength[2]+datalength[3];
count=false;
}
}
}
else
{
count=true;
int32_t type= 0;
int32_t request = 0;
int32_t error = 0;
//parcel = (Parcel)buffer;
parcel.setData((unsigned char *)buffer, sizeof(buffer));
parcel.setDataPosition(0);
parcel.readInt32(&type);
parcel.readInt32(&request);
parcel.readInt32(&error);
RLOGD("PLUGIN:%s, receve: type= %d,request= %d,error = %d", inet_ntoa(client_addr.sin_addr), type,request,error);
printf("PLUGIN:%s, receve: type= %d,request= %d,error = %d\n", inet_ntoa(client_addr.sin_addr), type,request,error);
}
}
RLOGD("close socket fd");
close(server_socket_fd);
return 1;
}
void *eventLoop(void *param) {
pthread_mutex_lock(&s_startupMutex);
s_started = 1;
pthread_cond_broadcast(&s_startupCond);
pthread_mutex_unlock(&s_startupMutex);
//#ifdef ECALL_SUPPORT
//init_ecall_timer_all();
//#endif /**/ECALL_SUPPORT
plugin_StartSerSocket();
RLOGD("error in event_loop_base errno:%d", errno);
// kill self to restart on error
kill(0, SIGKILL);
return NULL;
}
void plugin_startEventLoop()
{
RLOGD("RIL_startEventLoop()");
/* spin up eventLoop thread and wait for it to get started */
s_started = 0;
pthread_mutex_lock(&s_startupMutex);
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
if (result != 0) {
RLOGW("Failed to create dispatch thread: %s", strerror(result));
goto done;
}
while (s_started == 0) {
pthread_cond_wait(&s_startupCond, &s_startupMutex);
}
done:
pthread_mutex_unlock(&s_startupMutex);
}
int onRequest()
{
printf("this is callback function\n");
return 0;
}
int main(int argc, char **argv)
{
plugin_startEventLoop();
while(1)
{
sleep(1);
}
return 0;
}