Fix even more leaks
[pandora-libraries.git] / apps / pndnotifyd.c
index b511930..fd1c1a1 100644 (file)
@@ -27,6 +27,8 @@
 #include "pnd_utility.h"
 #include "pnd_desktop.h"
 #include "pnd_logger.h"
+#include "pnd_dbusnotify.h"
+#include "pnd_pndfiles.h"
 
 // this piece of code was simpler once; but need to grow it a bit and in a rush
 // moving all these to globals rather than refactor the code a bit; tsk tsk..
@@ -56,13 +58,18 @@ char *desktop_appspath = NULL;
 char *menu_dotdesktoppath = NULL;
 char *menu_iconpath = NULL;
 char *menu_appspath = NULL;
+char *info_dotdesktoppath = NULL;
 // pnd runscript
 char *run_searchpath; // searchpath to find pnd_run.sh
 char *run_script;     // name of pnd_run.sh script from config
 char *pndrun;         // full path to located pnd_run.sh
 char *pndhup = NULL;  // full path to located pnd_hup.sh
+// default username
+char g_username [ 128 ]; // since we have to wait for login (!!), store username here
 // notifier handle
 pnd_notify_handle nh = 0;
+pnd_dbusnotify_handle dbh = 0;
+unsigned char g_info_p = 0; // spit out info .desktops
 
 // constants
 #define PNDNOTIFYD_LOGLEVEL "pndnotifyd.loglevel"
@@ -70,6 +77,7 @@ pnd_notify_handle nh = 0;
 // decl's
 void consume_configuration ( void );
 void setup_notifications ( void );
