# terms provided in the LICENSE file distributed with this software.
import codecs
-import ctypes
-import ctypes.util
import os
import random
import re
try:
self.connection.send(self.output_queue[0])
del self.output_queue[0]
- except:
+ except BrokenPipeError:
if self.account and self.account.get("name"):
account = self.account.get("name")
else:
account = "an unknown user"
- log("Sending to %s raised an exception (broken pipe?)."
- % account, 7)
- pass
+ log("Broken pipe sending to %s." % account, 7)
+ self.state = "disconnecting"
def enqueue_input(self):
"""Process and enqueue any new input."""
# 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.")