pnd_utility maybe, but meh.
Made get_ro_mountpoint and get_appdata_path for clarifying the two mountpoints.. 99% will want
get_appdata_path
char *rel_exec, char *rel_startdir,
unsigned int clockspeed, unsigned int options );
+// should you wish to know where an app will get mounted, call this function to obtain a guess. The
+// logic is wrapped up in pnd_run.sh, but in theory should be easily determined.
+
+// get_appdata_path() is the one you probably want.. the appdata path (which includes both the
+// files in the pnd, and any files updated/written-out from that app. Look up aufs or union-filesystems.)
+// ie: appdata path is read/write, while ro_mountpoint is read-only
+// Returns >0 on success, and if not-NULL will fill r_path (up to path_len length.)
+unsigned char pnd_get_appdata_path ( char *fullpath, char *unique_id, char *r_path, unsigned int path_len );
+// get_ro_mountpoint() returns the _read only_ mountpoint, where the dir or .pnd is actually
+// mounted to. This is probably NOT WHAT YOU WANT. You probably want the read/write mountpoint, which
+// is the union-filesystem version of it.. see pnd_get_appdata_path()
+// r_mountpoint (if !NULL) will be populated; mountpoint_len should specify the maxlen of the buffer
+void pnd_get_ro_mountpoint ( char *fullpath, char *unique_id, char *r_mountpoint, unsigned int mountpoint_len );
+
#ifdef __cplusplus
} /* "C" */
#endif
// On success, _mount and _unmount return >0
unsigned char pnd_pnd_mount ( char *pndrun, char *fullpath, char *unique_id );
unsigned char pnd_pnd_unmount ( char *pndrun, char *fullpath, char *unique_id );
-// should you wish to know where an app will get mounted, call this function to obtain a guess. The
-// logic is wrapped up in pnd_run.sh, but in theory should be easily determined.
-// r_mountpoint (if !NULL) will be populated; mountpoint_len should specify the maxlen of the buffer
-void pnd_get_mountpoint ( char *unique_id, char *r_mountpoint, unsigned int mountpoint_len );
#ifdef __cplusplus
} /* "C" */
return ( 1 );
}
+
+void pnd_get_ro_mountpoint ( char *fullpath, char *unique_id, char *r_mountpoint, unsigned int mountpoint_len ) {
+
+ if ( ! r_mountpoint ) {
+ return; // sillyness
+ }
+
+ snprintf ( r_mountpoint, mountpoint_len, "%s/%s/", PND_MOUNT_PATH, unique_id );
+
+ return;
+}
+
+unsigned char pnd_get_appdata_path ( char *fullpath, char *unique_id, char *r_path, unsigned int path_len ) {
+ // you know, determining the 'mount point' used is sort of a pain in the rear
+ // use df <file>, skip header line, grab first token. Cheap and should work.
+ // (Rather than just assume first two path chunks in path, say, which would be pretty darned
+ // accurate, but whose to say they're not using NFS or crazy mountpoints?)
+ FILE *df;
+ char cmdbuf [ 1024 ];
+
+ snprintf ( cmdbuf, 1023, "/bin/df %s", fullpath );
+
+ df = popen ( cmdbuf, "r" );
+
+ if ( ! df ) {
+ return ( 0 ); // tunefs: you can tune a filesystem but you can't tune a fish
+ }
+
+ // fetch and discard header
+ if ( ! fgets ( cmdbuf, 1023, df ) ) {
+ pclose ( df );
+ return ( 0 );
+ }
+
+ // grab df result line
+ if ( ! fgets ( cmdbuf, 1023, df ) ) {
+ pclose ( df );
+ return ( 0 );
+ }
+
+ pclose ( df );
+
+ // parse
+ char *ws = strchr ( cmdbuf, ' ' );
+
+ if ( ! ws ) {
+ return ( 0 );
+ }
+
+ *ws = '\0';
+
+ if ( r_path && path_len ) {
+ snprintf ( r_path, path_len, "%s/appdata/%s/", cmdbuf, unique_id );
+ }
+
+ return ( 1 );
+}
return ( NULL );
}
-void pnd_get_mountpoint ( char *unique_id, char *r_mountpoint, unsigned int mountpoint_len ) {
-
- if ( ! r_mountpoint ) {
- return; // sillyness
- }
-
- snprintf ( r_mountpoint, mountpoint_len, "%s/%s", PND_MOUNT_PATH, unique_id );
-
- return;
-}
-
static unsigned char pnd_pnd_mountie ( char *pndrun, char *fullpath, char *unique_id, unsigned char do_mount ) {
char *argv [ 20 ];
int f;
} else if ( d -> object_type == pnd_object_type_pnd ) {
sprintf ( fullpath, "%s/%s", d -> object_path, d -> object_filename );
}
+
+ printf ( "Guessing appdata path..\n" );
+ char appdata_path [ 1024 ];
+ pnd_get_ro_mountpoint ( fullpath, d -> unique_id, appdata_path, 1024 );
+ printf ( "Guessed readonly app mountpoint '%s'\n", appdata_path );
+ if ( pnd_get_appdata_path ( fullpath, d -> unique_id, appdata_path, 1024 ) ) {
+ printf ( " Appdata should be: %s\n", appdata_path );
+ } else {
+ printf ( " Error determining appdata path..\n" );
+ }
+
printf ( "Trying to exec '%s'\n", fullpath );
pnd_apps_exec ( pndrun, fullpath, d -> unique_id, d -> exec, d -> startdir, atoi ( d -> clockspeed ), PND_EXEC_OPTION_BLOCK );
}
}
// extra testing - tilde-substitution
+ printf ( "Unrelated test..\n" );
char *p = strdup ( "~/.applications" );
printf ( "Tilde substitution: in '%s'\n", p );
printf ( " out '%s'\n", pnd_expand_tilde ( p ) );