+void sigint_handler ( int n );
 void sighup_handler ( int n );
 void process_discoveries ( pnd_box_handle applist, char *emitdesktoppath, char *emiticonpath );
 unsigned char perform_discoveries ( char *appspath, char *overridespath,
@@ -79,6 +87,7 @@ int main ( int argc, char *argv[] ) {
   // behaviour
   unsigned char scanonlaunch = 1;
   unsigned int interval_secs = 5;
+  int logall = -1; // -1 means normal logging rules; >=0 means log all!
   // misc
   int i;
 
@@ -93,10 +102,24 @@ int main ( int argc, char *argv[] ) {
       interval_secs = atoi ( argv [ i ] );
     } else if ( argv [ i ][ 0 ] == '-' && argv [ i ][ 1 ] == 'n' ) {
       scanonlaunch = 0;
+    } else if ( argv [ i ][ 0 ] == '-' && argv [ i ][ 1 ] == 'l' ) {
+
+      if ( isdigit ( argv [ i ][ 2 ] ) ) {
+       unsigned char x = atoi ( argv [ i ] + 2 );
+       if ( x >= 0 &&
+            x < pndn_none )
+       {
+         logall = x;
+       }
+      } else {
+       logall = 0;
+      }
+
     } else {
-      printf ( "%s [-d] [##]\n", argv [ 0 ] );
+      printf ( "%s [-d] [-l] [##]\n", argv [ 0 ] );
       printf ( "-d\tDaemon mode; detach from terminal, chdir to /tmp, suppress output. Optional.\n" );
       printf ( "-n\tDo not scan on launch; default is to run a scan for apps when %s is invoked.\n", argv [ 0 ] );
+      printf ( "-l#\tLog-it; -l is 0-and-up (or all), and -l2 means 2-and-up (not all); l[0-3] for now. Log goes to /tmp/pndnotifyd.log\n" );
       printf ( "##\tA numeric value is interpreted as number of seconds between checking for filesystem changes. Default %u.\n",
               interval_secs );
       printf ( "Signal: HUP the process to force reload of configuration and reset the notifier watch paths\n" );
@@ -107,17 +130,53 @@ int main ( int argc, char *argv[] ) {
 
   /* enable logging?
    */
-  if ( g_daemon_mode ) {
-    // nada
+  pnd_log_set_pretext ( "pndnotifyd" );
+  pnd_log_set_flush ( 1 );
+
+  if ( logall == -1 ) {
+    // standard logging; non-daemon versus daemon
+
+    if ( g_daemon_mode ) {
+      // nada
+    } else {
+      pnd_log_set_filter ( pndn_rem );
+      pnd_log_to_stdout();
+    }
+
   } else {
-    pnd_log_set_filter ( pndn_rem );
-    pnd_log_set_pretext ( "pndnotifyd" );
-    pnd_log_to_stdout();
-    pnd_log ( pndn_rem, "log level starting as %u", pnd_log_get_filter() );
-  }
+    FILE *f;
+
+    f = fopen ( "/tmp/pndnotifyd.log", "w" );
+
+    if ( f ) {
+      pnd_log_set_filter ( logall );
+      pnd_log_to_stream ( f );
+      pnd_log ( pndn_rem, "logall mode - logging to /tmp/pndnotifyd.log\n" );
+    }
+
+    if ( logall == pndn_debug ) {
+      pnd_log_set_buried_logging ( 1 ); // log the shit out of it
+      pnd_log ( pndn_rem, "logall mode 0 - turned on buried logging\n" );
+    }
+
+  } // logall
+
+  pnd_log ( pndn_rem, "%s built %s %s", argv [ 0 ], __DATE__, __TIME__ );
+
+  pnd_log ( pndn_rem, "log level starting as %u", pnd_log_get_filter() );
 
   pnd_log ( pndn_rem, "Interval between checks is %u seconds\n", interval_secs );
 
+  // check if inotify is awake yet; if not, try waiting for awhile to see if it does
+  pnd_log ( pndn_rem, "Starting INOTIFY test; should be instant, but may take awhile...\n" );
+
+  if ( ! pnd_notify_wait_until_ready ( 120 /* seconds */ ) ) {
+    pnd_log ( pndn_error, "ERROR: INOTIFY refuses to be useful and quite awhile has passed. Bailing out.\n" );
+    return ( -1 );
+  }
+
+  pnd_log ( pndn_rem, "INOTIFY seems to be useful, whew.\n" );
+
   // basic daemon set up
   if ( g_daemon_mode ) {
 
@@ -138,9 +197,21 @@ int main ( int argc, char *argv[] ) {
 
     // umask
     umask ( 022 ); // emitted files can be rwxr-xr-x
-    
+
   } // set up daemon
 
+  // wait for a user to be logged in - we should probably get hupped when a user logs in, so we can handle
+  // log-out and back in again, with SDs popping in and out between..
+  pnd_log ( pndn_rem, "Checking to see if a user is logged in\n" );
+  while ( 1 ) {
+    if ( pnd_check_login ( g_username, 127 ) ) {
+      break;
+    }
+    pnd_log ( pndn_debug, "  No one logged in yet .. spinning.\n" );
+    sleep ( 2 );
+  } // spin
+  pnd_log ( pndn_rem, "Looks like user '%s' is in, continue.\n", g_username );
+
   /* parse configs
    */
 
@@ -161,6 +232,7 @@ int main ( int argc, char *argv[] ) {
   pnd_log ( pndn_rem, "Apps searchpath is '%s'\n", menu_appspath );
   pnd_log ( pndn_rem, ".desktop files emit to '%s'\n", menu_dotdesktoppath );
   pnd_log ( pndn_rem, ".desktop icon files emit to '%s'\n", menu_iconpath );
+  pnd_log ( pndn_rem, ".desktop info files emit to '%s'\n", info_dotdesktoppath ? info_dotdesktoppath : "n/a" );
 
   /* set up signal handler
    */
@@ -174,6 +246,9 @@ int main ( int argc, char *argv[] ) {
 
   sigaction ( SIGHUP, &siggy, NULL );
 
+  siggy.sa_handler = sigint_handler;
+  sigaction ( SIGINT, &siggy, NULL );
+
   /* set up notifies
    */
 
@@ -183,39 +258,72 @@ int main ( int argc, char *argv[] ) {
   setup_notifications();
   //}
 
+  dbh = pnd_dbusnotify_init();
+
   /* daemon main loop
    */
+  unsigned char watch_inotify, watch_dbus;
   while ( 1 ) {
 
+    watch_dbus = 0;
+    watch_inotify = 0;
+
+    if ( dbh ) {
+      watch_dbus = pnd_dbusnotify_rediscover_p ( dbh );
+    }
+
+    if ( ! watch_dbus && nh ) {
+      watch_inotify = pnd_notify_rediscover_p ( nh );
+    }
+
     // need to rediscover?
-    if ( scanonlaunch ||
-        pnd_notify_rediscover_p ( nh ) )
-    {
-      createtime = time ( NULL ); // all 'new' .destops are created at or after this time; prev are old.
+    if ( scanonlaunch || watch_inotify || watch_dbus ) {
+
+      // by this point, the watched directories have notified us that something of relevent
+      // has occurred; we should be clever, but we're not, so just re-brute force the
+      // discovery and spit out .desktop files..
+      pnd_log ( pndn_rem, "------------------------------------------------------\n" );
+
+      pnd_log ( pndn_rem, "System changes detected in dbus or watched paths .. performing re-discover!\n" );
 
       // if this was a forced scan, lets not do that next iteration
       if ( scanonlaunch ) {
+       pnd_log ( pndn_rem, "scan-on-first-launch detected an event\n" );
        scanonlaunch = 0;
       }
 
-      // by this point, the watched directories have notified us that something of relevent
-      // has occurred; we should be clever, but we're not, so just re-brute force the
-      // discovery and spit out .desktop files..
+      if ( watch_inotify ) {
+       pnd_log ( pndn_rem, "inotify detected an event\n" );
+      }
+
+      if ( watch_dbus ) {
+       pnd_log ( pndn_rem, "dbusnotify detected an event\n" );
+       pnd_notify_shutdown ( nh );
+       nh = 0;
+      }
+
+      if ( time ( NULL ) - createtime <= 2 ) {
+       pnd_log ( pndn_rem, "Rediscovery request comes to soon after previous discovery; skipping.\n" );
+       sleep ( interval_secs );
+       continue;
+      }
+
       pnd_log ( pndn_rem, "------------------------------------------------------\n" );
-      pnd_log ( pndn_rem, "Changes within watched paths .. performing re-discover!\n" );
+
+      createtime = time ( NULL ); // all 'new' .destops are created at or after this time; prev are old.
 
       /* run the discovery
        */
 
-      pnd_log ( pndn_rem, "Scanning desktop paths----------------------------\n" );
+      pnd_log ( pndn_rem, "  Scanning desktop paths----------------------------\n" );
       if ( ! perform_discoveries ( desktop_appspath, overridespath, desktop_dotdesktoppath, desktop_iconpath ) ) {
-       pnd_log ( pndn_rem, "No applications found in desktop search path\n" );
+       pnd_log ( pndn_rem, "    No applications found in desktop search path\n" );
       }
 
       if ( menu_appspath && menu_dotdesktoppath && menu_iconpath ) {
-       pnd_log ( pndn_rem, "Scanning menu paths----------------------------\n" );
+       pnd_log ( pndn_rem, "  Scanning menu paths----------------------------\n" );
        if ( ! perform_discoveries ( menu_appspath, overridespath, menu_dotdesktoppath, menu_iconpath ) ) {
-         pnd_log ( pndn_rem, "No applications found in menu search path\n" );
+         pnd_log ( pndn_rem, "    No applications found in menu search path\n" );
        }
       }
 
@@ -228,7 +336,9 @@ int main ( int argc, char *argv[] ) {
       // since its entirely likely new directories have been found (ie: SD with a directory structure was inserted)
       // we should re-apply watches to catch all these new directories; ie: user might use on-device browser to
       // drop in new applications, or use the shell to juggle them around, or any number of activities.
-      //setup_notifications();
+      if ( watch_dbus ) {
+       setup_notifications();
+      }
 
     } // need to rediscover?
 
@@ -246,6 +356,7 @@ int main ( int argc, char *argv[] ) {
   /* shutdown
    */
   pnd_notify_shutdown ( nh );
+  pnd_dbusnotify_shutdown ( dbh );
 
   return ( 0 );
 }
@@ -294,6 +405,7 @@ void consume_configuration ( void ) {
     desktop_dotdesktoppath = pnd_conf_get_as_char ( desktoph, PND_DESKTOP_DOTDESKTOP_PATH_KEY );
     desktop_iconpath = pnd_conf_get_as_char ( desktoph, PND_DESKTOP_ICONS_PATH_KEY );
     desktop_appspath = pnd_conf_get_as_char ( desktoph, PND_DESKTOP_SEARCH_KEY );
+    info_dotdesktoppath = pnd_conf_get_as_char ( desktoph, "info.dotdesktoppath" );
   }
 
   if ( ! desktop_dotdesktoppath ) {
@@ -315,6 +427,11 @@ void consume_configuration ( void ) {
     menu_appspath = pnd_conf_get_as_char ( desktoph, PND_MENU_SEARCH_KEY );
   }
 
+  // info
+  if ( desktoph ) {
+    g_info_p = pnd_conf_get_as_int_d ( desktoph, "info.emit_info", 0 );
+  }
+
   /* try to locate a runscript and optional hupscript
    */
 
@@ -329,8 +446,12 @@ void consume_configuration ( void ) {
     }
 
     if ( pnd_conf_get_as_int ( apph, PNDNOTIFYD_LOGLEVEL ) != PND_CONF_BADNUM ) {
-      pnd_log_set_filter ( pnd_conf_get_as_int ( apph, PNDNOTIFYD_LOGLEVEL ) );
-      pnd_log ( pndn_rem, "config file causes loglevel to change to %u", pnd_log_get_filter() );
+      if ( pnd_log_do_buried_logging() == 0 ) {
+       pnd_log_set_filter ( pnd_conf_get_as_int ( apph, PNDNOTIFYD_LOGLEVEL ) );
+       pnd_log ( pndn_rem, "config file causes loglevel to change to %u", pnd_log_get_filter() );
+      } else {
+       pnd_log ( pndn_rem, "-l command line suppresses log level change in config file\n" );
+      }
     }
 
   } else {
@@ -378,6 +499,67 @@ void consume_configuration ( void ) {
     pnd_log ( pndn_rem, "No pndhup found (which is fine.)\n" );
   }
 
+  /* cheap hack, maybe it'll help when pndnotifyd is coming up before the rest of the system and before
+   * the user is formally logged in
+   */
+  pnd_log ( pndn_rem, "Setting a default $HOME to non-root user\n" );
+
+  // first, try to see if known-username maps to a homedir; if so, just use that!
+  // otherwise, pick first non-root homedir and assume .. or we start blaring .desktops
+  // out to all users like idiots
+  unsigned char got_user_homedir = 0;
+
+  if ( g_username [ 0 ] ) {
+    struct stat homedir;
+    char path [ PATH_MAX ];
+
+    sprintf ( path, "/home/%s", g_username );
+
+    // does this made up path exist?
+    if ( stat ( path, &homedir ) == 0 ) {
+
+      // and its a dir?
+      if ( S_ISDIR(homedir.st_mode) ) {
+       pnd_log ( pndn_rem, "  User [%s] matches path [%s], going with '%s'\n", g_username, path, path );
+       setenv ( "HOME", path, 1 /* overwrite */ );
+       got_user_homedir = 1;
+      } // and its a dir?
+
+    } // guessing a homedirname..
+
+  } // got a username?
+
+  // if guessing a path was no good, just try finding one
+  if ( got_user_homedir == 0 ) {
+    DIR *dir;
+
+    if ( ( dir = opendir ( "/home" ) ) ) {
+      struct dirent *dirent;
+
+      while ( ( dirent = readdir ( dir ) ) ) {
+       pnd_log ( pndn_rem, "  Scanning user homedir '%s'\n", dirent -> d_name );
+
+       // file is a .desktop?
+       if ( dirent -> d_name [ 0 ] == '.' ) {
+         continue;
+       } else if ( strcmp ( dirent -> d_name, "root" ) == 0 ) {
+         continue;
+       }
+
+       // a non-root user is found
+       char buffer [ 200 ];
+       sprintf ( buffer, "/home/%s", dirent -> d_name );
+       pnd_log ( pndn_rem, "  Going with '%s'\n", buffer );
+       setenv ( "HOME", buffer, 1 /* overwrite */ );
+       break;
+
+      } // while iterating through dir listing
+
+      closedir ( dir );
+    } // opendir?
+
+  } // scope
+
   /* handle globbing or variable substitution
    */
   desktop_dotdesktoppath = pnd_expand_tilde ( strdup ( desktop_dotdesktoppath ) );
@@ -385,6 +567,11 @@ void consume_configuration ( void ) {
   mkdir ( desktop_dotdesktoppath, 0777 );
   mkdir ( desktop_iconpath, 0777 );
 
+  if ( info_dotdesktoppath ) {
+    info_dotdesktoppath = pnd_expand_tilde ( strdup ( info_dotdesktoppath ) );
+    mkdir ( info_dotdesktoppath, 0777 );
+  }
+
   if ( menu_dotdesktoppath ) {
     menu_dotdesktoppath = pnd_expand_tilde ( strdup ( menu_dotdesktoppath ) );
     mkdir ( menu_dotdesktoppath, 0777 );
@@ -431,9 +618,20 @@ void setup_notifications ( void ) {
     pnd_log ( pndn_rem, "Watching path '%s' and its descendents.\n", buffer );
     pnd_notify_watch_path ( nh, buffer, PND_NOTIFY_RECURSE );
 
+    //pnd_notify_watch_path ( nh, buffer, 0 /* no recurse */ );
+
   }
   SEARCHPATH_POST
 
+#if 0
+  sleep ( 1 ); // wait for events to trigger?
+
+  // clear out any notifies we just created
+  while ( pnd_notify_rediscover_p ( nh ) ) {
+    usleep ( 100 ); // spin
+  } // while
+#endif
+
   return;
 }
 
@@ -450,6 +648,21 @@ void sighup_handler ( int n ) {
   return;
 }
 
+void sigint_handler ( int n ) {
+
+  pnd_log ( pndn_rem, "---[ SIGINT received ]---\n" );
+
+  if ( dbh ) {
+    pnd_dbusnotify_shutdown ( dbh );
+  }
+
+  if ( nh ) {
+    pnd_notify_shutdown ( nh );
+  }
+
+  return;
+}
+
 // This very recently was inline code; just slight refactor to functionize it so that it can be
 // reused in a couple of places. Simple code with simple design quickly became too large for
 // its simple design; should revisit a lot of these little things..
@@ -463,7 +676,7 @@ void process_discoveries ( pnd_box_handle applist, char *emitdesktoppath, char *
     // check if icon already exists (from a previous extraction say); if so, we needn't
     // do it again
     char existingpath [ FILENAME_MAX ];
-    sprintf ( existingpath, "%s/%s.png", emiticonpath, d -> unique_id );
+    sprintf ( existingpath, "%s/%s.png", emiticonpath, d -> unique_id /*, d -> subapp_number */ );
 
     struct stat dirs;
     if ( stat ( existingpath, &dirs ) == 0 ) {
@@ -481,17 +694,37 @@ void process_discoveries ( pnd_box_handle applist, char *emitdesktoppath, char *
 
       pnd_log ( pndn_debug, "  Icon not already present, so trying to write it! %s\n", existingpath );
 
+      // handle same-path icon override for davec :)
+      char ovrfile [ PATH_MAX ];
+      char *fixpxml;
+      sprintf ( ovrfile, "%s/%s", d -> object_path, d -> object_filename );
+      fixpxml = strcasestr ( ovrfile, PND_PACKAGE_FILEEXT );
+      if ( fixpxml ) {
+       strcpy ( fixpxml, ".png" );
+       fixpxml = NULL;
+       struct stat statbuf;
+       if ( stat ( ovrfile, &statbuf ) == 0 ) {
+         d -> icon = strdup ( ovrfile );
+         fixpxml = ovrfile; // !NULL will be the trigger to skip emittinf desktop from .pnd
+       } // stat
+      } // ovr?
+
       // attempt to create icon files; if successful, alter the disco struct to contain new
       // path, otherwise leave it alone (since it could be a generic icon reference..)
-      if ( pnd_emit_icon ( emiticonpath, d ) ) {
-       // success; fix up icon path to new one..
-       if ( d -> icon ) {
-         free ( d -> icon );
+      if ( fixpxml == NULL ) {
+       // don't have an same-path override icon, so go fetch something from pnd file
+
+       if ( pnd_emit_icon ( emiticonpath, d ) ) {
+         // success; fix up icon path to new one..
+         if ( d -> icon ) {
+           free ( d -> icon );
+         }
+         d -> icon = strdup ( existingpath );
+       } else {
+         pnd_log ( pndn_debug, "  WARN: Couldn't write out icon %s\n", existingpath );
        }
-       d -> icon = strdup ( existingpath );
-      } else {
-       pnd_log ( pndn_debug, "  WARN: Couldn't write out icon %s\n", existingpath );
-      }
+
+      } // got ovr icon already?
 
     } // icon already exists?
 
@@ -507,6 +740,64 @@ void process_discoveries ( pnd_box_handle applist, char *emitdesktoppath, char *
       pnd_log ( pndn_rem, "ERROR: Error creating .desktop file for app: %s\n", pnd_box_get_key ( d ) );
     }
 
+    // info .desktop
+    if ( g_info_p && info_dotdesktoppath ) {
+      if ( pnd_emit_dotinfo ( info_dotdesktoppath, pndrun, d ) ) {
+       // nada
+      } else {
+       pnd_log ( pndn_rem, "ERROR: Error creating info .desktop file for app: %s\n", pnd_box_get_key ( d ) );
+      }
+    }
+
+    // does this object request any mkdir's?
+    if ( d -> mkdir_sp ) {
+
+      // it would appear it does! but we have to carefully validate these suckers
+      pnd_log ( pndn_rem, "  App %s requests mkdir: %s\n", d -> object_path, d -> mkdir_sp );
+
+      // for each mkdir requested path, do it...
+      char *searchpath = d -> mkdir_sp;
+
+      SEARCHCHUNK_PRE
+      {
+       /* "buffer" now holds each chunk of the searchpath, expanded */
+
+       // WARN: This whole concept could be flawed; what if they represent '..' in some other obscure way (unicode?)
+       // and we end up allowing mkdir's all over the place? The risk really is limited -- once the pnd is here,
+       // if the user _runs it_, it can go nuts, so creating a few dirs isn't all that dangerous...
+       //   HMRF :/
+       // Perhaps I should have a config setting for pndnotifyd to suppress this whole mkdir behaviour?
+
+       // if not containing ".." we allow it
+       if ( strstr ( buffer, ".." )  == NULL ) {
+
+         // determine mountpoint for the file
+         // - we could deduce this from the path (somewhat risky if we assume leading /media/mmcblk1p1 type notation .. could
+         //   be other distributions entirely
+         // - better to scan through mount-list and figure it out.. *sucks*
+         char mountpoint [ PATH_MAX ];
+         if ( pnd_determine_mountpoint ( d -> object_path, mountpoint, PATH_MAX - strlen ( buffer ) - 1 ) == 1 ) {
+
+           strcat ( mountpoint, "/" );
+           strcat ( mountpoint, buffer );
+
+           struct stat t;
+           if ( stat ( mountpoint, &t ) == 0 ) {
+             pnd_log ( pndn_rem, "    Skipping existing mkdir: %s\n", mountpoint );
+           } else {
+             pnd_log ( pndn_rem, "    Attempting create of non-existant path: %s\n", mountpoint );
+             mkdir ( mountpoint, 0777 );
+           }
+
+         } // if figured out the mountpoint
+
+       } // if valid path
+
+      }
+      SEARCHCHUNK_POST
+
+    } // mkdir request
+
     // next!
     d = pnd_box_get_next ( d );
 
@@ -521,6 +812,9 @@ unsigned char perform_discoveries ( char *appspath, char *overridespath,
 {
   pnd_box_handle applist;
 
+  pnd_log ( pndn_rem, "perform discovery - apps: %s, overrides: %s\n", appspath, overridespath );
+  pnd_log ( pndn_rem, "                  - emit desktop: %s, icons: %s\n", emitdesktoppath, emiticonpath );
+
   // attempt to auto-discover applications in the given path
   applist = pnd_disco_search ( appspath, overridespath );
 
@@ -574,13 +868,13 @@ unsigned char perform_discoveries ( char *appspath, char *overridespath,
          }
        }
        if ( source_libpnd ) {
-#if 0
-         pnd_log ( pndn_rem,
+#if 1
+         pnd_log ( pndn_debug,
                    "File '%s' appears to have been created by libpnd so candidate for delete: %u\n", buffer, source_libpnd );
 #endif
        } else {
 #if 0
-         pnd_log ( pndn_rem, "File '%s' appears NOT to have been created by libpnd, so leave it alone\n", buffer );
+         pnd_log ( pndn_debug, "File '%s' appears NOT to have been created by libpnd, so leave it alone\n", buffer );
 #endif
          continue; // skip deleting it
        }
@@ -588,8 +882,8 @@ unsigned char perform_discoveries ( char *appspath, char *overridespath,
        // file is 'new'?
        if ( stat ( buffer, &dirs ) == 0 ) {
          if ( dirs.st_mtime >= createtime ) {
-#if 0
-           pnd_log ( pndn_rem, "File '%s' seems 'new', so leave it alone.\n", buffer );
+#if 1
+           pnd_log ( pndn_debug, "File '%s' seems 'new', so leave it alone.\n", buffer );
 #endif
            continue; // skip deleting it
          }
@@ -609,7 +903,9 @@ unsigned char perform_discoveries ( char *appspath, char *overridespath,
 
   //WARN: MEMORY LEAK HERE
   pnd_log ( pndn_debug, "pndnotifyd - memory leak here - perform_discoveries()\n" );
-  pnd_box_delete ( applist ); // does not free the disco_t contents!
+  if ( applist ) {
+    pnd_box_delete ( applist ); // does not free the disco_t contents!
+  }
 
   return ( 1 );
 }