1def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org#!/usr/bin/env python 2def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org# Copyright (c) 2011 Google Inc. All rights reserved. 3def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org# Use of this source code is governed by a BSD-style license that can be 4def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org# found in the LICENSE file. 5def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 6b8e58959f8767948aecbc3d8235927401cf3f93dthakis@chromium.org"""These functions are executed via gyp-flock-tool when using the Makefile 7b8e58959f8767948aecbc3d8235927401cf3f93dthakis@chromium.orggenerator. Used on systems that don't have a built-in flock.""" 8def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 9def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.orgimport fcntl 10def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.orgimport os 11def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.orgimport struct 12def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.orgimport subprocess 13def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.orgimport sys 14def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 15def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 16def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.orgdef main(args): 17b8e58959f8767948aecbc3d8235927401cf3f93dthakis@chromium.org executor = FlockTool() 18def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org executor.Dispatch(args) 19def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 20c1ced77af959d11dd80252ab471e89906ea70f09maruel@chromium.org 21b8e58959f8767948aecbc3d8235927401cf3f93dthakis@chromium.orgclass FlockTool(object): 22b8e58959f8767948aecbc3d8235927401cf3f93dthakis@chromium.org """This class emulates the 'flock' command.""" 23def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org def Dispatch(self, args): 24def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org """Dispatches a string command to a method.""" 25def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org if len(args) < 1: 26def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org raise Exception("Not enough arguments") 27def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 28def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org method = "Exec%s" % self._CommandifyName(args[0]) 29def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org getattr(self, method)(*args[1:]) 30def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 31def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org def _CommandifyName(self, name_string): 32def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org """Transforms a tool name like copy-info-plist to CopyInfoPlist""" 33def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org return name_string.title().replace('-', '') 34def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 35def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org def ExecFlock(self, lockfile, *cmd_list): 36def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org """Emulates the most basic behavior of Linux's flock(1).""" 37def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org # Rely on exception handling to report errors. 38def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org # Note that the stock python on SunOS has a bug 39def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org # where fcntl.flock(fd, LOCK_EX) always fails 40def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org # with EBADF, that's why we use this F_SETLK 41def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org # hack instead. 42def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org fd = os.open(lockfile, os.O_WRONLY|os.O_NOCTTY|os.O_CREAT, 0666) 43def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org op = struct.pack('hhllhhl', fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0) 44def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org fcntl.fcntl(fd, fcntl.F_SETLK, op) 45def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org return subprocess.call(cmd_list) 46def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org 47c1ced77af959d11dd80252ab471e89906ea70f09maruel@chromium.org 48def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.orgif __name__ == '__main__': 49def1c1d30312f82d3282d055aea28895bfacadefthakis@chromium.org sys.exit(main(sys.argv[1:])) 50