+#define PND_EXEC_OPTION_NIL 0
+#define PND_EXEC_OPTION_BLOCK 1 /* wait till children complete; note, children might fork on their own.. */
+#define PND_EXEC_OPTION_NOUNION 2 /* request pnd_run not use a union, just do the mount/run */
+#define PND_EXEC_OPTION_NOX11 4 /* request pnd_run to kill x11 and restart it after */
+#define PND_EXEC_OPTION_NORUN 8 /* don't try to run; just form the pnd_run.sh line and cache it */
+#define PND_EXEC_OPTION_INFO 16 /* for apps_exec_disco() only; implies that 'reserved' points to pnd_apps_exec_info_t struct */
+#define PND_EXEC_OPTION_FUTURE2 32
+
+unsigned char pnd_apps_exec ( char *pndrun, char *fullpath, char *unique_id,
+ char *rel_exec, char *rel_startdir,
+ char *args,
+ unsigned int clockspeed, unsigned int options );
+char *pnd_apps_exec_runline ( void ); // returns the cached pnd_run.sh line from last PND_EXEC_OPTION_NORUN
+
+// this is a superior version of pnd_apps_exec(), but avoiding breaking the pnd_apps_exec() API to
+// extend it.
+// - same option booleans
+// - 'reserved' should be NULL unless you know what to put there (depends on options)
+// - 'app' should be a return from discovery, or a populated disco-t struct
+// - 'pndrun' is a reference to a pnd_run.sh script, to avoid seeking it out every time
+unsigned char pnd_apps_exec_disco ( char *pndrun, pnd_disco_t *app, unsigned int options, void *reserved );
+
+// for pnd_apps_exec_disco(), when option PND_EXEC_OPTION_INFO is used
+typedef struct {
+ char *viewer; // required; viewer's executable
+ char *args; // optional; arg to viewer; ie: the file to view
+} pnd_apps_exec_info_t;
+
+// 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 );