/* Enable/Disable */
int (*enable) ( void *m, uint8_t e );
+ /* Free */
+ void (*done) ( void *m );
+
/* Channel listings */
void (*ch_add) ( void *m, struct channel *ch );
void (*ch_rem) ( void *m, struct channel *ch );
epggrab_module_int_t ; ///< Parent object
int sock; ///< Socket descriptor
+
+ pthread_t tid; ///< Thread ID
};
struct epggrab_ota_svc_link
/* Transponder tuning */
void (*start) ( epggrab_ota_map_t *map, struct mpegts_mux *mm );
- void (*done) ( epggrab_module_ota_t *m );
int (*tune) ( epggrab_ota_map_t *map, epggrab_ota_mux_t *om,
struct mpegts_mux *mm );
};
#include <string.h>
#include <pthread.h>
#include <unistd.h>
+#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
/*
* Run the parse
*/
-void epggrab_module_parse
- ( void *m, htsmsg_t *data )
+void epggrab_module_parse( void *m, htsmsg_t *data )
{
time_t tm1, tm2;
int save = 0;
* Internal module routines
* *************************************************************************/
+static void
+epggrab_module_int_done( void *m )
+{
+ epggrab_module_int_t *mod = m;
+ free((char *)mod->path);
+}
+
epggrab_module_int_t *epggrab_module_int_create
( epggrab_module_int_t *skel,
const char *id, const char *name, int priority,
skel->grab = grab ?: epggrab_module_grab_spawn;
skel->trans = trans ?: epggrab_module_trans_xml;
skel->parse = parse;
+ skel->done = epggrab_module_int_done;
return skel;
}
return NULL;
}
+/*
+ * Shutdown socket module
+ */
+static void
+epggrab_module_done_socket( void *m )
+{
+ epggrab_module_ext_t *mod = (epggrab_module_ext_t*)m;
+ int sock;
+
+ assert(mod->type == EPGGRAB_EXT);
+ mod->enabled = 0;
+ sock = mod->sock;
+ mod->sock = 0;
+ shutdown(sock, SHUT_RDWR);
+ close(sock);
+ if (mod->tid) {
+ pthread_kill(mod->tid, SIGTERM);
+ pthread_join(mod->tid, NULL);
+ }
+ mod->tid = 0;
+ if (mod->path)
+ unlink(mod->path);
+}
+
/*
* Enable socket module
*/
-int epggrab_module_enable_socket ( void *m, uint8_t e )
+static int
+epggrab_module_enable_socket ( void *m, uint8_t e )
{
- pthread_t tid;
pthread_attr_t tattr;
struct sockaddr_un addr;
epggrab_module_ext_t *mod = (epggrab_module_ext_t*)m;
/* Disable */
if (!e) {
- shutdown(mod->sock, SHUT_RDWR);
- close(mod->sock);
- unlink(mod->path);
- mod->sock = 0;
+ epggrab_module_done_socket(m);
/* Enable */
} else {
tvhlog(LOG_DEBUG, mod->id, "starting socket thread");
pthread_attr_init(&tattr);
- pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
- tvhthread_create(&tid, &tattr, _epggrab_socket_thread, mod, 1);
+ mod->enabled = 1;
+ tvhthread_create(&mod->tid, &tattr, _epggrab_socket_thread, mod, 0);
}
- mod->enabled = e;
return 1;
}
/* Local */
skel->type = EPGGRAB_EXT;
skel->enable = epggrab_module_enable_socket;
+ skel->done = epggrab_module_done_socket;
return skel;
}
void epggrab_module_ch_mod ( void *m, struct channel *ch );
void epggrab_module_ch_save ( void *m, epggrab_channel_t *ec );
-int epggrab_module_enable_socket ( void *m, uint8_t e );
-
void epggrab_module_parse ( void *m, htsmsg_t *data );
void epggrab_module_channels_load ( epggrab_module_t *m );
typedef struct epggrab_ota_module_ops {
void (*start) (epggrab_ota_map_t *map, struct mpegts_mux *mm);
int (*enable) (void *m, uint8_t e );
- void (*done) (epggrab_module_ota_t*m);
+ void (*done) (void *m);
int (*tune) (epggrab_ota_map_t *map, epggrab_ota_mux_t *om,
struct mpegts_mux *mm);
} epggrab_ota_module_ops_t;