]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
SALOME 7.3.0 pb with tests - patch for PPGP
authorvtn <vtn@opencascade.com>
Mon, 8 Sep 2014 06:55:17 +0000 (10:55 +0400)
committervtn <vtn@opencascade.com>
Mon, 8 Sep 2014 06:55:17 +0000 (10:55 +0400)
bin/nameserver.py [changed mode: 0755->0644]
bin/server.py [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 4645442..cb04c3b
-#!/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 ' , '\"' + upath + '\"', ' -errlog', '\"' + 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} &
+#!/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
old mode 100755 (executable)
new mode 100644 (file)
index 8721d09..54cd513
-#!/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
-          #cmd_str = "\"" + string.join(command, " ") + "\""
-          #print cmd_str
-          #pid = win32pm.spawnpid( cmd_str )
-          pid = win32pm.spawnpid( string.join(command, " "), '-nc' )
-          #pid = win32pm.spawnpid( string.join(command, " ") )
-        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)
+#!/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