# terms provided in the LICENSE file distributed with this software.
import codecs
-import ctypes
-import ctypes.util
import os
import random
import re
# only if this is what we're configured to do
if universe.contents["internal:process"].getboolean("daemon"):
- # if possible, we want to rename the process to the same as the script
- new_argv = b"\x00".join(x.encode("utf-8") for x in sys.argv) + b"\x00"
- short_argv0 = os.path.basename(sys.argv[0]).encode("utf-8") + b"\x00"
-
- # attempt the linux way first
- try:
- argv_array = ctypes.POINTER(ctypes.c_char_p)
- ctypes.pythonapi.Py_GetArgcArgv.argtypes = (
- ctypes.POINTER(ctypes.c_int),
- ctypes.POINTER(argv_array)
- )
- argc = argv_array()
- ctypes.pythonapi.Py_GetArgcArgv(
- ctypes.c_int(0),
- ctypes.pointer(argc)
- )
- old_argv0_size = len(argc.contents.value)
- ctypes.memset(argc.contents, 0, len(new_argv) + old_argv0_size)
- ctypes.memmove(argc.contents, new_argv, len(new_argv))
- ctypes.CDLL(ctypes.util.find_library("c")).prctl(
- 15,
- short_argv0,
- 0,
- 0,
- 0
- )
-
- except:
-
- # since that failed, maybe it's bsd?
- try:
-
- # much simpler, since bsd has a libc function call for this
- ctypes.CDLL(ctypes.util.find_library("c")).setproctitle(
- new_argv
- )
-
- except:
-
- # that didn't work either, so just log that we couldn't
- log("Failed to rename the interpreter process (cosmetic).")
-
# log before we start forking around, so the terminal gets the message
log("Disassociating from the controlling terminal.")