Ticket #88: share-mmap.patch
File share-mmap.patch, 9.6 KB (added by , 9 years ago) |
---|
-
trunk/src/xpra/client.py
434 434 import tempfile 435 435 import uuid 436 436 import ctypes 437 from stat import S_IRUSR,S_IWUSR 437 from stat import S_IRUSR,S_IWUSR,S_IRGRP,S_IWGRP 438 438 mmap_dir = os.getenv("TMPDIR", "/tmp") 439 439 if not os.path.exists(mmap_dir): 440 440 raise Exception("TMPDIR %s does not exist!" % mmap_dir) … … 442 442 #keep a reference to it so it does not disappear! 443 443 self._mmap_temp_file = temp 444 444 self.mmap_file = temp.name 445 #ensure that the permissions are strict: 446 os.chmod(self.mmap_file, S_IRUSR|S_IWUSR) 445 #ensure that the permissions are strict or set mmap-group option: 446 if opts.mmap_group: 447 s = os.stat(opts.sockfile) 448 os.chown(self.mmap_file, -1, s.st_uid) 449 os.chmod(self.mmap_file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) 450 else: 451 os.chmod(self.mmap_file, S_IRUSR|S_IWUSR) 447 452 self.mmap_size = max(4096, mmap.PAGESIZE)*32*1024 #generally 128MB 448 453 fd = temp.file.fileno() 449 454 log("using mmap file %s, fd=%s, size=%s", self.mmap_file, fd, self.mmap_size) -
trunk/src/xpra/dotxpra.py
15 15 pass 16 16 17 17 class DotXpra(object): 18 def __init__(self, dir=None):18 def __init__(self, sockdir=None, logdir=None ): 19 19 assert XPRA_LOCAL_SERVERS_SUPPORTED 20 if dir is None: 21 dir = os.path.expanduser("~/.xpra") 22 self._dir = dir 23 if not os.path.exists(self._dir): 24 os.mkdir(dir, 0700) 20 if logdir is None: 21 logdir = os.path.expanduser("~/.xpra") 22 self._logdir = logdir 23 if sockdir is None: 24 #sockdir = os.path.expanduser("/tmp/") 25 sockdir = os.path.expanduser("~/.xpra") 26 self._sockdir = sockdir 27 if not os.path.exists(self._logdir): 28 os.mkdir(logdir, 0700) 25 29 self._prefix = "%s-" % (socket.gethostname(),) 26 30 27 def dir(self):28 return self._ dir31 def logdir(self): 32 return self._logdir 29 33 30 34 def _normalize_local_display_name(self, local_display_name): 31 35 if not local_display_name.startswith(":"): … … 37 41 assert char in "0123456789" 38 42 return local_display_name 39 43 40 def socket_path(self, local_display_name):44 def make_path(self, local_display_name, dirpath ): 41 45 local_display_name = self._normalize_local_display_name(local_display_name) 42 return os.path.join( self._dir, self._prefix + local_display_name[1:])46 return os.path.join( dirpath , self._prefix + local_display_name[1:]) 43 47 48 def socket_path(self, local_display_name): 49 return self.make_path(local_display_name, self._sockdir) 50 51 def log_path(self, local_display_name): 52 return self.make_path(local_display_name, self._logdir) 53 44 54 LIVE = "LIVE" 45 55 DEAD = "DEAD" 46 56 UNKNOWN = "UNKNOWN" … … 74 84 75 85 def sockets(self): 76 86 results = [] 77 base = os.path.join(self._ dir, self._prefix)87 base = os.path.join(self._sockdir, self._prefix) 78 88 potential_sockets = glob.glob(base + "*") 79 89 for path in potential_sockets: 80 90 if stat.S_ISSOCK(os.stat(path).st_mode): -
trunk/src/xpra/scripts/main.py
163 163 parser.add_option("--ssh", action="store", 164 164 dest="ssh", default=DEFAULT_SSH_CMD, metavar="CMD", 165 165 help="How to run ssh (default: '%default')") 166 parser.add_option("--socket-dir", action="store", 167 dest="sockdir", default=None, metavar="CMD", 168 help="Directory to place socket file in (default: '%default')") 169 parser.add_option("--mmap-group", action="store_true", 170 dest="mmap_group", default=False, 171 help="Set the group permission on the mmap file the same as the owner of the socket file when creating the mmap file with the client (default: '%default')") 166 172 parser.add_option("--remote-xpra", action="store", 167 173 dest="remote_xpra", default=".xpra/run-xpra", 168 174 metavar="CMD", … … 263 269 "type": "unix-domain", 264 270 "local": True, 265 271 "display": display_name, 272 "sockdir": opts.sockdir, 266 273 } 267 274 return desc 268 275 elif display_name.startswith("tcp:"): … … 284 291 if not XPRA_LOCAL_SERVERS_SUPPORTED: 285 292 parser.error("need to specify a display") 286 293 # Pick a default server 287 sockdir = DotXpra( )294 sockdir = DotXpra(opts.sockdir) 288 295 servers = sockdir.sockets() 289 296 live_servers = [display 290 297 for (state, display) in servers … … 327 334 return TwoFileConnection(child.stdin, child.stdout, abort_test) 328 335 329 336 elif XPRA_LOCAL_SERVERS_SUPPORTED and display_desc["type"] == "unix-domain": 330 sockdir = DotXpra( )337 sockdir = DotXpra(display_desc["sockdir"]) 331 338 sock = socket.socket(socket.AF_UNIX) 332 339 return _socket_connect(sock, 333 340 sockdir.socket_path(display_desc["display"])) … … 361 368 from xpra.client_base import VersionXpraClient 362 369 app = VersionXpraClient(conn, opts) 363 370 else: 371 #before we go into the client class, we need to pass the sockfile for mmap-group option... 372 display_name = extra_args[0] 373 dotxpra = DotXpra(opts.sockdir) 374 sockfile = dotxpra.socket_path(display_name) 375 opts.sockfile = sockfile 376 364 377 from xpra.client import XpraClient 365 378 app = XpraClient(conn, opts) 366 379 def got_gibberish_msg(obj, data): … … 405 418 while conn.read(4096): 406 419 pass 407 420 if display_desc["local"]: 408 sockdir = DotXpra( )421 sockdir = DotXpra(opts.sockdir) 409 422 for _ in xrange(6): 410 423 final_state = sockdir.server_state(display_desc["display"]) 411 424 if final_state is DotXpra.LIVE: … … 431 444 assert "gtk" not in sys.modules 432 445 if extra_args: 433 446 parser.error("too many arguments for mode") 434 sockdir = DotXpra( )447 sockdir = DotXpra(opts.sockdir) 435 448 results = sockdir.sockets() 436 449 if not results: 437 450 sys.stdout.write("No xpra sessions found\n") -
trunk/src/xpra/scripts/server.py
15 15 import atexit 16 16 import signal 17 17 import socket 18 import os 18 19 19 20 from xpra.wait_for_x_server import wait_for_x_server #@UnresolvedImport 20 21 from xpra.dotxpra import DotXpra, ServerSockInUse 21 22 23 from stat import S_IRUSR,S_IWUSR,S_IRGRP,S_IWGRP 24 22 25 _cleanups = [] 23 26 def run_cleanups(): 24 27 for c in _cleanups: … … 136 139 def create_unix_domain_socket(sockpath): 137 140 listener = socket.socket(socket.AF_UNIX) 138 141 listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 142 #is this a race condition? 139 143 listener.bind(sockpath) 144 os.chmod(sockpath, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) 140 145 return listener 141 146 142 147 def create_tcp_socket(parser, spec): … … 181 186 assert mode in ("start", "upgrade") 182 187 upgrading = (mode == "upgrade") 183 188 184 dotxpra = DotXpra( )189 dotxpra = DotXpra(opts.sockdir) 185 190 186 191 # This used to be given a display-specific name, but now we give it a 187 192 # single fixed name and if multiple servers are started then the last one … … 191 196 # is running on the remote host. Might need to revisit this later if 192 197 # people run into problems or autodiscovery turns out to be less useful 193 198 # than expected. 194 scriptpath = os.path.join(dotxpra. dir(), "run-xpra")199 scriptpath = os.path.join(dotxpra.logdir(), "run-xpra") 195 200 196 201 # Save the starting dir now, because we'll lose track of it when we 197 202 # daemonize: … … 201 206 # Daemonize: 202 207 if opts.daemon: 203 208 try: 204 logpath = dotxpra.server_socket_path(display_name, clobber) + ".log"209 sockpath = dotxpra.server_socket_path(display_name, clobber) 205 210 except ServerSockInUse: 206 211 parser.error("You already have an xpra server running at %s\n" 207 212 " (did you want 'xpra upgrade'?)" 208 213 % (display_name,)) 214 logpath = dotxpra.log_path(display_name) + ".log" 209 215 sys.stderr.write("Entering daemon mode; " 210 216 + "any further errors will be reported to:\n" 211 217 + (" %s\n" % logpath)) … … 299 305 save_pid(xvfb_pid) 300 306 301 307 sockets = [] 302 sockpath = dotxpra.server_socket_path(display_name, clobber)303 308 #print("creating server socket %s" % sockpath) 304 309 sockets.append(create_unix_domain_socket(sockpath)) 305 310 def cleanup_socket():