mirror of
https://github.com/rofafor/vdr-plugin-iptv.git
synced 2023-10-10 13:37:03 +02:00
Removed SystemExec() from EXT protocol.
This commit is contained in:
parent
f9252cc925
commit
90abed4598
2
README
2
README
@ -95,7 +95,7 @@ Configuration:
|
|||||||
|
|
||||||
- channels.conf
|
- channels.conf
|
||||||
|
|
||||||
TV4;IPTV:4:IPTV|EXT|/video/iptvradio.sh|4321:P:0:0:680:0:0:4:0:0:0
|
TV4;IPTV:4:IPTV|EXT|/video/iptvstream.sh|4321:P:0:0:680:0:0:4:0:0:0
|
||||||
TV3;IPTV:3:IPTV|FILE|/media/video.ts|5:P:0:514:670:2321:0:3:0:0:0
|
TV3;IPTV:3:IPTV|FILE|/media/video.ts|5:P:0:514:670:2321:0:3:0:0:0
|
||||||
TV2;IPTV:2:IPTV|HTTP|127.0.0.1/TS/2|3000:P:0:513:660:2321:0:2:0:0:0
|
TV2;IPTV:2:IPTV|HTTP|127.0.0.1/TS/2|3000:P:0:513:660:2321:0:2:0:0:0
|
||||||
TV1;IPTV:1:IPTV|UDP|127.0.0.1|1234:P:0:512:650:2321:0:1:0:0:0
|
TV1;IPTV:1:IPTV|UDP|127.0.0.1|1234:P:0:512:650:2321:0:1:0:0:0
|
||||||
|
15
iptv/iptvstream.sh
Executable file
15
iptv/iptvstream.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
URL=""
|
||||||
|
|
||||||
|
if [ -z "${URL}" ]; then
|
||||||
|
logger "$0: error: URL not defined!"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -ne 1 ]; then
|
||||||
|
logger "$0: error: Invalid parameter count '$#' $*"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec vlc ${URL} --sout \"#transcode{vcodec=mp2v,acodec=mpga,vb=800,ab=192}:standard{access=udp,mux=ts,dst=127.0.0.1:${1}}\" --intf dummy
|
@ -3,9 +3,10 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: protocolext.c,v 1.3 2007/10/16 22:13:44 rahrenbe Exp $
|
* $Id: protocolext.c,v 1.4 2007/10/18 19:33:15 rahrenbe Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
@ -20,7 +21,8 @@
|
|||||||
#include "protocolext.h"
|
#include "protocolext.h"
|
||||||
|
|
||||||
cIptvProtocolExt::cIptvProtocolExt()
|
cIptvProtocolExt::cIptvProtocolExt()
|
||||||
: listenPort(4321),
|
: pid(-1),
|
||||||
|
listenPort(4321),
|
||||||
socketDesc(-1),
|
socketDesc(-1),
|
||||||
readBufferLen(TS_SIZE * IptvConfig.GetReadBufferTsCount()),
|
readBufferLen(TS_SIZE * IptvConfig.GetReadBufferTsCount()),
|
||||||
isActive(false)
|
isActive(false)
|
||||||
@ -99,6 +101,62 @@ void cIptvProtocolExt::CloseSocket(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cIptvProtocolExt::ExecuteCommand(void)
|
||||||
|
{
|
||||||
|
debug("cIptvProtocolExt::ExecuteCommand()\n");
|
||||||
|
// Let's fork
|
||||||
|
if ((pid = fork()) == -1) {
|
||||||
|
char tmp[64];
|
||||||
|
error("ERROR: fork(): %s", strerror_r(errno, tmp, sizeof(tmp)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if child process
|
||||||
|
if (pid == 0) {
|
||||||
|
// Close all dup'ed filedescriptors
|
||||||
|
int MaxPossibleFileDescriptors = getdtablesize();
|
||||||
|
for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++)
|
||||||
|
close(i);
|
||||||
|
// Execute the external script
|
||||||
|
char* cmd = NULL;
|
||||||
|
asprintf(&cmd, "%s %d", streamAddr, listenPort);
|
||||||
|
debug("cIptvProtocolExt::ExecuteCommand(child): %s\n", cmd);
|
||||||
|
if (execl("/bin/sh", "sh", "-c", cmd, NULL) == -1) {
|
||||||
|
free(cmd);
|
||||||
|
error("ERROR: Command failed: %s", streamAddr);
|
||||||
|
_exit(-1);
|
||||||
|
}
|
||||||
|
free(cmd);
|
||||||
|
_exit(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isActive = true;
|
||||||
|
debug("cIptvProtocolExt::ExecuteCommand(): pid=%d\n", pid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cIptvProtocolExt::TerminateCommand(void)
|
||||||
|
{
|
||||||
|
debug("cIptvProtocolExt::TerminateCommand(): pid=%d\n", pid);
|
||||||
|
if (pid > 0) {
|
||||||
|
const unsigned int timeoutms = 100;
|
||||||
|
unsigned int waitms = 0;
|
||||||
|
// signal and wait for termination
|
||||||
|
kill(pid, SIGTERM);
|
||||||
|
while (waitpid(pid, NULL, WNOHANG) == 0) {
|
||||||
|
waitms += timeoutms;
|
||||||
|
// Signal kill every 2 seconds
|
||||||
|
if ((waitms % 2000) == 0) {
|
||||||
|
error("ERROR: Script '%s' won't terminate - killing it", streamAddr);
|
||||||
|
kill(pid, SIGKILL);
|
||||||
|
}
|
||||||
|
// Sleep for awhile
|
||||||
|
cCondWait::SleepMs(timeoutms);
|
||||||
|
}
|
||||||
|
pid = -1;
|
||||||
|
isActive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int cIptvProtocolExt::Read(unsigned char* *BufferAddr)
|
int cIptvProtocolExt::Read(unsigned char* *BufferAddr)
|
||||||
{
|
{
|
||||||
@ -164,22 +222,14 @@ int cIptvProtocolExt::Read(unsigned char* *BufferAddr)
|
|||||||
|
|
||||||
bool cIptvProtocolExt::Open(void)
|
bool cIptvProtocolExt::Open(void)
|
||||||
{
|
{
|
||||||
debug("cIptvProtocolExt::Open(): streamAddr=%s\n", streamAddr);
|
debug("cIptvProtocolExt::Open(): streamAddr=%s listenPort=%d\n", streamAddr, listenPort);
|
||||||
|
|
||||||
// Reject completely empty stream addresses
|
// Reject completely empty stream addresses
|
||||||
if (!strlen(streamAddr))
|
if (!strlen(streamAddr))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Create the listening socket
|
// Create the listening socket
|
||||||
OpenSocket();
|
OpenSocket();
|
||||||
if (!isActive) {
|
if (!isActive)
|
||||||
char* cmd = NULL;
|
ExecuteCommand();
|
||||||
asprintf(&cmd, "%s start", streamAddr);
|
|
||||||
int retval = SystemExec(cmd);
|
|
||||||
free(cmd);
|
|
||||||
if (!retval)
|
|
||||||
isActive = true;
|
|
||||||
}
|
|
||||||
return isActive;
|
return isActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,15 +238,8 @@ bool cIptvProtocolExt::Close(void)
|
|||||||
debug("cIptvProtocolExt::Close(): streamAddr=%s\n", streamAddr);
|
debug("cIptvProtocolExt::Close(): streamAddr=%s\n", streamAddr);
|
||||||
// Close the socket
|
// Close the socket
|
||||||
CloseSocket();
|
CloseSocket();
|
||||||
if (isActive) {
|
if (isActive)
|
||||||
char* cmd = NULL;
|
TerminateCommand();
|
||||||
asprintf(&cmd, "%s stop", streamAddr);
|
|
||||||
int retval = SystemExec(cmd);
|
|
||||||
free(cmd);
|
|
||||||
if (!retval)
|
|
||||||
isActive = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return !isActive;
|
return !isActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: protocolext.h,v 1.2 2007/10/16 22:13:44 rahrenbe Exp $
|
* $Id: protocolext.h,v 1.3 2007/10/18 19:33:15 rahrenbe Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __IPTV_PROTOCOLEXT_H
|
#ifndef __IPTV_PROTOCOLEXT_H
|
||||||
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
class cIptvProtocolExt : public cIptvProtocolIf {
|
class cIptvProtocolExt : public cIptvProtocolIf {
|
||||||
private:
|
private:
|
||||||
|
int pid;
|
||||||
char* listenAddr;
|
char* listenAddr;
|
||||||
int listenPort;
|
int listenPort;
|
||||||
char* streamAddr;
|
char* streamAddr;
|
||||||
@ -26,6 +27,8 @@ private:
|
|||||||
private:
|
private:
|
||||||
bool OpenSocket(void);
|
bool OpenSocket(void);
|
||||||
void CloseSocket(void);
|
void CloseSocket(void);
|
||||||
|
void TerminateCommand(void);
|
||||||
|
void ExecuteCommand(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cIptvProtocolExt();
|
cIptvProtocolExt();
|
||||||
|
Loading…
Reference in New Issue
Block a user