Hello community,
here is the log from the commit of package icecream for openSUSE:Factory
checked in at Mon Mar 1 15:56:50 CET 2010.
--------
--- icecream/icecream.changes 2009-04-30 14:50:19.000000000 +0200
+++ /mounts/work_src_done/STABLE/icecream/icecream.changes 2010-03-01 15:22:36.000000000 +0100
@@ -1,0 +2,11 @@
+Mon Feb 1 09:36:00 UTC 2010 - coolo@novell.com
+
+- Update to 0.9.5
+ - fix: close the file descriptor (novell bug bnc#525799)
+ - log PID even if no prefix is specified
+ - allow get_msg() to fetch data from the kernel even if timeout is 0.
+ - clean up event loop of gcc invocation
+ - Install an "icerun" symlink that will serialize commands through
+ icecream's local daemon
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
Old:
----
icecc-0.9.4.tar.bz2
New:
----
icecc-0.9.5.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ icecream.spec ++++++
--- /var/tmp/diff_new_pack.E5LU8j/_old 2010-03-01 15:56:23.000000000 +0100
+++ /var/tmp/diff_new_pack.E5LU8j/_new 2010-03-01 15:56:23.000000000 +0100
@@ -1,7 +1,7 @@
#
-# spec file for package icecream (Version 0.9.4)
+# spec file for package icecream (Version 0.9.5)
#
-# Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -21,7 +21,7 @@
Name: icecream
BuildRequires: gcc-c++
-License: GPL v2 or later; LGPL v2.1 or later
+License: GPLv2+ ; LGPLv2.1+
Group: Development/Tools/Building
Summary: For Distributed Compile in the Network
Requires: /bin/tar /usr/bin/bzip2
@@ -31,7 +31,7 @@
%endif
PreReq: /usr/sbin/useradd /usr/sbin/groupadd
Requires: gcc-c++
-Version: 0.9.4
+Version: 0.9.5
Release: 1
Source0: ftp://ftp.suse.com/pub/projects/icecream/icecc-%{version}.tar.bz2
Source1: %name-manpages.tar.bz2
@@ -40,18 +40,8 @@
%description
icecream is the next generation distcc.
-
-
-Authors:
---------
- Stephan Kulow
- Michael Matz
- Cornelius Schumacher
- Lubos Lunak
- Frerich Raabe
-
%package -n libicecream-devel
-License: GPL v2 or later; LGPL v2.1 or later
+License: GPLv2+ ; LGPLv2.1+
Summary: For Distributed Compile in the Network
Group: Development/Tools/Building
Summary: For Distributed Compile in the Network
@@ -60,16 +50,6 @@
%description -n libicecream-devel
icecream is the next generation distcc.
-
-
-Authors:
---------
- Stephan Kulow
- Michael Matz
- Cornelius Schumacher
- Lubos Lunak
- Frerich Raabe
-
%prep
%setup -q -a 1 -n icecc-%{version}
@@ -129,6 +109,7 @@
%config /etc/logrotate.d/icecream
%config /etc/init.d/icecream
%_bindir/icecc
+%_bindir/icerun
%_sbindir/scheduler
%_libdir/icecc
%_sbindir/iceccd
++++++ icecc-0.9.4.tar.bz2 -> icecc-0.9.5.tar.bz2 ++++++
++++ 5678 lines of diff (skipped)
++++ retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/NEWS new/icecc-0.9.5/NEWS
--- old/icecc-0.9.4/NEWS 2009-04-30 14:42:54.000000000 +0200
+++ new/icecc-0.9.5/NEWS 2010-02-01 10:22:12.000000000 +0100
@@ -1,3 +1,11 @@
+0.9.5 (1083362)
+- fix: close the file descriptor (novell bug 525799)
+- log PID even if no prefix is specified
+- allow get_msg() to fetch data from the kernel even if timeout is 0.
+- clean up event loop of gcc invocation
+- Install an "icerun" symlink that will serialize commands through
+ icecream's local daemon
+
0.9.4 (961598):
- fix compilation warnings
- don't leak file descriptor to create-env
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/client/Makefile.am new/icecc-0.9.5/client/Makefile.am
--- old/icecc-0.9.4/client/Makefile.am 2008-05-12 19:52:37.000000000 +0200
+++ new/icecc-0.9.5/client/Makefile.am 2010-02-01 10:10:50.000000000 +0100
@@ -7,16 +7,10 @@
noinst_HEADERS = client.h md5.h util.h
EXTRA_DIST = icecc-create-env
-CLEANFILES = icecc++
-
-all-local: icecc++
-
-icecc++:
- -rm -f icecc++
- $(LN_S) icecc icecc++
install-exec-local:
$(mkinstalldirs) $(DESTDIR)$(bindir)
+ (cd $(DESTDIR)$(bindir) && $(LN_S) icecc icerun)
for link in g++ gcc c++ cc; do \
rm -f $(DESTDIR)$(bindir)/$$link ;\
$(LN_S) icecc $(DESTDIR)$(bindir)/$$link ;\
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/client/arg.cpp new/icecc-0.9.5/client/arg.cpp
--- old/icecc-0.9.4/client/arg.cpp 2009-04-30 14:35:23.000000000 +0200
+++ new/icecc-0.9.5/client/arg.cpp 2010-02-01 10:10:50.000000000 +0100
@@ -82,6 +82,7 @@
job.setLanguage (CompileJob::Lang_C);
else {
job.setLanguage( CompileJob::Lang_Custom );
+ job.setCompilerName( name ); // keep path
return true;
}
@@ -89,7 +90,7 @@
}
bool analyse_argv( const char * const *argv,
- CompileJob &job )
+ CompileJob &job, bool icerun )
{
ArgumentsList args;
string ofile;
@@ -105,11 +106,17 @@
bool always_local = analyze_program(had_cc ? job.compilerName().c_str() : argv[0], job);
bool seen_c = false;
bool seen_s = false;
+ if( icerun ) {
+ always_local = true;
+ job.setLanguage( CompileJob::Lang_Custom );
+ }
for (int i = had_cc ? 2 : 1; argv[i]; i++) {
const char *a = argv[i];
- if (a[0] == '-') {
+ if (icerun) {
+ args.append(a, Arg_Local);
+ } else if (a[0] == '-') {
if (!strcmp(a, "-E") || !strncmp(a, "-fdump", 6) || !strcmp(a, "-combine")) {
always_local = true;
args.append(a, Arg_Local);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/client/client.h new/icecc-0.9.5/client/client.h
--- old/icecc-0.9.4/client/client.h 2006-09-02 22:28:28.000000000 +0200
+++ new/icecc-0.9.5/client/client.h 2010-02-01 10:10:50.000000000 +0100
@@ -40,7 +40,7 @@
extern std::string get_absfilename( const std::string &_file );
/* In arg.cpp. */
-extern bool analyse_argv (const char * const *argv, CompileJob &job);
+extern bool analyse_argv (const char * const *argv, CompileJob &job, bool icerun);
/* In cpp.cpp. */
extern pid_t call_cpp (CompileJob &job, int fdwrite, int fdread = -1);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/client/local.cpp new/icecc-0.9.5/client/local.cpp
--- old/icecc-0.9.4/client/local.cpp 2009-04-30 11:48:35.000000000 +0200
+++ new/icecc-0.9.5/client/local.cpp 2010-02-01 10:10:23.000000000 +0100
@@ -244,7 +244,7 @@
}
if (r == 0)
break;
- if ( r < 0 && errno != EINTR && errno != EAGAIN )
+ if ( r < 0 && errno != EINTR)
break;
}
colorify_output(s_ccout);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/client/main.cpp new/icecc-0.9.5/client/main.cpp
--- old/icecc-0.9.4/client/main.cpp 2009-04-30 11:48:35.000000000 +0200
+++ new/icecc-0.9.5/client/main.cpp 2010-02-01 10:10:50.000000000 +0100
@@ -91,6 +91,23 @@
"\n");
}
+static void icerun_show_usage(void)
+{
+ printf(
+"Usage:\n"
+" icerun [compile options] -o OBJECT -c SOURCE\n"
+" icerun --help\n"
+"\n"
+"Options:\n"
+" --help explain usage and exit\n"
+" --version show version and exit\n"
+"Environment Variables:\n"
+" ICECC if set to \"no\", just exec the real gcc\n"
+" ICECC_DEBUG [info | warnings | debug]\n"
+" sets verboseness of icecream client.\n"
+" ICECC_LOGFILE if set, additional debug information is logged to the specified file\n"
+"\n");
+}
volatile bool local = false;
@@ -189,6 +206,7 @@
setup_debug(debug_level, logfile, "ICECC");
CompileJob job;
+ bool icerun = false;
string compiler_name = argv[0];
dcc_client_catch_signals();
@@ -209,6 +227,28 @@
if ( arg.size() > 0 && arg.at(0) == '/' )
job.setCompilerName(arg);
}
+ } else if ( find_basename( compiler_name ) == "icerun") {
+ icerun = true;
+ if ( argc > 1 ) {
+ string arg = argv[1];
+ if ( arg == "--help" ) {
+ icerun_show_usage();
+ return 0;
+ }
+ if ( arg == "--version" ) {
+ printf( "ICERUN " VERSION "\n" );
+ return 0;
+ }
+ if ( arg.size() > 0 )
+ job.setCompilerName(arg);
+ }
+ } else {
+ char buf[ PATH_MAX ];
+ buf[ PATH_MAX - 1 ] = '\0';
+ // check if it's a symlink to icerun
+ if( readlink( compiler_name.c_str(), buf, PATH_MAX - 1 ) >= 0 && find_basename( buf ) == "icerun" ) {
+ icerun = true;
+ }
}
int sg_level = dcc_recursion_safeguard();
@@ -222,7 +262,7 @@
* see the EPIPE. */
dcc_ignore_sigpipe(1);
- local |= analyse_argv( argv, job );
+ local |= analyse_argv( argv, job, icerun );
/* if ICECC is set to no, then run job locally */
char* icecc = getenv("ICECC");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/client/remote.cpp new/icecc-0.9.5/client/remote.cpp
--- old/icecc-0.9.4/client/remote.cpp 2009-04-30 11:48:35.000000000 +0200
+++ new/icecc-0.9.5/client/remote.cpp 2009-07-29 13:43:38.000000000 +0200
@@ -520,6 +520,7 @@
break;
md5_append(&state, buffer, size );
}
+ fclose(f);
md5_byte_t digest[16];
md5_finish(&state, digest);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/config.h.in new/icecc-0.9.5/config.h.in
--- old/icecc-0.9.4/config.h.in 2009-04-30 14:44:10.000000000 +0200
+++ new/icecc-0.9.5/config.h.in 2010-02-01 10:14:16.000000000 +0100
@@ -155,6 +155,9 @@
/* Define to 1 if you have the header file. */
#undef HAVE_NETINET_IN_H
+/* Define to 1 if you have the header file. */
+#undef HAVE_NETINET_TCP_H
+
/* Define to 1 if you have the header file. */
#undef HAVE_NETINET_TCP_VAR_H
@@ -227,6 +230,9 @@
/* Define to 1 if you have the header file. */
#undef HAVE_SYS_SIGNAL_H
+/* Define to 1 if you have the header file. */
+#undef HAVE_SYS_SOCKETVAR_H
+
/* Define to 1 if you have the header file. */
#undef HAVE_SYS_SOCKET_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/configure.in new/icecc-0.9.5/configure.in
--- old/icecc-0.9.4/configure.in 2009-04-30 14:43:07.000000000 +0200
+++ new/icecc-0.9.5/configure.in 2010-02-01 10:13:15.000000000 +0100
@@ -4,7 +4,7 @@
AC_INIT(client/main.cpp)
-AM_INIT_AUTOMAKE(icecc, "0.9.4")
+AM_INIT_AUTOMAKE(icecc, "0.9.5")
AM_CONFIG_HEADER(config.h)
AC_CANONICAL_HOST
@@ -34,7 +34,7 @@
# Some of these are needed by popt (or other libraries included in the future).
AC_CHECK_HEADERS([unistd.h stdint.h signal.h sys/types.h sys/signal.h ifaddrs.h kinfo.h sys/param.h devstat.h])
-AC_CHECK_HEADERS([ctype.h sys/resource.h sys/socket.h sys/stat.h sys/select.h sys/vfs.h])
+AC_CHECK_HEADERS([ctype.h sys/resource.h sys/socket.h sys/socketvar.h sys/stat.h sys/select.h sys/vfs.h])
AC_CHECK_HEADERS([mach/host_info.h])
AC_CHECK_HEADERS([netinet/in.h], [], [],
[#if HAVE_SYS_TYPES_H
@@ -61,7 +61,23 @@
AC_ARG_VAR(TAR, [Specifies tar path])
AC_PATH_PROG(TAR, [tar])
AC_DEFINE_UNQUOTED([TAR], ["$TAR"], [Define path to tar])
-AC_CHECK_HEADERS([float.h mcheck.h alloca.h sys/mman.h netinet/tcp_var.h])
+AC_CHECK_HEADERS([float.h mcheck.h alloca.h sys/mman.h netinet/tcp.h])
+AC_CHECK_HEADERS([netinet/tcp_var.h], [], [],
+[#if HAVE_SYS_TYPES_H
+# include
+#endif
+#if HAVE_SYS_SOCKETVAR_H
+# include
+#endif
+#if HAVE_NETINET_IN_H
+# include
+#endif
+#if HAVE_NETINET_TCP_H
+# include
+#endif
+])
+
+
AC_CHECK_HEADERS([sys/user.h])
######################################################################
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/daemon/main.cpp new/icecc-0.9.5/daemon/main.cpp
--- old/icecc-0.9.4/daemon/main.cpp 2009-04-30 14:39:28.000000000 +0200
+++ new/icecc-0.9.5/daemon/main.cpp 2010-02-01 10:20:21.000000000 +0100
@@ -1159,7 +1159,7 @@
off_t off = 0;
while ( len ) {
ssize_t bytes = write( client->pipe_to_child, fcmsg->buffer + off, len );
- if ( bytes < 0 && ( errno == EINTR || errno == EAGAIN ) )
+ if ( bytes < 0 && errno == EINTR )
continue;
if ( bytes == -1 ) {
@@ -1463,6 +1463,8 @@
close_scheduler();
}
}
+ // never really reached
+ return 0;
}
int main( int argc, char ** argv )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/daemon/serve.cpp new/icecc-0.9.5/daemon/serve.cpp
--- old/icecc-0.9.4/daemon/serve.cpp 2009-04-30 11:48:35.000000000 +0200
+++ new/icecc-0.9.5/daemon/serve.cpp 2010-02-01 10:10:23.000000000 +0100
@@ -214,7 +214,7 @@
ssize_t bytes = read(obj_fd, buffer, sizeof(buffer));
if ( bytes < 0 )
{
- if ( errno == EINTR || errno == EAGAIN )
+ if ( errno == EINTR )
continue;
throw myexception( EXIT_DISTCC_FAILED );
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/daemon/workit.cpp new/icecc-0.9.5/daemon/workit.cpp
--- old/icecc-0.9.4/daemon/workit.cpp 2009-04-30 11:48:35.000000000 +0200
+++ new/icecc-0.9.5/daemon/workit.cpp 2010-02-01 10:10:23.000000000 +0100
@@ -94,11 +94,16 @@
}
-volatile static bool must_reap = false;
+static int death_pipe[2];
+
+extern "C" {
static void theSigCHLDHandler( int )
{
- must_reap = true;
+ char foo = 0;
+ write(death_pipe[1], &foo, 1);
+}
+
}
static void
@@ -108,21 +113,27 @@
client->send_msg( StatusTextMsg( error ) );
}
+/*
+ * This is all happening in a forked child.
+ * That means that we can block and be lazy about closing fds
+ * (in the error cases which exit quickly).
+ */
+
int work_it( CompileJob &j, unsigned int job_stat[], MsgChannel* client,
CompileResultMsg& rmsg, const string &outfilename,
- unsigned long int mem_limit, int client_fd, int job_in_fd )
+ unsigned long int mem_limit, int client_fd, int /*job_in_fd*/ )
{
rmsg.out.erase(rmsg.out.begin(), rmsg.out.end());
rmsg.out.erase(rmsg.out.begin(), rmsg.out.end());
std::list<string> list = j.remoteFlags();
appendList( list, j.restFlags() );
- int ret;
int sock_err[2];
int sock_out[2];
int sock_in[2];
int main_sock[2];
+ char buffer[4096];
if ( pipe( sock_err ) )
return EXIT_DISTCC_FAILED;
@@ -130,24 +141,13 @@
return EXIT_DISTCC_FAILED;
if ( pipe( main_sock ) )
return EXIT_DISTCC_FAILED;
+ if ( pipe( death_pipe ) )
+ return EXIT_DISTCC_FAILED;
- if ( fcntl( sock_out[0], F_SETFL, O_NONBLOCK ) )
- return EXIT_DISTCC_FAILED;
- if ( fcntl( sock_err[0], F_SETFL, O_NONBLOCK ) )
- return EXIT_DISTCC_FAILED;
-
- if ( fcntl( sock_out[0], F_SETFD, FD_CLOEXEC ) )
- return EXIT_DISTCC_FAILED;
- if ( fcntl( sock_err[0], F_SETFD, FD_CLOEXEC ) )
- return EXIT_DISTCC_FAILED;
- if ( fcntl( sock_out[1], F_SETFD, FD_CLOEXEC ) )
- return EXIT_DISTCC_FAILED;
- if ( fcntl( sock_err[1], F_SETFD, FD_CLOEXEC ) )
- return EXIT_DISTCC_FAILED;
-
+ // We use a socket pair instead of a pipe to get a "slightly" bigger
+ // output buffer. This saves context switches and latencies.
if (socketpair(AF_UNIX, SOCK_STREAM, 0, sock_in) < 0)
return EXIT_DISTCC_FAILED;
-
int maxsize = 2*1024*2024;
#ifdef SO_SNDBUFFORCE
if (setsockopt(sock_in[1], SOL_SOCKET, SO_SNDBUFFORCE, &maxsize, sizeof(maxsize)) < 0)
@@ -156,7 +156,8 @@
setsockopt(sock_in[1], SOL_SOCKET, SO_SNDBUF, &maxsize, sizeof(maxsize));
}
- must_reap = false;
+ if ( fcntl( sock_in[1], F_SETFL, O_NONBLOCK ) )
+ return EXIT_DISTCC_FAILED;
/* Testing */
struct sigaction act;
@@ -173,31 +174,13 @@
sigaddset( &act.sa_mask, SIGCHLD );
// Make sure we don't block this signal. gdb tends to do that :-(
sigprocmask( SIG_UNBLOCK, &act.sa_mask, 0 );
- char buffer[4096];
-
- int return_value = 0;
flush_debug();
pid_t pid = fork();
if ( pid == -1 ) {
- close( sock_err[0] );
- close( sock_err[1] );
- close( main_sock[0] );
- close( main_sock[1] );
- close( sock_out[0] );
- close( sock_out[1] );
- close( sock_in[0] );
- close( sock_in[1] );
- close( sock_err[0] );
return EXIT_OUT_OF_MEMORY;
} else if ( pid == 0 ) {
- close( main_sock[0] );
- close( sock_in[1] );
- close( sock_out[0] );
- dup2( sock_in[0], 0);
- close (sock_in[0]);
- fcntl(main_sock[1], F_SETFD, FD_CLOEXEC);
setenv( "PATH", "usr/bin", 1 );
// Safety check
if (getuid() == 0 || getgid() == 0) {
@@ -261,11 +244,25 @@
assert(i <= argc);
close_debug();
+
+ close( sock_out[0] );
dup2 (sock_out[1], STDOUT_FILENO );
close(sock_out[1]);
+
+ close(sock_err[0]);
dup2( sock_err[1], STDERR_FILENO );
close(sock_err[1]);
+ close( sock_in[1] );
+ dup2( sock_in[0], STDIN_FILENO);
+ close (sock_in[0]);
+
+ close( main_sock[0] );
+ fcntl(main_sock[1], F_SETFD, FD_CLOEXEC);
+
+ close( death_pipe[0] );
+ close( death_pipe[1] );
+
#ifdef ICECC_DEBUG
for(int f = STDERR_FILENO+1; f < 4096; ++f) {
long flags;
@@ -279,212 +276,238 @@
char resultByte = 1;
write(main_sock[1], &resultByte, 1);
_exit(-1);
- } else {
- close( main_sock[1] );
- close( sock_in[0] );
- close( sock_out[1] );
- close( sock_err[1] );
-
- struct timeval starttv;
- gettimeofday(&starttv, 0 );
-
- while ( !return_value ) {
- Msg* msg = client->get_msg(60);
-
- if ( !msg || (msg->type != M_FILE_CHUNK && msg->type != M_END) )
- {
- log_error() << "protocol error while reading preprocessed file\n";
- delete msg;
- msg = 0;
- return_value = EXIT_IO_ERROR;
- client_fd = -1;
- break;
- }
-
- if ( msg->type == M_END )
- {
- delete msg;
- msg = 0;
- break;
- }
-
- FileChunkMsg *fcmsg = static_cast( msg );
- job_stat[JobStatistics::in_uncompressed] += fcmsg->len;
- job_stat[JobStatistics::in_compressed] += fcmsg->compressed;
-
- ssize_t len = fcmsg->len;
- off_t off = 0;
- while ( len ) {
- ssize_t bytes = write( sock_in[1], fcmsg->buffer + off, len );
- if ( bytes < 0 && ( errno == EINTR || errno == EAGAIN ) )
- continue;
-
- write(job_in_fd, fcmsg->buffer + off, bytes);
-
- if ( bytes == -1 ) {
- log_perror("write to caching socket failed. ");
+ }
+ close( sock_in[0] );
+ close( sock_out[1] );
+ close( sock_err[1] );
+
+ // idea borrowed from kprocess.
+ // check whether the compiler could be run at all.
+ close( main_sock[1] );
+ for(;;)
+ {
+ char resultByte;
+ ssize_t n = ::read(main_sock[0], &resultByte, 1);
+ if (n == -1 && errno == EINTR)
+ continue; // Ignore
- fd_set rfds;
- FD_ZERO( &rfds );
- FD_SET( sock_err[0], &rfds );
+ if (n == 1)
+ {
+ rmsg.status = resultByte;
- struct timeval tv;
- tv.tv_sec = 1;
- tv.tv_usec = 0;
+ error_client( client, "compiler did not start" );
+ return EXIT_COMPILER_MISSING;
+ }
+ break; // != EINTR
+ }
+ close( main_sock[0] );
- ret = select( sock_err[0]+1, &rfds, 0, 0, &tv );
+ struct timeval starttv;
+ gettimeofday(&starttv, 0 );
- if ( ret > 0 && FD_ISSET(sock_err[0], &rfds) ) {
- ssize_t bytes = read( sock_err[0], buffer, sizeof(buffer)-1 );
- if ( bytes > 0 ) {
+ int return_value = 0;
+ // Got EOF for preprocessed input. stdout send may be still pending.
+ bool input_complete = false;
+ // Pending data to send to stdin
+ FileChunkMsg *fcmsg = 0;
+ size_t off = 0;
- while ( bytes > 0 && buffer[bytes - 1] == '\n' )
- bytes--;
- buffer[bytes] = 0;
+ log_block parent_wait("parent, waiting");
- rmsg.err = buffer;
+ for(;;)
+ {
+ if ( client_fd >= 0 && !fcmsg ) {
+ if (Msg *msg = client->get_msg(0)) {
+ if (input_complete) {
+ rmsg.err.append( "client cancelled\n" );
+ return_value = EXIT_CLIENT_KILLED;
+ client_fd = -1;
+ kill(pid, SIGTERM);
+ delete fcmsg;
+ fcmsg = 0;
+ delete msg;
+ } else {
+ if ( msg->type == M_END ) {
+ input_complete = true;
+ if (!fcmsg) {
+ close( sock_in[1] );
+ sock_in[1] = -1;
}
+ delete msg;
+ } else if ( msg->type == M_FILE_CHUNK ) {
+ fcmsg = static_cast( msg );
+ off = 0;
+
+ job_stat[JobStatistics::in_uncompressed] += fcmsg->len;
+ job_stat[JobStatistics::in_compressed] += fcmsg->compressed;
+ } else {
+ log_error() << "protocol error while reading preprocessed file\n";
+ return_value = EXIT_IO_ERROR;
+ client_fd = -1;
+ kill(pid, SIGTERM);
+ delete fcmsg;
+ fcmsg = 0;
+ delete msg;
}
-
- if ( rmsg.err.size() )
- error_client( client, "compiler failed: " + rmsg.err );
- else
- error_client( client, "compiler failed." );
- delete msg;
- msg = 0;
- return_value = EXIT_COMPILER_CRASHED;
- break;
}
-
- len -= bytes;
- off += bytes;
+ } else if (client->at_eof()) {
+ log_error() << "unexpected EOF while reading preprocessed file\n";
+ return_value = EXIT_IO_ERROR;
+ client_fd = -1;
+ kill(pid, SIGTERM);
+ delete fcmsg;
+ fcmsg = 0;
}
+ }
- delete msg;
- msg = 0;
+ fd_set rfds;
+ FD_ZERO( &rfds );
+ if (sock_out[0] >= 0)
+ FD_SET( sock_out[0], &rfds );
+ if (sock_err[0] >= 0)
+ FD_SET( sock_err[0], &rfds );
+ int max_fd = std::max( sock_out[0], sock_err[0] );
+
+ if ( client_fd >= 0 && !fcmsg ) {
+ FD_SET( client_fd, &rfds );
+ if ( client_fd > max_fd )
+ max_fd = client_fd;
+ // Note that we don't actually query the status of this fd -
+ // we poll it in every iteration.
}
- close( sock_in[1] );
- log_block parent_wait("parent, waiting");
- // idea borrowed from kprocess
- for(;;)
- {
- char resultByte;
- ssize_t n = ::read(main_sock[0], &resultByte, 1);
- if (n == -1 && ( errno == EINTR || errno == EAGAIN ) )
- continue; // Ignore
-
- if (n == 1)
- {
- rmsg.status = resultByte;
- close(main_sock[0]);
- return_value = EXIT_COMPILER_MISSING;
- error_client( client, "compiler did not start" );
- }
- break; // != EINTR
+ FD_SET( death_pipe[0], &rfds );
+ if ( death_pipe[0] > max_fd )
+ max_fd = death_pipe[0];
+
+ fd_set wfds, *wfdsp = 0;
+ FD_ZERO( &wfds );
+ if (fcmsg) {
+ FD_SET( sock_in[1], &wfds );
+ wfdsp = &wfds;
+ if ( sock_in[1] > max_fd )
+ max_fd = sock_in[1];
}
- close( main_sock[0] );
- log_block bwrite("write block");
+ struct timeval tv, *tvp = 0;
+ if (!input_complete) {
+ tv.tv_sec = 60;
+ tv.tv_usec = 0;
+ tvp = &tv;
+ }
- for(;;)
+ switch( select( max_fd+1, &rfds, wfdsp, 0, tvp ) )
{
- fd_set rfds;
- FD_ZERO( &rfds );
- if (sock_out[0] >= 0)
- FD_SET( sock_out[0], &rfds );
- if (sock_err[0] >= 0)
- FD_SET( sock_err[0], &rfds );
- if ( client_fd >= 0 )
- FD_SET( client_fd, &rfds );
+ case 0:
+ if (!input_complete) {
+ log_error() << "timeout while reading preprocessed file\n";
+ kill(pid, SIGTERM); // Won't need it any more ...
+ return_value = EXIT_IO_ERROR;
+ client_fd = -1;
+ input_complete = true;
+ delete fcmsg;
+ fcmsg = 0;
+ continue;
+ }
+ // this should never happen
+ assert( false );
+ return EXIT_DISTCC_FAILED;
+ case -1:
+ if (errno == EINTR)
+ continue;
+ // this should never happen
+ assert( false );
+ return EXIT_DISTCC_FAILED;
+ default:
+ if ( fcmsg && FD_ISSET(sock_in[1], &wfds) ) {
+ ssize_t bytes = write( sock_in[1], fcmsg->buffer + off, fcmsg->len - off );
+ if ( bytes < 0 ) {
+ if (errno == EINTR)
+ continue;
+ kill(pid, SIGTERM); // Most likely crashed anyway ...
+ return_value = EXIT_COMPILER_CRASHED;
+ continue;
+ }
- int max_fd = std::max( sock_out[0], sock_err[0] );
- if ( client_fd > max_fd )
- max_fd = client_fd;
+ // The fd is -1 anyway
+ //write(job_in_fd, fcmsg->buffer + off, bytes);
- ret = 0;
- if (!must_reap)
- ret = select( max_fd+1, &rfds, 0, 0, NULL );
-
- switch( ret )
- {
- default:
- if ( sock_out[0] >= 0 && FD_ISSET(sock_out[0], &rfds) ) {
- ssize_t bytes = read( sock_out[0], buffer, sizeof(buffer)-1 );
- if ( bytes > 0 ) {
- buffer[bytes] = 0;
- rmsg.out.append( buffer );
- }
- else if (bytes == 0) {
- close(sock_out[0]);
- sock_out[0] = -1;
+ off += bytes;
+
+ if (off == fcmsg->len) {
+ delete fcmsg;
+ fcmsg = 0;
+ if (input_complete) {
+ close( sock_in[1] );
+ sock_in[1] = -1;
}
}
- if ( sock_err[0] >= 0 && FD_ISSET(sock_err[0], &rfds) ) {
- ssize_t bytes = read( sock_err[0], buffer, sizeof(buffer)-1 );
- if ( bytes > 0 ) {
- buffer[bytes] = 0;
- rmsg.err.append( buffer );
- }
- else if (bytes == 0) {
- close(sock_err[0]);
- sock_err[0] = -1;
- }
+ }
+
+ if ( sock_out[0] >= 0 && FD_ISSET(sock_out[0], &rfds) ) {
+ ssize_t bytes = read( sock_out[0], buffer, sizeof(buffer)-1 );
+ if ( bytes > 0 ) {
+ buffer[bytes] = 0;
+ rmsg.out.append( buffer );
}
- if ( client_fd >= 0 && FD_ISSET( client_fd, &rfds ) ) {
- rmsg.err.append( "client cancelled\n" );
- client_fd = -1;
- kill(pid, SIGTERM);
- return_value = EXIT_CLIENT_KILLED;
+ else if (bytes == 0) {
+ close(sock_out[0]);
+ sock_out[0] = -1;
}
- // fall through
- case -1:
- if ( ret < 0 && errno != EINTR ) { // this usually means the logic broke
- assert( false );
- return EXIT_DISTCC_FAILED;
+ }
+ if ( sock_err[0] >= 0 && FD_ISSET(sock_err[0], &rfds) ) {
+ ssize_t bytes = read( sock_err[0], buffer, sizeof(buffer)-1 );
+ if ( bytes > 0 ) {
+ buffer[bytes] = 0;
+ rmsg.err.append( buffer );
+ }
+ else if (bytes == 0) {
+ close(sock_err[0]);
+ sock_err[0] = -1;
}
- // fall through
- case 0:
+ }
+
+ if ( FD_ISSET(death_pipe[0], &rfds) ) {
+ // Note that we have already read any remaining stdout/stderr:
+ // the sigpipe is delivered after everything was written,
+ // and the notification is multiplexed into the select above.
+
struct rusage ru;
int status;
+ if (wait4(pid, &status, 0, &ru) != pid) {
+ // this should never happen
+ assert( false );
+ return EXIT_DISTCC_FAILED;
+ }
- if (wait4(pid, &status, must_reap ? WUNTRACED : WNOHANG, &ru) == pid)
- {
- close( sock_err[0] );
- close( sock_out[0] );
-
- if ( !WIFEXITED(status) || WEXITSTATUS(status) ) {
- unsigned long int mem_used = ( ru.ru_minflt + ru.ru_majflt ) * getpagesize() / 1024;
- rmsg.status = EXIT_OUT_OF_MEMORY;
-
- if ( mem_used * 100 > 85 * mem_limit * 1024 ||
- rmsg.err.find( "memory exhausted" ) != string::npos )
- {
- // the relation between ulimit and memory used is pretty thin ;(
- return EXIT_OUT_OF_MEMORY;
- }
- }
-
- if ( WIFEXITED(status) ) {
- struct timeval endtv;
- gettimeofday(&endtv, 0 );
- rmsg.status = WEXITSTATUS(status);
- job_stat[JobStatistics::exit_code] = WEXITSTATUS(status);
- job_stat[JobStatistics::real_msec] = (endtv.tv_sec - starttv.tv_sec) * 1000 +
- (long(endtv.tv_usec) - long(starttv.tv_usec)) / 1000;
- job_stat[JobStatistics::user_msec] = ru.ru_utime.tv_sec * 1000
- + ru.ru_utime.tv_usec / 1000;
- job_stat[JobStatistics::sys_msec] = ru.ru_stime.tv_sec * 1000
- + ru.ru_stime.tv_usec / 1000;
- job_stat[JobStatistics::sys_pfaults] = ru.ru_majflt + ru.ru_nswap + ru.ru_minflt;
+ if ( !WIFEXITED(status) || WEXITSTATUS(status) ) {
+ unsigned long int mem_used = ( ru.ru_minflt + ru.ru_majflt ) * getpagesize() / 1024;
+ rmsg.status = EXIT_OUT_OF_MEMORY;
+
+ if ( mem_used * 100 > 85 * mem_limit * 1024 ||
+ rmsg.err.find( "memory exhausted" ) != string::npos )
+ {
+ // the relation between ulimit and memory used is pretty thin ;(
+ return EXIT_OUT_OF_MEMORY;
}
+ }
- return return_value;
+ if ( WIFEXITED(status) ) {
+ struct timeval endtv;
+ gettimeofday(&endtv, 0 );
+ rmsg.status = WEXITSTATUS(status);
+ job_stat[JobStatistics::exit_code] = WEXITSTATUS(status);
+ job_stat[JobStatistics::real_msec] = (endtv.tv_sec - starttv.tv_sec) * 1000 +
+ (long(endtv.tv_usec) - long(starttv.tv_usec)) / 1000;
+ job_stat[JobStatistics::user_msec] = ru.ru_utime.tv_sec * 1000
+ + ru.ru_utime.tv_usec / 1000;
+ job_stat[JobStatistics::sys_msec] = ru.ru_stime.tv_sec * 1000
+ + ru.ru_stime.tv_usec / 1000;
+ job_stat[JobStatistics::sys_pfaults] = ru.ru_majflt + ru.ru_nswap + ru.ru_minflt;
}
- break;
+
+ return return_value;
}
}
}
- assert( false );
- return 0;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/missing new/icecc-0.9.5/missing
--- old/icecc-0.9.4/missing 2008-12-03 11:04:52.000000000 +0100
+++ new/icecc-0.9.5/missing 2009-10-24 02:17:03.000000000 +0200
@@ -1,10 +1,10 @@
#! /bin/sh
# Common stub for a few missing GNU programs while installing.
-scriptversion=2006-05-10.23
+scriptversion=2009-04-28.21; # UTC
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
-# Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009 Free Software Foundation, Inc.
# Originally by Fran,cois Pinard , 1996.
# This program is free software; you can redistribute it and/or modify
@@ -18,9 +18,7 @@
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program. If not, see http://www.gnu.org/licenses/.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -89,6 +87,9 @@
tar try tar, gnutar, gtar, then tar without non-portable flags
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
Send bug reports to ."
exit $?
;;
@@ -106,15 +107,22 @@
esac
+# normalize program name to check for.
+program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
# Now exit if we have it, but it failed. Also exit now if we
# don't have it and --version was passed (most likely to detect
-# the program).
+# the program). This is about non-GNU programs, so use $1 not
+# $program.
case $1 in
- lex|yacc)
+ lex*|yacc*)
# Not GNU programs, they don't have --version.
;;
- tar)
+ tar*)
if test -n "$run"; then
echo 1>&2 "ERROR: \`tar' requires --run"
exit 1
@@ -138,7 +146,7 @@
# If it does not exist, or fails to run (possibly an outdated version),
# try to emulate it.
-case $1 in
+case $program in
aclocal*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
@@ -148,7 +156,7 @@
touch aclocal.m4
;;
- autoconf)
+ autoconf*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`${configure_ac}'. You might want to install the
@@ -157,7 +165,7 @@
touch configure
;;
- autoheader)
+ autoheader*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acconfig.h' or \`${configure_ac}'. You might want
@@ -187,7 +195,7 @@
while read f; do touch "$f"; done
;;
- autom4te)
+ autom4te*)
echo 1>&2 "\
WARNING: \`$1' is needed, but is $msg.
You might have modified some files without having the
@@ -210,7 +218,7 @@
fi
;;
- bison|yacc)
+ bison*|yacc*)
echo 1>&2 "\
WARNING: \`$1' $msg. You should only need it if
you modified a \`.y' file. You may need the \`Bison' package
@@ -240,7 +248,7 @@
fi
;;
- lex|flex)
+ lex*|flex*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.l' file. You may need the \`Flex' package
@@ -263,7 +271,7 @@
fi
;;
- help2man)
+ help2man*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a dependency of a manual page. You may need the
@@ -277,11 +285,11 @@
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
- exit 1
+ exit $?
fi
;;
- makeinfo)
+ makeinfo*)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.texi' or \`.texinfo' file, or any other file
@@ -310,7 +318,7 @@
touch $file
;;
- tar)
+ tar*)
shift
# We have already tried tar in the generic part.
@@ -363,5 +371,6 @@
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
# End:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/services/comm.cpp new/icecc-0.9.5/services/comm.cpp
--- old/icecc-0.9.4/services/comm.cpp 2009-03-02 10:42:01.000000000 +0100
+++ new/icecc-0.9.5/services/comm.cpp 2010-02-01 10:19:25.000000000 +0100
@@ -320,9 +320,9 @@
if (inofs >= intogo + 4)
{
if ( ptrdiff_t(inbuf + intogo) % 4 ) {
- char t_buf[4];
+ uint32_t t_buf[1];
memcpy(t_buf, inbuf + intogo, 4);
- buf = *(uint32_t *)t_buf;
+ buf = t_buf[0];
} else
buf = *(uint32_t *)(inbuf + intogo);
intogo += 4;
@@ -850,11 +850,16 @@
{
if (has_msg ())
return true;
- if (!read_a_bit () || timeout <= 0)
+ if (!read_a_bit ())
{
- trace() << "!read_a_bit || timeout <= 0\n";
+ trace() << "!read_a_bit\n";
return false;
}
+ if (timeout <= 0)
+ {
+ trace() << "timeout <= 0\n";
+ return has_msg ();
+ }
while (!has_msg ())
{
fd_set read_set;
@@ -884,8 +889,8 @@
Msg *m = 0;
enum MsgType type;
uint32_t t;
- if (timeout > 0 && !wait_for_msg (timeout) ) {
- trace() << "blocking && !waiting_for_msg()\n";
+ if (!wait_for_msg (timeout) ) {
+ trace() << "!wait_for_msg()\n";
return 0;
}
/* If we've seen the EOF, and we don't have a complete message,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/services/comm.h new/icecc-0.9.5/services/comm.h
--- old/icecc-0.9.4/services/comm.h 2008-10-21 12:40:13.000000000 +0200
+++ new/icecc-0.9.5/services/comm.h 2010-02-01 10:10:23.000000000 +0100
@@ -154,7 +154,7 @@
void setBulkTransfer();
std::string dump() const;
- // NULL <--> channel closed
+ // NULL <--> channel closed or timeout
Msg *get_msg(int timeout = 10);
// false <--> error (msg not send)
bool send_msg (const Msg &, int SendFlags = SendBlocking);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/services/logging.h new/icecc-0.9.5/services/logging.h
--- old/icecc-0.9.4/services/logging.h 2008-05-12 19:52:37.000000000 +0200
+++ new/icecc-0.9.5/services/logging.h 2010-02-01 10:10:23.000000000 +0100
@@ -49,7 +49,8 @@
char buf[64];
strftime(buf, sizeof(buf), "%T: ", tmp);
if (logfile_prefix.size())
- os << logfile_prefix << "[" << getpid() << "] ";
+ os << logfile_prefix;
+ os << "[" << getpid() << "] ";
os << buf;
return os;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/icecc-0.9.4/suse/icecream.spec.in new/icecc-0.9.5/suse/icecream.spec.in
--- old/icecc-0.9.4/suse/icecream.spec.in 2008-05-12 19:51:26.000000000 +0200
+++ new/icecc-0.9.5/suse/icecream.spec.in 2010-02-01 10:13:53.000000000 +0100
@@ -28,16 +28,6 @@
%description
icecream is the next generation distcc.
-
-
-Authors:
---------
- Stephan Kulow
- Michael Matz
- Cornelius Schumacher
- Lubos Lunak
- Frerich Raabe
-
%package -n libicecream-devel
Summary: libicecream-devel
Group: Development/Tools/Building
@@ -104,6 +94,7 @@
%config /etc/logrotate.d/icecream
%config /etc/init.d/icecream
%_bindir/icecc
+%_bindir/icerun
%_sbindir/scheduler
%_libdir/icecc
%_sbindir/iceccd
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org