Added package tags support
[pandora-libraries.git] / lib / pnd_utility.c
index 33b60ef..9647f20 100644 (file)
@@ -67,8 +67,8 @@ char *pnd_expand_tilde ( char *freeable_buffer ) {
   char *s = freeable_buffer;
   char *home = getenv ( "HOME" );
 
-  printf ( "DEBUG: expand tilde IN: '%s'\n", freeable_buffer );
-  printf ( "DEBUG:  $HOME was %s\n", home );
+  //printf ( "DEBUG: expand tilde IN: '%s'\n", freeable_buffer );
+  //printf ( "DEBUG:  $HOME was %s\n", home );
 
   // well, as pndnotifyd (etc) may be running as _root_, while the user is logged in
   // as 'pandora' or god knows what, this could be problematic. Other parts of the lib
@@ -106,7 +106,7 @@ char *pnd_expand_tilde ( char *freeable_buffer ) {
              florp = strdup ( pw -> pw_dir );
 
              home = florp;
-             printf ( "  DEBUG: home (for %s) is %s (from %u)\n", b.ut_user, home, b.ut_type );
+             //printf ( "  DEBUG: home (for %s) is %s (from %u)\n", b.ut_user, home, b.ut_type );
 
            } // passwd entry matches the utmp entry
 
@@ -126,10 +126,10 @@ char *pnd_expand_tilde ( char *freeable_buffer ) {
     return ( s ); // can't succeed
   }
 
-  printf ( "DEBUG: entering while (%s) with home (%s)\n", s, home );
+  //printf ( "DEBUG: entering while (%s) with home (%s)\n", s, home );
 
   while ( ( p = strchr ( s, '~' ) ) ) {
-    printf ( "DEBUG: within while (%s)\n", s );
+    //printf ( "DEBUG: within while (%s)\n", s );
     char *temp = malloc ( strlen ( s ) + strlen ( home ) + 1 );
     memset ( temp, '\0', strlen ( s ) + strlen ( home ) + 1 );
     // copy in stuff prior to ~
@@ -143,7 +143,7 @@ char *pnd_expand_tilde ( char *freeable_buffer ) {
     s = temp;
   } // while finding matches
 
-  printf ( "DEBUG: expand tilde OUT: '%s'\n", s );
+  //printf ( "DEBUG: expand tilde OUT: '%s'\n", s );
 
   return ( s );
 }
@@ -167,15 +167,18 @@ void pnd_exec_no_wait_1 ( char *fullpath, char *arg1 ) {
     execl ( fullpath, fullpath, (char*) NULL );
   }
 
+  // error invoking something, and we're the child process, so just die before all hell breaks lose with us thinking we're the (second!) parent on return!
+  exit ( -1 );
+
   // getting here is an error
   //printf ( "Error attempting to run %s\n", fullpath );
 
   return;
 }
 
-pnd_pxml_handle pnd_pxml_get_by_path ( char *fullpath ) {
+pnd_pxml_handle *pnd_pxml_get_by_path ( char *fullpath ) {
   unsigned char valid = pnd_object_type_unknown;
-  pnd_pxml_handle pxmlh = 0;
+  pnd_pxml_handle *pxmlapps = 0;
 
   // WARN: this is way too close to callback in pnd_disco .. should be refactored!
 
@@ -192,7 +195,7 @@ pnd_pxml_handle pnd_pxml_get_by_path ( char *fullpath ) {
 
   // potentially a valid application
   if ( valid == pnd_object_type_directory ) {
-    pxmlh = pnd_pxml_fetch ( (char*) fullpath );
+    pxmlapps = pnd_pxml_fetch ( (char*) fullpath );
 
   } else if ( valid == pnd_object_type_pnd ) {
     FILE *f;
@@ -214,7 +217,7 @@ pnd_pxml_handle pnd_pxml_get_by_path ( char *fullpath ) {
     }
 
     // by now, we have <PXML> .. </PXML>, try to parse..
-    pxmlh = pnd_pxml_fetch_buffer ( (char*) fullpath, pxmlbuf );
+    pxmlapps = pnd_pxml_fetch_buffer ( (char*) fullpath, pxmlbuf );
 
     // done with file
     fclose ( f );
@@ -223,10 +226,10 @@ pnd_pxml_handle pnd_pxml_get_by_path ( char *fullpath ) {
 
   // ..
 
-  return ( pxmlh );
+  return ( pxmlapps );
 }
 
-unsigned char pnd_determine_mountpoint ( char *fullpath, char *r_mountpoint, unsigned char mountpoint_len ) {
+unsigned char pnd_determine_mountpoint ( char *fullpath, char *r_mountpoint, unsigned int mountpoint_len ) {
 
   // just cheap it, and call df like an idiot.
 
@@ -251,9 +254,8 @@ unsigned char pnd_determine_mountpoint ( char *fullpath, char *r_mountpoint, uns
     pclose ( p );
 
     // by now, good
-    char crap [ PATH_MAX ];
     char mount [ PATH_MAX ];
-    if ( sscanf ( inbuf, "%s %s %s %s %s %s", crap, crap, crap, crap, crap, mount ) != 6 ) {
+    if ( sscanf ( inbuf, "%*s %*s %*s %*s %*s %s", mount ) != 1 ) {
       return ( 0 );
     }
 
@@ -303,3 +305,59 @@ unsigned char pnd_determine_mountpoint ( char *fullpath, char *r_mountpoint, uns
 
   return ( 0 );
 }
+
+unsigned char pnd_filecopy ( char *sourcepath, char *targetpath ) {
+#define BITLEN (64*1024)
+  FILE *pnd, *target; // pnd == from, since I cribbed the code from pnd_desktop.c :/
+  unsigned char bits [ BITLEN ];
+  unsigned int bitlen;
+
+  pnd = fopen ( sourcepath, "rb" );
+
+  if ( ! pnd ) {
+    return ( 0 );
+  }
+
+  unsigned int len;
+
+  target = fopen ( targetpath, "wb" );
+
+  if ( ! target ) {
+    fclose ( pnd );
+    return ( 0 );
+  }
+
+  fseek ( pnd, 0, SEEK_END );
+  len = ftell ( pnd );
+  fseek ( pnd, 0, SEEK_SET );
+
+  while ( len ) {
+
+    if ( len > (BITLEN) ) {
+      bitlen = (BITLEN);
+    } else {
+      bitlen = len;
+    }
+
+    if ( fread ( bits, bitlen, 1, pnd ) != 1 ) {
+      fclose ( pnd );
+      fclose ( target );
+      unlink ( targetpath );
+      return ( 0 );
+    }
+
+    if ( fwrite ( bits, bitlen, 1, target ) != 1 ) {
+      fclose ( pnd );
+      fclose ( target );
+      unlink ( targetpath );
+      return ( 0 );
+    }
+
+    len -= bitlen;
+  } // while
+
+  fclose ( pnd );
+  fclose ( target );
+
+  return ( 1 );
+}