9e13d07b6e
Before, we were using both __file__ as well as sys.argv[0] to determine the base directory for Scyther, and we were not taking symlinks into account. By using the inspect module, we can consistently pick the current frame and derive the file from that, then use realpath to strip symlinks.
91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
"""
|
|
Scyther : An automatic verifier for security protocols.
|
|
Copyright (C) 2007-2012 Cas Cremers
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
"""
|
|
|
|
#
|
|
# Misc.py
|
|
# Various helper functions
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
""" Import externals """
|
|
import os.path
|
|
from subprocess import Popen,PIPE
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
def confirm(question):
|
|
answer = ''
|
|
while answer not in ('y','n'):
|
|
print question,
|
|
answer = raw_input().lower()
|
|
return answer == 'y'
|
|
|
|
def exists(func,list):
|
|
return len(filter(func,list)) > 0
|
|
|
|
def forall(func,list):
|
|
return len(filter(func,list)) == len(list)
|
|
|
|
def uniq(li):
|
|
result = []
|
|
for elem in li:
|
|
if (not elem in result):
|
|
result.append(elem)
|
|
return result
|
|
|
|
# Return a sorted copy of a list
|
|
def sorted(li):
|
|
result = li[:]
|
|
result.sort()
|
|
return result
|
|
|
|
|
|
# path
|
|
def mypath(file):
|
|
""" Construct a file path relative to the scyther-gui main directory
|
|
"""
|
|
import os, inspect
|
|
|
|
# Determine base directory (taking symbolic links into account)
|
|
cmd_file = os.path.realpath(os.path.abspath(inspect.getfile( inspect.currentframe() )))
|
|
basedir = os.path.split(cmd_file)[0]
|
|
return os.path.join(basedir,file)
|
|
|
|
# commands: push data in, get fp.write out
|
|
def cmdpushwrite(cmd,data,fname):
|
|
"""
|
|
Feed stdin data to cmd, write the output to a freshly created file
|
|
'fname'. The file is flushed and closed at the end.
|
|
"""
|
|
fp = open(fname,'w')
|
|
# execute command
|
|
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
|
|
(cin,cout) = (p.stdin, p.stdout)
|
|
|
|
cin.write(data)
|
|
cin.close()
|
|
for l in cout.read():
|
|
fp.write(l)
|
|
cout.close()
|
|
fp.flush()
|
|
fp.close()
|
|
|
|
#---------------------------------------------------------------------------
|
|
# vim: set ts=4 sw=4 et list lcs=tab\:>-:
|