Merging upstream version 0.3.2.
authorDaniel Baumann <daniel@debian.org>
Sun, 15 Apr 2012 15:39:54 +0000 (15:39 +0000)
committerDaniel Baumann <daniel@debian.org>
Sun, 15 Apr 2012 15:39:54 +0000 (15:39 +0000)
aclocal.m4
configure
configure.in
libmenu-cache/Makefile.am
libmenu-cache/Makefile.in
libmenu-cache/menu-cache.c
libmenu-cache/menu-cache.h
ltmain.sh
menu-cache-daemon/menu-cached.c

index 7c1cb04..996c907 100644 (file)
@@ -2500,6 +2500,18 @@ linux* | k*bsd*-gnu)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -3091,7 +3103,7 @@ linux* | k*bsd*-gnu)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
   else
@@ -3772,7 +3784,7 @@ m4_if([$1], [CXX], [
            ;;
        esac
        ;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
        ;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -4197,6 +4209,9 @@ m4_if([$1], [CXX], [
   cygwin* | mingw* | cegcc*)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
   ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+  ;;
   *)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
   ;;
@@ -4261,6 +4276,9 @@ dnl Note also adjust exclude_expsyms for C++ above.
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   esac
 
   _LT_TAGVAR(ld_shlibs, $1)=yes
@@ -4443,7 +4461,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
@@ -4618,6 +4636,7 @@ _LT_EOF
        if test "$aix_use_runtimelinking" = yes; then
          shared_flag="$shared_flag "'${wl}-G'
        fi
+       _LT_TAGVAR(link_all_deplibs, $1)=no
       else
        # not using gcc
        if test "$host_cpu" = ia64; then
@@ -4856,7 +4875,7 @@ _LT_EOF
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -8033,14 +8052,16 @@ fi])
 # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
 # ---------------------------------------------
 m4_define([_PKG_CONFIG],
-[if test -n "$$1"; then
-    pkg_cv_[]$1="$$1"
- elif test -n "$PKG_CONFIG"; then
-    PKG_CHECK_EXISTS([$3],
-                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
-                    [pkg_failed=yes])
- else
-    pkg_failed=untried
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+                        [pkg_failed=yes])
+    fi
+else
+       pkg_failed=untried
 fi[]dnl
 ])# _PKG_CONFIG
 
@@ -8084,9 +8105,9 @@ See the pkg-config man page for more details.])
 if test $pkg_failed = yes; then
         _PKG_SHORT_ERRORS_SUPPORTED
         if test $_pkg_short_errors_supported = yes; then
-               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1`
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
         else 
-               $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1`
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
         fi
        # Put the nasty error message in config.log where it belongs
        echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
index 192f9aa..f4f199a 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.64 for menu-cache 0.2.6.
+# Generated by GNU Autoconf 2.64 for menu-cache 0.3.2.
 #
 # Report bugs to <http://lxde.org/>.
 #
@@ -698,8 +698,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='menu-cache'
 PACKAGE_TARNAME='menu-cache'
-PACKAGE_VERSION='0.2.6'
-PACKAGE_STRING='menu-cache 0.2.6'
+PACKAGE_VERSION='0.3.2'
+PACKAGE_STRING='menu-cache 0.3.2'
 PACKAGE_BUGREPORT='http://lxde.org/'
 PACKAGE_URL=''
 
@@ -1423,7 +1423,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures menu-cache 0.2.6 to adapt to many kinds of systems.
+\`configure' configures menu-cache 0.3.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1493,7 +1493,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of menu-cache 0.2.6:";;
+     short | recursive ) echo "Configuration of menu-cache 0.3.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1598,7 +1598,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-menu-cache configure 0.2.6
+menu-cache configure 0.3.2
 generated by GNU Autoconf 2.64
 
 Copyright (C) 2009 Free Software Foundation, Inc.
@@ -1876,7 +1876,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by menu-cache $as_me 0.2.6, which was
+It was created by menu-cache $as_me 0.3.2, which was
 generated by GNU Autoconf 2.64.  Invocation command line was
 
   $ $0 $@
@@ -2686,7 +2686,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='menu-cache'
- VERSION='0.2.6'
+ VERSION='0.3.2'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5965,7 +5965,7 @@ linux* | k*bsd*-gnu)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
   else
@@ -8594,6 +8594,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu)
+    link_all_deplibs=no
+    ;;
   esac
 
   ld_shlibs=yes
@@ -8776,7 +8779,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
        wlarc=
@@ -8951,6 +8954,7 @@ _LT_EOF
        if test "$aix_use_runtimelinking" = yes; then
          shared_flag="$shared_flag "'${wl}-G'
        fi
+       link_all_deplibs=no
       else
        # not using gcc
        if test "$host_cpu" = ia64; then
@@ -9277,7 +9281,7 @@ rm -f core conftest.err conftest.$ac_objext \
       link_all_deplibs=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
        archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -10222,6 +10226,18 @@ rm -f core conftest.err conftest.$ac_objext \
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -10842,7 +10858,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10845 "configure"
+#line 10861 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -10938,7 +10954,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10941 "configure"
+#line 10957 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11290,10 +11306,11 @@ pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
 $as_echo_n "checking for GLIB... " >&6; }
 
-if test -n "$GLIB_CFLAGS"; then
-    pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GLIB_CFLAGS"; then
+        pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2\""; } >&5
   ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2") 2>&5
   ac_status=$?
@@ -11303,13 +11320,15 @@ if test -n "$GLIB_CFLAGS"; then
 else
   pkg_failed=yes
 fi
- else
-    pkg_failed=untried
+    fi
+else
+       pkg_failed=untried
 fi
-if test -n "$GLIB_LIBS"; then
-    pkg_cv_GLIB_LIBS="$GLIB_LIBS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GLIB_LIBS"; then
+        pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
     { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2\""; } >&5
   ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2") 2>&5
   ac_status=$?
@@ -11319,8 +11338,9 @@ if test -n "$GLIB_LIBS"; then
 else
   pkg_failed=yes
 fi
- else
-    pkg_failed=untried
+    fi
+else
+       pkg_failed=untried
 fi
 
 
@@ -11333,9 +11353,9 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-               GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2" 2>&1`
+               GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2"`
         else
