diff options
author | Jochen Dolze <vdr@dolze.de> | 2010-03-26 22:34:41 +0100 |
---|---|---|
committer | Jochen Dolze <vdr@dolze.de> | 2010-03-26 22:34:41 +0100 |
commit | b445c3bdbb6b222468052be12ee36422a99a8323 (patch) | |
tree | 77b1ecede26a2d7995b2e744b0eae60724a05096 /status.cpp | |
parent | 80599de74daed049ba6d25cbf2644a8725fc4060 (diff) | |
download | vdr-plugin-markad-b445c3bdbb6b222468052be12ee36422a99a8323.tar.gz vdr-plugin-markad-b445c3bdbb6b222468052be12ee36422a99a8323.tar.bz2 |
Added plugin active check to prevent shutdown while markad is still working
Diffstat (limited to 'status.cpp')
-rw-r--r-- | status.cpp | 105 |
1 files changed, 103 insertions, 2 deletions
@@ -16,13 +16,25 @@ void cStatusMarkAd::Recording(const cDevice *Device, const char *UNUSED(Name), c if (On) { - // Start the standalone version + // Start markad with (before) recording cString cmd = cString::sprintf("\"%s\"/markad --online=2 -l \"%s\" before \"%s\"",bindir, logodir,FileName); - SystemExec(cmd); + if (SystemExec(cmd)!=-1) + { + Add(FileName); + } } else { +#if 0 + // Start markad after recording + cString cmd = cString::sprintf("\"%s\"/markad -l \"%s\" after \"%s\"",bindir, + logodir,FileName); + if (SystemExec(cmd)!=-1) + { + Add(FileName); + } +#endif // TODO: Start second pass? } @@ -32,4 +44,93 @@ cStatusMarkAd::cStatusMarkAd(const char *BinDir, const char *LogoDir) { bindir=BinDir; logodir=LogoDir; + memset(&recs,0,sizeof(recs)); +} + +cStatusMarkAd::~cStatusMarkAd() +{ + for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) + { + if (recs[i]) free(recs[i]); + } +} + +bool cStatusMarkAd::MarkAdRunning() +{ + bool running=false; + for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) + { + if (recs[i]) + { + char *buf; + if (asprintf(&buf,"%s/markad.pid",recs[i])==-1) + { + // this is crude, but if we fail to allocate memory something + // is going really wrong! + return false; + } + // check for running markad process + FILE *fpid=fopen(buf,"r"); + free(buf); + if (fpid) + { + int pid,ret; + ret=fscanf(fpid,"%i\n",&pid); + fclose(fpid); + if (ret==1) + { + char procname[256]=""; + snprintf(procname,sizeof(procname),"/proc/%i",pid); + struct stat statbuf; + if (stat(procname,&statbuf)==0) + { + // found a running markad + running=true; + } + else + { + if (errno==ENOENT) + { + // no such file or directory -> markad crashed? + // remove filename from list + free(recs[i]); + recs[i]=NULL; + } + else + { + // serious error? -> let vdr close + return false; + } + } + } + } + else + { + if (errno==ENOENT) + { + // no such file or directory -> markad already finished + // remove filename from list + free(recs[i]); + recs[i]=NULL; + } + else + { + // serious error? -> let vdr close + return false; + } + } + } + } + return running; +} + +void cStatusMarkAd::Add(const char *FileName) +{ + for (int i=0; i<(MAXDEVICES*MAXRECEIVERS); i++) + { + if (!recs[i]) + { + recs[i]=strdup(FileName); + } + } } |