summaryrefslogtreecommitdiffstats
path: root/kinit
diff options
context:
space:
mode:
authorDarrell Anderson <[email protected]>2013-05-17 12:44:40 -0500
committerDarrell Anderson <[email protected]>2013-05-17 12:44:40 -0500
commit47a706a785ee2497fd7ebcf8176364a09f23ae07 (patch)
tree114871fa1729954446b676623b93dfb457474e88 /kinit
parent931f86e56b6e7139870ae37e7a86629176af57d4 (diff)
downloadtdelibs-47a706a785ee2497fd7ebcf8176364a09f23ae07.tar.gz
tdelibs-47a706a785ee2497fd7ebcf8176364a09f23ae07.zip
Rename remnant files and references from kinit -> tdeinit.
Diffstat (limited to 'kinit')
-rw-r--r--kinit/CMakeLists.txt167
-rw-r--r--kinit/LICENSE.setproctitle89
-rw-r--r--kinit/Mainpage.dox29
-rw-r--r--kinit/Makefile.am92
-rw-r--r--kinit/README84
-rw-r--r--kinit/README.DCOP83
-rw-r--r--kinit/README.autostart62
-rw-r--r--kinit/README.wrapper38
-rw-r--r--kinit/autostart.cpp310
-rw-r--r--kinit/autostart.h48
-rw-r--r--kinit/configure.in.in59
-rw-r--r--kinit/kinit.cpp1913
-rw-r--r--kinit/kwrapper.c25
-rw-r--r--kinit/lnusertemp.c294
-rw-r--r--kinit/setproctitle.cpp302
-rw-r--r--kinit/setproctitle.h156
-rw-r--r--kinit/shell.c25
-rw-r--r--kinit/start_tdeinit.c191
-rw-r--r--kinit/start_tdeinit_wrapper.c92
-rw-r--r--kinit/tdedostartupconfig.cpp143
-rw-r--r--kinit/tdeioslave.cpp93
-rw-r--r--kinit/tdelauncher.cpp1421
-rw-r--r--kinit/tdelauncher.h200
-rw-r--r--kinit/tdelauncher_cmds.h185
-rw-r--r--kinit/tdelauncher_main.cpp116
-rw-r--r--kinit/tdestartupconfig.cpp176
-rw-r--r--kinit/tests/Makefile.am10
-rw-r--r--kinit/tests/tdelaunchertest.cpp54
-rw-r--r--kinit/wrapper.c546
29 files changed, 0 insertions, 7003 deletions
diff --git a/kinit/CMakeLists.txt b/kinit/CMakeLists.txt
deleted file mode 100644
index 88be32621..000000000
--- a/kinit/CMakeLists.txt
+++ /dev/null
@@ -1,167 +0,0 @@
-#################################################
-#
-# (C) 2010 Serghei Amelian
-# serghei (DOT) amelian (AT) gmail.com
-#
-# Improvements and feedback are welcome
-#
-# This file is released under GPL >= 2
-#
-#################################################
-
-include_directories(
- ${TQT_INCLUDE_DIRS}
- ${CMAKE_CURRENT_BINARY_DIR}
- ${CMAKE_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_BINARY_DIR}/tdecore
- ${CMAKE_SOURCE_DIR}
- ${CMAKE_SOURCE_DIR}/dcop
- ${CMAKE_SOURCE_DIR}/tdecore
- ${CMAKE_SOURCE_DIR}/tdeui
- ${CMAKE_SOURCE_DIR}/tdeio
- ${CMAKE_SOURCE_DIR}/tdeio/tdeio
- ${FREETYPE_INCLUDE_DIRS}
-)
-
-link_directories(
- ${TQT_LIBRARY_DIRS}
-)
-
-
-#### tdeinit ####################################
-
-set( target tdeinit )
-
-set( ${target}_SRCS
- kinit.cpp setproctitle.cpp
-)
-
-tde_add_executable( ${target}
- SOURCES ${${target}_SRCS}
- LINK ltdlc-static tdeparts-shared
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### tdeinit_wrapper ############################
-
-set( target tdeinit_wrapper )
-
-tde_add_executable( ${target}
- SOURCES wrapper.c
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### kshell #####################################
-
-set( target kshell )
-
-tde_add_executable( ${target}
- SOURCES shell.c
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### tdeinit_shutdown ###########################
-
-set( target tdeinit_shutdown )
-
-tde_add_executable( ${target}
- SOURCES wrapper.c
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### lnusertemp #################################
-
-set( target lnusertemp )
-
-tde_add_executable( ${target}
- SOURCES lnusertemp.c
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### kwrapper ###################################
-
-set( target kwrapper )
-
-tde_add_executable( ${target}
- SOURCES kwrapper.c
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### tdeioslave ###################################
-
-set( target tdeioslave )
-
-tde_add_executable( ${target} AUTOMOC
- SOURCES tdeioslave.cpp
- LINK ltdlc-static tdeio-shared
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### tdestartupconfig #############################
-
-set( target tdestartupconfig )
-
-tde_add_executable( ${target} AUTOMOC
- SOURCES tdestartupconfig.cpp
- LINK tdefakes-shared ${TQT_LIBRARIES}
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### tdedostartupconfig ###########################
-
-set( target tdedostartupconfig )
-
-tde_add_executable( ${target} AUTOMOC
- SOURCES tdedostartupconfig.cpp
- LINK tdecore-shared
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### start_tdeinit ##############################
-
-set( target start_tdeinit )
-
-if( TDEINIT_SETUID )
- set( _setuid SETUID )
-endif( TDEINIT_SETUID )
-
-tde_add_executable( ${target} ${_setuid}
- SOURCES start_tdeinit.c
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-set_target_properties( ${target} PROPERTIES COMPILE_FLAGS -DEXECUTE=\\"${BIN_INSTALL_DIR}/tdeinit\\" )
-
-
-#### start_tdeinit_wrapper ######################
-
-set( target start_tdeinit_wrapper )
-
-tde_add_executable( ${target}
- SOURCES start_tdeinit_wrapper.c
- DESTINATION ${BIN_INSTALL_DIR}
-)
-
-
-#### tdelauncher ##################################
-
-set( target tdelauncher )
-
-set( ${target}_SRCS
- tdelauncher.cpp tdelauncher_main.cpp autostart.cpp
-)
-
-tde_add_tdeinit_executable( ${target} AUTOMOC
- SOURCES ${${target}_SRCS}
- LINK tdeio-shared
-)
diff --git a/kinit/LICENSE.setproctitle b/kinit/LICENSE.setproctitle
deleted file mode 100644
index d0ff63a9c..000000000
--- a/kinit/LICENSE.setproctitle
+++ /dev/null
@@ -1,89 +0,0 @@
- SENDMAIL LICENSE
-
-The following license terms and conditions apply, unless a different
-license is obtained from Sendmail, Inc., 1401 Park Avenue, Emeryville, CA
-94608, or by electronic mail at [email protected].
-
-License Terms:
-
-Use, Modification and Redistribution (including distribution of any
-modified or derived work) in source and binary forms is permitted only if
-each of the following conditions is met:
-
-1. Redistributions qualify as "freeware" or "Open Source Software" under
- one of the following terms:
-
- (a) Redistributions are made at no charge beyond the reasonable cost of
- materials and delivery.
-
- (b) Redistributions are accompanied by a copy of the Source Code or by an
- irrevocable offer to provide a copy of the Source Code for up to three
- years at the cost of materials and delivery. Such redistributions
- must allow further use, modification, and redistribution of the Source
- Code under substantially the same terms as this license. For the
- purposes of redistribution "Source Code" means the complete source
- code of sendmail including all modifications.
-
- Other forms of redistribution are allowed only under a separate royalty-
- free agreement permitting such redistribution subject to standard
- commercial terms and conditions. A copy of such agreement may be
- obtained from Sendmail, Inc. at the above address.
-
-2. Redistributions of source code must retain the copyright notices as they
- appear in each source code file, these license terms, and the
- disclaimer/limitation of liability set forth as paragraph 6 below.
-
-3. Redistributions in binary form must reproduce the Copyright Notice,
- these license terms, and the disclaimer/limitation of liability set
- forth as paragraph 6 below, in the documentation and/or other materials
- provided with the distribution. For the purposes of binary distribution
- the "Copyright Notice" refers to the following language:
- "Copyright (c) 1998 Sendmail, Inc. All rights reserved."
-
-4. Neither the name of Sendmail, Inc. nor the University of California nor
- the names of their contributors may be used to endorse or promote
- products derived from this software without specific prior written
- permission. The name "sendmail" is a trademark of Sendmail, Inc.
-
-5. All redistributions must comply with the conditions imposed by the
- University of California on certain embedded code, whose copyright
- notice and conditions for redistribution are as follows:
-
- (a) Copyright (c) 1988, 1993 The Regents of the University of
- California. All rights reserved.
-
- (b) Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- (i) Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- (ii) Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
-
- (iii) All advertising materials mentioning features or use of this
- software must display the following acknowledgement: "This
- product includes software developed by the University of
- California, Berkeley and its contributors."
-
- (iv) Neither the name of the University nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-6. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY
- SENDMAIL, INC. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
- WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- NO EVENT SHALL SENDMAIL, INC., THE REGENTS OF THE UNIVERSITY OF
- CALIFORNIA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-(Version 8.6, last updated 6/24/1998)
diff --git a/kinit/Mainpage.dox b/kinit/Mainpage.dox
deleted file mode 100644
index 06a34909b..000000000
--- a/kinit/Mainpage.dox
+++ /dev/null
@@ -1,29 +0,0 @@
-/** @mainpage Trinity Initialization Routines
-
-tdeinit is a process launcher somewhat similar to the
-famous init used for booting UNIX.
-<p>
-It launches processes by forking and then loading a
-dynamic library which should contain a 'main(...)'
-function. This both increases the startup speed and
-reduces the memory consumption of Trinity applications.
-
-tdeinit_wrapper, kshell and kwrapper provide methods
-of starting programs via tdeinit.
-
-@authors
-Waldo Bastian \<[email protected]\><br>
-Process title changing code taken from the ProFTPD Project, adapted by Alex Merry
-
-@maintainers
-[Unknown/None]
-
-@licenses
-@gpl<br>
-Most code is @lgpl
-
-*/
-
-// DOXYGEN_REFERENCES = tdecore
-// DOXYGEN_SET_PROJECT_NAME = KInit
-// vim:ts=4:sw=4:expandtab:filetype=doxygen
diff --git a/kinit/Makefile.am b/kinit/Makefile.am
deleted file mode 100644
index 3090d041e..000000000
--- a/kinit/Makefile.am
+++ /dev/null
@@ -1,92 +0,0 @@
-# This file is part of the KDE libraries
-# Copyright (C) 1999 Waldo Bastian ([email protected])
-
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Library General Public
-# License version 2 as published by the Free Software Foundation.
-
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Library General Public License for more details.
-
-# You should have received a copy of the GNU Library General Public License
-# along with this library; see the file COPYING.LIB. If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-
-INCLUDES = -I$(srcdir)/../libltdl/ $(all_includes) $(TDEINIT_XFT_INCLUDES)
-
-SUBDIRS = . tests
-
-bin_PROGRAMS = tdeinit tdeinit_wrapper kshell tdeinit_shutdown lnusertemp kwrapper tdeioslave \
- tdestartupconfig tdedostartupconfig start_tdeinit start_tdeinit_wrapper
-
-lib_LTLIBRARIES =
-tdeinit_LTLIBRARIES = tdelauncher.la
-tdeinit_SOURCES = kinit.cpp setproctitle.cpp
-
-# NOTE: We link against all common libraries even if we don't need them ourselves.
-# For the future: examine if condensing the tons of *_LDFLAGS variables
-# into $(all_libraries) isn't better
-AM_LDFLAGS = $(LDFLAGS_AS_NEEDED) $(LDFLAGS_NEW_DTAGS)
-
-tdeinit_LDFLAGS = $(KDE_MT_LDFLAGS) $(QT_LDFLAGS) $(X_LDFLAGS) $(USER_LDFLAGS) \
- $(KDE_RPATH)
-tdeinit_LDADD = $(LIB_KPARTS) -lXft $(LIB_QT)
-
-tdeioslave_SOURCES = tdeioslave.cpp
-tdeioslave_LDFLAGS = $(KDE_MT_LDFLAGS) $(QT_LDFLAGS) $(X_LDFLAGS) $(USER_LDFLAGS) \
- $(KDE_RPATH)
-tdeioslave_LDADD = $(LIB_KIO)
-
-tdeinit_wrapper_SOURCES = wrapper.c
-tdeinit_wrapper_LDADD = $(LIBSOCKET)
-
-kshell_SOURCES = shell.c
-kshell_LDADD = $(LIBSOCKET)
-
-tdeinit_shutdown_SOURCES = wrapper.c
-tdeinit_shutdown_LDADD = $(LIBSOCKET)
-
-lnusertemp_SOURCES = lnusertemp.c
-lnusertemp_LDFLAGS = $(KDE_RPATH)
-
-kwrapper_SOURCES = kwrapper.c
-kwrapper_LDADD = $(LIBSOCKET)
-
-tdelauncher_la_LDFLAGS = $(all_libraries) -module -avoid-version
-tdelauncher_la_LIBADD = $(LIB_KIO) $(LIB_QT) $(LIB_TDECORE) $(top_builddir)/dcop/libDCOP.la $(LIB_X11)
-tdelauncher_la_SOURCES = tdelauncher.cpp tdelauncher_main.cpp autostart.cpp
-
-tdestartupconfig_SOURCES = tdestartupconfig.cpp
-tdestartupconfig_LDADD = $(top_builddir)/tdecore/libtdefakes.la $(LIB_QT)
-tdedostartupconfig_SOURCES = tdedostartupconfig.cpp
-tdedostartupconfig_LDFLAGS = $(KDE_MT_LDFLAGS) $(QT_LDFLAGS) $(X_LDFLAGS) $(USER_LDFLAGS) \
- $(KDE_RPATH)
-tdedostartupconfig_LDADD = $(LIB_TDECORE)
-
-start_tdeinit_SOURCES = start_tdeinit.c
-tdeinitpath = $(bindir)/tdeinit
-start_tdeinit_CFLAGS = $(KDE_USE_FPIE) -DEXECUTE=\"$(tdeinitpath)\"
-start_tdeinit_LDFLAGS = $(KDE_USE_PIE)
-
-start_tdeinit_wrapper_SOURCES = start_tdeinit_wrapper.c
-
-METASOURCES = AUTO
-
-noinst_HEADERS = tdelauncher.h autostart.h tdelauncher_cmds.h setproctitle.h
-
-kwrapper.o: wrapper.c
-
-shell.o: wrapper.c
-
-dummy.cpp:
- echo > dummy.cpp
-
-install-exec-hook:
- @if test \${TDEINIT_SETUID} != 0; then \
- (chown 0 $(DESTDIR)$(bindir)/start_tdeinit && chmod 4755 $(DESTDIR)$(bindir)/start_tdeinit) || echo "Please make start_tdeinit setuid root" ; \
- fi
-
-include $(top_srcdir)/admin/Doxyfile.am
diff --git a/kinit/README b/kinit/README
deleted file mode 100644
index 644efbaf6..000000000
--- a/kinit/README
+++ /dev/null
@@ -1,84 +0,0 @@
-README
-
-tdeinit is a process launcher somewhat similar to the
-famous init used for booting UNIX.
-
-It launches processes by forking and then loading a
-dynamic library which should contain a 'main(...)'
-function.
-
-Executive summary
-=================
-
-Using tdeinit to launch KDE applications makes starting
-a typical KDE applications 2.5 times faster (100ms
-instead of 250ms on a P-III 500) It reduces memory
-consumption by approx. 350Kb per application.
-
-
-How it works
-============
-
-tdeinit is linked against all libraries a standard KDE
-application needs. With this technique starting an
-application becomes much faster because now only
-the application itself needs to be linked whereas
-otherwise both the application as well as all the libaries
-it uses need to be linked.
-
-Startup Speed
-=============
-
-Starting an application linked against libqt, libtdecore and libtdeui
-in the conventional way takes approx. 150ms on a Pentium III - 500Mhz.
-Starting the same application via tdeinit takes less than 10ms.
-
-(application without TDEApplication constructor, the TDEApplication
-constructor requires an extra 100ms in both cases)
-
-Memory Usage
-============
-
-An application linked against libqt, libtdecore and libtdeui started
-in the conventional way requires about 498Kb memory.
-(average of 10 instances) If the same application is started via
-tdeinit it requires about 142Kb. A difference of 356Kb (application
-without TDEApplication constructor)
-
-If we take the TDEApplication constructor into account, an application
-started in the conventional way takes about 679Kb memory while the same
-application started via tdeinit requires about 380Kb. Here the difference
-is somewhat less, 299Kb. This seems to be caused by the fact that the
-dynamic linker does "lazy linking". We can force the linker to link
-everything at startup by specifying "LD_BIND_NOW=true". When tdeinit is
-started with this option on, tdeinit is back to its full efficiency, an
-application with a TDEApplication constructor now uses 338Kb of memory.
-A difference of 341Kb with the normal case.
-
-Adapting programs to use tdeinit.
-===============================
-
-The sourcecode of a program does not require any change to take advantage
-of tdeinit. Only the makefile requires an adaption, if the Makefile.am of
-a normal program looks like this:
-
-bin_PROGRAMS = kicker
-kicker_LDADD = $(top_builddir)/libkonq/libkonq.la
-kicker_LDFLAGS = $(all_libraries) $(KDE_RPATH)
-
-The following lines need to be added to make a library version useable
-by tdeinit:
-
-lib_LTLIBRARIES = kicker.la
-libkicker_la_LIBADD = $(top_builddir)/libkonq/libkonq.la
-libkicker_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -module
-
-Disadvantages
-=============
-
-The process name of applications started via tdeinit is "tdeinit". This problem
-can be corrected to a degree by changing the application name as shown
-by 'ps'. However, applications like "killall" will only see "tdeinit" as
-process name. To workaround this, use "kdekillall", from tdesdk/scripts,
-for applications started via tdeinit.
-
diff --git a/kinit/README.DCOP b/kinit/README.DCOP
deleted file mode 100644
index cd5ba983e..000000000
--- a/kinit/README.DCOP
+++ /dev/null
@@ -1,83 +0,0 @@
-"TDELauncher" supports the following DCOP functions:
-
-/**
- * Starts a program.
- * 'envs' are environment variables that will be added
- * to this program's environment before starting it
- * 'startup_id' is for application startup notification,
- * "" is the default, "0" for none
- */
-void exec_blind(QCString name, QValueList<QCString> argList,
- QValueList<QCString> envs, QCString startup_id );
-void exec_blind(QCString name, QValueList<QCString> argList);
-
-/**
- * Start a service by name.
- *
- * 'serviceName' refers to the service name as given by
- * the Name field in the desktop file describing the service.
- *
- * 'url', if not empty, will be passed to the service as
- * argument.
- *
- * 'envs' are environment variables that will be added
- * to this program's environment before starting it
- *
- * 'startup_id' is for application startup notification,
- * "" is the default, "0" for none
- */
-serviceResult start_service_by_name(QString serviceName, QStringList url,
- QValueList<QCString> envs, QCString startup_id );
-serviceResult start_service_by_name(QString serviceName, QStringList url)
-
-/**
- * Start a service by desktop path.
- *
- * 'serviceName' refers to a desktop file describing the service.
- * This may be an absolute path or a path relative to $TDEDIRS/applnk
- * and/or $TDEDIRS/services
- * E.g. it should have the form "Applications/korganizer.desktop" or
- * "/opt/kde/share/applnk/Applications/korganizer.desktop".
- *
- * 'url', if not empty, will be passed to the service as
- * argument.
- *
- * 'envs' are environment variables that will be added
- * to this program's environment before starting it
- *
- * 'startup_id' is for application startup notification,
- * "" is the default, "0" for none
- */
-serviceResult start_service_by_desktop_path(QString serviceName, QStringList url,
- QValueList<QCString> envs, QCString startup_id );
-serviceResult start_service_by_desktop_path(QString serviceName, QStringList url)
-
-
-/**
- * Start a service by desktop name.
- *
- * 'serviceName' refers to a desktop file describing the service.
- * The service is looked up anywhere in $TDEDIR/applnk and/or
- * $TDEDIR/services.
- * E.g. it should have the form "korganizer".
- *
- * 'url', if not empty, will be passed to the service as
- * argument.
- *
- * 'envs' are environment variables that will be added
- * to this program's environment before starting it
- *
- * 'startup_id' is for application startup notification,
- * "" is the default, "0" for none
- */
-serviceResult start_service_by_desktop_name(QString serviceName, QStringList url,
- QValueList<QCString> envs, QCString startup_id );
-serviceResult start_service_by_desktop_name(QString serviceName, QStringList url)
-
-struct serviceResult
-{
- int result; // 0 means success. > 0 means error
- QCString dcopName; // Contains DCOP name on success
- QString error; // Contains error description on failure.
-}
-
diff --git a/kinit/README.autostart b/kinit/README.autostart
deleted file mode 100644
index ab8132915..000000000
--- a/kinit/README.autostart
+++ /dev/null
@@ -1,62 +0,0 @@
-KDE SESSION AUTOSTART
-=====================
-
-KDE session startup occurs in the following sequence:
-
- Window manager startup
- Autostart phase 1
- Session restoration
- Autostart phase 2
-
-Applications may be scheduled to be automatically run at KDE session startup
-in either autostart phase 1 or phase 2. Autostart phase 1 is the original
-autostart phase; phase 2 was introduced in KDE 3. To run in either phase, an
-application's .desktop file must be located in a KDE autostart directory such
-as $TDEDIR/share/autostart or $TDEHOME/share/autostart. The .desktop file can
-contain the following optional entries to control its autostart:
-
- X-TDE-autostart-condition = rcfile:group:entry:default
-
- rcfile = name of a config file (including path if necessary)
- group = name of a group within the config file
- entry = name of a boolean entry within the group
- default = true or false
-
- Starts the application only if the specified boolean entry in the
- specified config file has the value 'true'. If the specified entry is
- missing from the config file, the application will only be started if
- 'default' is 'true'.
- If the entry is not within a group, the group entry can be left empty.
-
- X-TDE-autostart-after = desktop_name
-
- desktop_name = the name of another .desktop file excluding path and
- the .desktop suffix. E.g. panel.desktop would appear
- as 'X-TDE-autostart-after=panel'
-
- Waits until the .desktop file specified by 'desktop_name' has been
- autostarted. The entry is ignored if the specified application is not
- scheduled in the same autostart phase as this .desktop file.
-
- X-TDE-autostart-phase = phase
-
- phase = 1 or 2
-
- Starts the application in the autostart phase specified by 'phase'.
- If this entry is missing or 'phase' < 1, 'phase' defaults to 1. If
- 'phase' > 2 the application will not be autostarted since the specified
- autostart phase will never be reached.
-
-
- Hidden = true
-
- Disables autostarting the application.
-
-
-KUniqueApplication and session restoration
-------------------------------------------
-
-If KUniqueApplication applications are autostarted before they are restored
-from the previous session, they will never see the session restoration command.
-So if you need to autostart a KUniqueApplication which may also be restored
-in session restoration, you should schedule it for autostart in phase 2.
diff --git a/kinit/README.wrapper b/kinit/README.wrapper
deleted file mode 100644
index 11483d2bc..000000000
--- a/kinit/README.wrapper
+++ /dev/null
@@ -1,38 +0,0 @@
-README
-
-tdeinit_wrapper, kshell and kwrapper are a programs that
-start programs via tdeinit.
-
-E.g. You can make a symbolic link from $TDEDIR/bin/konsole to
-$TDEDIR/bin/tdeinit_wrapper. Typing 'konsole' on the command line
-will then start 'konsole.la' through tdeinit instead.
-
-tdeinit_wrapper is the simplest for, it only passes the program
-and arguments to tdeinit, nothing else
-
-kshell is usually the best choice, it passes the program,
-arguments, complete environment ( $PATH, etc. ) and current
-working directory to tdeinit
-
-kwrapper tries to make the program look like it was actually
-really started directly and not via tdeinit. In addition to
-what kshell does, it also tries to redirect the program
-output to the console from which kwrapper was started, it waits
-for the program started via tdeinit to finish and only after then
-it exits ( it doesn't return its return value though ), and
-it also passes most signals it gets to the process of the started
-program ( thus allowing you to break it using Ctrl+C or stopping
-it using Ctrl+Z ). The drawbacks of this are that you'll have one
-more process running, and also the signal passing and output
-redirection may not work 100% reliably
-
-
-TODO
-====
-
-* There is no portable way to read out the complete environment and
- pass it to tdeinit. - tdeinit should probably unset every
- variable that's not set in the environment it gets from kshell or
- kwrapper
-* stdout/stderr of the started application goes to the console where
- tdeinit was started. - done, I hope it's ok
diff --git a/kinit/autostart.cpp b/kinit/autostart.cpp
deleted file mode 100644
index 3f49dfc1d..000000000
--- a/kinit/autostart.cpp
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- *
- * This file is part of the KDE libraries
- * Copyright (c) 2001 Waldo Bastian <[email protected]>
- *
- * $Id$
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- **/
-
-#include "autostart.h"
-
-#include <tdeconfig.h>
-#include <kdesktopfile.h>
-#include <tdeglobal.h>
-#include <kstandarddirs.h>
-
-#include <stdlib.h>
-
-class AutoStartItem
-{
-public:
- TQString name;
- TQString service;
- TQString startAfter;
- int phase;
-};
-
-class AutoStartList: public TQPtrList<AutoStartItem>
-{
-public:
- AutoStartList() { }
-};
-
-AutoStart::AutoStart( bool new_startup )
- : m_newStartup( new_startup ), m_phase( new_startup ? -1 : 0), m_phasedone(false)
-{
- m_startList = new AutoStartList;
- m_startList->setAutoDelete(true);
- TDEGlobal::dirs()->addResourceType("autostart", "share/autostart");
- TQString xdgdirs = getenv("XDG_CONFIG_DIRS");
- if (xdgdirs.isEmpty())
- xdgdirs = "/etc/xdg";
-
- TQStringList xdgdirslist = TQStringList::split( ':', xdgdirs );
- for ( TQStringList::Iterator itr = xdgdirslist.begin(); itr != xdgdirslist.end(); ++itr ) {
- TDEGlobal::dirs()->addResourceDir("autostart", (*itr) +"/autostart");
- }
-}
-
-AutoStart::~AutoStart()
-{
- delete m_startList;
-}
-
-void
-AutoStart::setPhase(int phase)
-{
- if (phase > m_phase)
- {
- m_phase = phase;
- m_phasedone = false;
- }
-}
-
-void AutoStart::setPhaseDone()
-{
- m_phasedone = true;
-}
-
-static TQString extractName(TQString path)
-{
- int i = path.findRev('/');
- if (i >= 0)
- path = path.mid(i+1);
- i = path.findRev('.');
- if (i >= 0)
- path = path.left(i);
- return path;
-}
-
-static bool startCondition(const TQString &condition)
-{
- if (condition.isEmpty())
- return true;
-
- TQStringList list = TQStringList::split(':', condition, true);
- if (list.count() < 4)
- return true;
- if (list[0].isEmpty() || list[2].isEmpty())
- return true;
-
- TDEConfig config(list[0], true, false);
- if (!list[1].isEmpty())
- config.setGroup(list[1]);
-
- bool defaultValue = (list[3].lower() == "true");
-
- return config.readBoolEntry(list[2], defaultValue);
-}
-
-void
-AutoStart::loadAutoStartList()
-{
- TQStringList files = TDEGlobal::dirs()->findAllResources("xdgconf-autostart", "*.desktop", false, true);
- TQStringList kdefiles = TDEGlobal::dirs()->findAllResources("autostart", "*.desktop", false, true);
- files += kdefiles;
-
- for(TQStringList::ConstIterator it = files.begin();
- it != files.end();
- ++it)
- {
- KDesktopFile config(*it, true);
- if (config.hasKey("X-TDE-autostart-condition")) {
- if (!startCondition(config.readEntry("X-TDE-autostart-condition")))
- continue;
- }
- else {
- if (!startCondition(config.readEntry("X-TDE-autostart-condition")))
- continue;
- }
- if (!config.tryExec())
- continue;
- if (config.readBoolEntry("Hidden", false))
- continue;
-
- // Check to see if the most important ( usually ~/.config/autostart or ~/.trinity/Autostart) XDG directory
- // has overridden the Hidden directive and honor it if set to True
- bool autostartOverriddenAndDisabled = false;
- for(TQStringList::ConstIterator localit = files.begin();
- localit != files.end();
- ++localit)
- {
- if (((*localit).startsWith(TDEGlobal::dirs()->localxdgconfdir()) == true) || ((*localit).startsWith(TDEGlobal::dirs()->localtdedir()) == true)) {
- // Same local file name?
- TQString localOuter;
- TQString localInner;
- int slashPos = (*it).findRev( '/', -1, TRUE );
- if (slashPos == -1) {
- localOuter = (*it);
- }
- else {
- localOuter = (*it).mid(slashPos+1);
- }
- slashPos = (*localit).findRev( '/', -1, TRUE );
- if (slashPos == -1) {
- localInner = (*localit);
- }
- else {
- localInner = (*localit).mid(slashPos+1);
- }
- if (localOuter == localInner) {
- // Overridden!
- // But is Hidden == True?
- KDesktopFile innerConfig(*localit, true);
- if (innerConfig.readBoolEntry("Hidden", false)) {
- // Override confirmed; exit speedily without autostarting
- autostartOverriddenAndDisabled = true;
- }
- }
- }
- }
-
- if (autostartOverriddenAndDisabled == true)
- continue;
-
- if (config.hasKey("OnlyShowIn"))
- {
-#ifdef WITH_OLD_XDG_STD
- if ((!config.readListEntry("OnlyShowIn", ';').contains("TDE")) && (!config.readListEntry("OnlyShowIn", ';').contains("KDE")))
- continue;
-#else
- if (!config.readListEntry("OnlyShowIn", ';').contains("TDE"))
- continue;
-#endif
- }
- if (config.hasKey("NotShowIn"))
- {
-#ifdef WITH_OLD_XDG_STD
- if ((config.readListEntry("NotShowIn", ';').contains("TDE")) || (config.readListEntry("NotShowIn", ';').contains("KDE")))
- continue;
-#else
- if (config.readListEntry("NotShowIn", ';').contains("TDE"))
- continue;
-#endif
- }
-
- AutoStartItem *item = new AutoStartItem;
- item->name = extractName(*it);
- item->service = *it;
- if (config.hasKey("X-TDE-autostart-after"))
- item->startAfter = config.readEntry("X-TDE-autostart-after");
- else
- item->startAfter = config.readEntry("X-TDE-autostart-after");
- if( m_newStartup )
- {
- if (config.hasKey("X-TDE-autostart-phase"))
- item->phase = config.readNumEntry("X-TDE-autostart-phase", 2);
- else
- item->phase = config.readNumEntry("X-TDE-autostart-phase", 2);
- if (item->phase < 0)
- item->phase = 0;
- }
- else
- {
- if (config.hasKey("X-TDE-autostart-phase"))
- item->phase = config.readNumEntry("X-TDE-autostart-phase", 1);
- else
- item->phase = config.readNumEntry("X-TDE-autostart-phase", 1);
- if (item->phase < 1)
- item->phase = 1;
- }
- m_startList->append(item);
- }
-
- // Check for duplicate entries and remove if found
- TQPtrListIterator<AutoStartItem> it1(*m_startList);
- TQPtrListIterator<AutoStartItem> it2(*m_startList);
- AutoStartItem *item1;
- AutoStartItem *item2;
- while ((item1 = it1.current()) != 0) {
- bool dupfound1 = false;
- it2.toFirst();
- while ((item2 = it2.current()) != 0) {
- bool dupfound2 = false;
- if (item2 != item1) {
- if (item1->service == item2->service) {
- m_startList->removeRef(item2);
- dupfound1 = true;
- dupfound2 = true;
- }
- }
- if (!dupfound2) {
- ++it2;
- }
- }
- if (!dupfound1) {
- ++it1;
- }
- }
-}
-
-TQString
-AutoStart::startService()
-{
- if (m_startList->isEmpty())
- return 0;
-
- while(!m_started.isEmpty())
- {
-
- // Check for items that depend on previously started items
- TQString lastItem = m_started[0];
- for(AutoStartItem *item = m_startList->first();
- item; item = m_startList->next())
- {
- if (item->phase == m_phase
- && item->startAfter == lastItem)
- {
- m_started.prepend(item->name);
- TQString service = item->service;
- m_startList->remove();
- return service;
- }
- }
- m_started.remove(m_started.begin());
- }
-
- // Check for items that don't depend on anything
- AutoStartItem *item;
- for(item = m_startList->first();
- item; item = m_startList->next())
- {
- if (item->phase == m_phase
- && item->startAfter.isEmpty())
- {
- m_started.prepend(item->name);
- TQString service = item->service;
- m_startList->remove();
- return service;
- }
- }
-
- // Just start something in this phase
- for(item = m_startList->first();
- item; item = m_startList->next())
- {
- if (item->phase == m_phase)
- {
- m_started.prepend(item->name);
- TQString service = item->service;
- m_startList->remove();
- return service;
- }
- }
-
- return 0;
-}
diff --git a/kinit/autostart.h b/kinit/autostart.h
deleted file mode 100644
index ce2efe2da..000000000
--- a/kinit/autostart.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 2001 Waldo Bastian <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef _AUTOSTART_H_
-#define _AUTOSTART_H_
-
-#include <tqstringlist.h>
-
-class AutoStartList;
-
-class AutoStart
-{
-public:
- AutoStart( bool new_startup );
- ~AutoStart();
-
- void loadAutoStartList();
- TQString startService();
- void setPhase(int phase);
- void setPhaseDone();
- int phase() const { return m_phase; }
- bool phaseDone() const { return m_phasedone; }
-
-private:
- bool m_newStartup;
- AutoStartList *m_startList;
- TQStringList m_started;
- int m_phase;
- bool m_phasedone;
-};
-
-#endif
diff --git a/kinit/configure.in.in b/kinit/configure.in.in
deleted file mode 100644
index 1d14ee592..000000000
--- a/kinit/configure.in.in
+++ /dev/null
@@ -1,59 +0,0 @@
-TDEINIT_USE_XFT=1
-dnl check if Qt is linked against Xft
-KDE_CHECK_LIB(qt-mt,XftInit,[],[TDEINIT_USE_XFT=])
-
-dnl Xft requires freetype to compile
-KDE_FIND_PATH(fontconfig-config, FONTCONFIG_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin], [ KDE_FIND_PATH(pkg-config, PKGCONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin], [AC_MSG_WARN([Could not find neither pkg-config nor fontconfig-config, check http://www.fontconfig.org/ ])
-])
-])
-
-if test -n "$PKGCONFIG"; then
- vers=`$PKGCONFIG fontconfig --modversion 2>/dev/null | sed -e 's/libfontconfig //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'`
- if test -n "$vers" && test "$vers" -ge 1000000
- then
- FONTCONFIG_CFLAGS="`$PKGCONFIG fontconfig --cflags`"
- TDEINIT_FONTCONFIG=1
- fi
-fi
-
-if test -n "$FONTCONFIG_CONFIG"; then
- vers=`$FONTCONFIG_CONFIG --version 2>/dev/null | sed -e 's/libfontconfig //' | awk 'BEGIN { FS = "."; } { printf "%d", ($1 * 1000 + $2) * 1000 + $3;}'`
- if test -n "$vers" && test "$vers" -ge 1000000
- then
- FONTCONFIG_CFLAGS="`$FONTCONFIG_CONFIG --cflags`"
- TDEINIT_FONTCONFIG=1
- fi
-fi
-
-KDE_FIND_PATH(freetype-config, TDEINIT_FREETYPE_CONFIG, [${prefix}/bin ${exec_prefix}/bin /usr/bin /usr/local/bin /opt/local/bin])
-if test -n "$TDEINIT_FREETYPE_CONFIG"; then
- TDEINIT_XFT_INCLUDES="`$TDEINIT_FREETYPE_CONFIG --cflags` $FONTCONFIG_CFLAGS"
- tdeinit_cppflags=$CPPFLAGS
- CPPFLAGS="$CPPFLAGS $TDEINIT_XFT_INCLUDES $FONTCONFIG_CFLAGS"
- KDE_CHECK_HEADER(X11/Xft/Xft.h,[],[TDEINIT_USE_XFT=])
- CPPFLAGS=$tdeinit_cppflags
-else
- TDEINIT_USE_XFT=
-fi
-
-if test -n "$TDEINIT_USE_XFT"; then
- AC_DEFINE(TDEINIT_USE_XFT,1,[Use Xft preinitialization in tdeinit])
-fi
-if test -n "$TDEINIT_FONTCONFIG"; then
- AC_DEFINE(TDEINIT_USE_FONTCONFIG,1,[Use FontConfig in tdeinit])
-fi
-AC_SUBST(TDEINIT_XFT_INCLUDES)
-
-AC_MSG_CHECKING(whether to make tdeinit setuid root in order to protect it from bad Linux OOM-killer)
-tdeinit_setuid=
-case $target_os in
- linux*)
- AC_MSG_RESULT(yes)
- TDEINIT_SETUID=1
- AC_DEFINE(TDEINIT_OOM_PROTECT,1,[Enable prevention against poor Linux OOM-killer])
- ;;
- *) AC_MSG_RESULT(no)
- TDEINIT_SETUID=0
- ;;
-esac
-AC_SUBST(TDEINIT_SETUID)
diff --git a/kinit/kinit.cpp b/kinit/kinit.cpp
deleted file mode 100644
index b635b63e6..000000000
--- a/kinit/kinit.cpp
+++ /dev/null
@@ -1,1913 +0,0 @@
-/*
- * This file is part of the KDE libraries
- * Copyright (c) 1999-2000 Waldo Bastian <[email protected]>
- * (c) 1999 Mario Weilguni <[email protected]>
- * (c) 2001 Lubos Lunak <[email protected]>
- *
- * $Id$
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/wait.h>
-#ifdef HAVE_SYS_SELECT_H
-#include <sys/select.h> // Needed on some systems.
-#endif
-
-#include <errno.h>
-#include <fcntl.h>
-#include <setproctitle.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <locale.h>
-
-#include <tqstring.h>
-#include <tqfile.h>
-#include <tqdatetime.h>
-#include <tqfileinfo.h>
-#include <tqtextstream.h>
-#include <tqregexp.h>
-#include <tqfont.h>
-#include <kinstance.h>
-#include <kstandarddirs.h>
-#include <tdeglobal.h>
-#include <tdeconfig.h>
-#include <klibloader.h>
-#include <tdeapplication.h>
-#include <tdelocale.h>
-
-#ifdef HAVE_SYS_PRCTL_H
-#include <sys/prctl.h>
-#ifndef PR_SET_NAME
-#define PR_SET_NAME 15
-#endif
-#endif
-
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#include <tdestartupinfo.h> // schroder
-#endif
-
-#include <tdeversion.h>
-
-#include "ltdl.h"
-#include "tdelauncher_cmds.h"
-
-//#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#ifdef Q_WS_X11
-//#undef K_WS_QTONLY
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#endif
-
-#ifdef HAVE_DLFCN_H
-# include <dlfcn.h>
-#endif
-
-#ifdef RTLD_GLOBAL
-# define LTDL_GLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LTDL_GLOBAL DL_GLOBAL
-# else
-# define LTDL_GLOBAL 0
-# endif
-#endif
-
-#if defined(TDEINIT_USE_XFT) && defined(TDEINIT_USE_FONTCONFIG)
-#include <X11/Xft/Xft.h>
-extern "C" FcBool XftInitFtLibrary (void);
-#include <fontconfig/fontconfig.h>
-#endif
-
-extern char **environ;
-
-extern int lt_dlopen_flag;
-//#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#ifdef Q_WS_X11
-static int X11fd = -1;
-static Display *X11display = 0;
-static int X11_startup_notify_fd = -1;
-static Display *X11_startup_notify_display = 0;
-#endif
-static const TDEInstance *s_instance = 0;
-#define MAX_SOCK_FILE 255
-static char sock_file[MAX_SOCK_FILE];
-static char sock_file_old[MAX_SOCK_FILE];
-
-//#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#ifdef Q_WS_X11
-#define DISPLAY "DISPLAY"
-#elif defined(Q_WS_QWS)
-#define DISPLAY "QWS_DISPLAY"
-#elif defined(Q_WS_MACX)
-#define DISPLAY "MAC_DISPLAY"
-#elif defined(K_WS_QTONLY)
-#define DISPLAY "QT_DISPLAY"
-#else
-#error Use QT/X11 or QT/Embedded
-#endif
-
-/* Group data */
-static struct {
- int maxname;
- int fd[2];
- int launcher[2]; /* socket pair for launcher communication */
- int deadpipe[2]; /* pipe used to detect dead children */
- int initpipe[2];
- int wrapper; /* socket for wrapper communication */
- int wrapper_old; /* old socket for wrapper communication */
- char result;
- int exit_status;
- pid_t fork;
- pid_t launcher_pid;
- pid_t my_pid;
- int n;
- lt_dlhandle handle;
- lt_ptr sym;
- char **argv;
- int (*func)(int, char *[]);
- int (*launcher_func)(int);
- bool debug_wait;
- int lt_dlopen_flag;
- TQCString errorMsg;
- bool launcher_ok;
- bool suicide;
-} d;
-
-//#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#ifdef Q_WS_X11
-extern "C" {
-int tdeinit_xio_errhandler( Display * );
-int tdeinit_x_errhandler( Display *, XErrorEvent *err );
-}
-#endif
-
-/* These are to link libtdeparts even if 'smart' linker is used */
-#include <tdeparts/plugin.h>
-extern "C" KParts::Plugin* _kinit_init_tdeparts() { return new KParts::Plugin(); }
-/* These are to link libtdeio even if 'smart' linker is used */
-#include <tdeio/authinfo.h>
-extern "C" TDEIO::AuthInfo* _tdeioslave_init_kio() { return new TDEIO::AuthInfo(); }
-
-/*
- * Close fd's which are only useful for the parent process.
- * Restore default signal handlers.
- */
-static void close_fds()
-{
- if (d.deadpipe[0] != -1)
- {
- close(d.deadpipe[0]);
- d.deadpipe[0] = -1;
- }
-
- if (d.deadpipe[1] != -1)
- {
- close(d.deadpipe[1]);
- d.deadpipe[1] = -1;
- }
-
- if (d.initpipe[0] != -1)
- {
- close(d.initpipe[0]);
- d.initpipe[0] = -1;
- }
-
- if (d.initpipe[1] != -1)
- {
- close(d.initpipe[1]);
- d.initpipe[1] = -1;
- }
-
- if (d.launcher_pid)
- {
- close(d.launcher[0]);
- d.launcher_pid = 0;
- }
- if (d.wrapper)
- {
- close(d.wrapper);
- d.wrapper = 0;
- }
- if (d.wrapper_old)
- {
- close(d.wrapper_old);
- d.wrapper_old = 0;
- }
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- if (X11fd >= 0)
- {
- close(X11fd);
- X11fd = -1;
- }
- if (X11_startup_notify_fd >= 0 && X11_startup_notify_fd != X11fd )
- {
- close(X11_startup_notify_fd);
- X11_startup_notify_fd = -1;
- }
-#endif
-
- signal(SIGCHLD, SIG_DFL);
- signal(SIGPIPE, SIG_DFL);
-}
-
-static void exitWithErrorMsg(const TQString &errorMsg)
-{
- fprintf( stderr, "[tdeinit] %s\n", errorMsg.local8Bit().data() );
- TQCString utf8ErrorMsg = errorMsg.utf8();
- d.result = 3; // Error with msg
- write(d.fd[1], &d.result, 1);
- int l = utf8ErrorMsg.length();
- write(d.fd[1], &l, sizeof(int));
- write(d.fd[1], utf8ErrorMsg.data(), l);
- close(d.fd[1]);
- exit(255);
-}
-
-static void setup_tty( const char* tty )
-{
- if( tty == NULL || *tty == '\0' )
- return;
- int fd = open( tty, O_WRONLY );
- if( fd < 0 )
- {
- fprintf(stderr, "[tdeinit] couldn't open() %s: %s\n", tty, strerror (errno) );
- return;
- }
- if( dup2( fd, STDOUT_FILENO ) < 0 )
- {
- fprintf(stderr, "[tdeinit] couldn't dup2() %s: %s\n", tty, strerror (errno) );
- close( fd );
- return;
- }
- if( dup2( fd, STDERR_FILENO ) < 0 )
- {
- fprintf(stderr, "[tdeinit] couldn't dup2() %s: %s\n", tty, strerror (errno) );
- close( fd );
- return;
- }
- close( fd );
-}
-
-// from tdecore/netwm.cpp
-static int get_current_desktop( Display* disp )
-{
- int desktop = 0; // no desktop by default
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11 // Only X11 supports multiple desktops
- Atom net_current_desktop = XInternAtom( disp, "_NET_CURRENT_DESKTOP", False );
- Atom type_ret;
- int format_ret;
- unsigned char *data_ret;
- unsigned long nitems_ret, unused;
- if( XGetWindowProperty( disp, DefaultRootWindow( disp ), net_current_desktop,
- 0l, 1l, False, XA_CARDINAL, &type_ret, &format_ret, &nitems_ret, &unused, &data_ret )
- == Success)
- {
- if (type_ret == XA_CARDINAL && format_ret == 32 && nitems_ret == 1)
- desktop = *((long *) data_ret) + 1;
- if (data_ret)
- XFree ((char*) data_ret);
- }
-#endif
- return desktop;
-}
-
-// var has to be e.g. "DISPLAY=", i.e. with =
-const char* get_env_var( const char* var, int envc, const char* envs )
-{
- if( envc > 0 )
- { // get the var from envs
- const char* env_l = envs;
- int ln = strlen( var );
- for (int i = 0; i < envc; i++)
- {
- if( strncmp( env_l, var, ln ) == 0 )
- return env_l + ln;
- while(*env_l != 0) env_l++;
- env_l++;
- }
- }
- return NULL;
-}
-
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11 // FIXME(E): Implement for Qt/Embedded
-static void init_startup_info( TDEStartupInfoId& id, const char* bin,
- int envc, const char* envs )
-{
- const char* dpy = get_env_var( DISPLAY"=", envc, envs );
- // this may be called in a child, so it can't use display open using X11display
- // also needed for multihead
- X11_startup_notify_display = XOpenDisplay( dpy );
- if( X11_startup_notify_display == NULL )
- return;
- X11_startup_notify_fd = XConnectionNumber( X11_startup_notify_display );
- TDEStartupInfoData data;
- int desktop = get_current_desktop( X11_startup_notify_display );
- data.setDesktop( desktop );
- data.setBin( bin );
- TDEStartupInfo::sendChangeX( X11_startup_notify_display, id, data );
- XFlush( X11_startup_notify_display );
-}
-
-static void complete_startup_info( TDEStartupInfoId& id, pid_t pid )
-{
- if( X11_startup_notify_display == NULL )
- return;
- if( pid == 0 ) // failure
- TDEStartupInfo::sendFinishX( X11_startup_notify_display, id );
- else
- {
- TDEStartupInfoData data;
- data.addPid( pid );
- data.setHostname();
- TDEStartupInfo::sendChangeX( X11_startup_notify_display, id, data );
- }
- XCloseDisplay( X11_startup_notify_display );
- X11_startup_notify_display = NULL;
- X11_startup_notify_fd = -1;
-}
-#endif
-
-TQCString execpath_avoid_loops( const TQCString& exec, int envc, const char* envs, bool avoid_loops )
-{
- TQStringList paths;
- if( envc > 0 ) /* use the passed environment */
- {
- const char* path = get_env_var( "PATH=", envc, envs );
- if( path != NULL )
- paths = TQStringList::split( TQRegExp( "[:\b]" ), path, true );
- }
- else
- paths = TQStringList::split( TQRegExp( "[:\b]" ), getenv( "PATH" ), true );
- TQCString execpath = TQFile::encodeName(
- s_instance->dirs()->findExe( exec, paths.join( TQString( ":" ))));
- if( avoid_loops && !execpath.isEmpty())
- {
- int pos = execpath.findRev( '/' );
- TQString bin_path = execpath.left( pos );
- for( TQStringList::Iterator it = paths.begin();
- it != paths.end();
- ++it )
- if( ( *it ) == bin_path || ( *it ) == bin_path + '/' )
- {
- paths.remove( it );
- break; // -->
- }
- execpath = TQFile::encodeName(
- s_instance->dirs()->findExe( exec, paths.join( TQString( ":" ))));
- }
- return execpath;
-}
-
-#ifdef TDEINIT_OOM_PROTECT
-static int oom_pipe = -1;
-
-static void oom_protect_sighandler( int ) {
-}
-
-static void reset_oom_protect() {
- if( oom_pipe <= 0 )
- return;
- struct sigaction act, oldact;
- act.sa_handler = oom_protect_sighandler;
- act.sa_flags = 0;
- sigemptyset( &act.sa_mask );
- sigaction( SIGUSR1, &act, &oldact );
- sigset_t sigs, oldsigs;
- sigemptyset( &sigs );
- sigaddset( &sigs, SIGUSR1 );
- sigprocmask( SIG_BLOCK, &sigs, &oldsigs );
- pid_t pid = getpid();
- if( write( oom_pipe, &pid, sizeof( pid_t )) > 0 ) {
- sigsuspend( &oldsigs ); // wait for the signal to come
- }
- sigprocmask( SIG_SETMASK, &oldsigs, NULL );
- sigaction( SIGUSR1, &oldact, NULL );
- close( oom_pipe );
- oom_pipe = -1;
-}
-#else
-static void reset_oom_protect() {
-}
-#endif
-
-static pid_t launch(int argc, const char *_name, const char *args,
- const char *cwd=0, int envc=0, const char *envs=0,
- bool reset_env = false,
- const char *tty=0, bool avoid_loops = false,
- const char* startup_id_str = "0" )
-{
- int launcher = 0;
- TQCString lib;
- TQCString name;
- TQCString exec;
-
- if (strcmp(_name, "tdelauncher") == 0) {
- /* tdelauncher is launched in a special way:
- * It has a communication socket on LAUNCHER_FD
- */
- if (0 > socketpair(AF_UNIX, SOCK_STREAM, 0, d.launcher))
- {
- perror("[tdeinit] socketpair() failed!\n");
- exit(255);
- }
- launcher = 1;
- }
-
- TQCString libpath;
- TQCString execpath;
- if (_name[0] != '/')
- {
- /* Relative name without '.la' */
- name = _name;
- lib = name + ".la";
- exec = name;
- libpath = TQFile::encodeName(KLibLoader::findLibrary( lib, s_instance ));
- execpath = execpath_avoid_loops( exec, envc, envs, avoid_loops );
- }
- else
- {
- lib = _name;
- name = _name;
- name = name.mid( name.findRev('/') + 1);
- exec = _name;
- if (lib.right(3) == ".la")
- libpath = lib;
- else
- execpath = exec;
- }
- if (!args)
- {
- argc = 1;
- }
-
- if (0 > pipe(d.fd))
- {
- perror("[tdeinit] pipe() failed!\n");
- d.result = 3;
- d.errorMsg = i18n("Unable to start new process.\n"
- "The system may have reached the maximum number of open files possible or the maximum number of open files that you are allowed to use has been reached.").utf8();
- close(d.fd[0]);
- close(d.fd[1]);
- d.fork = 0;
- return d.fork;
- }
-
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- TDEStartupInfoId startup_id;
- startup_id.initId( startup_id_str );
- if( !startup_id.none())
- init_startup_info( startup_id, name, envc, envs );
-#endif
-
- d.errorMsg = 0;
- d.fork = fork();
- switch(d.fork) {
- case -1:
- perror("[tdeinit] fork() failed!\n");
- d.result = 3;
- d.errorMsg = i18n("Unable to create new process.\n"
- "The system may have reached the maximum number of processes possible or the maximum number of processes that you are allowed to use has been reached.").utf8();
- close(d.fd[0]);
- close(d.fd[1]);
- d.fork = 0;
- break;
- case 0:
- /** Child **/
- close(d.fd[0]);
- close_fds();
- if (launcher)
- {
- if (d.fd[1] == LAUNCHER_FD)
- {
- d.fd[1] = dup(d.fd[1]); // Evacuate from LAUNCHER_FD
- }
- if (d.launcher[1] != LAUNCHER_FD)
- {
- dup2( d.launcher[1], LAUNCHER_FD); // Make sure the socket has fd LAUNCHER_FD
- close( d.launcher[1] );
- }
- close( d.launcher[0] );
- }
- reset_oom_protect();
-
- if (cwd && *cwd)
- chdir(cwd);
-
- if( reset_env ) // KWRAPPER/SHELL
- {
-
- TQStrList unset_envs;
- for( int tmp_env_count = 0;
- environ[tmp_env_count];
- tmp_env_count++)
- unset_envs.append( environ[ tmp_env_count ] );
- for( TQStrListIterator it( unset_envs );
- it.current() != NULL ;
- ++it )
- {
- TQCString tmp( it.current());
- int pos = tmp.find( '=' );
- if( pos >= 0 )
- unsetenv( tmp.left( pos ));
- }
- }
-
- for (int i = 0; i < envc; i++)
- {
- putenv((char *)envs);
- while(*envs != 0) envs++;
- envs++;
- }
-
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- if( startup_id.none())
- TDEStartupInfo::resetStartupEnv();
- else
- startup_id.setupStartupEnv();
-#endif
- {
- int r;
- TQCString procTitle;
- d.argv = (char **) malloc(sizeof(char *) * (argc+1));
- d.argv[0] = (char *) _name;
- for (int i = 1; i < argc; i++)
- {
- d.argv[i] = (char *) args;
- procTitle += " ";
- procTitle += (char *) args;
- while(*args != 0) args++;
- args++;
- }
- d.argv[argc] = 0;
-
- /** Give the process a new name **/
-#ifdef HAVE_SYS_PRCTL_H
- /* set the process name, so that killall works like intended */
- r = prctl(PR_SET_NAME, (unsigned long) name.data(), 0, 0, 0);
- if ( r == 0 )
- tdeinit_setproctitle( "%s [tdeinit]%s", name.data(), procTitle.data() ? procTitle.data() : "" );
- else
- tdeinit_setproctitle( "[tdeinit] %s%s", name.data(), procTitle.data() ? procTitle.data() : "" );
-#else
- tdeinit_setproctitle( "[tdeinit] %s%s", name.data(), procTitle.data() ? procTitle.data() : "" );
-#endif
- }
-
- d.handle = 0;
- if (libpath.isEmpty() && execpath.isEmpty())
- {
- TQString errorMsg = i18n("Could not find '%1' executable.").arg(TQFile::decodeName(_name));
- exitWithErrorMsg(errorMsg);
- }
-
- if ( getenv("TDE_IS_PRELINKED") && !execpath.isEmpty() && !launcher)
- libpath.truncate(0);
-
- if ( !libpath.isEmpty() )
- {
- d.handle = lt_dlopen( TQFile::encodeName(libpath) );
- if (!d.handle )
- {
- const char * ltdlError = lt_dlerror();
- if (execpath.isEmpty())
- {
- // Error
- TQString errorMsg = i18n("Could not open library '%1'.\n%2").arg(TQFile::decodeName(libpath))
- .arg(ltdlError ? TQFile::decodeName(ltdlError) : i18n("Unknown error"));
- exitWithErrorMsg(errorMsg);
- }
- else
- {
- // Print warning
- fprintf(stderr, "Could not open library %s: %s\n", lib.data(), ltdlError != 0 ? ltdlError : "(null)" );
- }
- }
- }
- lt_dlopen_flag = d.lt_dlopen_flag;
- if (!d.handle )
- {
- d.result = 2; // Try execing
- write(d.fd[1], &d.result, 1);
-
- // We set the close on exec flag.
- // Closing of d.fd[1] indicates that the execvp succeeded!
- fcntl(d.fd[1], F_SETFD, FD_CLOEXEC);
-
- setup_tty( tty );
-
- execvp(execpath.data(), d.argv);
- d.result = 1; // Error
- write(d.fd[1], &d.result, 1);
- close(d.fd[1]);
- exit(255);
- }
-
- d.sym = lt_dlsym( d.handle, "tdeinitmain");
- if (!d.sym )
- {
- d.sym = lt_dlsym( d.handle, "kdemain" );
- if ( !d.sym )
- {
-#if ! KDE_IS_VERSION( 3, 90, 0 )
- d.sym = lt_dlsym( d.handle, "main");
-#endif
- if (!d.sym )
- {
- const char * ltdlError = lt_dlerror();
- fprintf(stderr, "Could not find kdemain: %s\n", ltdlError != 0 ? ltdlError : "(null)" );
- TQString errorMsg = i18n("Could not find 'kdemain' in '%1'.\n%2").arg(TQString(libpath))
- .arg(ltdlError ? TQFile::decodeName(ltdlError) : i18n("Unknown error"));
- exitWithErrorMsg(errorMsg);
- }
- }
- }
-
- d.result = 0; // Success
- write(d.fd[1], &d.result, 1);
- close(d.fd[1]);
-
- d.func = (int (*)(int, char *[])) d.sym;
- if (d.debug_wait)
- {
- fprintf(stderr, "[tdeinit] Suspending process\n"
- "[tdeinit] 'gdb tdeinit %d' to debug\n"
- "[tdeinit] 'kill -SIGCONT %d' to continue\n",
- getpid(), getpid());
- kill(getpid(), SIGSTOP);
- }
- else
- {
- setup_tty( tty );
- }
-
- exit( d.func(argc, d.argv)); /* Launch! */
-
- break;
- default:
- /** Parent **/
- close(d.fd[1]);
- if (launcher)
- {
- close(d.launcher[1]);
- d.launcher_pid = d.fork;
- }
- bool exec = false;
- for(;;)
- {
- d.n = read(d.fd[0], &d.result, 1);
- if (d.n == 1)
- {
- if (d.result == 2)
- {
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] %s is executable. Launching with exec.\n", _name );
-#endif
- exec = true;
- continue;
- }
- if (d.result == 3)
- {
- int l = 0;
- d.n = read(d.fd[0], &l, sizeof(int));
- if (d.n == sizeof(int))
- {
- TQCString tmp;
- tmp.resize(l+1);
- d.n = read(d.fd[0], tmp.data(), l);
- tmp[l] = 0;
- if (d.n == l)
- d.errorMsg = tmp;
- }
- }
- // Finished
- break;
- }
- if (d.n == -1)
- {
- if (errno == ECHILD) { // a child died.
- continue;
- }
- if (errno == EINTR || errno == EAGAIN) { // interrupted or more to read
- continue;
- }
- }
- if (exec)
- {
- d.result = 0;
- break;
- }
- if (d.n == 0)
- {
- perror("[tdeinit] Pipe closed unexpectedly");
- d.result = 1; // Error
- break;
- }
- perror("[tdeinit] Error reading from pipe");
- d.result = 1; // Error
- break;
- }
- close(d.fd[0]);
- if (launcher && (d.result == 0))
- {
- // Trader launched successful
- d.launcher_pid = d.fork;
- }
- }
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- if( !startup_id.none())
- {
- if( d.fork && d.result == 0 ) // launched successfully
- complete_startup_info( startup_id, d.fork );
- else // failure, cancel ASN
- complete_startup_info( startup_id, 0 );
- }
-#endif
- return d.fork;
-}
-
-static void sig_child_handler(int)
-{
- /*
- * Write into the pipe of death.
- * This way we are sure that we return from the select()
- *
- * A signal itself causes select to return as well, but
- * this creates a race-condition in case the signal arrives
- * just before we enter the select.
- */
- char c = 0;
- write(d.deadpipe[1], &c, 1);
-}
-
-static void init_signals()
-{
- struct sigaction act;
- long options;
-
- if (pipe(d.deadpipe) != 0)
- {
- perror("[tdeinit] Aborting. Can't create pipe: ");
- exit(255);
- }
-
- options = fcntl(d.deadpipe[0], F_GETFL);
- if (options == -1)
- {
- perror("[tdeinit] Aborting. Can't make pipe non-blocking: ");
- exit(255);
- }
-
- if (fcntl(d.deadpipe[0], F_SETFL, options | O_NONBLOCK) == -1)
- {
- perror("[tdeinit] Aborting. Can't make pipe non-blocking: ");
- exit(255);
- }
-
- /*
- * A SIGCHLD handler is installed which sends a byte into the
- * pipe of death. This is to ensure that a dying child causes
- * an exit from select().
- */
- act.sa_handler=sig_child_handler;
- sigemptyset(&(act.sa_mask));
- sigaddset(&(act.sa_mask), SIGCHLD);
- sigprocmask(SIG_UNBLOCK, &(act.sa_mask), 0L);
- act.sa_flags = SA_NOCLDSTOP;
-
- // CC: take care of SunOS which automatically restarts interrupted system
- // calls (and thus does not have SA_RESTART)
-
-#ifdef SA_RESTART
- act.sa_flags |= SA_RESTART;
-#endif
- sigaction( SIGCHLD, &act, 0L);
-
- act.sa_handler=SIG_IGN;
- sigemptyset(&(act.sa_mask));
- sigaddset(&(act.sa_mask), SIGPIPE);
- sigprocmask(SIG_UNBLOCK, &(act.sa_mask), 0L);
- act.sa_flags = 0;
- sigaction( SIGPIPE, &act, 0L);
-}
-
-static void init_tdeinit_socket()
-{
- struct sockaddr_un sa;
- struct sockaddr_un sa_old;
- kde_socklen_t socklen;
- long options;
- const char *home_dir = getenv("HOME");
- int max_tries = 10;
- if (!home_dir || !home_dir[0])
- {
- fprintf(stderr, "[tdeinit] Aborting. $HOME not set!");
- exit(255);
- }
- chdir(home_dir);
-
- {
- TQCString path = home_dir;
- TQCString readOnly = getenv("TDE_HOME_READONLY");
- if (access(path.data(), R_OK|W_OK))
- {
- if (errno == ENOENT)
- {
- fprintf(stderr, "[tdeinit] Aborting. $HOME directory (%s) does not exist.\n", path.data());
- exit(255);
- }
- else if (readOnly.isEmpty())
- {
- fprintf(stderr, "[tdeinit] Aborting. No write access to $HOME directory (%s).\n", path.data());
- exit(255);
- }
- }
- path = getenv("ICEAUTHORITY");
- if (path.isEmpty())
- {
- path = home_dir;
- path += "/.ICEauthority";
- }
- if (access(path.data(), R_OK|W_OK) && (errno != ENOENT))
- {
- fprintf(stderr, "[tdeinit] Aborting. No write access to '%s'.\n", path.data());
- exit(255);
- }
- }
-
- /** Test if socket file is already present
- * note that access() resolves symlinks, and so we check the actual
- * socket file if it exists
- */
- if (access(sock_file, W_OK) == 0)
- {
- int s;
- struct sockaddr_un server;
-
-// fprintf(stderr, "[tdeinit] Warning, socket_file already exists!\n");
- /*
- * create the socket stream
- */
- s = socket(PF_UNIX, SOCK_STREAM, 0);
- if (s < 0)
- {
- perror("socket() failed: ");
- exit(255);
- }
- server.sun_family = AF_UNIX;
- strcpy(server.sun_path, sock_file);
- socklen = sizeof(server);
-
- if(connect(s, (struct sockaddr *)&server, socklen) == 0)
- {
- fprintf(stderr, "[tdeinit] Shutting down running client.\n");
- tdelauncher_header request_header;
- request_header.cmd = LAUNCHER_TERMINATE_TDEINIT;
- request_header.arg_length = 0;
- write(s, &request_header, sizeof(request_header));
- sleep(1); // Give it some time
- }
- close(s);
- }
-
- /** Delete any stale socket file (and symlink) **/
- unlink(sock_file);
- unlink(sock_file_old);
-
- /** create socket **/
- d.wrapper = socket(PF_UNIX, SOCK_STREAM, 0);
- if (d.wrapper < 0)
- {
- perror("[tdeinit] Aborting. socket() failed: ");
- exit(255);
- }
-
- options = fcntl(d.wrapper, F_GETFL);
- if (options == -1)
- {
- perror("[tdeinit] Aborting. Can't make socket non-blocking: ");
- close(d.wrapper);
- exit(255);
- }
-
- if (fcntl(d.wrapper, F_SETFL, options | O_NONBLOCK) == -1)
- {
- perror("[tdeinit] Aborting. Can't make socket non-blocking: ");
- close(d.wrapper);
- exit(255);
- }
-
- while (1) {
- /** bind it **/
- socklen = sizeof(sa);
- memset(&sa, 0, socklen);
- sa.sun_family = AF_UNIX;
- strcpy(sa.sun_path, sock_file);
- if(bind(d.wrapper, (struct sockaddr *)&sa, socklen) != 0)
- {
- if (max_tries == 0) {
- perror("[tdeinit] Aborting. bind() failed: ");
- fprintf(stderr, "Could not bind to socket '%s'\n", sock_file);
- close(d.wrapper);
- exit(255);
- }
- max_tries--;
- } else
- break;
- }
-
- /** set permissions **/
- if (chmod(sock_file, 0600) != 0)
- {
- perror("[tdeinit] Aborting. Can't set permissions on socket: ");
- fprintf(stderr, "Wrong permissions of socket '%s'\n", sock_file);
- unlink(sock_file);
- close(d.wrapper);
- exit(255);
- }
-
- if(listen(d.wrapper, SOMAXCONN) < 0)
- {
- perror("[tdeinit] Aborting. listen() failed: ");
- unlink(sock_file);
- close(d.wrapper);
- exit(255);
- }
-
- /** create compatibility socket **/
- d.wrapper_old = socket(PF_UNIX, SOCK_STREAM, 0);
- if (d.wrapper_old < 0)
- {
- // perror("[tdeinit] Aborting. socket() failed: ");
- return;
- }
-
- options = fcntl(d.wrapper_old, F_GETFL);
- if (options == -1)
- {
- // perror("[tdeinit] Aborting. Can't make socket non-blocking: ");
- close(d.wrapper_old);
- d.wrapper_old = 0;
- return;
- }
-
- if (fcntl(d.wrapper_old, F_SETFL, options | O_NONBLOCK) == -1)
- {
- // perror("[tdeinit] Aborting. Can't make socket non-blocking: ");
- close(d.wrapper_old);
- d.wrapper_old = 0;
- return;
- }
-
- max_tries = 10;
- while (1) {
- /** bind it **/
- socklen = sizeof(sa_old);
- memset(&sa_old, 0, socklen);
- sa_old.sun_family = AF_UNIX;
- strcpy(sa_old.sun_path, sock_file_old);
- if(bind(d.wrapper_old, (struct sockaddr *)&sa_old, socklen) != 0)
- {
- if (max_tries == 0) {
- // perror("[tdeinit] Aborting. bind() failed: ");
- fprintf(stderr, "Could not bind to socket '%s'\n", sock_file_old);
- close(d.wrapper_old);
- d.wrapper_old = 0;
- return;
- }
- max_tries--;
- } else
- break;
- }
-
- /** set permissions **/
- if (chmod(sock_file_old, 0600) != 0)
- {
- fprintf(stderr, "Wrong permissions of socket '%s'\n", sock_file);
- unlink(sock_file_old);
- close(d.wrapper_old);
- d.wrapper_old = 0;
- return;
- }
-
- if(listen(d.wrapper_old, SOMAXCONN) < 0)
- {
- // perror("[tdeinit] Aborting. listen() failed: ");
- unlink(sock_file_old);
- close(d.wrapper_old);
- d.wrapper_old = 0;
- }
-}
-
-/*
- * Read 'len' bytes from 'sock' into buffer.
- * returns 0 on success, -1 on failure.
- */
-static int read_socket(int sock, char *buffer, int len)
-{
- ssize_t result;
- int bytes_left = len;
- while ( bytes_left > 0)
- {
- result = read(sock, buffer, bytes_left);
- if (result > 0)
- {
- buffer += result;
- bytes_left -= result;
- }
- else if (result == 0)
- return -1;
- else if ((result == -1) && (errno != EINTR) && (errno != EAGAIN))
- return -1;
- }
- return 0;
-}
-
-static void WaitPid( pid_t waitForPid)
-{
- int result;
- while(1)
- {
- result = waitpid(waitForPid, &d.exit_status, 0);
- if ((result == -1) && (errno == ECHILD))
- return;
- }
-}
-
-static void launcher_died()
-{
- if (!d.launcher_ok)
- {
- /* This is bad. */
- fprintf(stderr, "[tdeinit] Communication error with launcher. Exiting!\n");
- ::exit(255);
- return;
- }
-
- // TDELauncher died... restart
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] TDELauncher died unexpectedly.\n");
-#endif
- // Make sure it's really dead.
- if (d.launcher_pid)
- {
- kill(d.launcher_pid, SIGKILL);
- sleep(1); // Give it some time
- }
-
- d.launcher_ok = false;
- d.launcher_pid = 0;
- close(d.launcher[0]);
- d.launcher[0] = -1;
-
- pid_t pid = launch( 1, "tdelauncher", 0 );
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] Relaunching TDELauncher, pid = %ld result = %d\n", (long) pid, d.result);
-#endif
-}
-
-static void handle_launcher_request(int sock = -1)
-{
- bool launcher = false;
- if (sock < 0)
- {
- sock = d.launcher[0];
- launcher = true;
- }
-
- tdelauncher_header request_header;
- char *request_data = 0L;
- int result = read_socket(sock, (char *) &request_header, sizeof(request_header));
- if (result != 0)
- {
- if (launcher)
- launcher_died();
- return;
- }
-
- if ( request_header.arg_length != 0 )
- {
- request_data = (char *) malloc(request_header.arg_length);
-
- result = read_socket(sock, request_data, request_header.arg_length);
- if (result != 0)
- {
- if (launcher)
- launcher_died();
- free(request_data);
- return;
- }
- }
-
- if (request_header.cmd == LAUNCHER_OK)
- {
- d.launcher_ok = true;
- }
- else if (request_header.arg_length &&
- ((request_header.cmd == LAUNCHER_EXEC) ||
- (request_header.cmd == LAUNCHER_EXT_EXEC) ||
- (request_header.cmd == LAUNCHER_SHELL ) ||
- (request_header.cmd == LAUNCHER_KWRAPPER) ||
- (request_header.cmd == LAUNCHER_EXEC_NEW)))
- {
- pid_t pid;
- tdelauncher_header response_header;
- long response_data;
- long l;
- memcpy( &l, request_data, sizeof( long ));
- int argc = l;
- const char *name = request_data + sizeof(long);
- const char *args = name + strlen(name) + 1;
- const char *cwd = 0;
- int envc = 0;
- const char *envs = 0;
- const char *tty = 0;
- int avoid_loops = 0;
- const char *startup_id_str = "0";
-
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] Got %s '%s' from %s.\n",
- (request_header.cmd == LAUNCHER_EXEC ? "EXEC" :
- (request_header.cmd == LAUNCHER_EXT_EXEC ? "EXT_EXEC" :
- (request_header.cmd == LAUNCHER_EXEC_NEW ? "EXEC_NEW" :
- (request_header.cmd == LAUNCHER_SHELL ? "SHELL" : "KWRAPPER" )))),
- name, launcher ? "launcher" : "socket" );
-#endif
-
- const char *arg_n = args;
- for(int i = 1; i < argc; i++)
- {
- arg_n = arg_n + strlen(arg_n) + 1;
- }
-
- if( request_header.cmd == LAUNCHER_SHELL || request_header.cmd == LAUNCHER_KWRAPPER )
- {
- // Shell or kwrapper
- cwd = arg_n; arg_n += strlen(cwd) + 1;
- }
- if( request_header.cmd == LAUNCHER_SHELL || request_header.cmd == LAUNCHER_KWRAPPER
- || request_header.cmd == LAUNCHER_EXT_EXEC || request_header.cmd == LAUNCHER_EXEC_NEW )
- {
- memcpy( &l, arg_n, sizeof( long ));
- envc = l;
- arg_n += sizeof(long);
- envs = arg_n;
- for(int i = 0; i < envc; i++)
- {
- arg_n = arg_n + strlen(arg_n) + 1;
- }
- if( request_header.cmd == LAUNCHER_KWRAPPER )
- {
- tty = arg_n;
- arg_n += strlen( tty ) + 1;
- }
- }
-
- if( request_header.cmd == LAUNCHER_SHELL || request_header.cmd == LAUNCHER_KWRAPPER
- || request_header.cmd == LAUNCHER_EXT_EXEC || request_header.cmd == LAUNCHER_EXEC_NEW )
- {
- memcpy( &l, arg_n, sizeof( long ));
- avoid_loops = l;
- arg_n += sizeof( long );
- }
-
- if( request_header.cmd == LAUNCHER_SHELL || request_header.cmd == LAUNCHER_KWRAPPER
- || request_header.cmd == LAUNCHER_EXT_EXEC )
- {
- startup_id_str = arg_n;
- arg_n += strlen( startup_id_str ) + 1;
- }
-
- if ((request_header.arg_length > (arg_n - request_data)) &&
- (request_header.cmd == LAUNCHER_EXT_EXEC || request_header.cmd == LAUNCHER_EXEC_NEW ))
- {
- // Optional cwd
- cwd = arg_n; arg_n += strlen(cwd) + 1;
- }
-
- if ((arg_n - request_data) != request_header.arg_length)
- {
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] EXEC request has invalid format.\n");
-#endif
- free(request_data);
- d.debug_wait = false;
- return;
- }
-
- // support for the old a bit broken way of setting DISPLAY for multihead
- TQCString olddisplay = getenv(DISPLAY);
- TQCString kdedisplay = getenv("TDE_DISPLAY");
- bool reset_display = (! olddisplay.isEmpty() &&
- ! kdedisplay.isEmpty() &&
- olddisplay != kdedisplay);
-
- if (reset_display)
- setenv(DISPLAY, kdedisplay, true);
-
- pid = launch( argc, name, args, cwd, envc, envs,
- request_header.cmd == LAUNCHER_SHELL || request_header.cmd == LAUNCHER_KWRAPPER,
- tty, avoid_loops, startup_id_str );
-
- if (reset_display) {
- unsetenv("TDE_DISPLAY");
- setenv(DISPLAY, olddisplay, true);
- }
-
- if (pid && (d.result == 0))
- {
- response_header.cmd = LAUNCHER_OK;
- response_header.arg_length = sizeof(response_data);
- response_data = pid;
- write(sock, &response_header, sizeof(response_header));
- write(sock, &response_data, response_header.arg_length);
- }
- else
- {
- int l = d.errorMsg.length();
- if (l) l++; // Include trailing null.
- response_header.cmd = LAUNCHER_ERROR;
- response_header.arg_length = l;
- write(sock, &response_header, sizeof(response_header));
- if (l)
- write(sock, d.errorMsg.data(), l);
- }
- d.debug_wait = false;
- }
- else if (request_header.arg_length && request_header.cmd == LAUNCHER_SETENV)
- {
- const char *env_name;
- const char *env_value;
- env_name = request_data;
- env_value = env_name + strlen(env_name) + 1;
-
-#ifndef NDEBUG
- if (launcher)
- fprintf(stderr, "[tdeinit] Got SETENV '%s=%s' from tdelauncher.\n", env_name, env_value);
- else
- fprintf(stderr, "[tdeinit] Got SETENV '%s=%s' from socket.\n", env_name, env_value);
-#endif
-
- if ( request_header.arg_length !=
- (int) (strlen(env_name) + strlen(env_value) + 2))
- {
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] SETENV request has invalid format.\n");
-#endif
- free(request_data);
- return;
- }
- setenv( env_name, env_value, 1);
- }
- else if (request_header.cmd == LAUNCHER_TERMINATE_KDE)
- {
-#ifndef NDEBUG
- fprintf(stderr,"[tdeinit] Terminating Trinity.\n");
-#endif
-#ifdef Q_WS_X11
- tdeinit_xio_errhandler( 0L );
-#endif
- }
- else if (request_header.cmd == LAUNCHER_TERMINATE_TDEINIT)
- {
-#ifndef NDEBUG
- fprintf(stderr,"[tdeinit] Killing tdeinit/tdelauncher.\n");
-#endif
- if (d.launcher_pid)
- kill(d.launcher_pid, SIGTERM);
- if (d.my_pid)
- kill(d.my_pid, SIGTERM);
- }
- else if (request_header.cmd == LAUNCHER_DEBUG_WAIT)
- {
-#ifndef NDEBUG
- fprintf(stderr,"[tdeinit] Debug wait activated.\n");
-#endif
- d.debug_wait = true;
- }
- if (request_data)
- free(request_data);
-}
-
-static void handle_requests(pid_t waitForPid)
-{
- int max_sock = d.wrapper;
- if (d.wrapper_old > max_sock)
- max_sock = d.wrapper_old;
- if (d.launcher_pid && (d.launcher[0] > max_sock))
- max_sock = d.launcher[0];
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef _WS_X11
- if (X11fd > max_sock)
- max_sock = X11fd;
-#endif
- max_sock++;
-
- while(1)
- {
- fd_set rd_set;
- fd_set wr_set;
- fd_set e_set;
- int result;
- pid_t exit_pid;
- char c;
-
- /* Flush the pipe of death */
- while( read(d.deadpipe[0], &c, 1) == 1);
-
- /* Handle dying children */
- do {
- exit_pid = waitpid(-1, 0, WNOHANG);
- if (exit_pid > 0)
- {
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] PID %ld terminated.\n", (long) exit_pid);
-#endif
- if (waitForPid && (exit_pid == waitForPid))
- return;
-
- if (d.launcher_pid)
- {
- // TODO send process died message
- tdelauncher_header request_header;
- long request_data[2];
- request_header.cmd = LAUNCHER_DIED;
- request_header.arg_length = sizeof(long) * 2;
- request_data[0] = exit_pid;
- request_data[1] = 0; /* not implemented yet */
- write(d.launcher[0], &request_header, sizeof(request_header));
- write(d.launcher[0], request_data, request_header.arg_length);
- }
- }
- }
- while( exit_pid > 0);
-
- FD_ZERO(&rd_set);
- FD_ZERO(&wr_set);
- FD_ZERO(&e_set);
-
- if (d.launcher_pid)
- {
- FD_SET(d.launcher[0], &rd_set);
- }
- FD_SET(d.wrapper, &rd_set);
- if (d.wrapper_old)
- {
- FD_SET(d.wrapper_old, &rd_set);
- }
- FD_SET(d.deadpipe[0], &rd_set);
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- if(X11fd >= 0) FD_SET(X11fd, &rd_set);
-#endif
-
- result = select(max_sock, &rd_set, &wr_set, &e_set, 0);
-
- /* Handle wrapper request */
- if ((result > 0) && (FD_ISSET(d.wrapper, &rd_set)))
- {
- struct sockaddr_un client;
- kde_socklen_t sClient = sizeof(client);
- int sock = accept(d.wrapper, (struct sockaddr *)&client, &sClient);
- if (sock >= 0)
- {
-#if defined(TDEINIT_USE_XFT) && defined(TDEINIT_USE_FONTCONFIG)
- if( FcGetVersion() < 20390 && !FcConfigUptoDate(NULL))
- FcInitReinitialize();
-#endif
- if (fork() == 0)
- {
- close_fds();
- reset_oom_protect();
- handle_launcher_request(sock);
- exit(255); /* Terminate process. */
- }
- close(sock);
- }
- }
- if ((result > 0) && (FD_ISSET(d.wrapper_old, &rd_set)))
- {
- struct sockaddr_un client;
- kde_socklen_t sClient = sizeof(client);
- int sock = accept(d.wrapper_old, (struct sockaddr *)&client, &sClient);
- if (sock >= 0)
- {
-#if defined(TDEINIT_USE_XFT) && defined(TDEINIT_USE_FONTCONFIG)
- if( FcGetVersion() < 20390 && !FcConfigUptoDate(NULL))
- FcInitReinitialize();
-#endif
- if (fork() == 0)
- {
- close_fds();
- reset_oom_protect();
- handle_launcher_request(sock);
- exit(255); /* Terminate process. */
- }
- close(sock);
- }
- }
-
- /* Handle launcher request */
- if ((result > 0) && (d.launcher_pid) && (FD_ISSET(d.launcher[0], &rd_set)))
- {
- handle_launcher_request();
- if (waitForPid == d.launcher_pid)
- return;
- }
-
-//#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#ifdef Q_WS_X11
- /* Look for incoming X11 events */
- if((result > 0) && (X11fd >= 0))
- {
- if(FD_ISSET(X11fd,&rd_set))
- {
- if (X11display != 0) {
- XEvent event_return;
- while (XPending(X11display))
- XNextEvent(X11display, &event_return);
- }
- }
- }
-#endif
- }
-}
-
-static void tdeinit_library_path()
-{
- TQStringList ltdl_library_path =
- TQStringList::split(':', TQFile::decodeName(getenv("LTDL_LIBRARY_PATH")));
- TQStringList ld_library_path =
- TQStringList::split(':', TQFile::decodeName(getenv("LD_LIBRARY_PATH")));
-
- TQCString extra_path;
- TQStringList candidates = s_instance->dirs()->resourceDirs("lib");
- for (TQStringList::ConstIterator it = candidates.begin();
- it != candidates.end();
- it++)
- {
- TQString d = *it;
- if (ltdl_library_path.contains(d))
- continue;
- if (ld_library_path.contains(d))
- continue;
- if (d[d.length()-1] == '/')
- {
- d.truncate(d.length()-1);
- if (ltdl_library_path.contains(d))
- continue;
- if (ld_library_path.contains(d))
- continue;
- }
- if ((d == "/lib") || (d == "/usr/lib"))
- continue;
-
- TQCString dir = TQFile::encodeName(d);
-
- if (access(dir, R_OK))
- continue;
-
- if ( !extra_path.isEmpty())
- extra_path += ":";
- extra_path += dir;
- }
-
- if (lt_dlinit())
- {
- const char * ltdlError = lt_dlerror();
- fprintf(stderr, "can't initialize dynamic loading: %s\n", ltdlError != 0 ? ltdlError : "(null)" );
- }
- if (!extra_path.isEmpty())
- lt_dlsetsearchpath(extra_path.data());
-
- TQCString display = getenv(DISPLAY);
- if (display.isEmpty())
- {
- fprintf(stderr, "[tdeinit] Aborting. $"DISPLAY" is not set.\n");
- exit(255);
- }
- int i;
- if((i = display.findRev('.')) > display.findRev(':') && i >= 0)
- display.truncate(i);
-
- TQCString socketName = TQFile::encodeName(locateLocal("socket", TQString("tdeinit-%1").arg(TQString(display)), s_instance));
- if (socketName.length() >= MAX_SOCK_FILE)
- {
- fprintf(stderr, "[tdeinit] Aborting. Socket name will be too long:\n");
- fprintf(stderr, " '%s'\n", socketName.data());
- exit(255);
- }
- strcpy(sock_file_old, socketName.data());
-
- display.replace(":","_");
- socketName = TQFile::encodeName(locateLocal("socket", TQString("tdeinit_%1").arg(TQString(display)), s_instance));
- if (socketName.length() >= MAX_SOCK_FILE)
- {
- fprintf(stderr, "[tdeinit] Aborting. Socket name will be too long:\n");
- fprintf(stderr, " '%s'\n", socketName.data());
- exit(255);
- }
- strcpy(sock_file, socketName.data());
-}
-
-int tdeinit_xio_errhandler( Display *disp )
-{
- // disp is 0L when KDE shuts down. We don't want those warnings then.
-
- if ( disp )
- tqWarning( "[tdeinit] Fatal IO error: client killed" );
-
- if (sock_file[0])
- {
- /** Delete any stale socket file **/
- unlink(sock_file);
- }
- if (sock_file_old[0])
- {
- /** Delete any stale socket file **/
- unlink(sock_file_old);
- }
-
- // Don't kill our children in suicide mode, they may still be in use
- if (d.suicide)
- {
- if (d.launcher_pid)
- kill(d.launcher_pid, SIGTERM);
- exit( 0 );
- }
-
- if ( disp )
- tqWarning( "[tdeinit] sending SIGHUP to children." );
-
- /* this should remove all children we started */
- signal(SIGHUP, SIG_IGN);
- kill(0, SIGHUP);
-
- sleep(2);
-
- if ( disp )
- tqWarning( "[tdeinit] sending SIGTERM to children." );
-
- /* and if they don't listen to us, this should work */
- signal(SIGTERM, SIG_IGN);
- kill(0, SIGTERM);
-
- if ( disp )
- tqWarning( "[tdeinit] Exit." );
-
- exit( 0 );
- return 0;
-}
-
-#ifdef Q_WS_X11
-int tdeinit_x_errhandler( Display *dpy, XErrorEvent *err )
-{
-#ifndef NDEBUG
- char errstr[256];
- // tdeinit almost doesn't use X, and therefore there shouldn't be any X error
- XGetErrorText( dpy, err->error_code, errstr, 256 );
- fprintf(stderr, "[tdeinit] TDE detected X Error: %s %d\n"
- " Major opcode: %d\n"
- " Minor opcode: %d\n"
- " Resource id: 0x%lx\n",
- errstr, err->error_code, err->request_code, err->minor_code, err->resourceid );
-#else
- Q_UNUSED(dpy);
- Q_UNUSED(err);
-#endif
- return 0;
-}
-#endif
-
-//#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#ifdef Q_WS_X11
-// needs to be done sooner than initXconnection() because of also opening
-// another X connection for startup notification purposes
-static void setupX()
-{
- XInitThreads();
- XSetIOErrorHandler(tdeinit_xio_errhandler);
- XSetErrorHandler(tdeinit_x_errhandler);
-}
-
-// Borrowed from tdebase/kaudio/kaudioserver.cpp
-static int initXconnection()
-{
- X11display = XOpenDisplay(NULL);
- if ( X11display != 0 ) {
- XCreateSimpleWindow(X11display, DefaultRootWindow(X11display), 0,0,1,1, \
- 0,
- BlackPixelOfScreen(DefaultScreenOfDisplay(X11display)),
- BlackPixelOfScreen(DefaultScreenOfDisplay(X11display)) );
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] opened connection to %s\n", DisplayString(X11display));
-#endif
- int fd = XConnectionNumber( X11display );
- int on = 1;
- (void) setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &on, (int) sizeof(on));
- return fd;
- } else
- fprintf(stderr, "[tdeinit] Can't connect to the X Server.\n" \
- "[tdeinit] Might not terminate at end of session.\n");
-
- return -1;
-}
-#endif
-
-#ifdef __KCC
-/* One of my horrible hacks. KCC includes in each "main" function a call
- to _main(), which is provided by the C++ runtime system. It is
- responsible for calling constructors for some static objects. That must
- be done only once, so _main() is guarded against multiple calls.
- For unknown reasons the designers of KAI's libKCC decided it would be
- a good idea to actually abort() when it's called multiple times, instead
- of ignoring further calls. This breaks our mechanism of KLM's, because
- most KLM's have a main() function which is called from us.
- The "solution" is to simply define our own _main(), which ignores multiple
- calls, which is easy, and which does the same work as KAI'c _main(),
- which is difficult. Currently (KAI 4.0f) it only calls __call_ctors(void)
- (a C++ function), but if that changes we need to change our's too.
- (matz) */
-/*
- Those 'unknown reasons' are C++ standard forbidding recursive calls to main()
- or any means that would possibly allow that (e.g. taking address of main()).
- The correct solution is not using main() as entry point for tdeinit modules,
- but only kdemain().
-*/
-extern "C" void _main(void);
-extern "C" void __call_ctors__Fv(void);
-static int main_called = 0;
-void _main(void)
-{
- if (main_called)
- return;
- main_called = 1;
- __call_ctors__Fv ();
-}
-#endif
-
-static void secondary_child_handler(int)
-{
- waitpid(-1, 0, WNOHANG);
-}
-
-int main(int argc, char **argv, char **envp)
-{
- int i;
- pid_t pid;
- int launch_dcop = 1;
- int launch_tdelauncher = 1;
- int launch_kded = 1;
- int keep_running = 1;
- int new_startup = 0;
- d.suicide = false;
-
- /** Save arguments first... **/
- char **safe_argv = (char **) malloc( sizeof(char *) * argc);
- for(i = 0; i < argc; i++)
- {
- safe_argv[i] = strcpy((char*)malloc(strlen(argv[i])+1), argv[i]);
- if (strcmp(safe_argv[i], "--no-dcop") == 0)
- launch_dcop = 0;
- if (strcmp(safe_argv[i], "--no-tdelauncher") == 0)
- launch_tdelauncher = 0;
- if (strcmp(safe_argv[i], "--no-kded") == 0)
- launch_kded = 0;
- if (strcmp(safe_argv[i], "--suicide") == 0)
- d.suicide = true;
- if (strcmp(safe_argv[i], "--exit") == 0)
- keep_running = 0;
- if (strcmp(safe_argv[i], "--new-startup") == 0)
- new_startup = 1;
-#ifdef TDEINIT_OOM_PROTECT
- if (strcmp(safe_argv[i], "--oom-pipe") == 0 && i+1<argc)
- oom_pipe = atol(argv[i+1]);
-#endif
- if (strcmp(safe_argv[i], "--help") == 0)
- {
- printf("Usage: tdeinit [options]\n");
- // printf(" --no-dcop Do not start dcopserver\n");
- // printf(" --no-tdelauncher Do not start tdelauncher\n");
- printf(" --no-kded Do not start kded\n");
- printf(" --suicide Terminate when no TDE applications are left running\n");
- // printf(" --exit Terminate when kded has run\n");
- exit(0);
- }
- }
-
- pipe(d.initpipe);
-
- // Fork here and let parent process exit.
- // Parent process may only exit after all required services have been
- // launched. (dcopserver/tdelauncher and services which start with '+')
- signal( SIGCHLD, secondary_child_handler);
- if (fork() > 0) // Go into background
- {
- close(d.initpipe[1]);
- d.initpipe[1] = -1;
- // wait till init is complete
- char c;
- while( read(d.initpipe[0], &c, 1) < 0);
- // then exit;
- close(d.initpipe[0]);
- d.initpipe[0] = -1;
- return 0;
- }
- close(d.initpipe[0]);
- d.initpipe[0] = -1;
- d.my_pid = getpid();
-
- /** Make process group leader (for shutting down children later) **/
- if(keep_running)
- setsid();
-
- /** Create our instance **/
- s_instance = new TDEInstance("tdeinit");
-
- /** Prepare to change process name **/
- tdeinit_initsetproctitle(argc, argv, envp);
- tdeinit_library_path();
- // Don't make our instance the global instance
- // (do it only after tdeinit_library_path, that one indirectly uses TDEConfig,
- // which seems to be buggy and always use TDEGlobal instead of the maching TDEInstance)
- TDEGlobal::_instance = 0L;
- // don't change envvars before tdeinit_initsetproctitle()
- unsetenv("LD_BIND_NOW");
- unsetenv("DYLD_BIND_AT_LAUNCH");
- TDEApplication::loadedByKdeinit = true;
-
- d.maxname = strlen(argv[0]);
- d.launcher_pid = 0;
- d.wrapper = 0;
- d.wrapper_old = 0;
- d.debug_wait = false;
- d.launcher_ok = false;
- d.lt_dlopen_flag = lt_dlopen_flag;
- lt_dlopen_flag |= LTDL_GLOBAL;
- init_signals();
-#ifdef Q_WS_X11
- setupX();
-#endif
-
- if (keep_running)
- {
- /*
- * Create ~/.trinity/tmp-<hostname>/tdeinit-<display> socket for incoming wrapper
- * requests.
- */
- init_tdeinit_socket();
- }
-
- if (launch_dcop)
- {
- if (d.suicide)
- pid = launch( 3, "dcopserver", "--nosid\0--suicide" );
- else
- pid = launch( 2, "dcopserver", "--nosid" );
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] Launched DCOPServer, pid = %ld result = %d\n", (long) pid, d.result);
-#endif
- WaitPid(pid);
- if (!WIFEXITED(d.exit_status) || (WEXITSTATUS(d.exit_status) != 0))
- {
- fprintf(stderr, "[tdeinit] DCOPServer could not be started, aborting.\n");
- exit(1);
- }
- }
-#ifndef __CYGWIN__
- if (!d.suicide && !getenv("TDE_IS_PRELINKED"))
- {
- TQString konq = locate("lib", "libkonq.la", s_instance);
- if (!konq.isEmpty())
- (void) lt_dlopen(TQFile::encodeName(konq).data());
- }
-#endif
- if (launch_tdelauncher)
- {
- if( new_startup )
- pid = launch( 2, "tdelauncher", "--new-startup" );
- else
- pid = launch( 1, "tdelauncher", 0 );
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] Launched TDELauncher, pid = %ld result = %d\n", (long) pid, d.result);
-#endif
- handle_requests(pid); // Wait for tdelauncher to be ready
- }
-
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- X11fd = initXconnection();
-#endif
-
- {
-#if defined(TDEINIT_USE_XFT) && defined(TDEINIT_USE_FONTCONFIG)
- if( FcGetVersion() < 20390 )
- {
- XftInit(0);
- XftInitFtLibrary();
- }
-#endif
- TQFont::initialize();
- setlocale (LC_ALL, "");
- setlocale (LC_NUMERIC, "C");
-#ifdef Q_WS_X11
- if (XSupportsLocale ())
- {
- // Similar to TQApplication::create_xim()
- // but we need to use our own display
- XOpenIM (X11display, 0, 0, 0);
- }
-#endif
- }
-
- if (launch_kded)
- {
- if( new_startup )
- pid = launch( 2, "kded", "--new-startup" );
- else
- pid = launch( 1, "kded", 0 );
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] Launched KDED, pid = %ld result = %d\n", (long) pid, d.result);
-#endif
- handle_requests(pid);
- }
-
- for(i = 1; i < argc; i++)
- {
- if (safe_argv[i][0] == '+')
- {
- pid = launch( 1, safe_argv[i]+1, 0);
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] Launched '%s', pid = %ld result = %d\n", safe_argv[i]+1, (long) pid, d.result);
-#endif
- handle_requests(pid);
- }
- else if (safe_argv[i][0] == '-'
-#ifdef TDEINIT_OOM_PROTECT
- || isdigit(safe_argv[i][0])
-#endif
- )
- {
- // Ignore
- }
- else
- {
- pid = launch( 1, safe_argv[i], 0 );
-#ifndef NDEBUG
- fprintf(stderr, "[tdeinit] Launched '%s', pid = %ld result = %d\n", safe_argv[i], (long) pid, d.result);
-#endif
- }
- }
-
- /** Free arguments **/
- for(i = 0; i < argc; i++)
- {
- free(safe_argv[i]);
- }
- free (safe_argv);
-
- tdeinit_setproctitle("tdeinit Running...");
-
- if (!keep_running)
- return 0;
-
- char c = 0;
- write(d.initpipe[1], &c, 1); // Kdeinit is started.
- close(d.initpipe[1]);
- d.initpipe[1] = -1;
-
- handle_requests(0);
-
- return 0;
-}
-
diff --git a/kinit/kwrapper.c b/kinit/kwrapper.c
deleted file mode 100644
index 68f27a57a..000000000
--- a/kinit/kwrapper.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 1999 Waldo Bastian <[email protected]>
- (c) 1999 Mario Weilguni <[email protected]>
- (c) 2001 Lubos Lunak <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-/* this should just save me from duplicating the code */
-
-#define WE_ARE_KWRAPPER
-#include "wrapper.c"
diff --git a/kinit/lnusertemp.c b/kinit/lnusertemp.c
deleted file mode 100644
index 171107041..000000000
--- a/kinit/lnusertemp.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 2000 Waldo Bastian <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <pwd.h>
-#ifdef HAVE_LIMITS_H
-#include <limits.h>
-#endif
-
-int check_tmp_dir(const char *tmp_dir);
-int create_link(const char *file, const char *tmp_dir);
-int build_link(const char *tmp_prefix, const char *kde_prefix, int kdehostname);
-
-int check_tmp_dir(const char *tmp_dir)
-{
- int result;
- struct stat stat_buf;
- result = lstat(tmp_dir, &stat_buf);
- if ((result == -1) && (errno == ENOENT))
- {
- result = mkdir(tmp_dir, 0700);
- if (result == -1)
- {
- fprintf(stderr, "[lnusertemp] Error: Can not create directory \"%s\".\n", tmp_dir);
- return 1;
- }
- result = stat(tmp_dir, &stat_buf);
- }
- if ((result == -1) || (!S_ISDIR(stat_buf.st_mode)))
- {
- fprintf(stderr, "[lnusertemp] Error: \"%s\" is not a directory.\n", tmp_dir);
- return 1;
- }
-
- if (stat_buf.st_uid != getuid())
- {
- fprintf(stderr, "[lnusertemp] Error: \"%s\" is owned by uid %d instead of uid %d.\n", tmp_dir, stat_buf.st_uid, getuid());
- return 1;
- }
- return 0;
-}
-
-int create_link(const char *file, const char *tmp_dir)
-{
- int result;
- result = check_tmp_dir(tmp_dir);
- if (result)
- {
- return result;
- }
- result = symlink(tmp_dir, file);
- if (result == -1)
- {
- fprintf(stderr, "[lnusertemp] Error: Can not create link from \"%s\" to \"%s\"\n", file, tmp_dir);
- return 1;
- }
- /*printf("[lnusertemp] Created link from \"%s\" to \"%s\"\n", file, tmp_dir);*/
- return 0;
-}
-
-
-#ifndef PATH_MAX
-#define PATH_MAX 4096
-#endif
-int build_link(const char *tmp_prefix, const char *kde_prefix, int kdehostname)
-{
- struct passwd *pw_ent;
- char kde_tmp_dir[PATH_MAX+1];
- char user_tmp_dir[PATH_MAX+1];
- char tmp_buf[PATH_MAX+1];
- int uid = getuid();
- const char *home_dir = getenv("HOME");
- const char *kde_home = uid ? getenv("TDEHOME") : getenv("TDEROOTHOME");
- int result;
- struct stat stat_buf;
-
- kde_tmp_dir[0] = 0;
-
- pw_ent = getpwuid(uid);
- if (!pw_ent)
- {
- fprintf(stderr, "[lnusertemp] Error: Can not find password entry for uid %d.\n", getuid());
- return 1;
- }
-
- strncpy(user_tmp_dir, tmp_prefix, PATH_MAX);
- user_tmp_dir[ PATH_MAX ] = '\0';
- strncat(user_tmp_dir, pw_ent->pw_name, PATH_MAX - strlen(tmp_prefix));
-
- if (!kde_home || !kde_home[0])
- {
- kde_home = "~/.trinity/";
- }
-
- if (kde_home[0] == '~')
- {
- if (uid == 0)
- {
- home_dir = pw_ent->pw_dir ? pw_ent->pw_dir : "/root";
- }
- if (!home_dir || !home_dir[0])
- {
- fprintf(stderr, "[lnusertemp] Aborting. $HOME not set!\n");
- return 1;
- }
- if (strlen(home_dir) > (PATH_MAX-100))
- {
- fprintf(stderr, "[lnusertemp] Aborting. Home directory path too long!\n");
- return 1;
- }
- kde_home++;
- strncpy(kde_tmp_dir, home_dir, PATH_MAX);
- kde_tmp_dir[ PATH_MAX ] = '\0';
- }
- strncat(kde_tmp_dir, kde_home, PATH_MAX - strlen(kde_tmp_dir));
-
- /** Strip trailing '/' **/
- if ( kde_tmp_dir[strlen(kde_tmp_dir)-1] == '/')
- kde_tmp_dir[strlen(kde_tmp_dir)-1] = 0;
-
- result = stat(kde_tmp_dir, &stat_buf);
- if ((result == -1) && (errno == ENOENT))
- {
- result = mkdir(kde_tmp_dir, 0700);
- }
- if (result == -1)
- {
- perror("[lnusertemp] mkdir failed: ");
- return 1;
- }
-
- strncat(kde_tmp_dir, kde_prefix, PATH_MAX - strlen(kde_tmp_dir));
-
- if( kdehostname )
- {
- if( getenv("XAUTHLOCALHOSTNAME"))
- strncat(kde_tmp_dir+strlen(kde_tmp_dir), getenv("XAUTHLOCALHOSTNAME"), PATH_MAX - strlen(kde_tmp_dir) - 1);
- else
- return 0;
- }
- else
- {
- if (gethostname(kde_tmp_dir+strlen(kde_tmp_dir), PATH_MAX - strlen(kde_tmp_dir) - 1) != 0)
- {
- perror("[lnusertemp] Could not determine hostname: ");
- return 1;
- }
- }
- kde_tmp_dir[sizeof(kde_tmp_dir)-1] = '\0';
-
- result = lstat(kde_tmp_dir, &stat_buf);
- if ((result == 0) && (S_ISDIR(stat_buf.st_mode)))
- {
- /* $TDEHOME/tmp is a normal directory. Do nothing. */
- /*printf("[lnusertemp] Directory \"%s\" already exists.\n", kde_tmp_dir);*/
- return 0;
- }
- if ((result == -1) && (errno == ENOENT))
- {
- /*printf("[lnusertemp] Creating link %s.\n", kde_tmp_dir);*/
- result = create_link(kde_tmp_dir, user_tmp_dir);
- if (result == 0) return 0; /* Success */
- unlink(kde_tmp_dir);
- strncat(user_tmp_dir, "XXXXXX", PATH_MAX - strlen(user_tmp_dir));
- mktemp(user_tmp_dir); /* We want a directory, not a file, so using mkstemp makes no sense and is wrong */
- return create_link(kde_tmp_dir, user_tmp_dir);
- }
- if ((result == -1) || (!S_ISLNK(stat_buf.st_mode)))
- {
- fprintf(stderr, "[lnusertemp] Error: \"%s\" is not a link or a directory.\n", kde_tmp_dir);
- return 1;
- }
- /* kde_tmp_dir is a link. Check whether it points to a valid directory. */
- result = readlink(kde_tmp_dir, tmp_buf, PATH_MAX);
- if (result == -1)
- {
- fprintf(stderr, "[lnusertemp] Error: \"%s\" could not be read.\n", kde_tmp_dir);
- return 1;
- }
- tmp_buf[result] = '\0';
- /*printf("[lnusertemp] Link \"%s\" points to \"%s\"\n", kde_tmp_dir, tmp_buf);*/
- if (strncmp(tmp_buf, user_tmp_dir, strlen(user_tmp_dir)) != 0)
- {
- fprintf(stderr, "[lnusertemp] Error: \"%s\" points to \"%s\" instead of \"%s\".\n", kde_tmp_dir, tmp_buf, user_tmp_dir);
- unlink(kde_tmp_dir);
- /*printf("[lnusertemp] Creating link %s.\n", kde_tmp_dir);*/
- result = create_link(kde_tmp_dir, user_tmp_dir);
- if (result == 0) return 0; /* Success */
- unlink(kde_tmp_dir);
- strncat(user_tmp_dir, "XXXXXX", PATH_MAX - strlen(user_tmp_dir));
- mktemp(user_tmp_dir); /* We want a directory, not a file, so using mkstemp makes no sense and is wrong */
- return create_link(kde_tmp_dir, user_tmp_dir);
- }
- result = check_tmp_dir(tmp_buf);
- if (result == 0) return 0; /* Success */
- unlink(kde_tmp_dir);
- strncat(user_tmp_dir, "XXXXXX", PATH_MAX - strlen(user_tmp_dir));
- mktemp(user_tmp_dir); /* We want a directory, not a file, so using mkstemp makes no sense and is wrong */
- return create_link(kde_tmp_dir, user_tmp_dir);
-}
-
-int main(int argc, char **argv)
-{
- const char *tmp = 0;
- char *tmp_prefix = 0;
- const char *kde_prefix = 0;
- int res = 0;
-
- if ((argc != 2) ||
- ((strcmp(argv[1], "tmp")!=0) &&
- (strcmp(argv[1], "socket")!=0) &&
- (strcmp(argv[1], "cache")!=0)))
- {
- fprintf(stderr, "[lnusertemp] Usage: lnusertemp tmp|socket|cache\n");
- return 1;
- }
-
- tmp = getenv("TDETMP");
- if (!tmp || !tmp[0])
- tmp = getenv("TMPDIR");
- if (!tmp || !tmp[0])
- tmp = getenv("TEMP");
- if (!tmp || !tmp[0])
- tmp = getenv("TMP");
- if (!tmp || !tmp[0])
- tmp = "/tmp";
-
- if (strcmp(argv[1], "tmp") == 0)
- {
- tmp_prefix = (char *)malloc(strlen(tmp)+strlen("/tde-")+1);
- strcpy(tmp_prefix, tmp);
- strcat(tmp_prefix, "/tde-");
-
- kde_prefix = "/tmp-";
- }
- else if (strcmp(argv[1], "socket") == 0)
- {
- tmp_prefix = (char *)malloc(strlen(tmp)+strlen("/tdesocket-")+1);
- strcpy(tmp_prefix, tmp );
- strcat(tmp_prefix, "/tdesocket-" );
-
- kde_prefix = "/socket-";
- }
- else if (strcmp(argv[1], "cache") == 0)
- {
- tmp = getenv("TDEVARTMP");
- if (!tmp || !tmp[0])
- tmp = "/var/tmp";
-
- tmp_prefix = (char *)malloc(strlen(tmp)+strlen("/tdecache-")+1);
- strcpy(tmp_prefix, tmp );
- strcat(tmp_prefix, "/tdecache-" );
-
- kde_prefix = "/cache-";
- }
-
- res = build_link(tmp_prefix, kde_prefix, 1);
- if( build_link(tmp_prefix, kde_prefix, 0))
- res = 1;
-
- free(tmp_prefix);
-
- return res;
-}
diff --git a/kinit/setproctitle.cpp b/kinit/setproctitle.cpp
deleted file mode 100644
index e6c85561c..000000000
--- a/kinit/setproctitle.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (c) 1998 Sendmail, Inc. All rights reserved.
- * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * By using this file, you agree to the terms and conditions set
- * forth in the LICENSE file which can be found at the top level of
- * the sendmail distribution.
- *
- * A copy of the above mentioned LICENSE file can be found in
- * LICENSE.setproctitle.
- *
- * Ported for use with KDE by Waldo Bastian <[email protected]>
- */
-
-#include "setproctitle.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-/* _GNU_SOURCE might already be defined in <config.h> */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE
-#endif
-#include <stdio.h>
-#include <stdarg.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-/* _PATH_KMEM should be defined in <paths.h> */
-#ifndef _PATH_KMEM
-# define _PATH_KMEM "/dev/kmem"
-#endif
-
-#define SPACELEFT(buf, ptr) (sizeof buf - ((ptr) - buf))
-
-
-/*
-** SETPROCTITLE -- set process title for ps
-**
-** Parameters:
-** fmt -- a printf style format string.
-** a, b, c -- possible parameters to fmt.
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** Clobbers argv of our main procedure so ps(1) will
-** display the title.
-*/
-
-#define SPT_NONE 0 /* don't use it at all */
-#define SPT_REUSEARGV 1 /* cover argv with title information */
-#define SPT_BUILTIN 2 /* use libc builtin */
-#define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */
-#define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */
-#define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */
-#define SPT_SCO 6 /* write kernel u. area */
-#define SPT_CHANGEARGV 7 /* write our own strings into argv[] */
-
-#ifndef SPT_TYPE
-# define SPT_TYPE SPT_REUSEARGV
-#endif
-
-#if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN
-
-# if SPT_TYPE == SPT_PSTAT
-# include <sys/pstat.h>
-# endif
-# if SPT_TYPE == SPT_PSSTRINGS
-# include <machine/vmparam.h>
-# ifdef HAVE_SYS_EXEC_H
-# include <sys/exec.h>
-# endif
-# ifndef PS_STRINGS /* hmmmm.... apparently not available after all */
-# undef SPT_TYPE
-# define SPT_TYPE SPT_REUSEARGV
-# else
-# ifndef NKPDE /* FreeBSD 2.0 */
-# define NKPDE 63
-typedef unsigned int *pt_entry_t;
-# endif
-# endif
-# endif
-
-# if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV
-# define SETPROC_STATIC static
-# else
-# define SETPROC_STATIC
-# endif
-
-# if SPT_TYPE == SPT_SYSMIPS
-# include <sys/sysmips.h>
-# include <sys/sysnews.h>
-# endif
-
-# if SPT_TYPE == SPT_SCO
-# include <sys/immu.h>
-# include <sys/dir.h>
-# include <sys/user.h>
-# include <sys/fs/s5param.h>
-# if PSARGSZ > MAXLINE
-# define SPT_BUFSIZE PSARGSZ
-# endif
-# endif
-
-# ifndef SPT_PADCHAR
-# ifdef _AIX
-# define SPT_PADCHAR '\0'
-# else
-# define SPT_PADCHAR ' '
-# endif
-# endif
-
-#endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */
-
-# ifndef SPT_BUFSIZE
-# define SPT_BUFSIZE 2048
-# endif
-
-/*
-** Pointers for setproctitle.
-** This allows "ps" listings to give more useful information.
-*/
-
-char **Argv = NULL; /* pointer to argument vector */
-char *LastArgv = NULL; /* end of argv */
-
-void
-tdeinit_initsetproctitle(int argc, char **argv, char **envp)
-{
- register int i, envpsize = 0;
-#if !defined(HAVE_NSGETENVIRON) || !defined(HAVE_CRT_EXTERNS_H)
- extern char **environ;
-#endif
-
- /*
- ** Move the environment so setproctitle can use the space at
- ** the top of memory.
- */
-
- for (i = 0; envp[i] != NULL; i++)
- envpsize += strlen(envp[i]) + 1;
- environ = (char **) malloc(sizeof (char *) * (i + 1));
- if (environ == NULL)
- return;
-
- for (i = 0; envp[i] != NULL; i++)
- environ[i] = strdup(envp[i]);
- environ[i] = NULL;
-
- /*
- ** Save start and extent of argv for setproctitle.
- */
-
- Argv = argv;
-
- /*
- ** Determine how much space we can use for setproctitle.
- ** Use all contiguous argv and envp pointers starting at argv[0]
- */
- for (i = 0; i < argc; i++)
- {
- if (i==0 || LastArgv + 1 == argv[i])
- LastArgv = argv[i] + strlen(argv[i]);
- else
- continue;
- }
-
- /*
- * On linux, we don't want to reuse the memory allocated for
- * the environment, as there are tools that try to read our environment
- * variables while we're running (ConsoleKit does that).
- * There is no way to move or resize it, so just not touchint it
- * seems to be the only option
- */
-#ifndef __linux__
- for (i=0; envp[i] != NULL; i++)
- {
- if (LastArgv + 1 == envp[i])
- LastArgv = envp[i] + strlen(envp[i]);
- else
- continue;
- }
-#endif
-}
-
-#if SPT_TYPE != SPT_BUILTIN
-
-/*VARARGS1*/
-static void
-setproctitle(const char *fmt, ...)
-{
-# if SPT_TYPE != SPT_NONE
- register char *p;
- register int i;
- SETPROC_STATIC char buf[SPT_BUFSIZE];
- va_list ap;
-# if SPT_TYPE == SPT_PSTAT
- union pstun pst;
-# endif
-# if SPT_TYPE == SPT_SCO
- off_t seek_off;
- static int kmem = -1;
-#warning (rikkus) kmempid is declared as int, should be long
- static int kmempid = -1;
- struct user u;
-# endif
-
- p = buf;
-
- /* print the argument string */
- va_start(ap, fmt);
- (void) vsnprintf(p, SPACELEFT(buf, p), fmt, ap);
- va_end(ap);
-
- i = strlen(buf);
-
-# if SPT_TYPE == SPT_PSTAT
- pst.pst_command = buf;
- pstat(PSTAT_SETCMD, pst, i, 0, 0);
-# endif
-# if SPT_TYPE == SPT_PSSTRINGS
- PS_STRINGS->ps_nargvstr = 1;
- PS_STRINGS->ps_argvstr = buf;
-# endif
-# if SPT_TYPE == SPT_SYSMIPS
- sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf);
-# endif
-# if SPT_TYPE == SPT_SCO
- if (kmem < 0 || kmempid != getpid())
- {
- if (kmem >= 0)
- close(kmem);
- kmem = open(_PATH_KMEM, O_RDWR, 0);
- if (kmem < 0)
- return;
- (void) fcntl(kmem, F_SETFD, 1);
- kmempid = getpid();
- }
- buf[PSARGSZ - 1] = '\0';
- seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u;
- if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off)
- (void) write(kmem, buf, PSARGSZ);
-# endif
-# if SPT_TYPE == SPT_REUSEARGV
- if (i > LastArgv - Argv[0] - 2)
- {
- i = LastArgv - Argv[0] - 2;
- buf[i] = '\0';
- }
- (void) strcpy(Argv[0], buf);
- p = &Argv[0][i];
- while (p < LastArgv)
- *p++ = SPT_PADCHAR;
- Argv[1] = NULL;
-# endif
-# if SPT_TYPE == SPT_CHANGEARGV
- Argv[0] = buf;
- Argv[1] = 0;
-# endif
-# endif /* SPT_TYPE != SPT_NONE */
-}
-
-#endif /* SPT_TYPE != SPT_BUILTIN */
- /*
-** SM_SETPROCTITLE -- set process task and set process title for ps
-**
-** Possibly set process status and call setproctitle() to
-** change the ps display.
-**
-** Parameters:
-** status -- whether or not to store as process status
-** fmt -- a printf style format string.
-** a, b, c -- possible parameters to fmt.
-**
-** Returns:
-** none.
-*/
-
-/*VARARGS2*/
-void
-tdeinit_setproctitle(const char *fmt, ...)
-{
- char buf[SPT_BUFSIZE];
-
- va_list ap;
- /* print the argument string */
- va_start(ap, fmt);
- (void) vsnprintf(buf, SPT_BUFSIZE, fmt, ap);
- va_end(ap);
-
- setproctitle("%s", buf);
-}
-
diff --git a/kinit/setproctitle.h b/kinit/setproctitle.h
deleted file mode 100644
index 7a134e73e..000000000
--- a/kinit/setproctitle.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 1998 Sendmail, Inc. All rights reserved.
- * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
- * Copyright (c) 1988, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * By using this file, you agree to the terms and conditions set
- * forth in the LICENSE file which can be found at the top level of
- * the sendmail distribution.
- *
- * A copy of the above mentioned LICENSE file can be found in
- * LICENSE.setproctitle.
- *
- * Ported for use with KDE by Waldo Bastian <[email protected]>
- */
-
-#ifndef _SETPROCTITLE_H_
-#define _SETPROCTITLE_H_
-
-#ifdef __hpux
-# define SPT_TYPE SPT_PSTAT
-#endif
-
-#ifdef _AIX3
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-#endif
-
-#ifdef _AIX4
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-#endif
-
-#ifdef AIX /* AIX/RT compiler pre-defines this */
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-#endif
-
-#ifdef DGUX_5_4_2
-# define DGUX 1
-#endif
-
-#ifdef DGUX
-# define SPT_TYPE SPT_NONE /* don't use setproctitle */
-#endif
-
-/*
-** Apple Rhapsody
-** Contributed by Wilfredo Sanchez <[email protected]>
-*/
-
-#ifdef __APPLE__
-# define SPT_TYPE SPT_PSSTRINGS
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-#endif
-
-#if defined(BSD4_4) && !defined(__bsdi__) && !defined(__GNU__)
-# define SPT_TYPE SPT_PSSTRINGS /* use PS_STRINGS pointer */
-#endif
-
-#ifdef __bsdi__
-# if defined(_BSDI_VERSION) && _BSDI_VERSION >= 199312
-/* version 1.1 or later */
-# undef SPT_TYPE
-# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */
-# else
-/* version 1.0 or earlier */
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-# endif
-#endif
-
-#if defined(__QNX__)
-# define SPT_TYPE SPT_REUSEARGV
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-#endif
-
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
-# if defined(__NetBSD__) || defined(__DragonFly__)
-# undef SPT_TYPE
-# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */
-# endif
-# if defined(__FreeBSD__)
-# undef SPT_TYPE
-# if __FreeBSD__ >= 2
-# include <osreldate.h>
-# if __FreeBSD_version >= 199512 /* 2.2-current when it appeared */
-# include <sys/types.h>
-# include <libutil.h>
-# define SPT_TYPE SPT_BUILTIN
-# endif
-# endif
-# ifndef SPT_TYPE
-# define SPT_TYPE SPT_REUSEARGV
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-# endif
-# endif
-# if defined(__OpenBSD__)
-# undef SPT_TYPE
-# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */
-# endif
-#endif
-
-#ifdef __GNU_HURD__
-# define SPT_TYPE SPT_CHANGEARGV
-#endif
-
-/* SCO UNIX 3.2v4.2/Open Desktop 3.0 */
-#ifdef _SCO_unix_4_2
-# define _SCO_unix_
-#endif
-
-/* SCO UNIX 3.2v4.0 Open Desktop 2.0 and earlier */
-#ifdef _SCO_unix_
-# define SPT_TYPE SPT_SCO /* write kernel u. area */
-#endif
-
-
-#ifdef __linux__
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-#endif
-
-#ifdef _SEQUENT_
-# define SPT_TYPE SPT_NONE /* don't use setproctitle */
-#endif
-
-#ifdef apollo
-# define SPT_TYPE SPT_NONE /* don't use setproctitle */
-#endif
-
-#ifdef __svr5__
-# define SPT_PADCHAR '\0' /* pad process title with nulls */
-#endif
-
-#ifdef NCR_MP_RAS2
-# define SPT_TYPE SPT_NONE
-#endif
-
-#ifdef NCR_MP_RAS3
-# define SPT_TYPE SPT_NONE
-#endif
-
-#ifdef sony_news
-# ifndef __svr4
-# ifndef SPT_TYPE
-# define SPT_TYPE SPT_SYSMIPS /* use sysmips() (OS 6.0.2 or later) */
-# endif
-# endif
-#endif
-
-
-extern void tdeinit_initsetproctitle(int, char **, char **);
-extern void tdeinit_setproctitle(const char *, ...)
-#ifdef __GNUC__
- __attribute__ (( format ( printf, 1, 2 ) ) )
-#endif
-;
-
-#endif
-
diff --git a/kinit/shell.c b/kinit/shell.c
deleted file mode 100644
index 62bcb3cc7..000000000
--- a/kinit/shell.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 1999 Waldo Bastian <[email protected]>
- (c) 1999 Mario Weilguni <[email protected]>
- (c) 2001 Lubos Lunak <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-/* this should just save me from duplicating the code */
-
-#define WE_ARE_KSHELL
-#include "wrapper.c"
diff --git a/kinit/start_tdeinit.c b/kinit/start_tdeinit.c
deleted file mode 100644
index e46aaa49f..000000000
--- a/kinit/start_tdeinit.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * This file is part of the KDE libraries
- * Copyright (c) 2006 Lubos Lunak <[email protected]>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include <config.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef TDEINIT_OOM_PROTECT
-
-/*
- Prevent getting killed by bad heuristic in Linux OOM-killer.
- This wrapper decreases the chance OOM killer kills it (or its children,
- namely tdeinit), opens a pipe and forks. Child drops privileges
- and launches tdeinit. Since processes started by tdeinit should
- not have this protection, tdeinit will after forking send the new
- PID using the pipe and wait for a signal. This parent will reset the protection
- and SIGUSR1 the process to continue.
- returns 1 if pid is valid
-*/
-
-static int set_protection( pid_t pid, int enable )
-{
- char buf[ 1024 ];
- int procfile;
- struct stat st;
-
- /* Newer kernels (noticed in 2.6.36) */
- sprintf( buf, "/proc/%d/oom_score_adj", pid );
- if ( lstat (buf, &st) == 0) {
- if( !enable ) {
- /* Be paranoid and check that the pid we got from the pipe
- belongs to this user. */
- if( st.st_uid != getuid())
- return 0;
- }
- procfile = open(buf, O_WRONLY);
- if( enable )
- write( procfile, "-300", sizeof( "-300" ));
- else
- write( procfile, "0", sizeof( "0" ));
- close( procfile );
- return 1;
- }
-
- sprintf( buf, "/proc/%d/stat", pid );
- if( !enable ) {
- /* Be paranoid and check that the pid we got from the pipe
- belongs to this user. */
- if( lstat( buf, &st ) < 0 || st.st_uid != getuid())
- return 0;
- }
- sprintf( buf, "/proc/%d/oom_adj", pid );
- procfile = open( buf, O_WRONLY );
- if( procfile >= 0 ) {
- if( enable )
- write( procfile, "-5", sizeof( "-5" ));
- else
- write( procfile, "0", sizeof( "0" ));
- close( procfile );
- }
- return 1;
-}
-
-int main(int argc, char **argv)
-{
- int pipes[ 2 ];
- int new_argc;
- const char** new_argv;
- char helper_num[ 1024 ];
- unsigned i;
- char** orig_environ = NULL;
- char header[ 7 ];
- if( pipe( pipes ) < 0 ) {
- perror( "pipe()" );
- return 1;
- }
- if( argc < 0 || argc > 1000 )
- abort(); /* paranoid */
- set_protection( getpid(), 1 );
- switch( fork()) {
- case -1:
- perror( "fork()" );
- return 1;
- default: /* parent, drop privileges and exec */
- if (setgid(getgid())) {
- perror("setgid()");
- return 1;
- }
- if (setuid(getuid()) || geteuid() != getuid()) {
- perror("setuid()");
- return 1;
- }
- close( pipes[ 0 ] );
- /* read original environment passed by start_tdeinit_wrapper */
- if( read( 0, header, 7 ) == 7 && strncmp( header, "environ", 7 ) == 0 ) {
- unsigned count;
- if( read( 0, &count, sizeof( unsigned )) == sizeof( unsigned )
- && count && count < (1<<16)) {
- char** env = malloc(( count + 1 ) * sizeof( char* ));
- int ok = 1;
- for( i = 0;
- i < count && ok;
- ++i ) {
- unsigned len;
- if( read( 0, &len, sizeof( unsigned )) == sizeof( unsigned )
- && len && len < (1<<12)) {
- env[ i ] = malloc( len + 1 );
- if( (unsigned) read( 0, env[ i ], len ) == len ) {
- env[ i ][ len ] = '\0';
- } else {
- ok = 0;
- }
- }
- }
- if( ok ) {
- env[ i ] = NULL;
- orig_environ = env;
- }
- }
- }
- if(argc == 0)
- return 1;
- new_argc = argc + 2;
- new_argv = malloc( sizeof( char* ) * ( new_argc + 1 ));
- if( new_argv == NULL )
- return 1;
- new_argv[ 0 ] = EXECUTE;
- new_argv[ 1 ] = "--oom-pipe";
- sprintf( helper_num, "%d", pipes[ 1 ] );
- new_argv[ 2 ] = helper_num;
- for( i = 1;
- i <= (unsigned) argc;
- ++i )
- new_argv[ i + 2 ] = argv[ i ];
- if( orig_environ )
- execve(EXECUTE, (char**)new_argv, orig_environ);
- else
- execv(EXECUTE, (char**)new_argv);
- perror(EXECUTE);
- return 1;
- case 0: /* child, keep privileges and do the privileged work */
- close( pipes[ 1 ] );
- for(;;) {
- pid_t pid = 0;
- int ret = read( pipes[ 0 ], &pid, sizeof( pid_t ));
- if( ret < 0 && errno == EINTR )
- continue;
- if( ret <= 0 ) /* pipe closed or error, exit */
- _exit(0);
- if( pid != 0 ) {
- if (set_protection( pid, 0 ))
- kill( pid, SIGUSR1 );
- }
- }
- }
-}
-
-#else /* not Linux, the simple non-setuid case */
-
-int main(int argc, char **argv)
-{
- if(argc == 0)
- return 1;
- argv[0] = (char*)EXECUTE;
- execv(EXECUTE,argv);
- perror(EXECUTE);
- return 1;
-}
-#endif
diff --git a/kinit/start_tdeinit_wrapper.c b/kinit/start_tdeinit_wrapper.c
deleted file mode 100644
index 0328f3e43..000000000
--- a/kinit/start_tdeinit_wrapper.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * This file is part of the KDE libraries
- * Copyright (c) 2007 Lubos Lunak <[email protected]>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef TDEINIT_OOM_PROTECT
-
-/*
- The start_tdeinit wrapper is setuid, which means some shell variables like LD_LIBRARY_PATH
- get unset before it's launched. However tdeinit is used to launch most of KDE, so such variables
- should not be dropped. Therefore this wrapper for the setuid wrapper read the environment
- and writes it to start_tdeinit's stdin, which after dropping priviledges reads it and uses it
- for launching the real tdeinit.
-*/
-int main(int argc, char **argv)
-{
- int pipes[ 2 ];
- if(argc == 0)
- return 1;
- if( pipe( pipes ) < 0 ) {
- perror( "pipe()" );
- return 1;
- }
- switch( fork()) {
- case -1:
- perror( "fork()" );
- return 1;
- default: /* parent, exec */
- close( pipes[ 1 ] );
- close( 0 ); /* stdin */
- dup2( pipes[ 0 ], 0 );
- close( pipes[ 0 ] );
- argv[ 0 ] = (char*)"start_tdeinit";
- execvp("start_tdeinit", argv);
- perror("start_tdeinit");
- return 1;
- case 0: { /* child, pass env and exit */
- extern char** environ;
- int i;
- close( pipes[ 0 ] );
- write( pipes[ 1 ], "environ", 7 ); /* header, just in case */
- for( i = 0;
- environ[ i ] != NULL;
- ++i )
- {}
- write( pipes[ 1 ], &i, sizeof( int )); /* write count */
- for( i = 0;
- environ[ i ] != NULL;
- ++i )
- {
- int len = strlen( environ[ i ] );
- write( pipes[ 1 ], &len, sizeof( int )); /* write length */
- write( pipes[ 1 ], environ[ i ], strlen( environ[ i ] ));
- }
- close( pipes[ 1 ] );
- }
- }
- return 0;
-}
-
-#else /* not Linux, the simple non-setuid case */
-
-int main(int argc, char **argv)
-{
- if(argc == 0)
- return 1;
- argv[0] = "start_tdeinit";
- execvp("start_tdeinit",argv);
- perror("start_tdeinit");
- return 1;
-}
-#endif
diff --git a/kinit/tdedostartupconfig.cpp b/kinit/tdedostartupconfig.cpp
deleted file mode 100644
index bbfdf88a4..000000000
--- a/kinit/tdedostartupconfig.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/****************************************************************************
-
- Copyright (C) 2005 Lubos Lunak <[email protected]>
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-****************************************************************************/
-
-#undef QT_NO_CAST_ASCII
-
-// See description in tdestartupconfig.cpp .
-
-#include <tqfile.h>
-#include <tqtextstream.h>
-#include <kinstance.h>
-#include <kstandarddirs.h>
-#include <tdeconfig.h>
-#include <kdebug.h>
-
-TQString get_entry( TQString* ll )
- {
- TQString& l = *ll;
- l = l.stripWhiteSpace();
- if( l.isEmpty())
- return TQString::null;
- TQString ret;
- if( l[ 0 ] == '\'' )
- {
- unsigned int pos = 1;
- while( pos < l.length() && l[ pos ] != '\'' )
- ret += l[ pos++ ];
- if( pos >= l.length())
- {
- *ll = TQString::null;
- return TQString::null;
- }
- *ll = l.mid( pos + 1 );
- return ret;
- }
- unsigned int pos = 0;
- while( pos < l.length() && l[ pos ] != ' ' )
- ret += l[ pos++ ];
- *ll = l.mid( pos );
- return ret;
- }
-
-int main()
- {
- TDEInstance inst( "tdedostartupconfig" );
- kdDebug() << "Running tdedostartupconfig." << endl;
- TQString keysname = locateLocal( "config", "startupconfigkeys" );
- TQFile keys( keysname );
- if( !keys.open( IO_ReadOnly ))
- return 3;
- TQFile f1( locateLocal( "config", "startupconfig" ));
- if( !f1.open( IO_WriteOnly ))
- return 4;
- TQFile f2( locateLocal( "config", "startupconfigfiles" ));
- if( !f2.open( IO_WriteOnly ))
- return 5;
- TQTextStream startupconfig( &f1 );
- TQTextStream startupconfigfiles( &f2 );
- startupconfig << "#! /bin/sh\n";
- for(;;)
- {
- TQString line;
- if( keys.readLine( line, 1024 ) < 0 )
- break;
- line = line.stripWhiteSpace();
- if( line.isEmpty())
- break;
- TQString tmp = line;
- TQString file, group, key, def;
- file = get_entry( &tmp );
- group = get_entry( &tmp );
- key = get_entry( &tmp );
- def = get_entry( &tmp );
- if( file.isEmpty() || group.isEmpty())
- return 6;
- if( group.left( 1 ) == "[" && group.right( 1 ) == "]" )
- { // whole config group
- TDEConfig cfg( file );
- group = group.mid( 1, group.length() - 2 );
- TQMap< TQString, TQString > entries = cfg.entryMap( group );
- startupconfig << "# " << line << "\n";
- for( TQMap< TQString, TQString >::ConstIterator it = entries.begin();
- it != entries.end();
- ++it )
- {
- TQString key = it.key();
- TQString value = *it;
- startupconfig << TQString(file.replace( ' ', '_' )).lower()
- << "_" << TQString(group.replace( ' ', '_' )).lower()
- << "_" << TQString(key.replace( ' ', '_' )).lower()
- << "=\"" << value.replace( "\"", "\\\"" ) << "\"\n";
- }
- }
- else
- { // a single key
- if( key.isEmpty())
- return 7;
- TDEConfig cfg( file );
- cfg.setGroup( group );
- TQString value = cfg.readEntry( key, def );
- startupconfig << "# " << line << "\n";
- startupconfig << TQString(file.replace( ' ', '_' )).lower()
- << "_" << TQString(group.replace( ' ', '_' )).lower()
- << "_" <<TQString( key.replace( ' ', '_' )).lower()
- << "=\"" << value.replace( "\"", "\\\"" ) << "\"\n";
- }
- startupconfigfiles << line << endl;
- // use even currently non-existing paths in $TDEDIRS
- TQStringList dirs = TQStringList::split( KPATH_SEPARATOR, TDEGlobal::dirs()->kfsstnd_prefixes());
- for( TQStringList::ConstIterator it = dirs.begin();
- it != dirs.end();
- ++it )
- {
- TQString cfg = *it + "share/config/" + file;
- if( TDEStandardDirs::exists( cfg ))
- startupconfigfiles << cfg << "\n";
- else
- startupconfigfiles << "!" << cfg << "\n";
- }
- startupconfigfiles << "*\n";
- }
- return 0;
- }
diff --git a/kinit/tdeioslave.cpp b/kinit/tdeioslave.cpp
deleted file mode 100644
index 1690ca2f7..000000000
--- a/kinit/tdeioslave.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * This file is part of the KDE libraries
- * Copyright (c) 1999-2000 Waldo Bastian <[email protected]>
- * (c) 1999 Mario Weilguni <[email protected]>
- * (c) 2001 Lubos Lunak <[email protected]>
- *
- * $Id$
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License version 2 as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-
-#include <tqstring.h>
-
-#include "ltdl.h"
-
-#ifdef HAVE_DLFCN_H
-# include <dlfcn.h>
-#endif
-
-#ifdef RTLD_GLOBAL
-# define LTDL_GLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LTDL_GLOBAL DL_GLOBAL
-# else
-# define LTDL_GLOBAL 0
-# endif
-#endif
-
-/* These are to link libtdeio even if 'smart' linker is used */
-#include <tdeio/authinfo.h>
-extern "C" TDEIO::AuthInfo* _tdeioslave_init_kio() { return new TDEIO::AuthInfo(); }
-
-int main(int argc, char **argv)
-{
- if (argc < 5)
- {
- fprintf(stderr, "Usage: tdeioslave <slave-lib> <protocol> <tdelauncher-socket> <app-socket>\n\nThis program is part of TDE.\n");
- exit(1);
- }
- TQCString libpath = argv[1];
-
- if (libpath.isEmpty())
- {
- fprintf(stderr, "library path is empty.\n");
- exit(1);
- }
- lt_dlinit();
-
- lt_dlhandle handle = lt_dlopen( libpath.data() );
- if (!handle )
- {
- const char * ltdlError = lt_dlerror();
- fprintf(stderr, "could not open %s: %s", libpath.data(), ltdlError != 0 ? ltdlError : "(null)" );
- exit(1);
- }
-
- lt_ptr sym = lt_dlsym( handle, "kdemain");
- if (!sym )
- {
- sym = lt_dlsym( handle, "main");
- if (!sym )
- {
- const char * ltdlError = lt_dlerror();
- fprintf(stderr, "Could not find main: %s\n", ltdlError != 0 ? ltdlError : "(null)" );
- exit(1);
- }
- }
-
- int (*func)(int, char *[]) = (int (*)(int, char *[])) sym;
-
- exit( func(argc-1, argv+1)); /* Launch! */
-}
diff --git a/kinit/tdelauncher.cpp b/kinit/tdelauncher.cpp
deleted file mode 100644
index f7ca08678..000000000
--- a/kinit/tdelauncher.cpp
+++ /dev/null
@@ -1,1421 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 1999 Waldo Bastian <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/time.h>
-
-#include <tqfile.h>
-
-#include <tdeconfig.h>
-#include <kdebug.h>
-#include <klibloader.h>
-#include <tdelocale.h>
-#include <tdeprotocolmanager.h>
-#include <kprotocolinfo.h>
-#include <krun.h>
-#include <kstandarddirs.h>
-#include <tdetempfile.h>
-#include <kurl.h>
-
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#include <tdestartupinfo.h> // schroder
-#endif
-
-
-#include "tdeio/global.h"
-#include "tdeio/connection.h"
-#include "tdeio/slaveinterface.h"
-
-#include "tdelauncher.h"
-#include "tdelauncher_cmds.h"
-
-//#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-#ifdef Q_WS_X11
-//#undef K_WS_QTONLY
-#include <X11/Xlib.h> // schroder
-#endif
-
-// Dispose slaves after being idle for SLAVE_MAX_IDLE seconds
-#define SLAVE_MAX_IDLE 30
-
-using namespace TDEIO;
-
-template class TQPtrList<TDELaunchRequest>;
-template class TQPtrList<IdleSlave>;
-
-IdleSlave::IdleSlave(TDESocket *socket)
-{
- mConn.init(socket);
- mConn.connect(this, TQT_SLOT(gotInput()));
- mConn.send( CMD_SLAVE_STATUS );
- mPid = 0;
- mBirthDate = time(0);
- mOnHold = false;
-}
-
-void
-IdleSlave::gotInput()
-{
- int cmd;
- TQByteArray data;
- if (mConn.read( &cmd, data) == -1)
- {
- // Communication problem with slave.
- kdError(7016) << "SlavePool: No communication with slave." << endl;
- delete this;
- }
- else if (cmd == MSG_SLAVE_ACK)
- {
- delete this;
- }
- else if (cmd != MSG_SLAVE_STATUS)
- {
- kdError(7016) << "SlavePool: Unexpected data from slave." << endl;
- delete this;
- }
- else
- {
- TQDataStream stream( data, IO_ReadOnly );
- pid_t pid;
- TQCString protocol;
- TQString host;
- TQ_INT8 b;
- stream >> pid >> protocol >> host >> b;
-// Overload with (bool) onHold, (KURL) url.
- if (!stream.atEnd())
- {
- KURL url;
- stream >> url;
- mOnHold = true;
- mUrl = url;
- }
-
- mPid = pid;
- mConnected = (b != 0);
- mProtocol = protocol;
- mHost = host;
- emit statusUpdate(this);
- }
-}
-
-void
-IdleSlave::connect(const TQString &app_socket)
-{
- TQByteArray data;
- TQDataStream stream( data, IO_WriteOnly);
- stream << app_socket;
- mConn.send( CMD_SLAVE_CONNECT, data );
- // Timeout!
-}
-
-void
-IdleSlave::reparseConfiguration()
-{
- mConn.send( CMD_REPARSECONFIGURATION );
-}
-
-bool
-IdleSlave::match(const TQString &protocol, const TQString &host, bool connected)
-{
- if (mOnHold) return false;
- if (protocol != mProtocol) return false;
- if (host.isEmpty()) return true;
- if (host != mHost) return false;
- if (!connected) return true;
- if (!mConnected) return false;
- return true;
-}
-
-bool
-IdleSlave::onHold(const KURL &url)
-{
- if (!mOnHold) return false;
- return (url == mUrl);
-}
-
-int
-IdleSlave::age(time_t now)
-{
- return (int) difftime(now, mBirthDate);
-}
-
-TDELauncher::TDELauncher(int _tdeinitSocket, bool new_startup)
-// : TDEApplication( false, false ), // No Styles, No GUI
- : TDEApplication( false, true ), // TQClipboard tries to construct a QWidget so a GUI is technically needed, even though it is not used
- DCOPObject("tdelauncher"),
- tdeinitSocket(_tdeinitSocket), mAutoStart( new_startup ),
- dontBlockReading(false), newStartup( new_startup )
-{
-#ifdef Q_WS_X11
- mCached_dpy = NULL;
-#endif
- connect(&mAutoTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotAutoStart()));
- requestList.setAutoDelete(true);
- mSlaveWaitRequest.setAutoDelete(true);
- dcopClient()->setNotifications( true );
- connect(dcopClient(), TQT_SIGNAL( applicationRegistered( const TQCString &)),
- this, TQT_SLOT( slotAppRegistered( const TQCString &)));
- dcopClient()->connectDCOPSignal( "DCOPServer", "", "terminateKDE()",
- objId(), "terminateKDE()", false );
-
- TQString prefix = locateLocal("socket", "tdelauncher");
- KTempFile domainname(prefix, TQString::fromLatin1(".slave-socket"));
- if (domainname.status() != 0)
- {
- // Sever error!
- tqDebug("TDELauncher: Fatal error, can't create tempfile!");
- ::exit(1);
- }
- mPoolSocketName = domainname.name();
-#ifdef __CYGWIN__
- domainname.close();
- domainname.unlink();
-#endif
- mPoolSocket = new TDEServerSocket(static_cast<const char*>(TQFile::encodeName(mPoolSocketName)));
- connect(mPoolSocket, TQT_SIGNAL(accepted( TDESocket *)),
- TQT_SLOT(acceptSlave(TDESocket *)));
-
- connect(&mTimer, TQT_SIGNAL(timeout()), TQT_SLOT(idleTimeout()));
-
- tdeinitNotifier = new TQSocketNotifier(tdeinitSocket, TQSocketNotifier::Read);
- connect(tdeinitNotifier, TQT_SIGNAL( activated( int )),
- this, TQT_SLOT( slotKDEInitData( int )));
- tdeinitNotifier->setEnabled( true );
- lastRequest = 0;
- bProcessingQueue = false;
-
- mSlaveDebug = getenv("TDE_SLAVE_DEBUG_WAIT");
- if (!mSlaveDebug.isEmpty())
- {
- tqWarning("Klauncher running in slave-debug mode for slaves of protocol '%s'", mSlaveDebug.data());
- }
- mSlaveValgrind = getenv("TDE_SLAVE_VALGRIND");
- if (!mSlaveValgrind.isEmpty())
- {
- mSlaveValgrindSkin = getenv("TDE_SLAVE_VALGRIND_SKIN");
- tqWarning("Klauncher running slaves through valgrind for slaves of protocol '%s'", mSlaveValgrind.data());
- }
- tdelauncher_header request_header;
- request_header.cmd = LAUNCHER_OK;
- request_header.arg_length = 0;
- write(tdeinitSocket, &request_header, sizeof(request_header));
-}
-
-TDELauncher::~TDELauncher()
-{
- close();
-}
-
-void TDELauncher::close()
-{
- if (!mPoolSocketName.isEmpty())
- {
- TQCString filename = TQFile::encodeName(mPoolSocketName);
- unlink(filename.data());
- }
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- if( mCached_dpy != NULL )
- XCloseDisplay( mCached_dpy );
-#endif
-}
-
-void
-TDELauncher::destruct(int exit_code)
-{
- if (kapp) ((TDELauncher*)kapp)->close();
- // We don't delete kapp here, that's intentional.
- ::exit(exit_code);
-}
-
-bool
-TDELauncher::process(const TQCString &fun, const TQByteArray &data,
- TQCString &replyType, TQByteArray &replyData)
-{
- if ((fun == "exec_blind(TQCString,TQValueList<TQCString>)")
- || (fun == "exec_blind(TQCString,TQValueList<TQCString>,TQValueList<TQCString>,TQCString)"))
- {
- TQDataStream stream(data, IO_ReadOnly);
- replyType = "void";
- TQCString name;
- TQValueList<TQCString> arg_list;
- TQCString startup_id = "0";
- TQValueList<TQCString> envs;
- stream >> name >> arg_list;
- if( fun == "exec_blind(TQCString,TQValueList<TQCString>,TQValueList<TQCString>,TQCString)" )
- stream >> envs >> startup_id;
- kdDebug(7016) << "TDELauncher: Got exec_blind('" << name << "', ...)" << endl;
- exec_blind( name, arg_list, envs, startup_id);
- return true;
- }
- if ((fun == "start_service_by_name(TQString,TQStringList)") ||
- (fun == "start_service_by_desktop_path(TQString,TQStringList)")||
- (fun == "start_service_by_desktop_name(TQString,TQStringList)")||
- (fun == "tdeinit_exec(TQString,TQStringList)") ||
- (fun == "tdeinit_exec_wait(TQString,TQStringList)") ||
- (fun == "start_service_by_name(TQString,TQStringList,TQValueList<TQCString>,TQCString)") ||
- (fun == "start_service_by_desktop_path(TQString,TQStringList,TQValueList<TQCString>,TQCString)")||
- (fun == "start_service_by_desktop_name(TQString,TQStringList,TQValueList<TQCString>,TQCString)") ||
- (fun == "start_service_by_name(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)") ||
- (fun == "start_service_by_desktop_path(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)")||
- (fun == "start_service_by_desktop_name(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)") ||
- (fun == "tdeinit_exec(TQString,TQStringList,TQValueList<TQCString>)") ||
- (fun == "tdeinit_exec_wait(TQString,TQStringList,TQValueList<TQCString>)") ||
- (fun == "tdeinit_exec(TQString,TQStringList,TQValueList<TQCString>,TQCString)") ||
- (fun == "tdeinit_exec_wait(TQString,TQStringList,TQValueList<TQCString>,TQCString)"))
- {
- TQDataStream stream(data, IO_ReadOnly);
- bool bNoWait = false;
- TQString serviceName;
- TQStringList urls;
- TQValueList<TQCString> envs;
- TQCString startup_id = "";
- DCOPresult.result = -1;
- DCOPresult.dcopName = 0;
- DCOPresult.error = TQString::null;
- DCOPresult.pid = 0;
- stream >> serviceName >> urls;
- if ((fun == "start_service_by_name(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)") ||
- (fun == "start_service_by_desktop_path(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)")||
- (fun == "start_service_by_desktop_name(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)"))
- stream >> envs >> startup_id >> bNoWait;
- else if ((fun == "start_service_by_name(TQString,TQStringList,TQValueList<TQCString>,TQCString)") ||
- (fun == "start_service_by_desktop_path(TQString,TQStringList,TQValueList<TQCString>,TQCString)")||
- (fun == "start_service_by_desktop_name(TQString,TQStringList,TQValueList<TQCString>,TQCString)"))
- stream >> envs >> startup_id;
- else if ((fun == "tdeinit_exec(TQString,TQStringList,TQValueList<TQCString>)") ||
- (fun == "tdeinit_exec_wait(TQString,TQStringList,TQValueList<TQCString>)"))
- stream >> envs;
- else if ((fun == "tdeinit_exec(TQString,TQStringList,TQValueList<TQCString>,TQCString)") ||
- (fun == "tdeinit_exec_wait(TQString,TQStringList,TQValueList<TQCString>,TQCString)"))
- stream >> envs >> startup_id;
- bool finished;
- if (strncmp(fun, "start_service_by_name(", 22) == 0)
- {
- kdDebug(7016) << "TDELauncher: Got start_service_by_name('" << serviceName << "', ...)" << endl;
- finished = start_service_by_name(serviceName, urls, envs, startup_id, bNoWait);
- }
- else if (strncmp(fun, "start_service_by_desktop_path(", 30) == 0)
- {
- kdDebug(7016) << "TDELauncher: Got start_service_by_desktop_path('" << serviceName << "', ...)" << endl;
- finished = start_service_by_desktop_path(serviceName, urls, envs, startup_id, bNoWait);
- }
- else if (strncmp(fun, "start_service_by_desktop_name(", 30) == 0)
- {
- kdDebug(7016) << "TDELauncher: Got start_service_by_desktop_name('" << serviceName << "', ...)" << endl;
- finished = start_service_by_desktop_name(serviceName, urls, envs, startup_id, bNoWait );
- }
- else if ((fun == "tdeinit_exec(TQString,TQStringList)")
- || (fun == "tdeinit_exec(TQString,TQStringList,TQValueList<TQCString>)")
- || (fun == "tdeinit_exec(TQString,TQStringList,TQValueList<TQCString>,TQCString)"))
- {
- kdDebug(7016) << "TDELauncher: Got tdeinit_exec('" << serviceName << "', ...)" << endl;
- finished = tdeinit_exec(serviceName, urls, envs, startup_id, false);
- }
- else
- {
- kdDebug(7016) << "TDELauncher: Got tdeinit_exec_wait('" << serviceName << "', ...)" << endl;
- finished = tdeinit_exec(serviceName, urls, envs, startup_id, true);
- }
- if (!finished)
- {
- replyType = "serviceResult";
- TQDataStream stream2(replyData, IO_WriteOnly);
- stream2 << DCOPresult.result << DCOPresult.dcopName << DCOPresult.error << DCOPresult.pid;
- }
- return true;
- }
- else if (fun == "requestSlave(TQString,TQString,TQString)")
- {
- TQDataStream stream(data, IO_ReadOnly);
- TQString protocol;
- TQString host;
- TQString app_socket;
- stream >> protocol >> host >> app_socket;
- replyType = "TQString";
- TQString error;
- pid_t pid = requestSlave(protocol, host, app_socket, error);
- TQDataStream stream2(replyData, IO_WriteOnly);
- stream2 << pid << error;
- return true;
- }
- else if (fun == "requestHoldSlave(KURL,TQString)")
- {
- TQDataStream stream(data, IO_ReadOnly);
- KURL url;
- TQString app_socket;
- stream >> url >> app_socket;
- replyType = "pid_t";
- pid_t pid = requestHoldSlave(url, app_socket);
- TQDataStream stream2(replyData, IO_WriteOnly);
- stream2 << pid;
- return true;
- }
- else if (fun == "waitForSlave(pid_t)")
- {
- TQDataStream stream(data, IO_ReadOnly);
- pid_t pid;
- stream >> pid;
- waitForSlave(pid);
- replyType = "void";
- return true;
-
- }
- else if (fun == "setLaunchEnv(TQCString,TQCString)")
- {
- TQDataStream stream(data, IO_ReadOnly);
- TQCString name;
- TQCString value;
- stream >> name >> value;
- setLaunchEnv(name, value);
- replyType = "void";
- return true;
- }
- else if (fun == "reparseConfiguration()")
- {
- TDEGlobal::config()->reparseConfiguration();
- kdDebug(7016) << "TDELauncher::process : reparseConfiguration" << endl;
- KProtocolManager::reparseConfiguration();
- IdleSlave *slave;
- for(slave = mSlaveList.first(); slave; slave = mSlaveList.next())
- slave->reparseConfiguration();
- replyType = "void";
- return true;
- }
- else if (fun == "terminateKDE()")
- {
- ::signal( SIGHUP, SIG_IGN);
- ::signal( SIGTERM, SIG_IGN);
- kdDebug() << "TDELauncher::process ---> terminateKDE" << endl;
- tdelauncher_header request_header;
- request_header.cmd = LAUNCHER_TERMINATE_KDE;
- request_header.arg_length = 0;
- write(tdeinitSocket, &request_header, sizeof(request_header));
- destruct(0);
- }
- else if (fun == "autoStart()")
- {
- kdDebug() << "TDELauncher::process ---> autoStart" << endl;
- autoStart(1);
- replyType = "void";
- return true;
- }
- else if (fun == "autoStart(int)")
- {
- kdDebug() << "TDELauncher::process ---> autoStart(int)" << endl;
- TQDataStream stream(data, IO_ReadOnly);
- int phase;
- stream >> phase;
- autoStart(phase);
- replyType = "void";
- return true;
- }
-
- if (DCOPObject::process(fun, data, replyType, replyData))
- {
- return true;
- }
- kdWarning(7016) << "Got unknown DCOP function: " << fun << endl;
- return false;
-}
-
-QCStringList
-TDELauncher::interfaces()
-{
- QCStringList ifaces = DCOPObject::interfaces();
- ifaces += "TDELauncher";
- return ifaces;
-}
-
-QCStringList
-TDELauncher::functions()
-{
- QCStringList funcs = DCOPObject::functions();
- funcs << "void exec_blind(TQCString,TQValueList<TQCString>)";
- funcs << "void exec_blind(TQCString,TQValueList<TQCString>,TQValueList<TQCString>,TQCString)";
- funcs << "serviceResult start_service_by_name(TQString,TQStringList)";
- funcs << "serviceResult start_service_by_desktop_path(TQString,TQStringList)";
- funcs << "serviceResult start_service_by_desktop_name(TQString,TQStringList)";
- funcs << "serviceResult tdeinit_exec(TQString,TQStringList)";
- funcs << "serviceResult tdeinit_exec_wait(TQString,TQStringList)";
- funcs << "serviceResult start_service_by_name(TQString,TQStringList,TQValueList<TQCString>,TQCString)";
- funcs << "serviceResult start_service_by_desktop_path(TQString,TQStringList,TQValueList<TQCString>,TQCString)";
- funcs << "serviceResult start_service_by_desktop_name(TQString,TQStringList,TQValueList<TQCString>,TQCString)";
- funcs << "serviceResult start_service_by_name(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)";
- funcs << "serviceResult start_service_by_desktop_path(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)";
- funcs << "serviceResult start_service_by_desktop_name(TQString,TQStringList,TQValueList<TQCString>,TQCString,bool)";
- funcs << "serviceResult tdeinit_exec(TQString,TQStringList,TQValueList<TQCString>)";
- funcs << "serviceResult tdeinit_exec_wait(TQString,TQStringList,TQValueList<TQCString>)";
- funcs << "TQString requestSlave(TQString,TQString,TQString)";
- funcs << "pid_t requestHoldSlave(KURL,TQString)";
- funcs << "void waitForSlave(pid_t)";
- funcs << "void setLaunchEnv(TQCString,TQCString)";
- funcs << "void reparseConfiguration()";
-// funcs << "void terminateKDE()";
- funcs << "void autoStart()";
- funcs << "void autoStart(int)";
- return funcs;
-}
-
-void TDELauncher::setLaunchEnv(const TQCString &name, const TQCString &_value)
-{
- TQCString value(_value);
- if (value.isNull())
- value = "";
- tdelauncher_header request_header;
- TQByteArray requestData(name.length()+value.length()+2);
- memcpy(requestData.data(), name.data(), name.length()+1);
- memcpy(requestData.data()+name.length()+1, value.data(), value.length()+1);
- request_header.cmd = LAUNCHER_SETENV;
- request_header.arg_length = requestData.size();
- write(tdeinitSocket, &request_header, sizeof(request_header));
- write(tdeinitSocket, requestData.data(), request_header.arg_length);
-}
-
-/*
- * Read 'len' bytes from 'sock' into buffer.
- * returns -1 on failure, 0 on no data.
- */
-static int
-read_socket(int sock, char *buffer, int len)
-{
- ssize_t result;
- int bytes_left = len;
- while ( bytes_left > 0)
- {
- result = read(sock, buffer, bytes_left);
- if (result > 0)
- {
- buffer += result;
- bytes_left -= result;
- }
- else if (result == 0)
- return -1;
- else if ((result == -1) && (errno != EINTR))
- return -1;
- }
- return 0;
-}
-
-
-void
-TDELauncher::slotKDEInitData(int)
-{
- tdelauncher_header request_header;
- TQByteArray requestData;
- if( dontBlockReading )
- {
- // in case we get a request to start an application and data arrive
- // to tdeinitSocket at the same time, requestStart() will already
- // call slotKDEInitData(), so we must check there's still something
- // to read, otherwise this would block
- fd_set in;
- timeval tm = { 0, 0 };
- FD_ZERO ( &in );
- FD_SET( tdeinitSocket, &in );
- select( tdeinitSocket + 1, &in, 0, 0, &tm );
- if( !FD_ISSET( tdeinitSocket, &in ))
- return;
- }
- dontBlockReading = false;
- int result = read_socket(tdeinitSocket, (char *) &request_header,
- sizeof( request_header));
- if (result == -1)
- {
- kdDebug() << "Exiting on read_socket errno: " << errno << endl;
- ::signal( SIGHUP, SIG_IGN);
- ::signal( SIGTERM, SIG_IGN);
- destruct(255); // Exit!
- }
- requestData.resize(request_header.arg_length);
- result = read_socket(tdeinitSocket, (char *) requestData.data(),
- request_header.arg_length);
-
- if (request_header.cmd == LAUNCHER_DIED)
- {
- long *request_data;
- request_data = (long *) requestData.data();
- processDied(request_data[0], request_data[1]);
- return;
- }
- if (lastRequest && (request_header.cmd == LAUNCHER_OK))
- {
- long *request_data;
- request_data = (long *) requestData.data();
- lastRequest->pid = (pid_t) (*request_data);
- kdDebug(7016) << lastRequest->name << " (pid " << lastRequest->pid <<
- ") up and running." << endl;
- switch(lastRequest->dcop_service_type)
- {
- case KService::DCOP_None:
- {
- lastRequest->status = TDELaunchRequest::Running;
- break;
- }
-
- case KService::DCOP_Unique:
- {
- lastRequest->status = TDELaunchRequest::Launching;
- break;
- }
-
- case KService::DCOP_Wait:
- {
- lastRequest->status = TDELaunchRequest::Launching;
- break;
- }
-
- case KService::DCOP_Multi:
- {
- lastRequest->status = TDELaunchRequest::Launching;
- break;
- }
- }
- lastRequest = 0;
- return;
- }
- if (lastRequest && (request_header.cmd == LAUNCHER_ERROR))
- {
- lastRequest->status = TDELaunchRequest::Error;
- if (!requestData.isEmpty())
- lastRequest->errorMsg = TQString::fromUtf8((char *) requestData.data());
- lastRequest = 0;
- return;
- }
-
- kdWarning(7016) << "Unexpected command from KDEInit (" << (unsigned int) request_header.cmd
- << ")" << endl;
-}
-
-void
-TDELauncher::processDied(pid_t pid, long /* exitStatus */)
-{
- TDELaunchRequest *request = requestList.first();
- for(; request; request = requestList.next())
- {
- if (request->pid == pid)
- {
- if (request->dcop_service_type == KService::DCOP_Wait)
- request->status = TDELaunchRequest::Done;
- else if ((request->dcop_service_type == KService::DCOP_Unique) &&
- (dcopClient()->isApplicationRegistered(request->dcop_name)))
- request->status = TDELaunchRequest::Running;
- else
- request->status = TDELaunchRequest::Error;
- requestDone(request);
- return;
- }
- }
-}
-
-void
-TDELauncher::slotAppRegistered(const TQCString &appId)
-{
- const char *cAppId = appId.data();
- if (!cAppId) return;
-
- TDELaunchRequest *request = requestList.first();
- TDELaunchRequest *nextRequest;
- for(; request; request = nextRequest)
- {
- nextRequest = requestList.next();
- if (request->status != TDELaunchRequest::Launching)
- continue;
-
- // For unique services check the requested service name first
- if ((request->dcop_service_type == KService::DCOP_Unique) &&
- ((appId == request->dcop_name) ||
- dcopClient()->isApplicationRegistered(request->dcop_name)))
- {
- request->status = TDELaunchRequest::Running;
- requestDone(request);
- continue;
- }
-
- const char *rAppId = request->dcop_name.data();
- if (!rAppId) continue;
-
- int l = strlen(rAppId);
- if ((strncmp(rAppId, cAppId, l) == 0) &&
- ((cAppId[l] == '\0') || (cAppId[l] == '-')))
- {
- request->dcop_name = appId;
- request->status = TDELaunchRequest::Running;
- requestDone(request);
- continue;
- }
- }
-}
-
-void
-TDELauncher::autoStart(int phase)
-{
- if( mAutoStart.phase() >= phase )
- return;
- mAutoStart.setPhase(phase);
- if( newStartup )
- {
- if (phase == 0)
- mAutoStart.loadAutoStartList();
- }
- else
- {
- if (phase == 1)
- mAutoStart.loadAutoStartList();
- }
- mAutoTimer.start(0, true);
-}
-
-void
-TDELauncher::slotAutoStart()
-{
- KService::Ptr s;
- do
- {
- TQString service = mAutoStart.startService();
- if (service.isEmpty())
- {
- // Done
- if( !mAutoStart.phaseDone())
- {
- mAutoStart.setPhaseDone();
- // Emit signal
- if( newStartup )
- {
- TQCString autoStartSignal;
- autoStartSignal.sprintf( "autoStart%dDone()", mAutoStart.phase());
- emitDCOPSignal(autoStartSignal, TQByteArray());
- }
- else
- {
- TQCString autoStartSignal( "autoStartDone()" );
- int phase = mAutoStart.phase();
- if ( phase > 1 )
- autoStartSignal.sprintf( "autoStart%dDone()", phase );
- emitDCOPSignal(autoStartSignal, TQByteArray());
- }
- }
- return;
- }
- s = new KService(service);
- }
- while (!start_service(s, TQStringList(), TQValueList<TQCString>(), "0", false, true));
- // Loop till we find a service that we can start.
-}
-
-void
-TDELauncher::requestDone(TDELaunchRequest *request)
-{
- if ((request->status == TDELaunchRequest::Running) ||
- (request->status == TDELaunchRequest::Done))
- {
- DCOPresult.result = 0;
- DCOPresult.dcopName = request->dcop_name;
- DCOPresult.error = TQString::null;
- DCOPresult.pid = request->pid;
- }
- else
- {
- DCOPresult.result = 1;
- DCOPresult.dcopName = "";
- DCOPresult.error = i18n("KDEInit could not launch '%1'.").arg(TQString(request->name));
- if (!request->errorMsg.isEmpty())
- DCOPresult.error += ":\n" + request->errorMsg;
- DCOPresult.pid = 0;
-
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11
- if (!request->startup_dpy.isEmpty())
- {
- Display* dpy = NULL;
- if( (mCached_dpy != NULL) &&
- (request->startup_dpy == XDisplayString( mCached_dpy )))
- dpy = mCached_dpy;
- if( dpy == NULL )
- dpy = XOpenDisplay( request->startup_dpy );
- if( dpy )
- {
- TDEStartupInfoId id;
- id.initId( request->startup_id );
- TDEStartupInfo::sendFinishX( dpy, id );
- if( mCached_dpy != dpy && mCached_dpy != NULL )
- XCloseDisplay( mCached_dpy );
- mCached_dpy = dpy;
- }
- }
-#endif
- }
-
- if (request->autoStart)
- {
- mAutoTimer.start(0, true);
- }
-
- if (request->transaction)
- {
- TQByteArray replyData;
- TQCString replyType;
- replyType = "serviceResult";
- TQDataStream stream2(replyData, IO_WriteOnly);
- stream2 << DCOPresult.result << DCOPresult.dcopName << DCOPresult.error << DCOPresult.pid;
- dcopClient()->endTransaction( request->transaction,
- replyType, replyData);
- }
- requestList.removeRef( request );
-}
-
-void
-TDELauncher::requestStart(TDELaunchRequest *request)
-{
- requestList.append( request );
- // Send request to tdeinit.
- tdelauncher_header request_header;
- TQByteArray requestData;
- int length = 0;
- length += sizeof(long); // Nr of. Args
- length += request->name.length() + 1; // Cmd
- for(TQValueList<TQCString>::Iterator it = request->arg_list.begin();
- it != request->arg_list.end();
- it++)
- {
- length += (*it).length() + 1; // Args...
- }
- length += sizeof(long); // Nr of. envs
- for(TQValueList<TQCString>::ConstIterator it = request->envs.begin();
- it != request->envs.end();
- it++)
- {
- length += (*it).length() + 1; // Envs...
- }
- length += sizeof( long ); // avoid_loops
-#ifdef Q_WS_X11
- bool startup_notify = !request->startup_id.isNull() && request->startup_id != "0";
- if( startup_notify )
- length += request->startup_id.length() + 1;
-#endif
- if (!request->cwd.isEmpty())
- length += request->cwd.length() + 1;
-
- requestData.resize( length );
-
- char *p = requestData.data();
- long l = request->arg_list.count()+1;
- memcpy(p, &l, sizeof(long));
- p += sizeof(long);
- strcpy(p, request->name.data());
- p += strlen(p) + 1;
- for(TQValueList<TQCString>::Iterator it = request->arg_list.begin();
- it != request->arg_list.end();
- it++)
- {
- strcpy(p, (*it).data());
- p += strlen(p) + 1;
- }
- l = request->envs.count();
- memcpy(p, &l, sizeof(long));
- p += sizeof(long);
- for(TQValueList<TQCString>::ConstIterator it = request->envs.begin();
- it != request->envs.end();
- it++)
- {
- strcpy(p, (*it).data());
- p += strlen(p) + 1;
- }
- l = 0; // avoid_loops, always false here
- memcpy(p, &l, sizeof(long));
- p += sizeof(long);
-#ifdef Q_WS_X11
- if( startup_notify )
- {
- strcpy(p, request->startup_id.data());
- p += strlen( p ) + 1;
- }
-#endif
- if (!request->cwd.isEmpty())
- {
- strcpy(p, request->cwd.data());
- p += strlen( p ) + 1;
- }
-#ifdef Q_WS_X11
- request_header.cmd = startup_notify ? LAUNCHER_EXT_EXEC : LAUNCHER_EXEC_NEW;
-#else
- request_header.cmd = LAUNCHER_EXEC_NEW;
-#endif
- request_header.arg_length = length;
- write(tdeinitSocket, &request_header, sizeof(request_header));
- write(tdeinitSocket, requestData.data(), request_header.arg_length);
-
- // Wait for pid to return.
- lastRequest = request;
- dontBlockReading = false;
- do {
- slotKDEInitData( tdeinitSocket );
- }
- while (lastRequest != 0);
- dontBlockReading = true;
-}
-
-void
-TDELauncher::exec_blind( const TQCString &name, const TQValueList<TQCString> &arg_list,
- const TQValueList<TQCString> &envs, const TQCString& startup_id )
-{
- TDELaunchRequest *request = new TDELaunchRequest;
- request->autoStart = false;
- request->name = name;
- request->arg_list = arg_list;
- request->dcop_name = 0;
- request->dcop_service_type = KService::DCOP_None;
- request->pid = 0;
- request->status = TDELaunchRequest::Launching;
- request->transaction = 0; // No confirmation is send
- request->envs = envs;
- // Find service, if any - strip path if needed
- KService::Ptr service = KService::serviceByDesktopName( name.mid( name.findRev( '/' ) + 1 ));
- if (service != NULL)
- send_service_startup_info( request, service,
- startup_id, TQValueList< TQCString >());
- else // no .desktop file, no startup info
- cancel_service_startup_info( request, startup_id, envs );
-
- requestStart(request);
- // We don't care about this request any longer....
- requestDone(request);
-}
-
-
-bool
-TDELauncher::start_service_by_name(const TQString &serviceName, const TQStringList &urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind)
-{
- KService::Ptr service = 0;
- // Find service
- service = KService::serviceByName(serviceName);
- if (!service)
- {
- DCOPresult.result = ENOENT;
- DCOPresult.error = i18n("Could not find service '%1'.").arg(serviceName);
- cancel_service_startup_info( NULL, startup_id, envs ); // cancel it if any
- return false;
- }
- return start_service(service, urls, envs, startup_id, blind);
-}
-
-bool
-TDELauncher::start_service_by_desktop_path(const TQString &serviceName, const TQStringList &urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind)
-{
- KService::Ptr service = 0;
- // Find service
- if (serviceName[0] == '/')
- {
- // Full path
- service = new KService(serviceName);
- }
- else
- {
- service = KService::serviceByDesktopPath(serviceName);
- }
- if (!service)
- {
- DCOPresult.result = ENOENT;
- DCOPresult.error = i18n("Could not find service '%1'.").arg(serviceName);
- cancel_service_startup_info( NULL, startup_id, envs ); // cancel it if any
- return false;
- }
- return start_service(service, urls, envs, startup_id, blind);
-}
-
-bool
-TDELauncher::start_service_by_desktop_name(const TQString &serviceName, const TQStringList &urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind)
-{
- KService::Ptr service = 0;
- // Find service
- service = KService::serviceByDesktopName(serviceName);
- if (!service)
- {
- DCOPresult.result = ENOENT;
- DCOPresult.error = i18n("Could not find service '%1'.").arg(serviceName);
- cancel_service_startup_info( NULL, startup_id, envs ); // cancel it if any
- return false;
- }
- return start_service(service, urls, envs, startup_id, blind);
-}
-
-bool
-TDELauncher::start_service(KService::Ptr service, const TQStringList &_urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind, bool autoStart)
-{
- TQStringList urls = _urls;
- if (!service->isValid())
- {
- DCOPresult.result = ENOEXEC;
- DCOPresult.error = i18n("Service '%1' is malformatted.").arg(service->desktopEntryPath());
- cancel_service_startup_info( NULL, startup_id, envs ); // cancel it if any
- return false;
- }
- TDELaunchRequest *request = new TDELaunchRequest;
- request->autoStart = autoStart;
-
- if ((urls.count() > 1) && !service->allowMultipleFiles())
- {
- // We need to launch the application N times. That sucks.
- // We ignore the result for application 2 to N.
- // For the first file we launch the application in the
- // usual way. The reported result is based on this
- // application.
- TQStringList::ConstIterator it = urls.begin();
- for(++it;
- it != urls.end();
- ++it)
- {
- TQStringList singleUrl;
- singleUrl.append(*it);
- TQCString startup_id2 = startup_id;
- if( !startup_id2.isEmpty() && startup_id2 != "0" )
- startup_id2 = "0"; // can't use the same startup_id several times
- start_service( service, singleUrl, envs, startup_id2, true);
- }
- TQString firstURL = *(urls.begin());
- urls.clear();
- urls.append(firstURL);
- }
- createArgs(request, service, urls);
-
- // We must have one argument at least!
- if (!request->arg_list.count())
- {
- DCOPresult.result = ENOEXEC;
- DCOPresult.error = i18n("Service '%1' is malformatted.").arg(service->desktopEntryPath());
- delete request;
- cancel_service_startup_info( NULL, startup_id, envs );
- return false;
- }
-
- request->name = request->arg_list.first();
- request->arg_list.remove(request->arg_list.begin());
-
- request->dcop_service_type = service->DCOPServiceType();
-
- if ((request->dcop_service_type == KService::DCOP_Unique) ||
- (request->dcop_service_type == KService::DCOP_Multi))
- {
- TQVariant v = service->property("X-DCOP-ServiceName");
- if (v.isValid())
- request->dcop_name = v.toString().utf8();
- if (request->dcop_name.isEmpty())
- {
- request->dcop_name = TQFile::encodeName(KRun::binaryName(service->exec(), true));
- }
- }
-
- request->pid = 0;
- request->transaction = 0;
- request->envs = envs;
- send_service_startup_info( request, service, startup_id, envs );
-
- // Request will be handled later.
- if (!blind && !autoStart)
- {
- request->transaction = dcopClient()->beginTransaction();
- }
- queueRequest(request);
- return true;
-}
-
-void
-TDELauncher::send_service_startup_info( TDELaunchRequest *request, KService::Ptr service, const TQCString& startup_id,
- const TQValueList<TQCString> &envs )
-{
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11 // TDEStartup* isn't implemented for Qt/Embedded yet
- request->startup_id = "0";
- if( startup_id == "0" )
- return;
- bool silent;
- TQCString wmclass;
- if( !KRun::checkStartupNotify( TQString::null, service, &silent, &wmclass ))
- return;
- TDEStartupInfoId id;
- id.initId( startup_id );
- const char* dpy_str = NULL;
- for( TQValueList<TQCString>::ConstIterator it = envs.begin();
- it != envs.end();
- ++it )
- if( strncmp( *it, "DISPLAY=", 8 ) == 0 )
- dpy_str = static_cast< const char* >( *it ) + 8;
- Display* dpy = NULL;
- if( dpy_str != NULL && mCached_dpy != NULL
- && qstrcmp( dpy_str, XDisplayString( mCached_dpy )) == 0 )
- dpy = mCached_dpy;
- if( dpy == NULL )
- dpy = XOpenDisplay( dpy_str );
- request->startup_id = id.id();
- if( dpy == NULL )
- {
- cancel_service_startup_info( request, startup_id, envs );
- return;
- }
-
- request->startup_dpy = dpy_str;
-
- TDEStartupInfoData data;
- data.setName( service->name());
- data.setIcon( service->icon());
- data.setDescription( i18n( "Launching %1" ).arg( service->name()));
- if( !wmclass.isEmpty())
- data.setWMClass( wmclass );
- if( silent )
- data.setSilent( TDEStartupInfoData::Yes );
- // the rest will be sent by tdeinit
- TDEStartupInfo::sendStartupX( dpy, id, data );
- if( mCached_dpy != dpy && mCached_dpy != NULL )
- XCloseDisplay( mCached_dpy );
- mCached_dpy = dpy;
- return;
-#else
- return;
-#endif
-}
-
-void
-TDELauncher::cancel_service_startup_info( TDELaunchRequest* request, const TQCString& startup_id,
- const TQValueList<TQCString> &envs )
-{
-#if defined Q_WS_X11 && ! defined K_WS_QTONLY
-//#ifdef Q_WS_X11 // TDEStartup* isn't implemented for Qt/Embedded yet
- if( request != NULL )
- request->startup_id = "0";
- if( !startup_id.isEmpty() && startup_id != "0" )
- {
- const char* dpy_str = NULL;
- for( TQValueList<TQCString>::ConstIterator it = envs.begin();
- it != envs.end();
- ++it )
- if( strncmp( *it, "DISPLAY=", 8 ) == 0 )
- dpy_str = static_cast< const char* >( *it ) + 8;
- Display* dpy = NULL;
- if( dpy_str != NULL && mCached_dpy != NULL
- && qstrcmp( dpy_str, XDisplayString( mCached_dpy )) == 0 )
- dpy = mCached_dpy;
- if( dpy == NULL )
- dpy = XOpenDisplay( dpy_str );
- if( dpy == NULL )
- return;
- TDEStartupInfoId id;
- id.initId( startup_id );
- TDEStartupInfo::sendFinishX( dpy, id );
- if( mCached_dpy != dpy && mCached_dpy != NULL )
- XCloseDisplay( mCached_dpy );
- mCached_dpy = dpy;
- }
-#endif
-}
-
-bool
-TDELauncher::tdeinit_exec(const TQString &app, const TQStringList &args,
- const TQValueList<TQCString> &envs, TQCString startup_id, bool wait)
-{
- TDELaunchRequest *request = new TDELaunchRequest;
- request->autoStart = false;
-
- for(TQStringList::ConstIterator it = args.begin();
- it != args.end();
- it++)
- {
- TQString arg = *it;
- request->arg_list.append(arg.local8Bit());
- }
-
- request->name = app.local8Bit();
-
- if (wait)
- request->dcop_service_type = KService::DCOP_Wait;
- else
- request->dcop_service_type = KService::DCOP_None;
- request->dcop_name = 0;
- request->pid = 0;
-#ifdef Q_WS_X11
- request->startup_id = startup_id;
-#endif
- request->envs = envs;
- if( app != "tdebuildsycoca" ) // avoid stupid loop
- {
- // Find service, if any - strip path if needed
- KService::Ptr service = KService::serviceByDesktopName( app.mid( app.findRev( '/' ) + 1 ));
- if (service != NULL)
- send_service_startup_info( request, service,
- startup_id, TQValueList< TQCString >());
- else // no .desktop file, no startup info
- cancel_service_startup_info( request, startup_id, envs );
- }
- request->transaction = dcopClient()->beginTransaction();
- queueRequest(request);
- return true;
-}
-
-void
-TDELauncher::queueRequest(TDELaunchRequest *request)
-{
- requestQueue.append( request );
- if (!bProcessingQueue)
- {
- bProcessingQueue = true;
- TQTimer::singleShot(0, this, TQT_SLOT( slotDequeue() ));
- }
-}
-
-void
-TDELauncher::slotDequeue()
-{
- do {
- TDELaunchRequest *request = requestQueue.take(0);
- // process request
- request->status = TDELaunchRequest::Launching;
- requestStart(request);
- if (request->status != TDELaunchRequest::Launching)
- {
- // Request handled.
- requestDone( request );
- continue;
- }
- } while(requestQueue.count());
- bProcessingQueue = false;
-}
-
-void
-TDELauncher::createArgs( TDELaunchRequest *request, const KService::Ptr service ,
- const TQStringList &urls)
-{
- TQStringList params = KRun::processDesktopExec(*service, urls, false);
-
- for(TQStringList::ConstIterator it = params.begin();
- it != params.end(); ++it)
- {
- request->arg_list.append((*it).local8Bit());
- }
- request->cwd = TQFile::encodeName(service->path());
-}
-
-///// IO-Slave functions
-
-pid_t
-TDELauncher::requestHoldSlave(const KURL &url, const TQString &app_socket)
-{
- IdleSlave *slave;
- for(slave = mSlaveList.first(); slave; slave = mSlaveList.next())
- {
- if (slave->onHold(url))
- break;
- }
- if (slave)
- {
- mSlaveList.removeRef(slave);
- slave->connect(app_socket);
- return slave->pid();
- }
- return 0;
-}
-
-
-pid_t
-TDELauncher::requestSlave(const TQString &protocol,
- const TQString &host,
- const TQString &app_socket,
- TQString &error)
-{
- IdleSlave *slave;
- for(slave = mSlaveList.first(); slave; slave = mSlaveList.next())
- {
- if (slave->match(protocol, host, true))
- break;
- }
- if (!slave)
- {
- for(slave = mSlaveList.first(); slave; slave = mSlaveList.next())
- {
- if (slave->match(protocol, host, false))
- break;
- }
- }
- if (!slave)
- {
- for(slave = mSlaveList.first(); slave; slave = mSlaveList.next())
- {
- if (slave->match(protocol, TQString::null, false))
- break;
- }
- }
- if (slave)
- {
- mSlaveList.removeRef(slave);
- slave->connect(app_socket);
- return slave->pid();
- }
-
- TQString _name = KProtocolInfo::exec(protocol);
- if (_name.isEmpty())
- {
- error = i18n("Unknown protocol '%1'.\n").arg(protocol);
- return 0;
- }
-
- TQCString name = _name.latin1(); // ex: "tdeio_ftp"
- TQCString arg1 = protocol.latin1();
- TQCString arg2 = TQFile::encodeName(mPoolSocketName);
- TQCString arg3 = TQFile::encodeName(app_socket);
- TQValueList<TQCString> arg_list;
- arg_list.append(arg1);
- arg_list.append(arg2);
- arg_list.append(arg3);
-
-// kdDebug(7016) << "TDELauncher: launching new slave " << _name << " with protocol=" << protocol << endl;
- if (mSlaveDebug == arg1)
- {
- tdelauncher_header request_header;
- request_header.cmd = LAUNCHER_DEBUG_WAIT;
- request_header.arg_length = 0;
- write(tdeinitSocket, &request_header, sizeof(request_header));
- }
- if (mSlaveValgrind == arg1)
- {
- arg_list.prepend(TQFile::encodeName(KLibLoader::findLibrary(name)));
- arg_list.prepend(TQFile::encodeName(locate("exe", "tdeioslave")));
- name = "valgrind";
- if (!mSlaveValgrindSkin.isEmpty()) {
- arg_list.prepend(TQCString("--tool=") + mSlaveValgrindSkin);
- } else
- arg_list.prepend("--tool=memcheck");
- }
-
- TDELaunchRequest *request = new TDELaunchRequest;
- request->autoStart = false;
- request->name = name;
- request->arg_list = arg_list;
- request->dcop_name = 0;
- request->dcop_service_type = KService::DCOP_None;
- request->pid = 0;
-#ifdef Q_WS_X11
- request->startup_id = "0";
-#endif
- request->status = TDELaunchRequest::Launching;
- request->transaction = 0; // No confirmation is send
- requestStart(request);
- pid_t pid = request->pid;
-
-// kdDebug(7016) << "Slave launched, pid = " << pid << endl;
-
- // We don't care about this request any longer....
- requestDone(request);
- if (!pid)
- {
- error = i18n("Error loading '%1'.\n").arg(TQString(name));
- }
- return pid;
-}
-
-void
-TDELauncher::waitForSlave(pid_t pid)
-{
- IdleSlave *slave;
- for(slave = mSlaveList.first(); slave; slave = mSlaveList.next())
- {
- if (slave->pid() == pid)
- return; // Already here.
- }
- SlaveWaitRequest *waitRequest = new SlaveWaitRequest;
- waitRequest->transaction = dcopClient()->beginTransaction();
- waitRequest->pid = pid;
- mSlaveWaitRequest.append(waitRequest);
-}
-
-void
-TDELauncher::acceptSlave(TDESocket *slaveSocket)
-{
- IdleSlave *slave = new IdleSlave(slaveSocket);
- // Send it a SLAVE_STATUS command.
- mSlaveList.append(slave);
- connect(slave, TQT_SIGNAL(destroyed()), this, TQT_SLOT(slotSlaveGone()));
- connect(slave, TQT_SIGNAL(statusUpdate(IdleSlave *)),
- this, TQT_SLOT(slotSlaveStatus(IdleSlave *)));
- if (!mTimer.isActive())
- {
- mTimer.start(1000*10);
- }
-}
-
-void
-TDELauncher::slotSlaveStatus(IdleSlave *slave)
-{
- SlaveWaitRequest *waitRequest = mSlaveWaitRequest.first();
- while(waitRequest)
- {
- if (waitRequest->pid == slave->pid())
- {
- TQByteArray replyData;
- TQCString replyType;
- replyType = "void";
- dcopClient()->endTransaction( waitRequest->transaction, replyType, replyData);
- mSlaveWaitRequest.removeRef(waitRequest);
- waitRequest = mSlaveWaitRequest.current();
- }
- else
- {
- waitRequest = mSlaveWaitRequest.next();
- }
- }
-}
-
-void
-TDELauncher::slotSlaveGone()
-{
- IdleSlave *slave = (IdleSlave *) sender();
- mSlaveList.removeRef(slave);
- if ((mSlaveList.count() == 0) && (mTimer.isActive()))
- {
- mTimer.stop();
- }
-}
-
-void
-TDELauncher::idleTimeout()
-{
- bool keepOneFileSlave=true;
- time_t now = time(0);
- IdleSlave *slave;
- for(slave = mSlaveList.first(); slave; slave = mSlaveList.next())
- {
- if ((slave->protocol()=="file") && (keepOneFileSlave))
- keepOneFileSlave=false;
- else if (slave->age(now) > SLAVE_MAX_IDLE)
- {
- // killing idle slave
- delete slave;
- }
- }
-}
-
-#include "tdelauncher.moc"
diff --git a/kinit/tdelauncher.h b/kinit/tdelauncher.h
deleted file mode 100644
index 791958980..000000000
--- a/kinit/tdelauncher.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 1999 Waldo Bastian <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef _KLAUNCHER_H_
-#define _KLAUNCHER_H_
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <time.h>
-#include <tqstring.h>
-#include <tqvaluelist.h>
-#include <tqsocketnotifier.h>
-#include <tqptrlist.h>
-#include <tqtimer.h>
-
-#include <dcopclient.h>
-#include <tdeio/connection.h>
-#include <ksock.h>
-#include <kurl.h>
-#include <kuniqueapplication.h>
-
-#include <kservice.h>
-
-#include "autostart.h"
-
-class IdleSlave : public TQObject
-{
- Q_OBJECT
-public:
- IdleSlave(TDESocket *socket);
- bool match( const TQString &protocol, const TQString &host, bool connected);
- void connect( const TQString &app_socket);
- pid_t pid() const { return mPid;}
- int age(time_t now);
- void reparseConfiguration();
- bool onHold(const KURL &url);
- TQString protocol() const {return mProtocol;}
-
-signals:
- void statusUpdate(IdleSlave *);
-
-protected slots:
- void gotInput();
-
-protected:
- TDEIO::Connection mConn;
- TQString mProtocol;
- TQString mHost;
- bool mConnected;
- pid_t mPid;
- time_t mBirthDate;
- bool mOnHold;
- KURL mUrl;
-};
-
-class SlaveWaitRequest
-{
-public:
- pid_t pid;
- DCOPClientTransaction *transaction;
-};
-
-class TDELaunchRequest
-{
-public:
- TQCString name;
- TQValueList<TQCString> arg_list;
- TQCString dcop_name;
- enum status_t { Init = 0, Launching, Running, Error, Done };
- pid_t pid;
- status_t status;
- DCOPClientTransaction *transaction;
- KService::DCOPServiceType_t dcop_service_type;
- bool autoStart;
- TQString errorMsg;
-#ifdef Q_WS_X11
- TQCString startup_id; // "" is the default, "0" for none
- TQCString startup_dpy; // Display to send startup notification to.
-#endif
- TQValueList<TQCString> envs; // env. variables to be app's environment
- TQCString cwd;
-};
-
-struct serviceResult
-{
- int result; // 0 means success. > 0 means error (-1 means pending)
- TQCString dcopName; // Contains DCOP name on success
- TQString error; // Contains error description on failure.
- pid_t pid;
-};
-
-class TDELauncher : public TDEApplication, public DCOPObject
-{
- Q_OBJECT
-
-public:
- TDELauncher(int _tdeinitSocket, bool new_startup);
-
- ~TDELauncher();
-
- void close();
- static void destruct(int exit_code); // exit!
-
- // DCOP
- virtual bool process(const TQCString &fun, const TQByteArray &data,
- TQCString &replyType, TQByteArray &replyData);
- virtual QCStringList functions();
- virtual QCStringList interfaces();
-
-protected:
- void processDied(pid_t pid, long exitStatus);
-
- void requestStart(TDELaunchRequest *request);
- void requestDone(TDELaunchRequest *request);
-
- void setLaunchEnv(const TQCString &name, const TQCString &value);
- void exec_blind(const TQCString &name, const TQValueList<TQCString> &arg_list,
- const TQValueList<TQCString> &envs, const TQCString& startup_id = "" );
- bool start_service(KService::Ptr service, const TQStringList &urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id = "",
- bool blind = false, bool autoStart = false );
- bool start_service_by_name(const TQString &serviceName, const TQStringList &urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind);
- bool start_service_by_desktop_path(const TQString &serviceName, const TQStringList &urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind);
- bool start_service_by_desktop_name(const TQString &serviceName, const TQStringList &urls,
- const TQValueList<TQCString> &envs, const TQCString& startup_id, bool blind);
- bool tdeinit_exec(const TQString &app, const TQStringList &args,
- const TQValueList<TQCString> &envs, TQCString startup_id, bool wait);
-
- void waitForSlave(pid_t pid);
-
- void autoStart(int phase);
-
- void createArgs( TDELaunchRequest *request, const KService::Ptr service,
- const TQStringList &url);
-
- pid_t requestHoldSlave(const KURL &url, const TQString &app_socket);
- pid_t requestSlave(const TQString &protocol, const TQString &host,
- const TQString &app_socket, TQString &error);
-
-
- void queueRequest(TDELaunchRequest *);
-
- void send_service_startup_info( TDELaunchRequest *request, KService::Ptr service, const TQCString& startup_id,
- const TQValueList<TQCString> &envs );
- void cancel_service_startup_info( TDELaunchRequest *request, const TQCString& startup_id,
- const TQValueList<TQCString> &envs );
-
-public slots:
- void slotAutoStart();
- void slotDequeue();
- void slotKDEInitData(int);
- void slotAppRegistered(const TQCString &appId);
- void slotSlaveStatus(IdleSlave *);
- void acceptSlave( TDESocket *);
- void slotSlaveGone();
- void idleTimeout();
-
-protected:
- TQPtrList<TDELaunchRequest> requestList; // Requests being handled
- TQPtrList<TDELaunchRequest> requestQueue; // Requests waiting to being handled
- int tdeinitSocket;
- TQSocketNotifier *tdeinitNotifier;
- serviceResult DCOPresult;
- TDELaunchRequest *lastRequest;
- TQPtrList<SlaveWaitRequest> mSlaveWaitRequest;
- TQString mPoolSocketName;
- TDEServerSocket *mPoolSocket;
- TQPtrList<IdleSlave> mSlaveList;
- TQTimer mTimer;
- TQTimer mAutoTimer;
- bool bProcessingQueue;
- AutoStart mAutoStart;
- TQCString mSlaveDebug;
- TQCString mSlaveValgrind;
- TQCString mSlaveValgrindSkin;
- bool dontBlockReading;
- bool newStartup;
-#ifdef Q_WS_X11
- Display *mCached_dpy;
-#endif
-};
-#endif
diff --git a/kinit/tdelauncher_cmds.h b/kinit/tdelauncher_cmds.h
deleted file mode 100644
index 5763e5a38..000000000
--- a/kinit/tdelauncher_cmds.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 1999 Waldo Bastian <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef _KLAUNCHER_CMDS_H_
-#define _KLAUNCHER_CMDS_H_
-
-typedef struct
-{
- long cmd;
- long arg_length;
-} tdelauncher_header;
-
-/* Launcher commands: */
-
-#define LAUNCHER_EXEC 1
-/*
- * LAUNCHER_EXEC
- *
- * Start a new process. Try using LAUNCHER_EXEC_NEW instead.
- * There will be no app startup notification.
- *
- * long argc: number of arguments
- * char *args: arguments, argument 0 is the program to start.
- */
-
-
-#define LAUNCHER_SETENV 2
-/*
- * LAUNCHER_SETENV
- *
- * Change environment of future processes launched via tdeinit.
- * DON'T use this if you want to change environment only for one
- * application you're going to start.
- *
- * char *env_name;
- * char *env_value;
- */
-
-#define LAUNCHER_DIED 3
-/*
- * LAUNCHER_DIED
- *
- * Notification A child of tdeinit died.
- *
- * long pid;
- * long exit_code;
- */
-
-#define LAUNCHER_OK 4
-/*
- * LAUNCHER_OK
- *
- * Notification Last process launched ok.
- *
- * long pid;
- */
-
-#define LAUNCHER_ERROR 5
-/*
- * LAUNCHER_ERROR
- *
- * Notification Last process could not be launched.
- *
- * char *error msg (utf8)
- */
-
-#define LAUNCHER_SHELL 6
-/*
- * LAUNCHER_SHELL
- *
- * Start a new process and use given environment.
- * Starts app-startup notification.
- *
- * long argc: number of arguments
- * char *args: arguments, argument 0 is the program to start.
- * char *cwd: Working directory.
- * long envc: number of environment vars
- * char *envs: environment strings.
- * int avoid_loops : avoid using the first path in $PATH where
- * this process binary is found in order to avoid
- * infinite loop by binary->tdeinit_wrapper link in $PATH
- * char* startup_id: app startup notification id, "0" for none,
- * "" ( empty string ) is the default
- */
-
-#define LAUNCHER_TERMINATE_KDE 7
-
-/*
- * LAUNCHER_TERMINATE_TDEINIT
- *
- * Suicide is painless
- */
-#define LAUNCHER_TERMINATE_TDEINIT 8
-
-#define LAUNCHER_DEBUG_WAIT 9
-/*
- * LAUNCHER_DEBUG_WAIT
- *
- * Next process started will do a sleep(1000000)
- * before calling main()/kdemain()
- *
- * (Used for debugging io-slaves)
- */
-
-#define LAUNCHER_EXT_EXEC 10
-/*
- * LAUNCHER_EXT_EXEC
- *
- * Start a new process. The given environment variables will
- * be added to its environment before starting it.
- * Starts app-startup notification.
- *
- * long argc: number of arguments
- * char *args: arguments, argument 0 is the program to start.
- * long envc: number of environment vars
- * char *envs: environment strings.
- * int avoid_loops : avoid using the first path in $PATH where
- * this process binary is found in order to avoid
- * infinite loop by binary->tdeinit_wrapper link in $PATH
- * char* startup_id: app startup notification id, "0" for none,
- * "" ( empty string ) is the default
- *
- */
-
-
-#define LAUNCHER_KWRAPPER 11
-/*
- * LAUNCHER_KWRAPPER
- *
- * Start a new process, use given environment, pass signals and output.
- * Starts app-startup notification.
- *
- * long argc: number of arguments
- * char *args: arguments, argument 0 is the program to start.
- * char *cwd: Working directory.
- * long envc: number of environment vars
- * char *envs: environment strings.
- * char *tty: tty to redirect stdout/stderr to.
- * int avoid_loops : avoid using the first path in $PATH where
- * this process binary is found in order to avoid
- * infinite loop by binary->tdeinit_wrapper link in $PATH
- * char* startup_id: app startup notification id, "0" for none,
- * "" ( empty string ) is the default
- */
-
-#define LAUNCHER_EXEC_NEW 12
-/*
- * LAUNCHER_EXEC_NEW
- *
- * Start a new process. An improved version of LAUNCHER_EXEC.
- * The given environment variables will be added
- * to its environment before starting it.
- * There will be no app startup notification.
- *
- * long argc: number of arguments
- * char *args: arguments, argument 0 is the program to start.
- * long envc: number of environment vars
- * char *envs: environment strings.
- * int avoid_loops : avoid using the first path in $PATH where
- * this process binary is found in order to avoid
- * infinite loop by binary->tdeinit_wrapper link in $PATH
- */
-
-#define LAUNCHER_FD 42
-/*
- * File descriptor to use for communication with tdeinit.
- */
-
-#endif
diff --git a/kinit/tdelauncher_main.cpp b/kinit/tdelauncher_main.cpp
deleted file mode 100644
index 747050668..000000000
--- a/kinit/tdelauncher_main.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 1999 Waldo Bastian <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include "config.h"
-
-#include <unistd.h>
-#include <fcntl.h>
-
-#include "tdeapplication.h"
-#include "tdelauncher.h"
-#include "tdecmdlineargs.h"
-#include "kcrash.h"
-#include "kdebug.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <tqcstring.h>
-#include <tdelocale.h>
-
-#include "tdelauncher_cmds.h"
-
-static void sig_handler(int sig_num)
-{
- // No recursion
- signal( SIGHUP, SIG_IGN);
- signal( SIGTERM, SIG_IGN);
- fprintf(stderr, "[tdelauncher] Exiting on signal %d\n", sig_num);
- TDELauncher::destruct(255);
-}
-
-static TDECmdLineOptions options[] =
-{
- { "new-startup", "Internal", 0 },
- TDECmdLineLastOption
-};
-
-extern "C" KDE_EXPORT int kdemain( int argc, char**argv )
-{
- // Started via tdeinit.
- if (fcntl(LAUNCHER_FD, F_GETFD) == -1)
- {
- fprintf(stderr, "%s", i18n("[tdelauncher] This program is not supposed to be started manually.\n"
- "[tdelauncher] It is started automatically by tdeinit.\n").local8Bit().data());
- return 1;
- }
-
- TQCString cname = TDEApplication::launcher();
- char *name = cname.data();
- TDECmdLineArgs::init(argc, argv, name, "TDELauncher", "A service launcher.",
- "v1.0");
-
- TDELauncher::addCmdLineOptions();
- TDECmdLineArgs::addCmdLineOptions( options );
-
- // WABA: Make sure not to enable session management.
- putenv(strdup("SESSION_MANAGER="));
-
- // Allow the locale to initialize properly
- TDELocale::setMainCatalogue("tdelibs");
-
- TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
-
- int maxTry = 3;
- while(true)
- {
- TQCString dcopName = TDEApplication::dcopClient()->registerAs(name, false);
- if (dcopName.isEmpty())
- {
- kdWarning() << "[tdelauncher] DCOP communication problem!" << endl;
- return 1;
- }
- if (dcopName == cname)
- break; // Good!
-
- if (--maxTry == 0)
- {
- kdWarning() << "[tdelauncher] Another instance of tdelauncher is already running!" << endl;
- return 1;
- }
-
- // Wait a bit...
- kdWarning() << "[tdelauncher] Waiting for already running tdelauncher to exit." << endl;
- sleep(1);
-
- // Try again...
- }
-
- TDELauncher *launcher = new TDELauncher(LAUNCHER_FD, args->isSet("new-startup"));
- launcher->dcopClient()->setDefaultObject( name );
- launcher->dcopClient()->setDaemonMode( true );
-
- TDECrash::setEmergencySaveFunction(sig_handler);
- signal( SIGHUP, sig_handler);
- signal( SIGPIPE, SIG_IGN);
- signal( SIGTERM, sig_handler);
-
- launcher->exec();
- return 0;
-}
-
diff --git a/kinit/tdestartupconfig.cpp b/kinit/tdestartupconfig.cpp
deleted file mode 100644
index 373ac6787..000000000
--- a/kinit/tdestartupconfig.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/****************************************************************************
-
- Copyright (C) 2005 Lubos Lunak <[email protected]>
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-****************************************************************************/
-
-/*
-
-This utility helps to have some configuration options available in starttde
-without the need to launch anything linked to KDE libraries (which may need
-some time to load).
-
-The configuration options are written to $TDEHOME/share/config/startupconfigkeys,
-one option per line, as <file> <group> <key> <default>. It is possible to
-use ' for quoting multiword entries. Values of these options will be written
-to $TDEHOME/share/config/startupconfig as a shell script that will set
-the values to shell variables, named <file>_<group>_<key> (all spaces replaced
-by underscores, everything lowercase). So e.g. line
-"ksplashrc KSplash Theme Default" may result in "ksplashrc_ksplash_theme=Default".
-
-In order to real a whole group it is possible to use <file> <[group]>, e.g.
-"ksplashrc [KSplash]", which will set shell variables for all keys in the group.
-It is not possible to specify default values, but since the configuration options
-are processed in the order they are specified this can be solved by first
-specifying a group and then all the entries that need default values.
-
-When a tdeconf_update script is used to update such option, tdestartupconfig is run
-before tdeconf_update and therefore cannot see the change in time. To avoid this
-problem, together with the tdeconf_update script also the matching global config
-file should be updated (any change, tdestartupconfig will see the timestamp change).
-
-Note that the kdeglobals config file is not used as a depedendency for other config
-files.
-
-Since the checking is timestamp-based, config files that are frequently updated
-should not be used.
-
-Kstartupconfig works by storing every line from startupconfigkeys in file startupconfigfiles
-followed by paths of all files that are relevant to the option. Non-existent files
-have '!' prepended (for the case they'll be later created), the list of files is
-terminated by line containing '*'. If the timestamps of all relevant files are older
-than the timestamp of the startupconfigfile file, there's no need to update anything.
-Otherwise tdedostartupconfig is launched to create or update all the necessary files
-(which already requires loading KDE libraries, but this case should be rare).
-
-*/
-
-#include <config.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-int main()
- {
- char tdehome[ 1024 ];
- if( getenv( "TDEHOME" ))
- strlcpy( tdehome, getenv( "TDEHOME" ), 1024 );
- else if( getenv( "HOME" ))
- {
- strlcpy( tdehome, getenv( "HOME" ), 1024 );
- strlcat( tdehome, "/.trinity", 1024 );
- }
- else
- return 1;
- char filename[ 1024 ];
- strlcpy( filename, tdehome, 1024 );
- strlcat( filename, "/share/config/startupconfig", 1024 );
- if( access( filename, R_OK ) != 0 )
- {
- int ret = system( "tdedostartupconfig" );
- return WEXITSTATUS( ret );
- }
- strlcpy( filename, tdehome, 1024 );
- strlcat( filename, "/share/config/startupconfigfiles", 1024 );
- struct stat st;
- if( stat( filename, &st ) != 0 )
- {
- int ret = system( "tdedostartupconfig" );
- return WEXITSTATUS( ret );
- }
- time_t config_time = st.st_mtime;
- FILE* config = fopen( filename, "r" );
- if( config == NULL )
- {
- int ret = system( "tdedostartupconfig" );
- return WEXITSTATUS( ret );
- }
- strlcpy( filename, tdehome, 1024 );
- strlcat( filename, "/share/config/startupconfigkeys", 1024 );
- FILE* keys = fopen( filename, "r" );
- if( keys == NULL )
- {
- fclose( config );
- return 2;
- }
- bool need_update = true;
- for(;;)
- {
- char keyline[ 1024 ];
- if( fgets( keyline, 1023, keys ) == NULL )
- {
- need_update = false;
- break;
- }
- if( char* nl = strchr( keyline, '\n' ))
- *nl = '\0';
- char line[ 1024 ];
- if( fgets( line, 1023, config ) == NULL )
- break;
- if( char* nl = strchr( line, '\n' ))
- *nl = '\0';
- if( strcmp( keyline, line ) != 0 )
- break;
- bool ok = false;
- for(;;)
- {
- if( fgets( line, 1023, config ) == NULL )
- break;
- if( char* nl = strchr( line, '\n' ))
- *nl = '\0';
- if( *line == '\0' )
- break;
- if( *line == '*' )
- {
- ok = true;
- break;
- }
- if( *line == '!' )
- {
- if( access( line + 1, R_OK ) == 0 )
- break; // file now exists -> update
- }
- else
- {
- struct stat st;
- if( stat( line, &st ) != 0 )
- break;
- if( st.st_mtime > config_time )
- break;
- }
- }
- if( !ok )
- break;
- }
- fclose( keys );
- fclose( config );
- if( need_update )
- {
- int ret = system( "tdedostartupconfig" );
- return WEXITSTATUS( ret );
- }
- return 0;
- }
diff --git a/kinit/tests/Makefile.am b/kinit/tests/Makefile.am
deleted file mode 100644
index e1157bf72..000000000
--- a/kinit/tests/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-# $Id$
-
-INCLUDES= -I$(srcdir)/../.. $(all_includes)
-####### Files
-
-check_PROGRAMS = tdelaunchertest
-
-tdelaunchertest_SOURCES = tdelaunchertest.cpp
-tdelaunchertest_LDADD = $(LIB_KIO)
-
diff --git a/kinit/tests/tdelaunchertest.cpp b/kinit/tests/tdelaunchertest.cpp
deleted file mode 100644
index 07eaf21f7..000000000
--- a/kinit/tests/tdelaunchertest.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- This file is part of KDE
-
- Copyright (C) 1998 Waldo Bastian ([email protected])
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as published by the Free Software Foundation.
-
- This software is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this library; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include <tqstring.h>
-#include <tdeapplication.h>
-#include <dcopclient.h>
-#include <stdio.h>
-#include <tqvaluelist.h>
-#include <kservice.h>
-
-
-int main(int argc, char *argv[])
-{
- TDEApplication::tdeinitExec("konsole");
-
- TDEApplication k(argc, argv, "tdelaunchertest");
-
- kapp->dcopClient()->registerAs( kapp->name()) ;
-
-#if 0
- TQString error;
- TQCString dcopService;
- int pid;
- int result = TDEApplication::startServiceByDesktopName(
- TQString::fromLatin1("konsole"), TQString::null, &error, &dcopService, &pid );
-
- printf("Result = %d, error = \"%s\", dcopService = \"%s\", pid = %d\n",
- result, error.ascii(), dcopService.data(), pid);
-
- result = TDEApplication::startServiceByDesktopName(
- TQString::fromLatin1("konqueror"), TQString::null, &error, &dcopService, &pid );
-
- printf("Result = %d, error = \"%s\", dcopService = \"%s\", pid = %d\n",
- result, error.ascii(), dcopService.data(), pid);
-#endif
-}
-
diff --git a/kinit/wrapper.c b/kinit/wrapper.c
deleted file mode 100644
index d22ba5080..000000000
--- a/kinit/wrapper.c
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- This file is part of the KDE libraries
- Copyright (c) 1999 Waldo Bastian <[email protected]>
- (c) 1999 Mario Weilguni <[email protected]>
- (c) 2001 Lubos Lunak <[email protected]>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#include <config.h>
-
-#include "tdelauncher_cmds.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <signal.h>
-
-extern char **environ;
-
-static char *getDisplay()
-{
- const char *display;
- char *result;
- char *screen;
- char *colon;
- char *i;
-/*
- don't test for a value from tqglobal.h but instead distinguish
- Qt/X11 from Qt/Embedded by the fact that Qt/E apps have -DQWS
- on the commandline (which in tqglobal.h however triggers Q_WS_QWS,
- but we don't want to include that here) (Simon)
-#ifdef Q_WS_X11
- */
-#if !defined(QWS)
- display = getenv("DISPLAY");
-#else
- display = getenv("QWS_DISPLAY");
-#endif
- if (!display || !*display)
- {
- display = ":0";
- }
- result = malloc(strlen(display)+1);
- if (result == NULL)
- return NULL;
-
- strcpy(result, display);
- screen = strrchr(result, '.');
- colon = strrchr(result, ':');
- if (screen && (screen > colon))
- *screen = '\0';
- while((i = strchr(result, ':')))
- *i = '_';
- return result;
-}
-
-/*
- * Write 'len' bytes from 'buffer' into 'sock'.
- * returns 0 on success, -1 on failure.
- */
-static int write_socket(int sock, char *buffer, int len)
-{
- ssize_t result;
- int bytes_left = len;
- while ( bytes_left > 0)
- {
- result = write(sock, buffer, bytes_left);
- if (result > 0)
- {
- buffer += result;
- bytes_left -= result;
- }
- else if (result == 0)
- return -1;
- else if ((result == -1) && (errno != EINTR) && (errno != EAGAIN))
- return -1;
- }
- return 0;
-}
-
-/*
- * Read 'len' bytes from 'sock' into 'buffer'.
- * returns 0 on success, -1 on failure.
- */
-static int read_socket(int sock, char *buffer, int len)
-{
- ssize_t result;
- int bytes_left = len;
- while ( bytes_left > 0)
- {
- result = read(sock, buffer, bytes_left);
- if (result > 0)
- {
- buffer += result;
- bytes_left -= result;
- }
- else if (result == 0)
- return -1;
- else if ((result == -1) && (errno != EINTR) && (errno != EAGAIN))
- return -1;
- }
- return 0;
-}
-
-static int openSocket()
-{
- kde_socklen_t socklen;
- int s;
- struct sockaddr_un server;
-#define MAX_SOCK_FILE 255
- char sock_file[MAX_SOCK_FILE + 1];
- const char *home_dir = getenv("HOME");
- const char *kde_home = getenv("TDEHOME");
- char *display;
-
- sock_file[0] = sock_file[MAX_SOCK_FILE] = 0;
-
- if (!kde_home || !kde_home[0])
- {
- kde_home = "~/.trinity/";
- }
-
- if (kde_home[0] == '~')
- {
- if (!home_dir || !home_dir[0])
- {
- fprintf(stderr, "[tdeinit wrapper] Warning: $HOME not set!\n");
- return -1;
- }
- if (strlen(home_dir) > (MAX_SOCK_FILE-100))
- {
- fprintf(stderr, "[tdeinit wrapper] Warning: Home directory path too long!\n");
- return -1;
- }
- kde_home++;
- strncpy(sock_file, home_dir, MAX_SOCK_FILE);
- }
- strncat(sock_file, kde_home, MAX_SOCK_FILE - strlen(sock_file));
-
- /** Strip trailing '/' **/
- if ( sock_file[strlen(sock_file)-1] == '/')
- sock_file[strlen(sock_file)-1] = 0;
-
- strncat(sock_file, "/socket-", MAX_SOCK_FILE - strlen(sock_file));
- if( getenv("XAUTHLOCALHOSTNAME"))
- strncat(sock_file, getenv("XAUTHLOCALHOSTNAME"), MAX_SOCK_FILE - strlen(sock_file) - 1);
- else if (gethostname(sock_file+strlen(sock_file), MAX_SOCK_FILE - strlen(sock_file) - 1) != 0)
- {
- perror("[tdeinit wrapper] Warning: Could not determine hostname: ");
- return -1;
- }
- sock_file[sizeof(sock_file)-1] = '\0';
-
- /* append $DISPLAY */
- display = getDisplay();
- if (display == NULL)
- {
- fprintf(stderr, "[tdeinit wrapper] Error: Could not determine display.\n");
- return -1;
- }
-
- if (strlen(sock_file)+strlen(display)+strlen("/tdeinit_")+2 > MAX_SOCK_FILE)
- {
- fprintf(stderr, "[tdeinit wrapper] Warning: Socket name will be too long.\n");
- free (display);
- return -1;
- }
- strcat(sock_file, "/tdeinit_");
- strcat(sock_file, display);
- free(display);
-
- if (strlen(sock_file) >= sizeof(server.sun_path))
- {
- fprintf(stderr, "[tdeinit wrapper] Warning: Path of socket file exceeds UNIX_PATH_MAX.\n");
- return -1;
- }
-
- /*
- * create the socket stream
- */
- s = socket(PF_UNIX, SOCK_STREAM, 0);
- if (s < 0)
- {
- perror("[tdeinit wrapper] Warning: socket creation failed: ");
- return -1;
- }
-
- server.sun_family = AF_UNIX;
- strcpy(server.sun_path, sock_file);
- socklen = sizeof(server);
- if(connect(s, (struct sockaddr *)&server, socklen) == -1)
- {
- perror("[tdeinit wrapper] Warning: socket connection failed: ");
- close(s);
- return -1;
- }
- return s;
-}
-
-static pid_t kwrapper_pid;
-static volatile pid_t got_sig; /* = 0 */
-static pid_t last_sig; /* = 0 */
-
-static void sig_pass_handler( int signo );
-static void setup_signals( void );
-
-static void setup_signal_handler( int signo, int clean )
-{
- struct sigaction sa;
- if( clean )
- sa.sa_handler = SIG_DFL;
- else
- sa.sa_handler = sig_pass_handler;
- sigemptyset( &sa.sa_mask );
- sigaddset( &sa.sa_mask, signo );
- sa.sa_flags = 0; /* don't use SA_RESTART */
- sigaction( signo, &sa, 0 );
-}
-
-static void sig_pass_handler( int signo )
-{
- int save_errno = errno;
- if( signo == SIGTSTP )
- kill( kwrapper_pid, SIGSTOP ); /* pass the signal to the real process */
- else /* SIGTSTP wouldn't work ... I don't think is much */
- kill( kwrapper_pid, signo ); /* of a problem */
- got_sig = signo;
- if( got_sig == SIGCONT )
- setup_signals(); /* restore signals */
- errno = save_errno;
-}
-
-static void setup_signals()
-{
- setup_signal_handler( SIGHUP, 0 );
- setup_signal_handler( SIGINT, 0 );
- setup_signal_handler( SIGQUIT, 0 );
- setup_signal_handler( SIGILL, 0 ); /* e.g. this one is probably doesn't make sense to pass */
- setup_signal_handler( SIGABRT, 0 ); /* but anyway ... */
- setup_signal_handler( SIGFPE, 0 );
- /* SIGKILL can't be handled :( */
- setup_signal_handler( SIGSEGV, 0 );
- setup_signal_handler( SIGPIPE, 0 );
- setup_signal_handler( SIGALRM, 0 );
- setup_signal_handler( SIGTERM, 0 );
- setup_signal_handler( SIGUSR1, 0 );
- setup_signal_handler( SIGUSR2, 0 );
- setup_signal_handler( SIGCHLD, 0 ); /* is this a good idea ??? */
- setup_signal_handler( SIGCONT, 0 ); /* SIGSTOP can't be handled, but SIGTSTP and SIGCONT can */
- /* SIGSTOP */ /* which should be enough */
- setup_signal_handler( SIGTSTP, 0 );
- setup_signal_handler( SIGTTIN, 0 ); /* is this a good idea ??? */
- setup_signal_handler( SIGTTOU, 0 ); /* is this a good idea ??? */
- /* some more ? */
-}
-
-static void kwrapper_run( pid_t pid )
-{
- kwrapper_pid = pid;
- setup_signals();
- for(;;)
- {
- sleep( 1 ); /* poll and see if the real process is still alive */
- if( got_sig != last_sig ) /* did we get a signal ? */
- {
- last_sig = got_sig;
- if( got_sig == SIGCHLD )
- ; /* nothing, ignore */
- else if( got_sig == SIGCONT )
- ; /* done in signal handler */
- else /* do the default action ( most of them quit the app ) */
- {
- setup_signal_handler( got_sig, 1 );
- raise( got_sig ); /* handle the signal again */
- }
- }
- if( kill( pid, 0 ) < 0 )
- break;
- }
- /* I'm afraid it won't be that easy to get the return value ... */
-}
-
-int main(int argc, char **argv)
-{
- int i;
- int wrapper = 0;
- int ext_wrapper = 0;
- int kwrapper = 0;
- long arg_count;
- long env_count;
- tdelauncher_header header;
- char *start, *p, *buffer;
- char cwd[8192];
- const char *tty = NULL;
- long avoid_loops = 0;
- const char* startup_id = NULL;
- int sock;
-
- long size = 0;
-
- start = argv[0];
- p = start + strlen(argv[0]);
- while (--p > start)
- {
- if (*p == '/') break;
- }
- if ( p > start)
- p++;
- start = p;
-
- if (strcmp(start, "tdeinit_wrapper") == 0)
- wrapper = 1;
- else if (strcmp(start, "kshell") == 0)
- ext_wrapper = 1;
- else if (strcmp(start, "kwrapper") == 0)
- kwrapper = 1;
- else if (strcmp(start, "tdeinit_shutdown") == 0)
- {
- if( argc > 1)
- {
- fprintf(stderr, "[tdeinit wrapper] Usage: %s\n\n", start);
- fprintf(stderr, "[tdeinit wrapper] Shuts down tdeinit master process and terminates all processes spawned from it.\n");
- exit( 255 );
- }
- sock = openSocket();
- if( sock < 0 )
- {
- fprintf( stderr, "[tdeinit wrapper] Error: Can't contact tdeinit!\n" );
- exit( 255 );
- }
- header.cmd = LAUNCHER_TERMINATE_KDE;
- header.arg_length = 0;
- write_socket(sock, (char *) &header, sizeof(header));
- return 0;
- }
-
- if (wrapper || ext_wrapper || kwrapper)
- {
- argv++;
- argc--;
- if (argc < 1)
- {
- fprintf(stderr, "[tdeinit wrapper] Usage: %s <application> [<args>]\n", start);
- exit(255); /* usage should be documented somewhere ... */
- }
- start = argv[0];
- }
-
- sock = openSocket();
- if( sock < 0 ) /* couldn't contact tdeinit, start argv[ 0 ] directly */
- {
- execvp( argv[ 0 ], argv );
- fprintf( stderr, "[tdeinit wrapper] Error: Can't run %s !\n", argv[ 0 ] );
- exit( 255 );
- }
-
- if( !wrapper && !ext_wrapper && !kwrapper )
- { /* was called as a symlink */
- avoid_loops = 1;
-#if defined(WE_ARE_KWRAPPER)
- kwrapper = 1;
-#elif defined(WE_ARE_KSHELL)
- ext_wrapper = 1;
-#else
- wrapper = 1;
-#endif
- }
-
- arg_count = argc;
-
- size += sizeof(long); /* Number of arguments*/
-
- size += strlen(start)+1; /* Size of first argument. */
-
- for(i = 1; i < argc; i++)
- {
- size += strlen(argv[i])+1;
- }
- if( wrapper )
- {
- size += sizeof(long); /* empty envs */
- }
- if (ext_wrapper || kwrapper)
- {
- if (!getcwd(cwd, 8192))
- cwd[0] = '\0';
- size += strlen(cwd)+1;
-
- env_count = 0;
- size += sizeof(long); /* Number of env.vars. */
-
- for(; environ[env_count] ; env_count++)
- {
- int l = strlen(environ[env_count])+1;
- size += l;
- }
-
- if( kwrapper )
- {
- tty = ttyname(1);
- if (!tty || !isatty(2))
- tty = "";
- size += strlen(tty)+1;
- }
- }
-
- size += sizeof( avoid_loops );
-
- if( !wrapper )
- {
- startup_id = getenv( "DESKTOP_STARTUP_ID" );
- if( startup_id == NULL )
- startup_id = "";
- size += strlen( startup_id ) + 1;
- }
-
- if (wrapper)
- header.cmd = LAUNCHER_EXEC_NEW;
- else if (kwrapper)
- header.cmd = LAUNCHER_KWRAPPER;
- else
- header.cmd = LAUNCHER_SHELL;
- header.arg_length = size;
- write_socket(sock, (char *) &header, sizeof(header));
-
- buffer = (char *) malloc(size);
- if (buffer == NULL)
- {
- fprintf(stderr, "[tdeinit wrapper] Error: malloc() failed.");
- exit(255);
- }
- p = buffer;
-
- memcpy(p, &arg_count, sizeof(arg_count));
- p += sizeof(arg_count);
-
- memcpy(p, start, strlen(start)+1);
- p += strlen(start)+1;
-
- for(i = 1; i < argc; i++)
- {
- memcpy(p, argv[i], strlen(argv[i])+1);
- p += strlen(argv[i])+1;
- }
-
- if( wrapper )
- {
- long dummy = 0;
- memcpy(p, &dummy, sizeof(dummy)); /* empty envc */
- p+= sizeof( dummy );
- }
- if (ext_wrapper || kwrapper)
- {
- memcpy(p, cwd, strlen(cwd)+1);
- p+= strlen(cwd)+1;
-
- memcpy(p, &env_count, sizeof(env_count));
- p+= sizeof(env_count);
-
- for(i = 0; i < env_count; i++)
- {
- int l = strlen(environ[i])+1;
- memcpy(p, environ[i], l);
- p += l;
- }
-
- if( kwrapper )
- {
- memcpy(p, tty, strlen(tty)+1);
- p+=strlen(tty)+1;
- }
- }
-
- memcpy( p, &avoid_loops, sizeof( avoid_loops ));
- p += sizeof( avoid_loops );
-
- if( !wrapper )
- {
- memcpy(p, startup_id, strlen(startup_id)+1);
- p+= strlen(startup_id)+1;
- }
-
- if( p - buffer != size ) /* should fail only if you change this source and do */
- /* a stupid mistake, it should be assert() actually */
- {
- fprintf(stderr, "[tdeinit wrapper] Oops. Invalid format.\n");
- exit(255);
- }
-
- write_socket(sock, buffer, size);
- free( buffer );
-
- if (read_socket(sock, (char *) &header, sizeof(header))==-1)
- {
- fprintf(stderr, "[tdeinit wrapper] Communication error.\n");
- exit(255);
- }
-
- if (header.cmd == LAUNCHER_OK)
- {
- long pid;
- buffer = (char *) malloc(header.arg_length);
- if (buffer == NULL)
- {
- fprintf(stderr, "[tdeinit wrapper] Error: malloc() failed\n");
- exit(255);
- }
- read_socket(sock, buffer, header.arg_length);
- pid = *((long *) buffer);
- if ( !(!kwrapper) )
- kwrapper_run( pid );
- }
- else if (header.cmd == LAUNCHER_ERROR)
- {
- fprintf(stderr, "[tdeinit wrapper] Could not launch '%s'.\n", start);
- exit(255);
- }
- else
- {
- fprintf(stderr, "[tdeinit wrapper] Unexpected response (response = %ld).\n", header.cmd);
- exit(255);
- }
- exit(0);
-}