-               GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors "glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2" 2>&1`
+               GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-2.0 >= 2.16.0 gio-2.0 >= 2.15.2"`
         fi
        # Put the nasty error message in config.log where it belongs
        echo "$GLIB_PKG_ERRORS" >&5
@@ -11923,7 +11943,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by menu-cache $as_me 0.2.6, which was
+This file was extended by menu-cache $as_me 0.3.2, which was
 generated by GNU Autoconf 2.64.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -11987,7 +12007,7 @@ Report bugs to <http://lxde.org/>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-menu-cache config.status 0.2.6
+menu-cache config.status 0.3.2
 configured by $0, generated by GNU Autoconf 2.64,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index ae19321..106c476 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT([menu-cache], [0.2.6],
+AC_INIT([menu-cache], [0.3.2],
         [http://lxde.org/])
 AC_CONFIG_SRCDIR(menu-cache-gen/gmenu-tree.h)
 
index 17ccf82..cae4eef 100644 (file)
@@ -22,6 +22,7 @@ libmenu_cache_la_LIBADD =             \
 libmenu_cache_la_LDFLAGS =                     \
        -no-undefined                           \
        -export-symbols-regex menu_cache        \
+       -version-info 1:0:0 \
        $(NULL)
 
 lib_menu_cache_includedir = $(includedir)/menu-cache
index ceb82c1..f2cf80a 100644 (file)
@@ -242,6 +242,7 @@ libmenu_cache_la_LIBADD = \
 libmenu_cache_la_LDFLAGS = \
        -no-undefined                           \
        -export-symbols-regex menu_cache        \
+       -version-info 1:0:0 \
        $(NULL)
 
 lib_menu_cache_includedir = $(includedir)/menu-cache
index c4746ff..b8a7483 100644 (file)
  *      MA 02110-1301, USA.
  */
 
+/* NOTICE: This library is not MT-safe and should only be called from main thread.
+ *         If you really need to use it in another thread, using mutex is needed,
+ *         but the correct way to do this is unknown. */
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
 #include "menu-cache.h"
 
+#ifdef G_ENABLE_DEBUG
+#define DEBUG(...)  g_debug(__VA_ARGS__)
+#else
+#define DEBUG(...)
+#endif
+
 struct _MenuCacheItem
 {
     guint n_ref;
@@ -89,7 +99,6 @@ static GIOChannel* server_ch = NULL;
 static guint server_watch = 0;
 static GHashTable* hash = NULL;
 
-
 /* Don't call this API directly. Use menu_cache_lookup instead. */
 static MenuCache* menu_cache_new( const char* cache_file );
 
@@ -284,58 +293,9 @@ static gboolean read_all_known_des( FILE* f, char** des )
 MenuCache* menu_cache_new( const char* cache_file )
 {
     MenuCache* cache;
-    struct stat st;
-    char line[4096];
-
-    FILE* f = fopen( cache_file, "r" );
-    if( ! f )
-        return NULL;
-
-    if( fstat( fileno( f ), &st ) == -1 )
-    {
-        fclose( f );
-        return NULL;
-    }
-
-    /* the first line is version number */
-    if( fgets( line, G_N_ELEMENTS(line) ,f ) )
-    {
-        int ver_maj, ver_min;
-        if( sscanf(line, "%d.%d", &ver_maj, &ver_min)< 2 )
-            return NULL;
-        if( ver_maj != VER_MAJOR || ver_min != VER_MINOR )
-            return NULL;
-    }
-    else
-        return NULL;
-
-    /* the second line is menu name */
-    if( ! fgets( line, G_N_ELEMENTS(line) ,f ) )
-        return NULL;
-
     cache = g_slice_new0( MenuCache );
-
     cache->cache_file = g_strdup( cache_file );
-    /* cache->menu_file_path = g_strdup( strtok(line, "\n") ); */
-
-    /* get all used files */
-    if( ! read_all_used_files( f, &cache->n_all_used_files, &cache->all_used_files ) )
-    {
-        g_slice_free( MenuCache, cache );
-        return NULL;
-    }
-
-    /* read all known DEs */
-    if( ! read_all_known_des( f, &cache->known_des ) )
-    {
-        g_strfreev(cache->all_used_files);
-        g_slice_free( MenuCache, cache );
-        return NULL;
-    }
-
     cache->n_ref = 1;
-    cache->root_dir = (MenuCacheDir*)read_item( f, cache );
-    fclose( f );
     return cache;
 }
 
@@ -347,18 +307,19 @@ MenuCache* menu_cache_ref(MenuCache* cache)
 
 void menu_cache_unref(MenuCache* cache)
 {
-    /* g_debug("cache_unref: %d", cache->n_ref); */
-    if( g_atomic_int_dec_and_test( &cache->n_ref ) )
+    /* DEBUG("cache_unref: %d", cache->n_ref); */
+    --cache->n_ref;
+    if( cache->n_ref == 0 )
     {
         unregister_menu_from_server( cache );
-        /* g_debug("unregister to server"); */
+        /* DEBUG("unregister to server"); */
         g_hash_table_remove( hash, cache->menu_name );
         if( g_hash_table_size(hash) == 0 )
         {
-            /* g_debug("destroy hash"); */
+            /* DEBUG("destroy hash"); */
             g_hash_table_destroy(hash);
 
-            /* g_debug("disconnect from server"); */
+            /* DEBUG("disconnect from server"); */
             g_source_remove(server_watch);
             g_io_channel_unref(server_ch);
             server_fd = -1;
@@ -368,9 +329,9 @@ void menu_cache_unref(MenuCache* cache)
 
         if( G_LIKELY(cache->root_dir) )
         {
-            /* g_debug("unref root dir"); */
+            /* DEBUG("unref root dir"); */
             menu_cache_item_unref( cache->root_dir );
-            /* g_debug("unref root dir finished"); */
+            /* DEBUG("unref root dir finished"); */
         }
         g_free( cache->cache_file );
         g_free( cache->menu_name );
@@ -378,6 +339,7 @@ void menu_cache_unref(MenuCache* cache)
         g_strfreev( cache->all_used_files );
         g_slice_free( MenuCache, cache );
     }
+    
 }
 
 MenuCacheDir* menu_cache_get_root_dir( MenuCache* cache )
@@ -389,7 +351,7 @@ MenuCacheDir* menu_cache_get_root_dir( MenuCache* cache )
 MenuCacheItem* menu_cache_item_ref(MenuCacheItem* item)
 {
     g_atomic_int_inc( &item->n_ref );
-    /* g_debug("item_ref %s: %d -> %d", item->id, item->n_ref-1, item->n_ref); */
+    /* DEBUG("item_ref %s: %d -> %d", item->id, item->n_ref-1, item->n_ref); */
     return item;
 }
 
@@ -475,7 +437,9 @@ gboolean menu_cache_reload( MenuCache* cache )
         return FALSE;
     }
 
-    menu_cache_item_unref( cache->root_dir );
+    if(cache->root_dir)
+        menu_cache_item_unref( cache->root_dir );
+
     cache->root_dir = (MenuCacheDir*)read_item( f, cache );
     fclose( f );
 
@@ -486,10 +450,10 @@ gboolean menu_cache_reload( MenuCache* cache )
 
 void menu_cache_item_unref(MenuCacheItem* item)
 {
-    /* g_debug("item_unref(%s): %d", item->id, item->n_ref); */
+    /* DEBUG("item_unref(%s): %d", item->id, item->n_ref); */
     if( g_atomic_int_dec_and_test( &item->n_ref ) )
     {
-        /* g_debug("free item: %s", item->id); */
+        /* DEBUG("free item: %s", item->id); */
         g_free( item->id );
         g_free( item->name );
         g_free( item->comment );
@@ -500,7 +464,7 @@ void menu_cache_item_unref(MenuCacheItem* item)
 
         if( item->parent )
         {
-            /* g_debug("remove %s from parent %s", item->id, MENU_CACHE_ITEM(item->parent)->id); */
+            /* DEBUG("remove %s from parent %s", item->id, MENU_CACHE_ITEM(item->parent)->id); */
             /* remove ourselve from the parent node. */
             item->parent->children = g_slist_remove(item->parent->children, item);
         }
@@ -725,7 +689,7 @@ static gboolean on_server_io(GIOChannel* ch, GIOCondition cond, gpointer user_da
     if( cond & (G_IO_ERR|G_IO_HUP) )
     {
 reconnect:
-        g_debug("IO error %d, try to re-connect.", cond);
+        DEBUG("IO error %d, try to re-connect.", cond);
         g_io_channel_unref(ch);
         server_fd = -1;
         if( ! connect_server() )
@@ -737,14 +701,16 @@ reconnect:
             GHashTableIter it;
             char* menu_name;
             MenuCache* cache;
-            g_debug("successfully restart server.\nre-register menus.");
+            DEBUG("successfully restart server.\nre-register menus.");
             /* re-register all menu caches */
+            
             if(hash)
             {
                 g_hash_table_iter_init(&it, hash);
                 while(g_hash_table_iter_next(&it, (gpointer*)&menu_name, (gpointer*)&cache))
                     register_menu_to_server( menu_name, TRUE );
             }
+            
         }
         return FALSE;
     }
@@ -757,11 +723,11 @@ reconnect:
             goto retry;
         if ( st != G_IO_STATUS_NORMAL || len < 4 )
         {
-            g_debug("server IO error!!");
+            DEBUG("server IO error!!");
             goto reconnect;
             return FALSE;
         }
-        g_debug("server line: %s", line);
+        DEBUG("server line: %s", line);
         if( 0 == memcmp( line, "REL:", 4 ) ) /* reload */
         {
             GHashTableIter it;
@@ -769,20 +735,21 @@ reconnect:
             MenuCache* cache;
             line[len - 1] = '\0';
             char* menu_cache_id = line + 4;
-            g_debug("server ask us to reload cache: %s", menu_cache_id);
+            DEBUG("server ask us to reload cache: %s", menu_cache_id);
 
+            
             g_hash_table_iter_init(&it, hash);
             while(g_hash_table_iter_next(&it, (gpointer*)&menu_name, (gpointer*)&cache))
             {
                 if(0 == memcmp(cache->md5, menu_cache_id, 32))
                 {
-                    g_debug("RELOAD!");
+                    DEBUG("RELOAD!");
                     menu_cache_reload(cache);
                     break;
                 }
             }
+            
         }
-
         g_free( line );
     }
     return TRUE;
@@ -847,9 +814,10 @@ MenuCache* register_menu_to_server( const char* menu_name, gboolean re_register
     const char* xdg_data_home = g_getenv("XDG_DATA_HOME");
     const char* xdg_cache_home = g_getenv("XDG_CACHE_HOME");
     char* buf;
-    char md5[36];
+    const char* md5;
     char* file_name;
     int len = 0, r;
+    GChecksum *sum;
 
     if( !xdg_cfg )
         xdg_cfg = "";
@@ -868,7 +836,7 @@ MenuCache* register_menu_to_server( const char* menu_name, gboolean re_register
     while( strchr(langs[0], '.') )
         ++langs;
 
-    buf = g_strdup_printf( "REG:%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
+    buf = g_strdup_printf( "REG:%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t00000000000000000000000000000000\n",
                             menu_name,
                             *langs,
                                                        xdg_cache_home,
@@ -877,30 +845,33 @@ MenuCache* register_menu_to_server( const char* menu_name, gboolean re_register
                             xdg_data,
                             xdg_cfg_home,
                             xdg_data_home );
-    write( server_fd, buf, strlen(buf) );
-
-    while( (r=read(server_fd, md5 + len, 32 - len)) > 0 && len < 32 )
-        len += r;
 
-    md5[32] = '\0';
+    /* calculate the md5 sum of menu name + lang + all environment variables */
+    sum = g_checksum_new(G_CHECKSUM_MD5);
+    len = strlen(buf);
+    g_checksum_update(sum, buf + 4, len - 38);
+    md5 = g_checksum_get_string(sum);
+    memcpy(buf + len - 33, md5, 32);
+    write( server_fd, buf, len );
+    g_free( buf );
 
-    if( r == -1 )
+    if( re_register )
     {
-        g_debug("server error!");
+        g_checksum_free(sum);
         return NULL;
     }
-    g_free( buf );
-    if( len != 32 || re_register )
-        return NULL;
 
     file_name = g_build_filename( g_get_user_cache_dir(), "menus", md5, NULL );
-    g_debug("cache file_name = %s", file_name);
+    DEBUG("cache file_name = %s", file_name);
     cache = menu_cache_new( file_name );
     memcpy( cache->md5, md5, 32 );
     cache->menu_name = g_strdup(menu_name);
     g_free( file_name );
 
+    g_checksum_free(sum); /* md5 is also freed here */
+
     g_hash_table_insert( hash, g_strdup(menu_name), cache );
+
     return cache;
 }
 
@@ -923,7 +894,10 @@ MenuCache* menu_cache_lookup( const char* menu_name )
     {
         cache = (MenuCache*)g_hash_table_lookup(hash, menu_name);
         if( cache )
+        {
+            
             return menu_cache_ref(cache);
+        }
     }
 
     if( !connect_server() )
@@ -934,6 +908,27 @@ MenuCache* menu_cache_lookup( const char* menu_name )
     return register_menu_to_server( menu_name, FALSE );
 }
 
+static void on_menu_cache_reload(MenuCache* mc, gpointer user_data)
+{
+    GMainLoop* mainloop = (GMainLoop*)user_data;
+    g_main_loop_quit(mainloop);
+}
+
+MenuCache* menu_cache_lookup_sync( const char* menu_name )
+{
+    MenuCache* mc = menu_cache_lookup(menu_name);
+    /* ensure that the menu cache is loaded */
+    if(! menu_cache_get_root_dir(mc)) /* if it's not yet loaded */
+    {
+        GMainLoop* mainloop = g_main_loop_new(NULL, FALSE);
+        gpointer notify_id = menu_cache_add_reload_notify(mc, on_menu_cache_reload, mainloop);
+        g_main_loop_run(mainloop);
+        g_main_loop_unref(mainloop);
+        menu_cache_remove_reload_notify(mc, notify_id);
+    }
+    return mc;
+}
+
 static GSList* list_app_in_dir(MenuCacheDir* dir, GSList* list)
 {
     GSList* l;
index a310164..21a4080 100644 (file)
  *      MA 02110-1301, USA.
  */
 
+/* NOTICE: This library is not MT-safe and should only be called from main thread.
+ *         If you really need to use it in another thread, using mutex is needed,
+ *         but the correct way to do this is unknown. */
+
 #ifndef __MENU_CACHE_H__
 #define __MENU_CACHE_H__
 
@@ -66,6 +70,7 @@ enum _MenuCacheItemFlag{
 void menu_cache_init(int flags);
 
 MenuCache* menu_cache_lookup( const char* menu_name );
+MenuCache* menu_cache_lookup_sync( const char* menu_name );
 /* MenuCache* menu_cache_lookup_by_cache_id( const char* md5 ); */
 
 MenuCache* menu_cache_ref(MenuCache* cache);
index b36c4ad..3506ead 100755 (executable)
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -65,7 +65,7 @@
 #       compiler:              $LTCC
 #       compiler flags:                $LTCFLAGS
 #       linker:                $LD (gnu? $with_gnu_ld)
-#       $progname:             (GNU libtool) 2.2.6
+#       $progname:             (GNU libtool) 2.2.6 Debian-2.2.6a-4
 #       automake:              $automake_version
 #       autoconf:              $autoconf_version
 #
@@ -73,7 +73,7 @@
 
 PROGRAM=ltmain.sh
 PACKAGE=libtool
-VERSION=2.2.6
+VERSION="2.2.6 Debian-2.2.6a-4"
 TIMESTAMP=""
 package_revision=1.3012
 
@@ -116,15 +116,15 @@ $lt_unset CDPATH
 
 : ${CP="cp -f"}
 : ${ECHO="echo"}
-: ${EGREP="/usr/bin/grep -E"}
-: ${FGREP="/usr/bin/grep -F"}
-: ${GREP="/usr/bin/grep"}
+: ${EGREP="/bin/grep -E"}
+: ${FGREP="/bin/grep -F"}
+: ${GREP="/bin/grep"}
 : ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
-: ${SED="/opt/local/bin/gsed"}
+: ${SED="/bin/sed"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
 : ${Xsed="$SED -e 1s/^X//"}
 
@@ -5033,7 +5033,10 @@ func_mode_link ()
        case $pass in
        dlopen) libs="$dlfiles" ;;
        dlpreopen) libs="$dlprefiles" ;;
-       link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+       link)
+         libs="$deplibs %DEPLIBS%"
+         test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+         ;;
        esac
       fi
       if test "$linkmode,$pass" = "lib,dlpreopen"; then
@@ -5344,19 +5347,19 @@ func_mode_link ()
            # It is a libtool convenience library, so add in its objects.
            convenience="$convenience $ladir/$objdir/$old_library"
            old_convenience="$old_convenience $ladir/$objdir/$old_library"
+           tmp_libs=
+           for deplib in $dependency_libs; do
+             deplibs="$deplib $deplibs"
+             if $opt_duplicate_deps ; then
+               case "$tmp_libs " in
+               *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+               esac
+             fi
+             tmp_libs="$tmp_libs $deplib"
+           done
          elif test "$linkmode" != prog && test "$linkmode" != lib; then
            func_fatal_error "\`$lib' is not a convenience library"
          fi
-         tmp_libs=
-         for deplib in $dependency_libs; do
-           deplibs="$deplib $deplibs"
-           if $opt_duplicate_deps ; then
-             case "$tmp_libs " in
-             *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-             esac
-           fi
-           tmp_libs="$tmp_libs $deplib"
-         done
          continue
        fi # $pass = conv
 
@@ -5893,6 +5896,7 @@ func_mode_link ()
          if test "$link_all_deplibs" != no; then
            # Add the search paths of all dependency libraries
            for deplib in $dependency_libs; do
+             path=
              case $deplib in
              -L*) path="$deplib" ;;
              *.la)
@@ -6206,6 +6210,9 @@ func_mode_link ()
            revision="$number_minor"
            lt_irix_increment=no
            ;;
+         *)
+           func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+           ;;
          esac
          ;;
        no)
index 4baf9f1..ee6364f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *      menu-cached.c
  *
- *      Copyright 2008 PCMan <pcman.tw@gmail.com>
+ *      Copyright 2008 - 2010 PCMan <pcman.tw@gmail.com>
  *
  *      This program is free software; you can redistribute it and/or modify
  *      it under the terms of the GNU General Public License as published by
 #include <signal.h>
 #include <utime.h>
 
+#ifdef G_ENABLE_DEBUG
+#define DEBUG(...)  g_debug(__VA_ARGS__)
+#else
+#define DEBUG(...)
+#endif
+
 typedef struct _Cache
 {
     int n_ref;
@@ -70,11 +76,11 @@ static void on_file_changed( GFileMonitor* mon, GFile* gf, GFile* other,
 static void cache_unref(Cache* cache)
 {
     --cache->n_ref;
-    /* g_debug("menu cache unrefed: ref_count=%d", cache->n_ref); */
+    /* DEBUG("menu cache unrefed: ref_count=%d", cache->n_ref); */
     if( cache->n_ref == 0 )
     {
         int i;
-        /* g_debug("menu cache freed"); */
+        /* DEBUG("menu cache freed"); */
         g_slist_foreach( cache->clients, (GFunc)g_io_channel_unref, NULL );
         g_slist_free( cache->clients );
         for(i = 0; i < cache->n_files; ++i)
@@ -97,7 +103,7 @@ static void cache_unref(Cache* cache)
     }
     else if( cache->n_ref == 1 ) /* the last ref count is held by hash table */
     {
-        /* g_debug("menu cache removed from hash"); */
+        /* DEBUG("menu cache removed from hash"); */
         g_hash_table_remove( hash, cache->md5 );
     }
 }
@@ -182,15 +188,15 @@ static gboolean regenerate_cache( const char* menu_name,
     argv[4] = menu_name;
     argv[6] = cache_file;
 
-    /* g_debug("cmd: %s", g_strjoinv(" ", argv)); */
+    /* DEBUG("cmd: %s", g_strjoinv(" ", argv)); */
 
     /* run menu-cache-gen */
     if( !g_spawn_sync(NULL, argv, NULL, 0,
                     pre_exec, env, NULL, NULL, &status, NULL ))
     {
-        g_debug("error executing menu-cache-gen");
+        DEBUG("error executing menu-cache-gen");
     }
-    /* g_debug("exit status of menu-cache-gen: %d", status); */
+    /* DEBUG("exit status of menu-cache-gen: %d", status); */
     if( status != 0 )
         return FALSE;
 
@@ -201,7 +207,7 @@ static gboolean regenerate_cache( const char* menu_name,
         {
             n_files = 0;
             files = NULL;
-            /* g_debug("error: read_all_used_files"); */
+            /* DEBUG("error: read_all_used_files"); */
         }
         fclose(f);
     }
@@ -220,8 +226,8 @@ static gboolean delayed_reload( Cache* cache )
     int i;
     GFile* gf;
 
-    /* g_debug("Re-generation of cache is needed!"); */
-    /* g_debug("call menu-cache-gen to re-generate the cache"); */
+    /* DEBUG("Re-generation of cache is needed!"); */
+    /* DEBUG("call menu-cache-gen to re-generate the cache"); */
     memcpy( buf, "REL:", 4 );
     memcpy( buf + 4, cache->md5, 32 );
     buf[36] = '\n';
@@ -244,7 +250,7 @@ static gboolean delayed_reload( Cache* cache )
     if( ! regenerate_cache( cache->menu_name, cache->lang_name, cache_file,
                             cache->env, &cache->n_files, &cache->files ) )
     {
-        g_debug("regeneration of cache failed.");
+        DEBUG("regeneration of cache failed.");
     }
 
     cache->mons = g_realloc( cache->mons, sizeof(GFileMonitor*)*(cache->n_files+1) );
@@ -334,7 +340,7 @@ static gboolean is_desktop_file_in_cache(Cache* cache, int dir_idx, const char*
 void on_file_changed( GFileMonitor* mon, GFile* gf, GFile* other,
                       GFileMonitorEvent evt, Cache* cache )
 {
-    /* g_debug("file %s is changed (%d).", g_file_get_path(gf), evt); */
+    /* DEBUG("file %s is changed (%d).", g_file_get_path(gf), evt); */
     /* if( mon != cache->cache_mon ) */
     {
         /* Optimization: Some files in the dir are changed, but it
@@ -370,7 +376,7 @@ void on_file_changed( GFileMonitor* mon, GFile* gf, GFile* other,
                      * affect the content of our menu.
                      */
                     gboolean in_cache = is_desktop_file_in_cache(cache, idx, base_name);
-                    /* g_debug("in_cache = %d", in_cache); */
+                    /* DEBUG("in_cache = %d", in_cache); */
                     if( ! in_cache ) /* means this is a new file or previously hidden */
                     {
                         GKeyFile* kf = g_key_file_new();
@@ -422,7 +428,7 @@ void on_file_changed( GFileMonitor* mon, GFile* gf, GFile* other,
                     g_object_unref(gf);
                     g_signal_connect( cache->cache_mon, "changed", G_CALLBACK(on_file_changed), cache);
                                        */
-                    g_debug("files are changed, but no re-generation is needed.");
+                    DEBUG("files are changed, but no re-generation is needed.");
                     return;
                 }
             }
@@ -513,17 +519,17 @@ static int create_socket()
     }
     /* remove of previous socket file successful */
     else
-       g_warning("removed previous socket file %s");
+           g_warning("removed previous socket file %s", addr.sun_path);
 
     if(bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
     {
-        g_debug("Failed to bind to socket");
+        DEBUG("Failed to bind to socket");
         close(fd);
         return -1;
     }
     if(listen(fd, 30) < 0)
     {
-        g_debug( "Failed to listen to socket" );
+        DEBUG( "Failed to listen to socket" );
         close(fd);
         return -1;
     }
@@ -536,7 +542,7 @@ static void on_client_closed(GIOChannel* ch, gpointer user_data)
     char* md5;
     Cache* cache;
     GSList *l, *to_remove = NULL;
-    g_debug("client closed: %p", ch);
+    DEBUG("client closed: %p", ch);
     g_hash_table_iter_init (&it, hash);
     while( g_hash_table_iter_next (&it, (gpointer*)&md5, (gpointer*)&cache) )
     {
@@ -553,11 +559,11 @@ static void on_client_closed(GIOChannel* ch, gpointer user_data)
              */
             to_remove = g_slist_prepend( to_remove, cache );
             cache->clients = g_slist_delete_link( cache->clients, l );
-            g_debug("remove channel from cache");
+            DEBUG("remove channel from cache");
             g_io_channel_unref(ch);
         }
     }
-    /* g_debug("client closed"); */
+    /* DEBUG("client closed"); */
     g_slist_foreach( to_remove, (GFunc)cache_unref, NULL );
     g_slist_free( to_remove );
 }
@@ -587,18 +593,18 @@ retry:
     --len;
     line[len] = 0;
 
-    g_debug("line(%d) = %s", len, line);
+    DEBUG("line(%d) = %s", len, line);
 
     if( memcmp(line, "REG:", 4) == 0 )
     {
-        GChecksum *sum;
         int status = 0, n_files, i;
         char *pline = line + 4;
         char *sep, *menu_name, *lang_name, *cache_dir, *cache_file;
         char **files;
         char **env;
-        len -= 4;
+        char reload_cmd[38] = "REL:";
 
+        len -= 4;
         /* Format of received string, separated by '\t'.
          * Menu Name
          * Language Name
@@ -608,9 +614,8 @@ retry:
          * XDG_DATA_DIRS
          * XDG_CONFIG_HOME
          * XDG_DATA_HOME */
-        sum = g_checksum_new(G_CHECKSUM_MD5);
-        g_checksum_update(sum, pline, len);
-        md5 = g_checksum_get_string(sum);
+
+        md5 = pline + len - 32; /* the md5 hash of this menu */
 
         cache = (Cache*)g_hash_table_lookup(hash, md5);
         if( !cache )
@@ -636,7 +641,7 @@ retry:
                 /* run menu-cache-gen */
                 if(! regenerate_cache( menu_name, lang_name, cache_file, env, &n_files, &files ) )
                 {
-                    g_debug("regeneration of cache failed!!");
+                    DEBUG("regeneration of cache failed!!");
                 }
             }
             cache = g_slice_new0( Cache );
@@ -648,7 +653,7 @@ retry:
             cache->env = env;
             cache->mons = g_new0(GFileMonitor*, n_files+1);
             /* create required file monitors */
-            g_debug("%d files/dirs are monitored.", n_files);
+            DEBUG("%d files/dirs are monitored.", n_files);
             for( i = 0; i < n_files; ++i )
             {
                 gf = g_file_new_for_path( files[i] + 1 );
@@ -656,7 +661,7 @@ retry:
                     cache->mons[i] = g_file_monitor_directory( gf, 0, NULL, NULL );
                 else
                     cache->mons[i] = g_file_monitor_file( gf, 0, NULL, NULL );
-                /* g_debug("monitor: %s", g_file_get_path(gf)); */
+                DEBUG("monitor: %s", g_file_get_path(gf));
                 g_signal_connect( cache->mons[i], "changed", on_file_changed, cache);
                 g_object_unref(gf);
             }
@@ -669,22 +674,27 @@ retry:
             g_free(cache_file);
 
             g_hash_table_insert(hash, cache->md5, cache);
-            g_debug("new menu cache added to hash");
+            DEBUG("new menu cache added to hash");
             cache->n_ref = 1;
         }
-        /* g_debug("menu %s requested by client %d", md5, g_io_channel_unix_get_fd(ch)); */
+        /* DEBUG("menu %s requested by client %d", md5, g_io_channel_unix_get_fd(ch)); */
         ++cache->n_ref;
         cache->clients = g_slist_prepend( cache->clients, g_io_channel_ref(ch) );
-        if( status  == 0 )
-            write( g_io_channel_unix_get_fd(ch), md5, 32 );
-        else
-            write( g_io_channel_unix_get_fd(ch), "", 0 );
-        g_checksum_free( sum );
+
+        /* generate a fake reload notification */
+        DEBUG("fake reload!");
+        memcpy(reload_cmd + 4, md5, 32);
+
+        reload_cmd[36] = '\n';
+        reload_cmd[37] = '\0';
+
+        DEBUG("reload command: %s", reload_cmd);
+        write(g_io_channel_unix_get_fd(ch), reload_cmd, 37);
     }
     else if( memcmp(line, "UNR:", 4) == 0 )
     {
         md5 = line + 4;
-        g_debug("unregister: %s", md5);
+        DEBUG("unregister: %s", md5);
         cache = (Cache*)g_hash_table_lookup(hash, md5);
         if( cache )
         {
@@ -694,7 +704,7 @@ retry:
             g_io_channel_unref(ch);
         }
         else
-            g_debug("bug! client is not found.");
+            DEBUG("bug! client is not found.");
     }
     g_free( line );
 
@@ -714,7 +724,7 @@ static gboolean on_new_conn_incoming(GIOChannel* ch, GIOCondition cond, gpointer
     client = accept(server, &client_addr, &client_addrlen);
     if( client == -1 )
     {
-        g_debug("accept error");
+        DEBUG("accept error");
         return TRUE;
     }
 
@@ -722,7 +732,7 @@ static gboolean on_new_conn_incoming(GIOChannel* ch, GIOCondition cond, gpointer
     g_io_add_watch( child, G_IO_PRI|G_IO_IN|G_IO_HUP|G_IO_ERR, on_client_data_in, NULL );
     g_io_channel_set_close_on_unref( child, TRUE );
 
-    /* g_debug("new client accepted"); */
+    /* DEBUG("new client accepted"); */
     return TRUE;
 }
 
@@ -759,43 +769,43 @@ int main(int argc, char** argv)
     if( server_fd < 0 )
         return 1;
 
-#ifndef _DEBUG
+#ifndef DISABLE_DAEMONIZE
     /* Become a daemon */
     if ((pid = fork()) < 0) {
-       g_error("can't fork");
+       g_error("can't fork");
     }
     else if (pid != 0) {
        /* exit parent */
-       exit(0);
+       exit(0);
     }
 
     /* change working directory to root, so previous working directory
      * can be unmounted */
     if (chdir("/") < 0) {
-       g_error("can't change directory to /");
+       g_error("can't change directory to /");
     }
 
     open_max = sysconf (_SC_OPEN_MAX);
     for (i = 0; i < open_max; i++)
     {
-       /* don't hold open fd opened besides server socket */
-       if (i != fd)
-           fcntl (i, F_SETFD, FD_CLOEXEC);
+        /* don't hold open fd opened besides server socket */
+        if (i != fd)
+            fcntl (i, F_SETFD, FD_CLOEXEC);
     }
 
     /* /dev/null for stdin, stdout, stderr */
     fd = open ("/dev/null", O_RDONLY);
     if (fd != -1)
     {
-       dup2 (fd, 0);
-       close (fd);
+        dup2 (fd, 0);
+        close (fd);
     }
     fd = open ("/dev/null", O_WRONLY);
     if (fd != -1)
     {
-       dup2 (fd, 1);
-       dup2 (fd, 2);
-       close (fd);
+        dup2 (fd, 1);
+        dup2 (fd, 2);
+        close (fd);
     }
 #endif