]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
SALOME 7.3.0 pb with tests - patch for PPGP BR_PPGP730
authorvtn <vtn@opencascade.com>
Mon, 8 Sep 2014 07:38:40 +0000 (11:38 +0400)
committervtn <vtn@opencascade.com>
Mon, 8 Sep 2014 07:38:40 +0000 (11:38 +0400)
bin/nameserver.py
bin/server.py

index cb04c3b5edeea029cc8a9b80281f64e9ebe9ed11..f7394d9b3dfd123cd5affb05123939821e7c0f86 100644 (file)
-#!/usr/bin/env python\r
-#  -*- coding: iso-8859-1 -*-\r
-# Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE\r
-#\r
-# Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,\r
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS\r
-#\r
-# This library is free software; you can redistribute it and/or\r
-# modify it under the terms of the GNU Lesser General Public\r
-# License as published by the Free Software Foundation; either\r
-# version 2.1 of the License.\r
-#\r
-# This library is distributed in the hope that it will be useful,\r
-# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-# Lesser General Public License for more details.\r
-#\r
-# You should have received a copy of the GNU Lesser General Public\r
-# License along with this library; if not, write to the Free Software\r
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
-#\r
-# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com\r
-#\r
-\r
-import sys, os, re, socket\r
-#import commands\r
-from server import *\r
-from Utils_Identity import getShortHostName\r
-from launchConfigureParser import verbose\r
-\r
-# -----------------------------------------------------------------------------\r
-\r
-class NamingServer(Server):\r
-   XTERM=""\r
-   USER=os.getenv('USER')\r
-   if USER is None:\r
-      USER='anonymous'\r
-   #os.system("mkdir -m 777 -p /tmp/logs")\r
-   LOGDIR="/tmp/logs/" + USER\r
-\r
-   def initNSArgs(self):\r
-        if sys.platform == "win32":\r
-          # temporarily using home directory for Namning Service logs\r
-          # to be replaced with TEMP later...\r
-          os.environ["BaseDir"]=os.environ["HOME"]\r
-        else:\r
-          os.environ["BaseDir"]="/tmp"\r
-\r
-        try:\r
-          os.mkdir(os.environ["BaseDir"] + "/logs")\r
-          os.chmod(os.environ["BaseDir"] + "/logs", 0777)\r
-        except:\r
-          #print "Can't create " + os.environ["BaseDir"] + "/logs"\r
-          pass\r
-\r
-        upath = os.environ["BaseDir"] + "/logs/";\r
-        if sys.platform == "win32":\r
-           upath += os.environ["Username"];\r
-        else:\r
-           upath += os.environ["USER"];\r
-\r
-        try:\r
-          os.mkdir(upath)\r
-        except:\r
-          #print "Can't create " + upath\r
-          pass\r
-\r
-        if verbose(): print "Name Service... ",\r
-        #hname=os.environ["HOST"] #commands.getoutput("hostname")\r
-        if sys.platform == "win32":\r
-          hname=getShortHostName();\r
-        else:\r
-          hname = socket.gethostname();\r
-        #print "hname=",hname\r
-\r
-        f=open(os.environ["OMNIORB_CONFIG"])\r
-        ss=re.findall("NameService=corbaname::" + hname + ":\d+", f.read())\r
-        if verbose(): print "ss = ", ss,\r
-        f.close()\r
-        sl=ss[0]\r
-        ll = sl.split(':')\r
-        aPort = ll[-1]\r
-        #aPort=(ss.join().split(':'))[2];\r
-        #aPort=re.findall("\d+", ss[0])[0]\r
-\r
-        # \begin{E.A.}\r
-        # put the log files of omniNames in different directory with port reference,\r
-        # it is cleaner on linux and it is a fix for salome since it is impossible to\r
-        # remove the log files if the corresponding omniNames has not been killed.\r
-        # \end{E.A.}\r
-        \r
-        upath += "/omniNames_%s"%(aPort)\r
-        try:\r
-           os.mkdir(upath)\r
-        except:\r
-           #print "Can't create " + upath\r
-           pass\r
-        \r
-        #os.system("touch " + upath + "/dummy")\r
-        for fname in os.listdir(upath):\r
-          try:\r
-             os.remove(upath + "/" + fname)\r
-          except:\r
-            pass\r
-        #os.system("rm -f " + upath + "/omninames* " + upath + "/dummy " + upath + "/*.log")\r
-\r
-        #aSedCommand="s/.*NameService=corbaname::" + hname + ":\([[:digit:]]*\)/\1/"\r
-        #print "sed command = ", aSedCommand\r
-        #aPort = commands.getoutput("sed -e\"" + aSedCommand + "\"" + os.environ["OMNIORB_CONFIG"])\r
-        #print "port=", aPort\r
-        if sys.platform == "win32":\r
-          #print "start omniNames -start " + aPort + " -logdir " + upath\r
-          self.CMD=['omniNames', '-start' , aPort , '-nohostname', '-logdir' , os.path.realpath(upath), '-errlog', os.path.realpath(os.path.join(upath,'omniNameErrors.log'))]\r
-          #os.system("start omniNames -start " + aPort + " -logdir " + upath)\r
-        else:\r
-          #self.CMD=['omniNames -start ' , aPort , ' -logdir ' , upath , ' &']\r
-          self.CMD=['omniNames','-start' , aPort, '-logdir' , upath, '-errlog', upath+'/omniNameErrors.log']\r
-          #os.system("omniNames -start " + aPort + " -logdir " + upath + " &")\r
-\r
-        if verbose(): print "... ok"\r
-        if verbose(): print "to list contexts and objects bound into the context with the specified name : showNS "\r
-\r
-\r
-   def initArgs(self):\r
-        Server.initArgs(self)\r
-        if sys.platform == "win32":\r
-          env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("PATH")]\r
-        else:\r
-          env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")]\r
-        self.CMD=['xterm', '-e']+ env_ld_library_path + ['python']\r
-        self.initNSArgs()\r
-\r
-# In LifeCycleCORBA, FactoryServer is started with rsh on the requested\r
-#    computer if this Container does not exist. Default is localhost.\r
-#    Others Containers are started with start_impl method of FactoryServer Container.\r
-# For using rsh it is necessary to have in the ${HOME} directory a .rhosts file\r
-# Warning : on RedHat the file /etc/hosts contains by default a line like :\r
-# 127.0.0.1               bordolex bordolex.paris1.matra-dtv.fr localhost.localdomain localhost  \r
-#   (bordolex is the station name). omniNames on bordolex will be accessible from other\r
-#   computers only if the computer name is removed on that line like :\r
-#   127.0.0.1               bordolex.paris1.matra-dtv.fr localhost.localdomain localhost\r
-\r
-# To start dynamically Containers on several computers you need to\r
-# put in the ${OMNIORB_CONFIG} file a computer name instead of "localhost"\r
-# example : ORBInitRef NameService=corbaname::dm2s0017\r
-\r
-# If you need to use several omniNames running on the same computer, you have to :\r
-#1. put in your ${OMNIORB_CONFIG} file a computer name and port number\r
-# example : ORBInitRef NameService=corbaname::dm2s0017:1515\r
-#2. start omninames with this port number like in orbmodile.py\r
-# example : omniNames -start 1515 -logdir ${BaseDir}/logs/${Username} &\r
-\r
+#!/usr/bin/env python
+#  -*- coding: iso-8859-1 -*-
+# Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+import sys, os, re, socket
+#import commands
+from server import *
+from Utils_Identity import getShortHostName
+from launchConfigureParser import verbose
+
+# -----------------------------------------------------------------------------
+
+class NamingServer(Server):
+   XTERM=""
+   USER=os.getenv('USER')
+   if USER is None:
+      USER='anonymous'
+   #os.system("mkdir -m 777 -p /tmp/logs")
+   LOGDIR="/tmp/logs/" + USER
+
+   def initNSArgs(self):
+        if sys.platform == "win32":
+          # temporarily using home directory for Namning Service logs
+          # to be replaced with TEMP later...
+          os.environ["BaseDir"]=os.environ["HOME"]
+        else:
+          os.environ["BaseDir"]="/tmp"
+
+        try:
+          os.mkdir(os.environ["BaseDir"] + "/logs")
+          os.chmod(os.environ["BaseDir"] + "/logs", 0777)
+        except:
+          #print "Can't create " + os.environ["BaseDir"] + "/logs"
+          pass
+
+        upath = os.environ["BaseDir"] + "/logs/";
+        if sys.platform == "win32":
+           upath += os.environ["Username"];
+        else:
+           upath += os.environ["USER"];
+
+        try:
+          os.mkdir(upath)
+        except:
+          #print "Can't create " + upath
+          pass
+
+        if verbose(): print "Name Service... ",
+        #hname=os.environ["HOST"] #commands.getoutput("hostname")
+        if sys.platform == "win32":
+          hname=getShortHostName();
+        else:
+          hname = socket.gethostname();
+        #print "hname=",hname
+
+        f=open(os.environ["OMNIORB_CONFIG"])
+        ss=re.findall("NameService=corbaname::" + hname + ":\d+", f.read())
+        if verbose(): print "ss = ", ss,
+        f.close()
+        sl=ss[0]
+        ll = sl.split(':')
+        aPort = ll[-1]
+        #aPort=(ss.join().split(':'))[2];
+        #aPort=re.findall("\d+", ss[0])[0]
+
+        # \begin{E.A.}
+        # put the log files of omniNames in different directory with port reference,
+        # it is cleaner on linux and it is a fix for salome since it is impossible to
+        # remove the log files if the corresponding omniNames has not been killed.
+        # \end{E.A.}
+        
+        upath += "/omniNames_%s"%(aPort)
+        try:
+           os.mkdir(upath)
+        except:
+           #print "Can't create " + upath
+           pass
+        
+        #os.system("touch " + upath + "/dummy")
+        for fname in os.listdir(upath):
+          try:
+             os.remove(upath + "/" + fname)
+          except:
+            pass
+        #os.system("rm -f " + upath + "/omninames* " + upath + "/dummy " + upath + "/*.log")
+
+        #aSedCommand="s/.*NameService=corbaname::" + hname + ":\([[:digit:]]*\)/\1/"
+        #print "sed command = ", aSedCommand
+        #aPort = commands.getoutput("sed -e\"" + aSedCommand + "\"" + os.environ["OMNIORB_CONFIG"])
+        #print "port=", aPort
+        if sys.platform == "win32":
+          #print "start omniNames -start " + aPort + " -logdir " + upath
+          self.CMD=['omniNames', '-start' , aPort , '-nohostname', '-logdir' , os.path.realpath(upath), '-errlog', os.path.realpath(os.path.join(upath,'omniNameErrors.log'))]
+          #os.system("start omniNames -start " + aPort + " -logdir " + upath)
+        else:
+          #self.CMD=['omniNames -start ' , aPort , ' -logdir ' , upath , ' &']
+          self.CMD=['omniNames','-start' , aPort, '-logdir' , upath, '-errlog', upath+'/omniNameErrors.log']
+          #os.system("omniNames -start " + aPort + " -logdir " + upath + " &")
+
+        if verbose(): print "... ok"
+        if verbose(): print "to list contexts and objects bound into the context with the specified name : showNS "
+
+
+   def initArgs(self):
+        Server.initArgs(self)
+        if sys.platform == "win32":
+          env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("PATH")]
+        else:
+          env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")]
+        self.CMD=['xterm', '-e']+ env_ld_library_path + ['python']
+        self.initNSArgs()
+
+# In LifeCycleCORBA, FactoryServer is started with rsh on the requested
+#    computer if this Container does not exist. Default is localhost.
+#    Others Containers are started with start_impl method of FactoryServer Container.
+# For using rsh it is necessary to have in the ${HOME} directory a .rhosts file
+# Warning : on RedHat the file /etc/hosts contains by default a line like :
+# 127.0.0.1               bordolex bordolex.paris1.matra-dtv.fr localhost.localdomain localhost  
+#   (bordolex is the station name). omniNames on bordolex will be accessible from other
+#   computers only if the computer name is removed on that line like :
+#   127.0.0.1               bordolex.paris1.matra-dtv.fr localhost.localdomain localhost
+
+# To start dynamically Containers on several computers you need to
+# put in the ${OMNIORB_CONFIG} file a computer name instead of "localhost"
+# example : ORBInitRef NameService=corbaname::dm2s0017
+
+# If you need to use several omniNames running on the same computer, you have to :
+#1. put in your ${OMNIORB_CONFIG} file a computer name and port number
+# example : ORBInitRef NameService=corbaname::dm2s0017:1515
+#2. start omninames with this port number like in orbmodile.py
+# example : omniNames -start 1515 -logdir ${BaseDir}/logs/${Username} &
+
index 54cd513572ddccf2daa08015503afed546903d37..8e912bd8e25b7989187d839ee863b107eaa5d793 100644 (file)
-#!/usr/bin/env python\r
-#  -*- coding: iso-8859-1 -*-\r
-# Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE\r
-#\r
-# Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,\r
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS\r
-#\r
-# This library is free software; you can redistribute it and/or\r
-# modify it under the terms of the GNU Lesser General Public\r
-# License as published by the Free Software Foundation; either\r
-# version 2.1 of the License.\r
-#\r
-# This library is distributed in the hope that it will be useful,\r
-# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-# Lesser General Public License for more details.\r
-#\r
-# You should have received a copy of the GNU Lesser General Public\r
-# License along with this library; if not, write to the Free Software\r
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
-#\r
-# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com\r
-#\r
-\r
-import os, sys, string\r
-from salome_utils import getHostName\r
-process_id = {}\r
-\r
-# -----------------------------------------------------------------------------\r
-#\r
-# Definition des classes d'objets pour le lancement des Server CORBA\r
-#\r
-\r
-class Server:\r
-    """Generic class for CORBA server launch"""\r
-    \r
-    server_launch_mode = "daemon"\r
-\r
-    def initArgs(self):\r
-        self.PID=None\r
-        self.CMD=[]\r
-        self.ARGS=[]\r
-        if self.args.get('xterm'):\r
-          if sys.platform != "win32":\r
-            self.ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']\r
-          else:\r
-            self.ARGS=['cmd', '/c', 'start  cmd.exe', '/K']\r
-\r
-    def __init__(self,args):\r
-        self.args=args\r
-        self.initArgs()\r
-\r
-    @staticmethod\r
-    def set_server_launch_mode(mode):\r
-      if mode == "daemon" or mode == "fork":\r
-        Server.server_launch_mode = mode\r
-      else:\r
-        raise Exception("Unsupported server launch mode: %s" % mode)\r
-\r
-    def run(self):\r
-        global process_id\r
-        myargs=self.ARGS\r
-        if self.args.get('xterm'):\r
-            # (Debian) send LD_LIBRARY_PATH to children shells (xterm)\r
-            if sys.platform != "win32":\r
-              env_ld_library_path=['env', 'LD_LIBRARY_PATH='\r
-                                   + os.getenv("LD_LIBRARY_PATH")]\r
-              myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path\r
-        command = myargs + self.CMD\r
-        #print "command = ", command\r
-        if sys.platform == "win32":\r
-          import win32pm\r
-          pid = win32pm.spawnpid( command, '-nc' )\r
-        elif Server.server_launch_mode == "fork":\r
-          pid = os.spawnvp(os.P_NOWAIT, command[0], command)\r
-        else: # Server launch mode is daemon\r
-          pid=self.daemonize(command)\r
-        if pid is not None:\r
-          #store process pid if it really exists\r
-          process_id[pid]=self.CMD\r
-        self.PID = pid\r
-        return pid\r
-\r
-    def daemonize(self,args):\r
-        # to daemonize a process need to do the UNIX double-fork magic\r
-        # see Stevens, "Advanced Programming in the UNIX Environment" for details (ISBN 0201563177)\r
-        # and UNIX Programming FAQ 1.7 How do I get my program to act like a daemon?\r
-        #     http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16\r
-        #open a pipe\r
-        c2pread, c2pwrite = os.pipe()\r
-        #do first fork\r
-        pid=os.fork()\r
-        if pid > 0:\r
-          #first parent\r
-          os.close(c2pwrite)\r
-          #receive real pid from child\r
-          data=os.read(c2pread,24) #read 24 bytes\r
-          os.waitpid(pid,0) #remove zombie\r
-          os.close(c2pread)\r
-          # return : first parent\r
-          childpid=int(data)\r
-          if childpid==-1:\r
-            return None\r
-          try:\r
-            os.kill(childpid,0)\r
-            return childpid\r
-          except:\r
-            return None\r
-\r
-        #first child\r
-        # decouple from parent environment\r
-        os.setsid()\r
-        os.close(c2pread)\r
-\r
-        # do second fork : second child not a session leader\r
-        try:\r
-          pid = os.fork()\r
-          if pid > 0:\r
-            #send real pid to parent\r
-            os.write(c2pwrite,"%d" % pid)\r
-            os.close(c2pwrite)\r
-            # exit from second parent\r
-            os._exit(0)\r
-        except OSError, e:\r
-          print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)\r
-          os.write(c2pwrite,"-1")\r
-          os.close(c2pwrite)\r
-          sys.exit(1)\r
-\r
-        #I am a daemon\r
-        os.close(0) #close stdin\r
-        os.open("/dev/null", os.O_RDWR)  # redirect standard input (0) to /dev/null\r
-        try:\r
-          os.execvp(args[0], args)\r
-        except OSError, e:\r
-          if args[0] != "notifd":\r
-            print >>sys.stderr, "(%s) launch failed: %d (%s)" % (args[0],e.errno, e.strerror)\r
-            pass\r
-          os._exit(127)\r
-\r
+#!/usr/bin/env python
+#  -*- coding: iso-8859-1 -*-
+# Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+import os, sys, string
+from salome_utils import getHostName
+process_id = {}
+
+# -----------------------------------------------------------------------------
+#
+# Definition des classes d'objets pour le lancement des Server CORBA
+#
+
+class Server:
+    """Generic class for CORBA server launch"""
+    
+    server_launch_mode = "daemon"
+
+    def initArgs(self):
+        self.PID=None
+        self.CMD=[]
+        self.ARGS=[]
+        if self.args.get('xterm'):
+          if sys.platform != "win32":
+            self.ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']
+          else:
+            self.ARGS=['cmd', '/c', 'start  cmd.exe', '/K']
+
+    def __init__(self,args):
+        self.args=args
+        self.initArgs()
+
+    @staticmethod
+    def set_server_launch_mode(mode):
+      if mode == "daemon" or mode == "fork":
+        Server.server_launch_mode = mode
+      else:
+        raise Exception("Unsupported server launch mode: %s" % mode)
+
+    def run(self):
+        global process_id
+        myargs=self.ARGS
+        if self.args.get('xterm'):
+            # (Debian) send LD_LIBRARY_PATH to children shells (xterm)
+            if sys.platform != "win32":
+              env_ld_library_path=['env', 'LD_LIBRARY_PATH='
+                                   + os.getenv("LD_LIBRARY_PATH")]
+              myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path
+        command = myargs + self.CMD
+        #print "command = ", command
+        if sys.platform == "win32":
+          import win32pm
+          pid = win32pm.spawnpid( command, '-nc' )
+        elif Server.server_launch_mode == "fork":
+          pid = os.spawnvp(os.P_NOWAIT, command[0], command)
+        else: # Server launch mode is daemon
+          pid=self.daemonize(command)
+        if pid is not None:
+          #store process pid if it really exists
+          process_id[pid]=self.CMD
+        self.PID = pid
+        return pid
+
+    def daemonize(self,args):
+        # to daemonize a process need to do the UNIX double-fork magic
+        # see Stevens, "Advanced Programming in the UNIX Environment" for details (ISBN 0201563177)
+        # and UNIX Programming FAQ 1.7 How do I get my program to act like a daemon?
+        #     http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
+        #open a pipe
+        c2pread, c2pwrite = os.pipe()
+        #do first fork
+        pid=os.fork()
+        if pid > 0:
+          #first parent
+          os.close(c2pwrite)
+          #receive real pid from child
+          data=os.read(c2pread,24) #read 24 bytes
+          os.waitpid(pid,0) #remove zombie
+          os.close(c2pread)
+          # return : first parent
+          childpid=int(data)
+          if childpid==-1:
+            return None
+          try:
+            os.kill(childpid,0)
+            return childpid
+          except:
+            return None
+
+        #first child
+        # decouple from parent environment
+        os.setsid()
+        os.close(c2pread)
+
+        # do second fork : second child not a session leader
+        try:
+          pid = os.fork()
+          if pid > 0:
+            #send real pid to parent
+            os.write(c2pwrite,"%d" % pid)
+            os.close(c2pwrite)
+            # exit from second parent
+            os._exit(0)
+        except OSError, e:
+          print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
+          os.write(c2pwrite,"-1")
+          os.close(c2pwrite)
+          sys.exit(1)
+
+        #I am a daemon
+        os.close(0) #close stdin
+        os.open("/dev/null", os.O_RDWR)  # redirect standard input (0) to /dev/null
+        try:
+          os.execvp(args[0], args)
+        except OSError, e:
+          if args[0] != "notifd":
+            print >>sys.stderr, "(%s) launch failed: %d (%s)" % (args[0],e.errno, e.strerror)
+            pass
+          os._exit(127)
+