diff options
Diffstat (limited to 'mcast/client/.svn/text-base/api_server.c.svn-base')
-rw-r--r-- | mcast/client/.svn/text-base/api_server.c.svn-base | 397 |
1 files changed, 0 insertions, 397 deletions
diff --git a/mcast/client/.svn/text-base/api_server.c.svn-base b/mcast/client/.svn/text-base/api_server.c.svn-base deleted file mode 100644 index c3d7617..0000000 --- a/mcast/client/.svn/text-base/api_server.c.svn-base +++ /dev/null @@ -1,397 +0,0 @@ -/* - * (c) BayCom GmbH, http://www.baycom.de, info@baycom.de - * - * See the COPYING file for copyright information and - * how to reach the author. - * - */ - -#include "headers.h" - -#if defined(API_SOCK) || defined(API_SHM) || defined (API_WIN) - -static int process_cmd (api_cmd_t * api_cmd, tra_info_t * trl, netceiver_info_list_t * nci) -{ - if(api_cmd->magic != MCLI_MAGIC || api_cmd->version != MCLI_VERSION) { - api_cmd->magic = MCLI_MAGIC; - api_cmd->version = MCLI_VERSION; - api_cmd->state = API_RESPONSE; - return 0; - } - if (api_cmd->state != API_REQUEST) { - return 0; - } - - switch (api_cmd->cmd) { - case API_GET_NC_NUM: - api_cmd->parm[API_PARM_NC_NUM] = nci->nci_num; - api_cmd->state = API_RESPONSE; - break; - - case API_GET_NC_INFO: - if (api_cmd->parm[API_PARM_NC_NUM] < nci->nci_num) { - api_cmd->u.nc_info = nci->nci[api_cmd->parm[API_PARM_NC_NUM]]; - api_cmd->state = API_RESPONSE; - } else { - api_cmd->state = API_ERROR; - } - break; - case API_GET_TUNER_INFO: - if (api_cmd->parm[API_PARM_NC_NUM] < nci->nci_num) { - if (api_cmd->parm[API_PARM_TUNER_NUM] < nci->nci[api_cmd->parm[API_PARM_NC_NUM]].tuner_num) { - api_cmd->u.tuner_info = nci->nci[api_cmd->parm[API_PARM_NC_NUM]].tuner[api_cmd->parm[API_PARM_TUNER_NUM]]; - api_cmd->state = API_RESPONSE; - } else { - api_cmd->state = API_ERROR; - } - } else { - api_cmd->state = API_ERROR; - } - break; - case API_GET_SAT_LIST_INFO: - if (api_cmd->parm[API_PARM_NC_NUM] < nci->nci_num) { - if (api_cmd->parm[API_PARM_SAT_LIST_NUM] < nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list_num) { - api_cmd->u.sat_list = nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list[api_cmd->parm[API_PARM_SAT_LIST_NUM]]; - api_cmd->state = API_RESPONSE; - } else { - api_cmd->state = API_ERROR; - } - } else { - api_cmd->state = API_ERROR; - } - break; - case API_GET_SAT_INFO: - if (api_cmd->parm[API_PARM_NC_NUM] < nci->nci_num) { - if (api_cmd->parm[API_PARM_SAT_LIST_NUM] < nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list_num) { - if (api_cmd->parm[API_PARM_SAT_NUM] < nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list[api_cmd->parm[API_PARM_SAT_LIST_NUM]].sat_num) { - api_cmd->u.sat_info = nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list[api_cmd->parm[API_PARM_SAT_LIST_NUM]].sat[api_cmd->parm[API_PARM_SAT_NUM]]; - api_cmd->state = API_RESPONSE; - } else { - api_cmd->state = API_ERROR; - } - } else { - api_cmd->state = API_ERROR; - } - } else { - api_cmd->state = API_ERROR; - } - break; - - case API_GET_SAT_COMP_INFO: - if (api_cmd->parm[API_PARM_NC_NUM] < nci->nci_num) { - if (api_cmd->parm[API_PARM_SAT_LIST_NUM] < nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list_num) { - if (api_cmd->parm[API_PARM_SAT_NUM] < nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list[api_cmd->parm[API_PARM_SAT_LIST_NUM]].sat_num) { - if (api_cmd->parm[API_PARM_SAT_COMP_NUM] < nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list[api_cmd->parm[API_PARM_SAT_LIST_NUM]].sat[api_cmd->parm[API_PARM_SAT_NUM]].comp_num) { - api_cmd->u.sat_comp = nci->nci[api_cmd->parm[API_PARM_NC_NUM]].sat_list[api_cmd->parm[API_PARM_SAT_LIST_NUM]].sat[api_cmd->parm[API_PARM_SAT_NUM]].comp[api_cmd->parm[API_PARM_SAT_COMP_NUM]]; - api_cmd->state = API_RESPONSE; - } else { - api_cmd->state = API_ERROR; - } - } else { - api_cmd->state = API_ERROR; - } - } else { - api_cmd->state = API_ERROR; - } - } else { - api_cmd->state = API_ERROR; - } - break; - case API_GET_TRA_NUM: - api_cmd->parm[API_PARM_TRA_NUM] = trl->tra_num; - api_cmd->state = API_RESPONSE; - break; - case API_GET_TRA_INFO: - if (api_cmd->parm[API_PARM_TRA_NUM] < trl->tra_num) { - api_cmd->u.tra = trl->tra[api_cmd->parm[API_PARM_TRA_NUM]]; - api_cmd->state = API_RESPONSE; - } else { - api_cmd->state = API_ERROR; - } - break; - default: - api_cmd->state = API_ERROR; - } - return 1; -} -#endif -#ifdef API_SOCK -typedef struct -{ - pthread_t thread; - int fd; - struct sockaddr_un addr; - socklen_t len; - int run; -} sock_t; - -static void *sock_cmd_loop (void *p) -{ - sock_t *s = (sock_t *) p; - api_cmd_t sock_cmd; - int n; - netceiver_info_list_t *nc_list=nc_get_list(); - tra_info_t *tra_list=tra_get_list(); - - dbg ("new api client connected\n"); - s->run = 1; - while (s->run){ - n = recv (s->fd, &sock_cmd, sizeof (api_cmd_t), 0); - if (n == sizeof (api_cmd_t)) { - nc_lock_list(); - process_cmd (&sock_cmd, tra_list, nc_list); - nc_unlock_list(); - send (s->fd, &sock_cmd, sizeof (api_cmd_t), 0); - } else { - sock_cmd.magic = MCLI_MAGIC; - sock_cmd.version = MCLI_VERSION; - sock_cmd.state = API_RESPONSE; - send (s->fd, &sock_cmd, sizeof (api_cmd_t), 0); - break; - } - pthread_testcancel(); - } - - close (s->fd); - pthread_detach (s->thread); - free (s); - return NULL; -} - -static void *sock_cmd_listen_loop (void *p) -{ - sock_t tmp; - sock_t *s = (sock_t *) p; - dbg ("sock api listen loop started\n"); - s->run = 1; - - while (s->run) { - tmp.len = sizeof (struct sockaddr_un); - tmp.fd = accept (s->fd, (struct sockaddr*)&tmp.addr, &tmp.len); - if (tmp.fd >= 0) { - sock_t *as = (sock_t *) malloc (sizeof (sock_t)); - if (as == NULL) { - err ("Cannot get memory for socket\n"); - } - *as=tmp; - as->run = 0; - pthread_create (&as->thread, NULL, sock_cmd_loop, as); - } else { - break; - } - pthread_testcancel(); - } - pthread_detach (s->thread); - return NULL; -} - -static sock_t s; -int api_sock_init (const char *cmd_sock_path) -{ - s.addr.sun_family = AF_UNIX; - strcpy (s.addr.sun_path, cmd_sock_path); - s.len = sizeof(struct sockaddr_un); //strlen (cmd_sock_path) + sizeof (s.addr.sun_family); - - if ((s.fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) { - warn ("Cannot get socket %d\n", errno); - return -1; - } - unlink (cmd_sock_path); - if (bind (s.fd, (struct sockaddr*)&s.addr, s.len) < 0) { - warn ("Cannot bind control socket\n"); - return -1; - } - if (chmod(cmd_sock_path, S_IRWXU|S_IRWXG|S_IRWXO)) { - warn ("Cannot chmod 777 socket %s\n", cmd_sock_path); - } - if (listen (s.fd, 5) < 0) { - warn ("Cannot listen on socket\n"); - return -1; - } - return pthread_create (&s.thread, NULL, sock_cmd_listen_loop, &s); -} - -void api_sock_exit (void) -{ - //FIXME memory leak on exit in context structres - s.run=0; - close(s.fd); - - if(pthread_exist(s.thread) && !pthread_cancel (s.thread)) { - pthread_join (s.thread, NULL); - } -} -#endif -#ifdef API_SHM -static api_cmd_t *api_cmd = NULL; -static pthread_t api_cmd_loop_thread; - -static void *api_cmd_loop (void *p) -{ - netceiver_info_list_t *nc_list=nc_get_list(); - tra_info_t *tra_list=tra_get_list(); - while (1) { - nc_lock_list(); - process_cmd (api_cmd, tra_list, nc_list); - nc_unlock_list(); - usleep (1); - pthread_testcancel(); - } - - return NULL; -} - -int api_shm_init (void) -{ - int fd = shm_open (API_SHM_NAMESPACE, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); - if (fd == -1) { - warn ("Cannot get a shared memory handle\n"); - return -1; - } - if (ftruncate (fd, sizeof (api_cmd_t)) == -1) { - err ("Cannot truncate shared memory\n"); - } - api_cmd = mmap (NULL, sizeof (api_cmd_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (api_cmd == MAP_FAILED) { - err ("MMap of shared memory region failed\n"); - } - close (fd); - - memset (api_cmd, 0, sizeof (api_cmd_t)); - - pthread_create (&api_cmd_loop_thread, NULL, api_cmd_loop, NULL); - return 0; -} - -void api_shm_exit (void) -{ - if(pthread_exist(api_cmd_loop_thread) && !pthread_cancel (api_cmd_loop_thread)) { - pthread_join (api_cmd_loop_thread, NULL); - } - shm_unlink (API_SHM_NAMESPACE); -} -#endif -#ifdef API_WIN - -void *api_cmd_loop(void *lpvParam) -{ - netceiver_info_list_t *nc_list=nc_get_list(); - tra_info_t *tra_list=tra_get_list(); - api_cmd_t sock_cmd; - DWORD cbBytesRead, cbWritten; - BOOL fSuccess; - HANDLE hPipe; - - hPipe = (HANDLE) lpvParam; - - while (1) { - fSuccess = ReadFile( - hPipe, // handle to pipe - &sock_cmd, // buffer to receive data - sizeof(sock_cmd), // size of buffer - &cbBytesRead, // number of bytes read - NULL); // not overlapped I/O - - if (! fSuccess || cbBytesRead == 0) { - break; - } - - if (cbBytesRead == sizeof (api_cmd_t)) { - nc_lock_list(); - process_cmd (&sock_cmd, tra_list, nc_list); - nc_unlock_list(); - - fSuccess = WriteFile( - hPipe, // handle to pipe - &sock_cmd, // buffer to write from - sizeof(sock_cmd), // number of bytes to write - &cbWritten, // number of bytes written - NULL); // not overlapped I/O - - if (! fSuccess || sizeof(sock_cmd) != cbWritten) { - break; - } - } else { - sock_cmd.magic = MCLI_MAGIC; - sock_cmd.version = MCLI_VERSION; - sock_cmd.state = API_RESPONSE; - fSuccess = WriteFile( - hPipe, // handle to pipe - &sock_cmd, // buffer to write from - sizeof(sock_cmd), // number of bytes to write - &cbWritten, // number of bytes written - NULL); // not overlapped I/O - - if (! fSuccess || sizeof(sock_cmd) != cbWritten) { - break; - } - break; - } - } - - FlushFileBuffers(hPipe); - DisconnectNamedPipe(hPipe); - CloseHandle(hPipe); - - return NULL; -} - -#define BUFSIZE 2048 -void *api_listen_loop(void *p) -{ - BOOL fConnected; - pthread_t api_cmd_loop_thread; - HANDLE hPipe; - LPTSTR lpszPipename=(LPTSTR)p; - - while(1) { - hPipe = CreateNamedPipe( - lpszPipename, // pipe name - PIPE_ACCESS_DUPLEX, // read/write access - PIPE_TYPE_MESSAGE | // message type pipe - PIPE_READMODE_MESSAGE | // message-read mode - PIPE_WAIT, // blocking mode - PIPE_UNLIMITED_INSTANCES, // max. instances - BUFSIZE, // output buffer size - BUFSIZE, // input buffer size - 0, // client time-out - NULL); // default security attribute - - if (hPipe == INVALID_HANDLE_VALUE) { - err ("CreatePipe failed"); - return NULL; - } - pthread_testcancel(); - fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); - - if (fConnected) { - if(pthread_create(&api_cmd_loop_thread, NULL, api_cmd_loop, hPipe)) { - err ("CreateThread failed"); - return NULL; - } else { - pthread_detach(api_cmd_loop_thread); - } - } - else { - CloseHandle(hPipe); - } - } - return NULL; -} - -pthread_t api_listen_loop_thread; - -int api_init (LPTSTR cmd_pipe_path) -{ - return pthread_create (&api_listen_loop_thread, NULL, api_listen_loop, cmd_pipe_path); -} - -void api_exit (void) -{ - if(pthread_exist(api_listen_loop_thread) && !pthread_cancel (api_listen_loop_thread)) { - TerminateThread(pthread_getw32threadhandle_np(api_listen_loop_thread),0); - pthread_join (api_listen_loop_thread, NULL); - } -} - -#endif |