#include <stdio.h> /* for FILE etc */
#include <stdlib.h> /* for malloc */
#include <ctype.h> /* for isprint */
+#include <unistd.h> /* for fork/exec */
+#include <sys/types.h> /* for wait */
+#include <sys/wait.h> /* for wait */
#define __USE_GNU
#include <string.h> /* for making strcasestr happy */
// up at all, we've already been here and time to fail
if ( pos == 0 ) {
break; // done, FAIL
- } else if ( pos > PND_PXML_WINDOW_FRACTIONAL ) {
+
+ } else if ( pos > PND_PXML_WINDOW_FRACTIONAL ) { // lots of space to back-seek
pos -= PND_PXML_WINDOW_FRACTIONAL;
readable = PND_PXML_WINDOW_SIZE;
- } else {
+
+ // at some point when back-seeking, we just give up; we could seek through
+ // whole file (and if someone has gone and broken a pnd-file, the behaviour is
+ // 'undefined' .. but lets be kind in case that guy then distributes the broken
+ // file around. So we backseek to a point, but stop after xKB backwards?
+ if ( len - pos > (500*1024) ) {
+ break;
+ }
+
+ } else { // can only backseek less than the window-size
readable = PND_PXML_WINDOW_SIZE - pos;
memset ( b + pos, '\0', PND_PXML_WINDOW_SIZE - pos );
pos = 0;
return ( NULL );
}
+
+static unsigned char pnd_pnd_mountie ( char *pndrun, char *fullpath, char *unique_id, unsigned char do_mount ) {
+ char *argv [ 20 ];
+ int f;
+
+ if ( ! pndrun ) {
+ return ( 0 );
+ }
+
+ if ( ! fullpath ) {
+ return ( 0 );
+ }
+
+ if ( ! unique_id ) {
+ return ( 0 );
+ }
+
+#if 0
+ printf ( " runscript: %s\n", pndrun );
+ printf ( " path: %s\n", fullpath );
+ printf ( " id: %s\n", unique_id );
+#endif
+
+ memset ( argv, '\0', sizeof(char*) * 20 );
+
+ // normal stuff
+ f = 0;
+ argv [ f++ ] = pndrun;
+ argv [ f++ ] = "-p";
+ argv [ f++ ] = fullpath;
+ argv [ f++ ] = "-b";
+ argv [ f++ ] = unique_id;
+
+ // mount-only
+ if ( do_mount ) {
+ argv [ f++ ] = "-m";
+ } else {
+ argv [ f++ ] = "-u";
+ }
+
+ // finish
+ argv [ f++ ] = NULL; // for execv
+
+ // debug
+#if 0
+ int i;
+ for ( i = 0; i < f; i++ ) {
+ printf ( "exec's argv %u [ %s ]\n", i, argv [ i ] );
+ }
+#endif
+
+ // invoke it!
+
+ if ( ( f = fork() ) < 0 ) {
+ // error forking
+ } else if ( f > 0 ) {
+ // parent
+ } else {
+ // child, do it
+ execv ( pndrun, argv );
+ }
+
+ // wait until mountscript actually completes
+ int status = 0;
+ waitpid ( f, &status, 0 /* options */ );
+
+ return ( 1 );
+}
+
+unsigned char pnd_pnd_mount ( char *pndrun, char *fullpath, char *unique_id ) {
+ return ( pnd_pnd_mountie ( pndrun, fullpath, unique_id, 1 ) );
+}
+
+unsigned char pnd_pnd_unmount ( char *pndrun, char *fullpath, char *unique_id ) {
+ return ( pnd_pnd_mountie ( pndrun, fullpath, unique_id, 0 ) );
+}