summaryrefslogtreecommitdiff
path: root/dvdplugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'dvdplugin.c')
-rw-r--r--dvdplugin.c122
1 files changed, 65 insertions, 57 deletions
diff --git a/dvdplugin.c b/dvdplugin.c
index 4412e0a..0579238 100644
--- a/dvdplugin.c
+++ b/dvdplugin.c
@@ -1,4 +1,4 @@
-#include <vdr/remote.h>
+
#include <vdr/plugin.h>
#include <vdr/player.h>
#include <unistd.h>
@@ -62,63 +62,68 @@ cDVDPluginThread *cDVDPlugin::thread = NULL;
void cDVDPlugin::DetectDevice(void)
{
- dsyslog("dvdswitch: Scan for DVD Device");
- char *cmd = NULL;
- char *output = NULL;
+ dsyslog("dvdswitch: parse cmdline of dvd-plugin for DVD Device");
+ char *file = NULL;
char *dvd = NULL;
- if(0 < asprintf(&cmd, "ps -p %i -o cmd --no-header", getpid())) {
- dsyslog("dvdswitch: Command: %s", cmd);
-
- FILE *p = popen(cmd, "r");
- if(p)
- {
- #if VDRVERSNUM >= 10318
- cReadLine rl;
- output = rl.Read(p);
- #else
- output = readline(p);
- #endif
- pclose(p);
+ if(0 < asprintf(&file, "/proc/%i/cmdline", getpid())) {
+ /* read /proc/`pidof vdr`/cmdline */
+ char buffer[1024];
+ int len = -1;
+
+ int fd = open(file,O_RDONLY);
+ if (fd >= 0) {
+ do {
+ len = read(fd,buffer,sizeof(buffer)); }
+ while (len == -1 && errno == EINTR);
+ close(fd);
+ } else {
+ char* szErr = get_strerror(errno);
+ esyslog("dvdswitch: could not open %s:%s", file, szErr ? szErr : "");
+ if(szErr) free(szErr);
}
-
- cTokenizer *token = new cTokenizer(output, " ");
- for(int i = 1; i <= token->Count(); i++)
- {
- if(RegIMatch(token->GetToken(i), "^--plugin=dvd") ||
- (RegIMatch(token->GetToken(i - 1), "^-P$") &&
- RegIMatch(token->GetToken(i), "^dvd$")))
- {
- if(RegIMatch(token->GetToken(i + 1), "^-C$") &&
- token->GetToken(i + 2))
- {
- dvd = strdup(token->GetToken(i + 2));
- break;
- }
- if(RegIMatch(token->GetToken(i + 1), "^--dvd="))
- {
- const char *p = strchr(token->GetToken(i + 1), '=');
- p++;
- dvd = strdup(p);
- break;
+ free(file);
+
+ if (len < 0) {
+ char* szErr = get_strerror(errno);
+ esyslog("dvdswitch: could not read %s:%s", file, szErr ? szErr : "");
+ if(szErr) free(szErr);
+ } else {
+ char *output = NULL;
+ for(int n = 0; n < len && !dvd;n += (strlen(output) + 1)) {
+ output = buffer + n;
+ //dsyslog("dvdswitch: parse '%s'", output);
+ if(0 == strncmp(output, "--plugin=dvd ",13)
+ || 0 == strncmp(output, "-Pdvd ",6)
+ || 0 == strncmp(output, "-P dvd ",7)
+ || 0 == strncmp(output, "-P'dvd ",7)
+ || 0 == strncmp(output, "-P\"dvd ",7)) {
+
+ cTokenizer *token = new cTokenizer(output, " ");
+ for(int i = 0; i <= token->Count(); i++) {
+ if(RegIMatch(token->GetToken(i), "^-C$") &&
+ token->GetToken(i + 1)) {
+ dvd = strdup(token->GetToken(i + 1));
+ break;
+ }
+ if(RegIMatch(token->GetToken(i), "^--dvd=")) {
+ const char *p = strchr(token->GetToken(i), '=');
+ dvd = strdup(p + 1);
+ break;
+ }
+ }
+ DELETENULL(token);
}
}
}
- DELETENULL(token);
-
- if(dvd)
- {
- isyslog("dvdswitch: Used DVD Device: %s", dvd);
+ if(!dvd) {
+ dvd = strdup("/dev/dvd");
+ }
+ if(dvd) {
+ isyslog("dvdswitch: use DVD Device: %s", dvd);
DVDSwitchSetup.SetDVDDevice(dvd);
free(dvd);
}
- else
- {
- isyslog("dvdswitch: Use Default-DVD Device /dev/dvd");
- DVDSwitchSetup.SetDVDDevice("/dev/dvd");
- }
-
- free(cmd);
}
}
@@ -163,14 +168,17 @@ void cDVDPlugin::ChangeLink(char *target)
{
if(target)
{
- char *cmd = NULL;
- int rc = 0;
-
- if(0 < asprintf(&cmd, LINK, target, DVDSwitchSetup.DVDLink)) {
- dsyslog("dvdswitch: Change link: %s", cmd);
- rc = system(cmd);
- dsyslog("dvdswitch: Change link got: %i", rc);
- free(cmd);
+ isyslog("dvdswitch: create link %s to %s", DVDSwitchSetup.DVDLink, target);
+
+ if(-1 == unlink(DVDSwitchSetup.DVDLink) && errno != ENOENT) {
+ char* szErr = get_strerror(errno);
+ esyslog("dvdswitch: could not remove symbolic link %s : %s (%d)", DVDSwitchSetup.DVDLink, szErr ? szErr : "", errno);
+ if(szErr) free(szErr);
+ }
+ if(-1 == symlink(target, DVDSwitchSetup.DVDLink)) {
+ char* szErr = get_strerror(errno);
+ esyslog("dvdswitch: could not create link %s to %s :%s (%d)", DVDSwitchSetup.DVDLink, target, szErr ? szErr : "", errno);
+ if(szErr) free(szErr);
}
}
}