diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/runner/inetd.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/runner/inetd.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/runner/inetd.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/runner/inetd.py b/contrib/python/Twisted/py2/twisted/runner/inetd.py new file mode 100644 index 0000000000..3402e232e4 --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/runner/inetd.py @@ -0,0 +1,70 @@ +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +# + +""" +Twisted inetd. + +Maintainer: Andrew Bennetts + +Future Plans: Bugfixes. Specifically for UDP and Sun-RPC, which don't work +correctly yet. +""" + +import os + +from twisted.internet import process, reactor, fdesc +from twisted.internet.protocol import Protocol, ServerFactory +from twisted.protocols import wire + +# A dict of known 'internal' services (i.e. those that don't involve spawning +# another process. +internalProtocols = { + 'echo': wire.Echo, + 'chargen': wire.Chargen, + 'discard': wire.Discard, + 'daytime': wire.Daytime, + 'time': wire.Time, +} + + +class InetdProtocol(Protocol): + """Forks a child process on connectionMade, passing the socket as fd 0.""" + def connectionMade(self): + sockFD = self.transport.fileno() + childFDs = {0: sockFD, 1: sockFD} + if self.factory.stderrFile: + childFDs[2] = self.factory.stderrFile.fileno() + + # processes run by inetd expect blocking sockets + # FIXME: maybe this should be done in process.py? are other uses of + # Process possibly affected by this? + fdesc.setBlocking(sockFD) + if 2 in childFDs: + fdesc.setBlocking(childFDs[2]) + + service = self.factory.service + uid = service.user + gid = service.group + + # don't tell Process to change our UID/GID if it's what we + # already are + if uid == os.getuid(): + uid = None + if gid == os.getgid(): + gid = None + + process.Process(None, service.program, service.programArgs, os.environ, + None, None, uid, gid, childFDs) + + reactor.removeReader(self.transport) + reactor.removeWriter(self.transport) + + +class InetdFactory(ServerFactory): + protocol = InetdProtocol + stderrFile = None + + def __init__(self, service): + self.service = service |