# HG changeset patch # User Norm Jacobs # Date 1312513144 25200 # Node ID 2edc011b559e764dbfe53ff12812c48b7a2d0559 # Parent aa27b836c528ac2fc6df65466bb137157f347b64 7004671 Add Python 2.7.1 diff -r aa27b836c528 -r 2edc011b559e components/python/python27/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/Makefile Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,99 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + +# +include ../../../make-rules/shared-macros.mk + +PATH=/usr/bin:/usr/gnu/bin:/usr/sbin + +COMPONENT_NAME= Python +COMPONENT_VERSION= 2.7.1 +COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) +COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.bz2 +COMPONENT_ARCHIVE_HASH= sha1:fbe1894322ff91b80726e269c97454f4129fc2a3 +COMPONENT_ARCHIVE_URL= http://python.org/ftp/python/$(COMPONENT_VERSION)/$(COMPONENT_ARCHIVE) + +include $(WS_TOP)/make-rules/prep.mk +include $(WS_TOP)/make-rules/configure.mk +include $(WS_TOP)/make-rules/ips.mk + +# We patch auto* files, so regenerate headers and configure +COMPONENT_PREP_ACTION = \ + (cd $(@D) ; autoheader ; autoconf) + +# to find the ncurses headers +CPPFLAGS += -I/usr/include/ncurses + +# libffi for _ctypes +CPPFLAGS += $(shell pkg-config --cflags-only-I libffi) + +# because python links with $(CC) ... $(LDFLAGS) ... +LDFLAGS = $(CC_BITS) $(CC_PIC) + +# build pic +CFLAGS += $(CC_PIC) + +# add /usr/gnu/lib to the library search/run path +LDFLAGS.32 = -R/usr/gnu/lib -L/usr/gnu/lib +LDFLAGS.64 = -R/usr/gnu/lib/$(MACH64) -L/usr/gnu/lib/$(MACH64) +LDFLAGS += $(LDFLAGS.$(BITS)) + +CONFIGURE_OPTIONS += --infodir=$(CONFIGURE_INFODIR) +CONFIGURE_OPTIONS += --enable-shared +CONFIGURE_OPTIONS += --with-system-expat +CONFIGURE_OPTIONS += --with-system-ffi +CONFIGURE_OPTIONS += --without-gcc +CONFIGURE_OPTIONS += --enable-ipv6 +CONFIGURE_OPTIONS += ac_cv_opt_olimit_ok=no +CONFIGURE_OPTIONS += ac_cv_olimit_ok=no +CONFIGURE_OPTIONS += CPPFLAGS="$(CPPFLAGS)" +CONFIGURE_OPTIONS += BASECFLAGS="$(CFLAGS)" +CONFIGURE_OPTIONS += LDFLAGS="$(LDFLAGS)" +CONFIGURE_OPTIONS += DFLAGS="-$(BITS)" + +COMPONENT_BUILD_ENV += DFLAGS="-$(BITS)" + +# patches/00-bits.patch removes some AC_CHECK_SIZEOF tests in order to +# generate a pyconfig.h that is both 32 and 64 bit compatible. We add this +# back to the environment so that configure can still work. configure.in and +# pyconfig.h.in should probably be rewhacked to do this more cleanly in the +# future. +CONFIGURE_OPTIONS.32 += ac_cv_sizeof_long=4 +CONFIGURE_OPTIONS.64 += ac_cv_sizeof_long=8 + +# 64 bit shared objects need to go in a 64-bit directory +COMPONENT_INSTALL_ARGS.64 += DESTSHARED=$(CONFIGURE_PREFIX)/lib/python2.7/lib-dynload + +# common targets +build: $(BUILD_32_and_64) + +$(INSTALL_32): $(INSTALL_64) + +install: $(INSTALL_32_and_64) + +COMPONENT_TEST_TARGETS = test + +test: $(TEST_32_and_64) + +BUILD_PKG_DEPENDENCIES = $(BUILD_TOOLS) + +include $(WS_TOP)/make-rules/depend.mk diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/00-bits.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/00-bits.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,152 @@ +# +# This patch makes the pyconfig.h header file 32/64 bit friendly. +# +--- Python-2.7.1/configure.in.orig Tue Jul 12 14:46:56 2011 ++++ Python-2.7.1/configure.in Tue Jul 12 14:47:05 2011 +@@ -12,7 +12,7 @@ + [], + [m4_fatal([Autoconf version $1 is required for Python], 63)]) + ]) +-version_required(2.65) ++version_required(2.63) + + AC_REVISION($Revision: 86076 $) + AC_INIT(python, PYTHON_VERSION, http://bugs.python.org/) +@@ -35,6 +35,41 @@ + #define Py_PYCONFIG_H + ]) + AH_BOTTOM([ ++ ++#include ++ ++/* ++ * Python originally defined these statically, which prevents a 32-64 python ++ * from working at all. ++ */ ++ ++#define SIZEOF_SHORT 2 ++#define SIZEOF_INT 4 ++#define SIZEOF_LONG_LONG 8 ++#define SIZEOF_FPOS_T 8 ++#define SIZEOF_OFF_T 8 ++#define SIZEOF_PTHREAD_T 4 ++ ++#ifdef _LP64 ++#define SIZEOF_LONG 8 ++#define SIZEOF_UINTPTR_T 8 ++#define SIZEOF_VOID_P 8 ++#define SIZEOF_TIME_T 8 ++#define SIZEOF_SIZE_T 8 ++#define SIZEOF_LONG_DOUBLE 16 ++#else ++#define SIZEOF_LONG 4 ++#define SIZEOF_UINTPTR_T 4 ++#define SIZEOF_VOID_P 4 ++#define SIZEOF_TIME_T 4 ++#define SIZEOF_SIZE_T 4 ++#if defined(__i386) ++#define SIZEOF_LONG_DOUBLE 12 ++#else ++#define SIZEOF_LONG_DOUBLE 16 ++#endif ++#endif ++ + /* Define the macros needed if on a UnixWare 7.x system. */ + #if defined(__USLC__) && defined(__SCO_VERSION__) + #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */ +@@ -1474,13 +1509,13 @@ + # Sizes of various common basic types + # ANSI C requires sizeof(char) == 1, so no need to check it + AC_CHECK_SIZEOF(int, 4) +-AC_CHECK_SIZEOF(long, 4) +-AC_CHECK_SIZEOF(void *, 4) ++dnl AC_CHECK_SIZEOF(long, 4) ++dnl AC_CHECK_SIZEOF(void *, 4) + AC_CHECK_SIZEOF(short, 2) + AC_CHECK_SIZEOF(float, 4) + AC_CHECK_SIZEOF(double, 8) + AC_CHECK_SIZEOF(fpos_t, 4) +-AC_CHECK_SIZEOF(size_t, 4) ++dnl AC_CHECK_SIZEOF(size_t, 4) + AC_CHECK_SIZEOF(pid_t, 4) + + AC_MSG_CHECKING(for long long support) +@@ -1501,9 +1536,9 @@ + have_long_double=yes + ],[]) + AC_MSG_RESULT($have_long_double) +-if test "$have_long_double" = yes ; then +-AC_CHECK_SIZEOF(long double, 12) +-fi ++dnl if test "$have_long_double" = yes ; then ++dnl AC_CHECK_SIZEOF(long double, 12) ++dnl fi + + AC_MSG_CHECKING(for _Bool support) + have_c99_bool=no +@@ -1517,7 +1552,7 @@ + fi + + AC_CHECK_TYPES(uintptr_t, +- [AC_CHECK_SIZEOF(uintptr_t, 4)], ++ [], + [], [#ifdef HAVE_STDINT_H + #include + #endif +@@ -1534,8 +1569,8 @@ + AC_MSG_CHECKING(whether to enable large file support) + if test "$have_long_long" = yes + then +-if test "$ac_cv_sizeof_off_t" -gt "$ac_cv_sizeof_long" -a \ +- "$ac_cv_sizeof_long_long" -ge "$ac_cv_sizeof_off_t"; then ++dnl if test "$ac_cv_sizeof_off_t" -gt "$ac_cv_sizeof_long" -a \ ++dnl "$ac_cv_sizeof_long_long" -ge "$ac_cv_sizeof_off_t"; then + AC_DEFINE(HAVE_LARGEFILE_SUPPORT, 1, + [Defined to enable large file support when an off_t is bigger than a long + and long long is available and at least as big as an off_t. You may need +@@ -1542,21 +1577,21 @@ + to add some flags for configuration and compilation to enable this mode. + (For Solaris and Linux, the necessary defines are already defined.)]) + AC_MSG_RESULT(yes) ++dnl else ++dnl AC_MSG_RESULT(no) ++dnl fi + else + AC_MSG_RESULT(no) + fi +-else +- AC_MSG_RESULT(no) +-fi + +-AC_CHECK_SIZEOF(time_t, [], [ +-#ifdef HAVE_SYS_TYPES_H +-#include +-#endif +-#ifdef HAVE_TIME_H +-#include +-#endif +-]) ++dnl AC_CHECK_SIZEOF(time_t, [], [ ++dnl #ifdef HAVE_SYS_TYPES_H ++dnl #include ++dnl #endif ++dnl #ifdef HAVE_TIME_H ++dnl #include ++dnl #endif ++dnl ]) + + # if have pthread_t then define SIZEOF_PTHREAD_T + ac_save_cc="$CC" +@@ -1906,12 +1941,6 @@ + if test -z "$CCSHARED" + then + case $ac_sys_system/$ac_sys_release in +- SunOS*) if test "$GCC" = yes; +- then CCSHARED="-fPIC"; +- elif test `uname -p` = sparc; +- then CCSHARED="-xcode=pic32"; +- else CCSHARED="-Kpic"; +- fi;; + hp*|HP*) if test "$GCC" = yes; + then CCSHARED="-fPIC"; + else CCSHARED="+z"; diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/01-ext-stdio.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/01-ext-stdio.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,35 @@ +--- Python-2.7.1/Modules/python.c.orig Tue Jun 21 21:35:45 2011 ++++ Python-2.7.1/Modules/python.c Tue Jun 21 21:39:29 2011 +@@ -6,6 +6,13 @@ + #include + #endif + ++#if defined(sun) && defined(__SVR4) && !defined(_LP64) ++#define USE_EXTENDED_FILE_STDIO 1 ++#include ++#include ++#include ++#endif ++ + int + main(int argc, char **argv) + { +@@ -20,5 +27,18 @@ + m = fpgetmask(); + fpsetmask(m & ~FP_X_OFL); + #endif ++#ifdef USE_EXTENDED_FILE_STDIO ++ /* ++ * enable extended FILE facility on Solaris so that Python ++ * apps can keep more than 256 file descriptors open ++ */ ++ struct rlimit rlp; ++ (void) getrlimit(RLIMIT_NOFILE, &rlp); ++ rlp.rlim_cur = rlp.rlim_max; ++ if (setrlimit(RLIMIT_NOFILE, &rlp) != -1) { ++ enable_extended_FILE_stdio(-1, 0); ++ } ++#endif ++ + return Py_Main(argc, argv); + } diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/02-setup.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/02-setup.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,60 @@ +--- Python-2.7.1/setup.py.~1~ Sun Oct 31 11:40:21 2010 ++++ Python-2.7.1/setup.py Fri Jul 15 15:04:56 2011 +@@ -347,8 +347,8 @@ + + def detect_modules(self): + # Ensure that /usr/local is always used +- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') +- add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ #add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') ++ #add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -657,6 +657,13 @@ + ['/usr/lib/termcap'], + 'termcap'): + readline_libs.append('termcap') ++ ++ if platform == 'sunos5': ++ # insert '-zrecord' before the readline libraries that we ++ # want to link with to avoid rl_insert() elimination ++ readline_extra_link_args = ('-Wl,-zrecord','-lreadline','-lncurses') ++ readline_libs = () ++ + exts.append( Extension('readline', ['readline.c'], + library_dirs=['/usr/lib/termcap'], + extra_link_args=readline_extra_link_args, +@@ -677,6 +684,7 @@ + + # socket(2) + exts.append( Extension('_socket', ['socketmodule.c'], ++ libraries = ['socket', 'nsl'], + depends = ['socketmodule.h']) ) + # Detect SSL support for the socket module (via _ssl) + search_for_ssl_incs_in = [ +@@ -1443,9 +1451,14 @@ + sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')): + multiprocessing_srcs.append('_multiprocessing/semaphore.c') + ++ multiproc_libs = [] ++ if platform == 'sunos5': ++ multiproc_libs = [ "xnet" ] ++ + if sysconfig.get_config_var('WITH_THREAD'): + exts.append ( Extension('_multiprocessing', multiprocessing_srcs, + define_macros=macros.items(), ++ libraries=multiproc_libs, + include_dirs=["Modules/_multiprocessing"])) + else: + missing.append('_multiprocessing') +@@ -1896,7 +1909,8 @@ + # this option. If you want to compile ctypes with the Sun + # compiler, please research a proper solution, instead of + # finding some -z option for the Sun compiler. +- extra_link_args.append('-mimpure-text') ++ #extra_link_args.append('-mimpure-text') ++ pass + + elif sys.platform.startswith('hp-ux'): + extra_link_args.append('-fPIC') diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/03-vendor-packages.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/03-vendor-packages.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,6 @@ +diff --git Python-2.7.1/Lib/site-packages/vendor-packages.pth Python2.7.1/Lib/site-packages/vendor-packages.pth +--- /dev/null Sat Feb 12 00:21:26 2011 ++++ Python-2.7.1/Lib/site-packages/vendor-packages.pth Sat Feb 12 00:47:05 2011 +@@ -0,0 +1,1 @@ ++import site; site.addsitedir('/usr/lib/python2.7/vendor-packages') + diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/04-solaris-64-bit.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/04-solaris-64-bit.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,163 @@ +--- Python-2.7.1/Lib/distutils/command/build_ext.py.orig Fri Jul 15 15:32:28 2011 ++++ Python-2.7.1/Lib/distutils/command/build_ext.py Fri Jul 15 15:37:00 2011 +@@ -637,6 +637,10 @@ + filename = self.get_ext_filename(ext_name) + filename = os.path.split(filename)[-1] + ++ # on Solaris we put 64-bit python objects under .../64 ++ if sys.maxint != 2147483647L: ++ filename = os.path.join("64", filename) ++ + if not self.inplace: + # no further work needed + # returning : +@@ -677,7 +681,14 @@ + so_ext = get_config_var('SO') + if os.name == 'nt' and self.debug: + return os.path.join(*ext_path) + '_d' + so_ext +- return os.path.join(*ext_path) + so_ext ++ #return os.path.join(*ext_path) + so_ext ++ # .so extensions are word-size specific ++ path = apply(os.path.join, ext_path) ++ if sys.maxint == 2147483647L: ++ return path + so_ext ++ dirname = os.path.dirname(path); ++ basename = os.path.basename(path); ++ return os.path.join(dirname, "64", basename + so_ext) + + def get_export_symbols (self, ext): + """Return the list of symbols that a shared extension has to +--- Python-2.7.1/Python/import.c.orig Fri Jul 15 15:41:33 2011 ++++ Python-2.7.1/Python/import.c Fri Jul 15 15:46:55 2011 +@@ -1197,6 +1197,57 @@ + static int find_init_module(char *); /* Forward */ + static struct filedescr importhookdescr = {"", "", IMP_HOOK}; + ++#ifdef HAVE_STAT ++static char * ++insert_64dir(char *buf, size_t buflen) ++{ ++ char *base; ++ char *cp; ++ size_t blen; ++ ++ if ((blen = strlen(buf)) == 0) ++ return (NULL); ++ ++ cp = &buf[blen - 1]; ++ while (cp != buf && *cp != SEP) ++ cp--; ++ ++ if (cp != buf) ++ cp++; ++ ++ if (blen + strlen("64/") + 1 >= buflen) ++ return NULL; ++ ++ base = strdup(cp); ++ sprintf(cp, "64%c%s", SEP, base); ++ free(base); ++ ++ return buf; ++} ++ ++/* ++ * If we're on a 64-bit platform, modify lookups for shared object files. ++ */ ++static size_t modify_path(struct filedescr *fdp, char *buf, size_t buflen) ++{ ++ struct stat statbuf; ++ ++ if (sizeof(void *) != 8) ++ return 0; ++ ++ if (stat(buf, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) ++ return 0; ++ ++ if (fdp->type != C_EXTENSION) ++ return 0; ++ ++ if (insert_64dir(buf, buflen) == NULL) ++ return 0; ++ ++ return strlen("64/"); ++} ++#endif ++ + static struct filedescr * + find_module(char *fullname, char *subname, PyObject *path, char *buf, + size_t buflen, FILE **p_fp, PyObject **p_loader) +@@ -1214,11 +1265,10 @@ + static struct filedescr fd_builtin = {"", "", C_BUILTIN}; + static struct filedescr fd_package = {"", "", PKG_DIRECTORY}; + char name[MAXPATHLEN+1]; +-#if defined(PYOS_OS2) + size_t saved_len; + size_t saved_namelen; + char *saved_buf = NULL; +-#endif ++ + if (p_loader != NULL) + *p_loader = NULL; + +@@ -1437,7 +1487,6 @@ + } + #endif + #endif +-#if defined(PYOS_OS2) + /* take a snapshot of the module spec for restoration + * after the 8 character DLL hackery + */ +@@ -1444,8 +1493,11 @@ + saved_buf = strdup(buf); + saved_len = len; + saved_namelen = namelen; +-#endif /* PYOS_OS2 */ ++ + for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { ++#ifdef HAVE_STAT ++ len += modify_path(fdp, buf, buflen); ++#endif + #if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING) + /* OS/2 limits DLLs to 8 character names (w/o + extension) +@@ -1486,14 +1538,13 @@ + fp = NULL; + } + } +-#if defined(PYOS_OS2) ++ + /* restore the saved snapshot */ + strcpy(buf, saved_buf); + len = saved_len; + namelen = saved_namelen; +-#endif + } +-#if defined(PYOS_OS2) ++ + /* don't need/want the module name snapshot anymore */ + if (saved_buf) + { +@@ -1500,7 +1551,7 @@ + free(saved_buf); + saved_buf = NULL; + } +-#endif ++ + Py_XDECREF(copy); + if (fp != NULL) + break; +--- Python-2.7.1/Python/importdl.h.orig Fri Jul 15 15:48:16 2011 ++++ Python-2.7.1/Python/importdl.h Fri Jul 15 15:49:10 2011 +@@ -31,8 +31,9 @@ + extern PyObject *_PyImport_LoadDynamicModule(char *name, char *pathname, + FILE *); + +-/* Max length of module suffix searched for -- accommodates "module.slb" */ +-#define MAXSUFFIXSIZE 12 ++/* Max length of module suffix searched for -- accommodates "module.slb" ++ and '64/' */ ++#define MAXSUFFIXSIZE 15 + + #ifdef MS_WINDOWS + #include diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/05-dtrace.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/05-dtrace.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,416 @@ +--- Python-2.7.1/Makefile.pre.in.~1~ Thu Oct 14 06:37:30 2010 ++++ Python-2.7.1/Makefile.pre.in Mon Jul 18 14:53:46 2011 +@@ -198,6 +198,7 @@ + # Used of signalmodule.o is not available + SIGNAL_OBJS= @SIGNAL_OBJS@ + ++DTRACE_OBJS=Python/dtrace.o Python/phelper.o + + ########################################################################## + # Grammar +@@ -298,6 +299,7 @@ + Python/formatter_unicode.o \ + Python/formatter_string.o \ + Python/$(DYNLOADFILE) \ ++ $(DTRACE_OBJS) \ + $(LIBOBJS) \ + $(MACHDEP_OBJS) \ + $(THREADOBJ) +@@ -599,6 +601,18 @@ + Python/formatter_string.o: $(srcdir)/Python/formatter_string.c \ + $(STRINGLIB_HEADERS) + ++Python/phelper.o: $(srcdir)/Python/phelper.d ++ dtrace -o $@ -DPHELPER $(DFLAGS) $(CPPFLAGS) -C -G -s $(srcdir)/Python/phelper.d ++ ++Python/python.h: $(srcdir)/Python/python.d ++ dtrace -o $@ $(DFLAGS) -C -h -s $(srcdir)/Python/python.d ++ ++Python/ceval.o: Python/ceval.c Python/python.h ++ $(CC) -c -I. -IPython $(BASECFLAGS) $(EXTRA_CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) $(CFLAGS) -DPy_BUILD_CORE -o $@ $< ++ ++Python/dtrace.o: $(srcdir)/Python/python.d Python/ceval.o ++ dtrace -o $@ $(DFLAGS) -C -G -s $(srcdir)/Python/python.d Python/ceval.o ++ + ############################################################################ + # Header files + +--- Python-2.7.1/Include/frameobject.h.~1~ Fri May 8 17:23:21 2009 ++++ Python-2.7.1/Include/frameobject.h Mon Jul 18 14:53:46 2011 +@@ -44,6 +44,7 @@ + PyCode_Addr2Line to calculate the line from the current + bytecode index. */ + int f_lineno; /* Current line number */ ++ int f_calllineno; /* line number of call site */ + int f_iblock; /* index in f_blockstack */ + PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ + +--- Python-2.7.1/Objects/frameobject.c.~1~ Sun May 9 09:46:46 2010 ++++ Python-2.7.1/Objects/frameobject.c Mon Jul 18 15:03:52 2011 +@@ -736,6 +736,7 @@ + f->f_tstate = tstate; + + f->f_lasti = -1; ++ f->f_calllineno = code->co_firstlineno; + f->f_lineno = code->co_firstlineno; + f->f_iblock = 0; + +--- Python-2.7.1/Python/ceval.c.~1~ Fri Sep 24 22:27:12 2010 ++++ Python-2.7.1/Python/ceval.c Mon Jul 18 15:15:35 2011 +@@ -19,6 +19,11 @@ + + #include + ++#define HAVE_DTRACE ++#ifdef HAVE_DTRACE ++#include "python.h" ++#endif ++ + #ifndef WITH_TSC + + #define READ_TIMESTAMP(var) +@@ -671,7 +676,56 @@ + NULL); + } + ++#ifdef HAVE_DTRACE ++static void ++dtrace_entry(PyFrameObject *f) ++{ ++ const char *filename; ++ const char *fname; ++ int lineno; ++ ++ filename = PyString_AsString(f->f_code->co_filename); ++ fname = PyString_AsString(f->f_code->co_name); ++ lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); + ++ PYTHON_FUNCTION_ENTRY((char *)filename, (char *)fname, lineno); ++ ++ /* ++ * Currently a USDT tail-call will not receive the correct arguments. ++ * Disable the tail call here. ++ */ ++#if defined(__sparc) ++ asm("nop"); ++#endif ++} ++ ++static void ++dtrace_return(PyFrameObject *f) ++{ ++ const char *filename; ++ const char *fname; ++ int lineno; ++ ++ filename = PyString_AsString(f->f_code->co_filename); ++ fname = PyString_AsString(f->f_code->co_name); ++ lineno = PyCode_Addr2Line(f->f_code, f->f_lasti); ++ PYTHON_FUNCTION_RETURN((char *)filename, (char *)fname, lineno); ++ ++ /* ++ * Currently a USDT tail-call will not receive the correct arguments. ++ * Disable the tail call here. ++ */ ++#if defined(__sparc) ++ asm("nop"); ++#endif ++} ++#else ++#define PYTHON_FUNCTION_ENTRY_ENABLED 0 ++#define PYTHON_FUNCTION_RETURN_ENABLED 0 ++#define dtrace_entry() ++#define dtrace_return() ++#endif ++ + /* Interpreter main loop */ + + PyObject * +@@ -682,9 +736,84 @@ + return PyEval_EvalFrameEx(f, 0); + } + ++/* ++ * These shenanigans look like utter madness, but what we're actually doing is ++ * making sure that the ustack helper will see the PyFrameObject pointer on the ++ * stack. We have two tricky cases: ++ * ++ * amd64 ++ * ++ * We use up the six registers for passing arguments, meaning the call can't ++ * use a register for passing 'f', and has to push it onto the stack in a known ++ * location. ++ * ++ * And how does "throwflag" figure in to this? -PN ++ * ++ * SPARC ++ * ++ * Here the problem is that (on 32-bit) the compiler is re-using %i0 before ++ * some calls inside PyEval_EvalFrameReal(), which means that when it's saved, ++ * it's just some junk value rather than the real first argument. So, instead, ++ * we trace our proxy PyEval_EvalFrame(), where we 'know' the compiler won't ++ * decide to re-use %i0. We also need to defeat optimization of our proxy. ++ */ ++ ++#if defined(HAVE_DTRACE) ++ ++#if defined(__amd64) ++PyObject *PyEval_EvalFrameExReal(long, long, long, long, long, long, ++ PyFrameObject *, int throwflag); ++ ++ ++ + PyObject * + PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) + { ++ volatile PyObject *f2; ++ f2 = PyEval_EvalFrameExReal(0, 0, 0, 0, 0, 0, f, throwflag); ++ return (PyObject *)f2; ++} ++ ++PyObject * ++PyEval_EvalFrameExReal(long a1, long a2, long a3, long a4, long a5, long a6, ++ PyFrameObject *f, int throwflag) ++{ ++ ++#elif defined(__sparc) ++ ++PyObject *PyEval_EvalFrameExReal(PyFrameObject *f, int throwflag); ++ ++volatile int dummy; ++ ++PyObject * ++PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ++{ ++ volatile PyObject *f2; ++ f2 = PyEval_EvalFrameExReal(f, throwflag); ++ dummy = f->ob_refcnt; ++ return (PyObject *)f2; ++} ++ ++PyObject * ++PyEval_EvalFrameExReal(PyFrameObject *f, int throwflag) ++{ ++ ++#else /* __amd64 || __sparc */ ++ ++PyObject * ++PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) ++{ ++ ++#endif /* __amd64 || __sparc */ ++ ++#else /* don't HAVE_DTRACE */ ++ ++PyObject * ++PyEval_EvalFrameexEx(PyFrameObject *f, int throwflag)) ++{ ++ ++#endif /* HAVE_DTRACE */ ++ + #ifdef DXPAIRS + int lastopcode = 0; + #endif +@@ -909,6 +1038,11 @@ + } + } + ++#ifdef HAVE_DTRACE ++ if (PYTHON_FUNCTION_ENTRY_ENABLED()) ++ dtrace_entry(f); ++#endif ++ + co = f->f_code; + names = co->co_names; + consts = co->co_consts; +@@ -2659,6 +2793,9 @@ + PyObject **sp; + PCALL(PCALL_ALL); + sp = stack_pointer; ++#ifdef HAVE_DTRACE ++ f->f_calllineno = PyCode_Addr2Line(f->f_code, f->f_lasti); ++#endif + #ifdef WITH_TSC + x = call_function(&sp, oparg, &intr0, &intr1); + #else +@@ -2700,6 +2837,9 @@ + } else + Py_INCREF(func); + sp = stack_pointer; ++#ifdef HAVE_DTRACE ++ f->f_calllineno = PyCode_Addr2Line(f->f_code, f->f_lasti); ++#endif + READ_TIMESTAMP(intr0); + x = ext_do_call(func, &sp, flags, na, nk); + READ_TIMESTAMP(intr1); +@@ -3000,6 +3140,10 @@ + + /* pop frame */ + exit_eval_frame: ++#ifdef HAVE_DTRACE ++ if (PYTHON_FUNCTION_RETURN_ENABLED()) ++ dtrace_return(f); ++#endif + Py_LeaveRecursiveCall(); + tstate->frame = f->f_back; + +diff --git Python-2.6.4/Python/phelper.d Python-2.6.4/Python/phelper.d +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Python/phelper.d +@@ -0,0 +1,139 @@ ++ ++/* ++ * Python ustack helper. This relies on the first argument (PyFrame *) being ++ * on the stack; see Python/ceval.c for the contortions we go through to ensure ++ * this is the case. ++ * ++ * On x86, the PyFrame * is two slots up from the frame pointer; on SPARC, it's ++ * eight. ++ */ ++ ++/* ++ * Yes, this is as gross as it looks. DTrace cannot handle static functions, ++ * and our stat_impl.h has them in ILP32. ++ */ ++#define _SYS_STAT_H ++ ++#include ++#include ++ ++#include "pyport.h" ++#include "object.h" ++#include "pystate.h" ++#include "pyarena.h" ++#include "pythonrun.h" ++#include "compile.h" ++#include "frameobject.h" ++#include "stringobject.h" ++ ++#if defined(__i386) ++#define startframe PyEval_EvalFrameEx ++#define endframe PyEval_EvalCodeEx ++#elif defined(__amd64) ++#define PyEval_EvalFrameEx PyEval_EvalFrameExReal ++#define startframe PyEval_EvalFrameExReal ++#define endframe PyEval_EvalCodeEx ++#elif defined(__sparc) ++#define PyEval_EvalFrameEx PyEval_EvalFrameExReal ++#define startframe PyEval_EvalFrameEx ++#define endframe PyEval_EvalFrameExReal ++#endif ++ ++#ifdef __sparcv9 ++#define STACK_BIAS (2048-1) ++#else ++#define STACK_BIAS 0 ++#endif ++ ++/* ++ * Not defining PHELPER lets us test this code as a normal D script. ++ */ ++#ifdef PHELPER ++ ++#define at_evalframe(addr) \ ++ ((uintptr_t)addr >= ((uintptr_t)&``startframe) && \ ++ (uintptr_t)addr < ((uintptr_t)&``endframe)) ++#define probe dtrace:helper:ustack: ++#define print_result(r) (r) ++ ++#if defined(__i386) || defined(__amd64) ++#define frame_ptr_addr ((uintptr_t)arg1 + sizeof(uintptr_t) * 2) ++#elif defined(__sparc) ++#define frame_ptr_addr ((uintptr_t)arg1 + STACK_BIAS + sizeof(uintptr_t) * 8) ++#else ++#error unknown architecture ++#endif ++ ++#else /* PHELPER */ ++ ++#define at_evalframe(addr) (1) ++#define probe pid$target::PyEval_EvalFrame:entry ++#define print_result(r) (trace(r)) ++ ++#if defined(__i386) || defined(__amd64) ++#define frame_ptr_addr ((uintptr_t)uregs[R_SP] + sizeof(uintptr_t)) ++#elif defined(__sparc) ++/* ++ * Not implemented: we could just use R_I0, but what's the point? ++ */ ++#else ++#error unknown architecture ++#endif ++ ++#endif /* PHELPER */ ++ ++extern uintptr_t PyEval_EvalFrameEx; ++extern uintptr_t PyEval_EvalCodeEx; ++ ++#define copyin_obj(addr, obj) ((obj *)copyin((uintptr_t)addr, sizeof(obj))) ++#define pystr_addr(addr) ((char *)addr + offsetof(PyStringObject, ob_sval)) ++#define copyin_str(dest, addr, obj) \ ++ (copyinto((uintptr_t)pystr_addr(addr), obj->ob_size, (dest))) ++#define add_str(addr, obj) \ ++ copyin_str(this->result + this->pos, addr, obj); \ ++ this->pos += obj->ob_size; \ ++ this->result[this->pos] = '\0'; ++#define add_digit(nr, div) ((nr / div) ? \ ++ (this->result[this->pos++] = '0' + ((nr / div) % 10)) : \ ++ (this->result[this->pos] = '\0')) ++#define add_char(c) (this->result[this->pos++] = c) ++ ++probe /at_evalframe(arg0)/ ++{ ++ this->framep = *(uintptr_t *)copyin(frame_ptr_addr, sizeof(uintptr_t)); ++ this->frameo = copyin_obj(this->framep, PyFrameObject); ++ this->codep = this->frameo->f_code; ++ this->lineno = this->frameo->f_calllineno; ++ this->codeo = copyin_obj(this->codep, PyCodeObject); ++ this->filenamep = this->codeo->co_filename; ++ this->fnamep = this->codeo->co_name; ++ this->filenameo = copyin_obj(this->filenamep, PyStringObject); ++ this->fnameo = copyin_obj(this->fnamep, PyStringObject); ++ ++ this->len = 1 + this->filenameo->ob_size + 1 + 5 + 2 + ++ this->fnameo->ob_size + 1 + 1; ++ ++ this->result = (char *)alloca(this->len); ++ this->pos = 0; ++ ++ add_char('@'); ++ add_str(this->filenamep, this->filenameo); ++ add_char(':'); ++ add_digit(this->lineno, 10000); ++ add_digit(this->lineno, 1000); ++ add_digit(this->lineno, 100); ++ add_digit(this->lineno, 10); ++ add_digit(this->lineno, 1); ++ add_char(' '); ++ add_char('('); ++ add_str(this->fnamep, this->fnameo); ++ add_char(')'); ++ this->result[this->pos] = '\0'; ++ ++ print_result(stringof(this->result)); ++} ++ ++probe /!at_evalframe(arg0)/ ++{ ++ NULL; ++} +diff --git Python-2.6.4/Python/python.d Python-2.6.4/Python/python.d +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Python/python.d +@@ -0,0 +1,10 @@ ++provider python { ++ probe function__entry(const char *, const char *, int); ++ probe function__return(const char *, const char *, int); ++}; ++ ++#pragma D attributes Evolving/Evolving/Common provider python provider ++#pragma D attributes Private/Private/Common provider python module ++#pragma D attributes Private/Private/Common provider python function ++#pragma D attributes Evolving/Evolving/Common provider python name ++#pragma D attributes Evolving/Evolving/Common provider python args diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/06-ucred.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/06-ucred.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,462 @@ +diff --git Python-2.6.4/Modules/ucred.c Python-2.6.4/Modules/ucred.c +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/ucred.c +@@ -0,0 +1,390 @@ ++/* ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++typedef struct { ++ PyObject_HEAD ++ ucred_t *ucred; ++} pyucred_t; ++ ++#define pyucred_getlongid(name, type) \ ++ static PyObject * \ ++ pyucred_get##name(pyucred_t *uc) \ ++ { \ ++ type val; \ ++ \ ++ if (uc->ucred == NULL) { \ ++ errno = EINVAL; \ ++ PyErr_SetFromErrno(PyExc_OSError); \ ++ return (NULL); \ ++ } \ ++ \ ++ if ((val = ucred_get##name(uc->ucred)) == -1) { \ ++ PyErr_SetFromErrno(PyExc_OSError); \ ++ return (NULL); \ ++ } \ ++ \ ++ return (Py_BuildValue("l", (long)val)); \ ++ } ++ ++pyucred_getlongid(euid, uid_t) ++pyucred_getlongid(ruid, uid_t) ++pyucred_getlongid(suid, uid_t) ++pyucred_getlongid(egid, gid_t) ++pyucred_getlongid(rgid, gid_t) ++pyucred_getlongid(sgid, gid_t) ++pyucred_getlongid(pid, pid_t) ++pyucred_getlongid(projid, projid_t) ++pyucred_getlongid(zoneid, zoneid_t) ++ ++static PyObject * ++pyucred_getgroups(pyucred_t *uc) ++{ ++ const gid_t *groups; ++ PyObject *list; ++ int len; ++ int i; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if ((len = ucred_getgroups(uc->ucred, &groups)) == -1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if ((list = PyList_New(len)) == NULL) ++ return (NULL); ++ ++ for (i = 0; i < len; i++) { ++ PyObject *gid = Py_BuildValue("l", (long)groups[i]); ++ if (PyList_SetItem(list, i, gid) == -1) ++ return (NULL); ++ } ++ ++ return (list); ++} ++ ++static PyObject * ++pyucred_getlabel(pyucred_t *uc) ++{ ++ m_label_t *label; ++ PyObject *ret; ++ char *str; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ label = ucred_getlabel(uc->ucred); ++ if (label == NULL) ++ return (Py_BuildValue("s", "")); ++ ++ if (label_to_str(label, &str, M_LABEL, DEF_NAMES) == -1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ ret = Py_BuildValue("s", str); ++ free(str); ++ return (ret); ++} ++ ++static PyObject * ++pyucred_getpflags(pyucred_t *uc, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "flags", NULL }; ++ uint_t flags; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, ++ &flags)) ++ return (NULL); ++ ++ if ((flags = ucred_getpflags(uc->ucred, flags)) == (uint_t)-1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("i", flags)); ++} ++ ++static PyObject * ++pyucred_has_priv(pyucred_t *uc, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "set", "priv", NULL }; ++ const priv_set_t *privs; ++ const char *set; ++ const char *priv; ++ ++ if (uc->ucred == NULL) { ++ errno = EINVAL; ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, ++ &set, &priv)) ++ return (NULL); ++ ++ if ((privs = ucred_getprivset(uc->ucred, set)) == NULL) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ if (priv_ismember(privs, priv)) { ++ Py_INCREF(Py_True); ++ return Py_True; ++ } ++ ++ Py_INCREF(Py_False); ++ return Py_False; ++} ++ ++PyDoc_STRVAR(pyucred_getlabel_doc, ++ "getlabel() -> string\n" ++ "\n" ++ "Return the Trusted Extensions label string, or an " ++ "empty string if not available. The label string is " ++ "converted using the default name and M_LABEL (human-readable). " ++ "Raises OSError. See label_to_str(3TSOL)."); ++PyDoc_STRVAR(pyucred_getpflags_doc, ++ "getpflags(flags) -> int\n" ++ "\n" ++ "Return the values of the specified privilege flags."); ++PyDoc_STRVAR(pyucred_has_priv_doc, ++ "has_priv(set, priv) -> bool\n" ++ "\n" ++ "Return true if the given privilege is set in the " ++ "specified set. Raises OSError if the set or privilege is " ++ "invalid, or a problem occurs.\n" ++ "\n" ++ "Currently, the following privilege sets are defined, as " ++ "described in privileges(5):\n" ++ "\n" ++ "Effective\n" ++ "Permitted\n" ++ "Inheritable\n" ++ "Limit\n"); ++ ++static PyMethodDef pyucred_methods[] = { ++ { "geteuid", (PyCFunction)pyucred_geteuid, METH_NOARGS, ++ "Return the effective user ID." }, ++ { "getruid", (PyCFunction)pyucred_getruid, METH_NOARGS, ++ "Return the real user ID." }, ++ { "getsuid", (PyCFunction)pyucred_getsuid, METH_NOARGS, ++ "Return the saved user ID." }, ++ { "getegid", (PyCFunction)pyucred_getegid, METH_NOARGS, ++ "Return the effective group ID." }, ++ { "getrgid", (PyCFunction)pyucred_getrgid, METH_NOARGS, ++ "Return the real group ID." }, ++ { "getsgid", (PyCFunction)pyucred_getsgid, METH_NOARGS, ++ "Return the saved group ID." }, ++ { "getpid", (PyCFunction)pyucred_getpid, METH_NOARGS, ++ "Return the effective user ID." }, ++ { "getprojid", (PyCFunction)pyucred_getprojid, METH_NOARGS, ++ "Return the project ID." }, ++ { "getzoneid", (PyCFunction)pyucred_getzoneid, METH_NOARGS, ++ "Return the zone ID." }, ++ { "getgroups", (PyCFunction)pyucred_getgroups, METH_NOARGS, ++ "Return a list of group IDs." }, ++ { "getlabel", (PyCFunction)pyucred_getlabel, METH_NOARGS, ++ pyucred_getlabel_doc }, ++ { "getpflags", (PyCFunction)pyucred_getpflags, ++ METH_VARARGS|METH_KEYWORDS, pyucred_getpflags_doc }, ++ { "has_priv", (PyCFunction)pyucred_has_priv, ++ METH_VARARGS|METH_KEYWORDS, pyucred_has_priv_doc }, ++ { NULL } ++}; ++ ++static int ++pyucred_init(PyObject *self, PyObject *args, PyObject *kwargs) ++{ ++ pyucred_t *uc = (pyucred_t *)self; ++ uc->ucred = NULL; ++ return (0); ++} ++ ++static void ++pyucred_dealloc(PyObject *self) ++{ ++ pyucred_t *uc = (pyucred_t *)self; ++ if (uc->ucred != NULL) ++ ucred_free(uc->ucred); ++ self->ob_type->tp_free(self); ++} ++ ++static PyTypeObject pyucred_type = { ++ PyObject_HEAD_INIT(NULL) ++ 0, /*ob_size*/ ++ "ucred.ucred", /*tp_name*/ ++ sizeof (pyucred_t), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ pyucred_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_compare*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT, /*tp_flags*/ ++ "user credentials", /*tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ pyucred_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)pyucred_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ 0, /* tp_new */ ++}; ++ ++static PyObject * ++pyucred_new(const ucred_t *uc) ++{ ++ pyucred_t *self; ++ ++ self = (pyucred_t *)PyObject_CallObject((PyObject *)&pyucred_type, NULL); ++ ++ if (self == NULL) ++ return (NULL); ++ ++ self->ucred = (ucred_t *)uc; ++ ++ return ((PyObject *)self); ++} ++ ++static PyObject * ++pyucred_get(PyObject *o, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "pid", NULL }; ++ ucred_t *ucred = NULL; ++ int pid; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, ++ &pid)) ++ return (NULL); ++ ++ ucred = ucred_get(pid); ++ ++ if (ucred == NULL) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ return (pyucred_new(ucred)); ++} ++ ++static PyObject * ++pyucred_getpeer(PyObject *o, PyObject *args, PyObject *kwargs) ++{ ++ static char *kwlist[] = { "fd", NULL }; ++ ucred_t *ucred = NULL; ++ int fd; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, ++ &fd)) ++ return (NULL); ++ ++ if (getpeerucred(fd, &ucred) == -1) { ++ PyErr_SetFromErrno(PyExc_OSError); ++ return (NULL); ++ } ++ ++ return (pyucred_new(ucred)); ++} ++ ++PyDoc_STRVAR(pyucred_get_doc, ++ "get(pid) -> ucred\n" ++ "\n" ++ "Return the credentials of the specified process ID. " ++ "Raises OSError. See ucred_get(3C)."); ++PyDoc_STRVAR(pyucred_getpeer_doc, ++ "getpeer(fd) -> ucred\n" ++ "\n" ++ "Return the credentials of the peer endpoint of a " ++ "connection-oriented socket (SOCK_STREAM) or STREAM fd " ++ "at the time the endpoint was created or the connection " ++ "was established. Raises OSError. See getpeerucred(3C)."); ++ ++static struct PyMethodDef pyucred_module_methods[] = { ++ { "get", (PyCFunction) pyucred_get, ++ METH_VARARGS|METH_KEYWORDS, pyucred_get_doc }, ++ { "getpeer", (PyCFunction) pyucred_getpeer, ++ METH_VARARGS|METH_KEYWORDS, pyucred_getpeer_doc }, ++ { NULL, NULL, 0, NULL } ++}; ++ ++PyDoc_STRVAR(pyucred_module_doc, ++ "This module provides an interface to the user credential access " ++ "methods, obtainable either by process ID or file descriptor."); ++ ++PyMODINIT_FUNC ++initucred(void) ++{ ++ PyObject *m; ++ ++ m = Py_InitModule3("ucred", pyucred_module_methods, ++ pyucred_module_doc); ++ ++ pyucred_type.tp_new = PyType_GenericNew; ++ if (PyType_Ready(&pyucred_type) < 0) ++ return; ++ ++ Py_INCREF(&pyucred_type); ++ ++ PyModule_AddObject(m, "ucred", (PyObject *)&pyucred_type); ++} +diff --git Python-2.6.4/setup.py Python-2.6.4/setup.py +--- Python-2.6.4/setup.py ++++ Python-2.6.4/setup.py +@@ -1277,6 +1277,13 @@ + else: + missing.append('dl') + ++ # ucred module (Solaris) ++ ucred_inc = find_file('ucred.h', [], inc_dirs) ++ tsol_inc = find_file('tsol/label.h', [], inc_dirs) ++ if ucred_inc is not None and tsol_inc is not None: ++ exts.append( Extension('ucred', ['ucred.c'], ++ libraries = ['tsol']) ) ++ + # Thomas Heller's _ctypes module + self.detect_ctypes(inc_dirs, lib_dirs) + +diff --git Python-2.6.4/Lib/test/ucredtext.py Python-2.6.4/Lib/test/ucredtext.py +new file mode 100644 +--- /dev/null 2011-02-12 03:14:16.000000000 -0600 ++++ Python-2.6.4/Lib/test/ucredtest.py 2011-01-20 13:52:42.945657919 -0600 +@@ -0,0 +1,45 @@ ++#!/usr/bin/python2.6 ++ ++import ucred ++import os ++ ++uc = ucred.get(os.getpid()) ++ ++print "pid = %d" % uc.getpid() ++print "euid = %d" % uc.geteuid() ++print "ruid = %d" % uc.getruid() ++print "suid = %d" % uc.getsuid() ++print "egid = %d" % uc.getegid() ++print "rgid = %d" % uc.getrgid() ++print "sgid = %d" % uc.getsgid() ++print "zoneid = %d" % uc.getzoneid() ++print "projid = %d" % uc.getprojid() ++print "groups = %s" % uc.getgroups() ++print "label = %s" % uc.getlabel() ++ ++print "getpflags(0x1) = %d" % uc.getpflags(0x1) ++print "getpflags(0x2) = %d" % uc.getpflags(0x2) ++print "has_priv(Effective, proc_fork) = %d" % uc.has_priv("Effective", "proc_fork") ++print "has_priv(Permitted, proc_fork) = %d" % uc.has_priv("Permitted", "proc_fork") ++print "has_priv(Inheritable, proc_fork) = %d" % uc.has_priv("Inheritable", "proc_fork") ++print "has_priv(Limit, file_setid) = %d" % uc.has_priv("Limit", "file_setid") ++print "has_priv(Effective, file_setid) = %d" % uc.has_priv("Effective", "file_setid") ++try: ++ uc.has_priv("Effective", "proc_bork") ++except OSError, e: ++ print e ++try: ++ uc.has_priv("Defective", "proc_fork") ++except OSError, e: ++ print e ++try: ++ uc.has_priv("Defective", "proc_bork") ++except OSError, e: ++ print e ++ ++del uc ++uc = ucred.ucred() ++try: ++ uc.getpid() ++except OSError, e: ++ print e diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/07-dlpi.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/07-dlpi.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,1327 @@ +diff --git Python-2.6.4/Modules/dlpimodule.c Python-2.6.4/Modules/dlpimodule.c +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/dlpimodule.c +@@ -0,0 +1,1205 @@ ++/* ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ * ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++#include ++#include ++#include ++ ++typedef struct { ++ PyObject_HEAD ++ dlpi_handle_t dlpihdl; ++} pylink_t; ++ ++typedef struct { ++ PyObject *pyfunc; ++ PyObject *pyarg; ++} callback_data_t; ++ ++/* ++ * dlpi_err: the only exception raised for libdlpi related error. ++ * The accompanying value is: ++ * (dlpi_error_number, string), when it's a dlpi specific error, ++ * or, (DL_SYSERR, errno, string), when it's coming from a system call. ++ */ ++static PyObject *dlpi_err; ++ ++static void ++dlpi_raise_exception(int err) ++{ ++ PyObject *e = NULL; ++ ++ if (err == DL_SYSERR) { ++ e = Py_BuildValue("(iis)", DL_SYSERR, errno, strerror(errno)); ++ } else { ++ e = Py_BuildValue("(is)", err, dlpi_strerror(err)); ++ } ++ if (e != NULL) { ++ PyErr_SetObject(dlpi_err, e); ++ Py_DECREF(e); ++ } ++} ++ ++PyDoc_STRVAR(link_doc, ++ "link(linkname[, flags]) -> link object\n" ++ "\n" ++ "Open linkname with specified flags.\n" ++ "Three flags are supported: PASSIVE, RAW, NATIVE.\n" ++ "And these flags can be bitwise-OR'ed together(default flag is 0).\n" ++ "You need sys_net_rawaccess privilege to open a link.\n" ++ "See dlpi_open(3DLPI).\n" ++); ++static int ++link_init(PyObject *self, PyObject *args, PyObject *kwds) ++{ ++ uint_t flags = 0; ++ dlpi_handle_t dh; ++ char *linkname; ++ int rval; ++ static char *keywords[] = {"linkname", "flags", NULL}; ++ pylink_t *link = (pylink_t *)self; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|I", keywords, ++ &linkname, &flags)) ++ return (-1); ++ ++ if ((rval = dlpi_open(linkname, &dh, flags)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (-1); ++ } ++ ++ link->dlpihdl = dh; ++ ++ return (0); ++} ++ ++static void ++link_dealloc(pylink_t *link) ++{ ++ if (link->dlpihdl != NULL) ++ dlpi_close(link->dlpihdl); ++ link->ob_type->tp_free((PyObject *)link); ++} ++ ++PyDoc_STRVAR(bind_doc, ++ "bind(sap) -> unsigned int\n" ++ "\n" ++ "Attempts to bind the link to specified SAP, or ANY_SAP.\n" ++ "Returns the SAP that the function actually bound to, which\n" ++ "could be different from the SAP requested.\n" ++ "See dlpi_bind(3DLPI).\n" ++); ++static PyObject * ++link_bind(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ uint_t sap = 0, boundsap = 0; ++ static char *keywords[] = {"sap", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &sap)) ++ return (NULL); ++ ++ if ((rval = dlpi_bind(link->dlpihdl, sap, &boundsap)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", boundsap)); ++} ++ ++PyDoc_STRVAR(unbind_doc, ++ "unbind() -> None\n" ++ "\n" ++ "Attempts to unbind the link from previously bound sap.\n" ++ "See dlpi_unbind(3DLPI).\n" ++); ++static PyObject * ++link_unbind(pylink_t *link) ++{ ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_unbind(link->dlpihdl)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(send_doc, ++ "send(destaddr, message[, sap, minpri, maxpri]) -> None\n" ++ "\n" ++ "Attempts to send message over this link to sap on destaddr.\n" ++ "If SAP is not specified, the bound SAP is used\n" ++ "You can also specify priority range (minpri, maxpri).\n" ++ "See dlpi_send(3DLPI).\n" ++); ++static PyObject * ++link_send(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *daddr = NULL, *msgbuf = NULL; ++ size_t daddrlen = 0, msglen = 0; ++ t_scalar_t minpri = DL_QOS_DONT_CARE, maxpri = DL_QOS_DONT_CARE; ++ uint_t sap = DLPI_ANY_SAP; ++ dlpi_sendinfo_t ds, *dsp = NULL; ++ static char *keywords[] = ++ {"destaddr", "message", "sap", "minpri", "maxpri", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#s#|Iii", keywords, ++ &daddr, &daddrlen, &msgbuf, &msglen, &sap, &minpri, &maxpri)) ++ return (NULL); ++ ++ if ((sap != DLPI_ANY_SAP) || (minpri != DL_QOS_DONT_CARE) || ++ (maxpri != DL_QOS_DONT_CARE)) { ++ ds.dsi_sap = sap; ++ ds.dsi_prio.dl_min = minpri; ++ ds.dsi_prio.dl_max = maxpri; ++ dsp = &ds; ++ } ++ ++ if ((rval = dlpi_send(link->dlpihdl, daddr, daddrlen, ++ msgbuf, msglen, dsp)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(recv_doc, ++ "recv(msglen[, timeout]) -> (string, string), or (None, None)\n" ++ "\n" ++ "Attempts to receive message over this link.\n" ++ "You need to specify the message length for the received message.\n" ++ "And you can specify timeout value in milliseconds.\n" ++ "The default timeout value is -1 (wait forever).\n" ++ "Returns (source address, message data), or (None, None) when error occurs.\n" ++ "See dlpi_recv(3DLPI).\n" ++); ++static PyObject * ++link_recv(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ PyObject *obj; ++ char *saddr = NULL, *msgbuf = NULL; ++ size_t saddrlen = 0, msglen = 0, *saddrlenp = NULL, *msglenp = NULL; ++ int msec = -1; /* block until receive data */ ++ static char *keywords[] = {"msglen", "timeout", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "k|i", ++ keywords, &msglen, &msec)) ++ return (NULL); ++ ++ if (msglen > 0) { ++ msgbuf = malloc(msglen); ++ if (msgbuf == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ saddrlen = DLPI_PHYSADDR_MAX; ++ saddr = malloc(saddrlen); ++ if (saddr == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ free(msgbuf); ++ return (NULL); ++ } ++ msglenp = &msglen; ++ saddrlenp = &saddrlen; ++ } ++ ++ if ((rval = dlpi_recv(link->dlpihdl, saddr, saddrlenp, msgbuf, ++ msglenp, msec, NULL)) != DLPI_SUCCESS) { ++ if (msgbuf != NULL) ++ free(msgbuf); ++ if (saddr != NULL) ++ free(saddr); ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ obj = Py_BuildValue("s#s#", saddr, saddrlen, msgbuf, msglen); ++ if (msgbuf != NULL) ++ free(msgbuf); ++ if (saddr != NULL) ++ free(saddr); ++ return (obj); ++} ++ ++PyDoc_STRVAR(disabmulti_doc, ++ "disabmulti(address) -> None\n" ++ "\n" ++ "Disable a specified multicast address on this link.\n" ++ "See dlpi_disabmulti(3DLPI).\n" ++); ++static PyObject * ++link_disabmulti(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr = NULL; ++ size_t addrlen = 0; ++ static char *keywords[] = {"address", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", keywords, ++ &addr, &addrlen)) ++ return (NULL); ++ ++ if ((addrlen == 0) || (addrlen > DLPI_PHYSADDR_MAX)) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_disabmulti(link->dlpihdl, addr, addrlen)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(enabmulti_doc, ++ "enabmulti(address) -> None\n" ++ "\n" ++ "Enable a specified multicast address on this link.\n" ++ "See dlpi_enabmulti(3DLPI).\n" ++); ++static PyObject * ++link_enabmulti(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr = NULL; ++ size_t addrlen = 0; ++ static char *keywords[] = {"address", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", keywords, ++ &addr, &addrlen)) ++ return (NULL); ++ ++ if ((addrlen == 0) || (addrlen > DLPI_PHYSADDR_MAX)) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_enabmulti(link->dlpihdl, addr, addrlen)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++static void ++dlpi_callback(dlpi_handle_t hdl, dlpi_notifyinfo_t *ni, void *arg) ++{ ++ callback_data_t *cd = (callback_data_t *)arg; ++ PyObject *arglist, *result; ++ ++ switch (ni->dni_note) { ++ case DL_NOTE_SPEED: ++ arglist = Py_BuildValue("(OII)", ++ cd->pyarg, ni->dni_note, ni->dni_speed); ++ break; ++ case DL_NOTE_SDU_SIZE: ++ arglist = Py_BuildValue("(OII)", ++ cd->pyarg, ni->dni_note, ni->dni_size); ++ break; ++ case DL_NOTE_PHYS_ADDR: ++ arglist = Py_BuildValue("(OIs#)", ++ cd->pyarg, ni->dni_note, ni->dni_physaddr, ++ ni->dni_physaddrlen); ++ break; ++ default: ++ arglist = Py_BuildValue("(OIO)", cd->pyarg, ni->dni_note, ++ Py_None); ++ } ++ ++ result = PyEval_CallObject(cd->pyfunc, arglist); ++ Py_DECREF(arglist); ++ if (result == NULL) { ++ PyErr_Clear(); /* cannot raise error */ ++ } ++ Py_DECREF(result); ++ Py_DECREF(cd->pyfunc); ++ Py_XDECREF(cd->pyarg); ++ free(cd); ++} ++ ++PyDoc_STRVAR(enabnotify_doc, ++ "enabnotify(events, function[, arg]) -> unsigned long\n" ++ "\n" ++ "Enables a notification callback for the set of specified events,\n" ++ "which must be one or more (by a logical OR) events listed as below:\n" ++ "NOTE_LINK_DOWN Notify when link has gone down\n" ++ "NOTE_LINK_UP Notify when link has come up\n" ++ "NOTE_PHYS_ADDR Notify when address changes\n" ++ "NOTE_SDU_SIZE Notify when MTU changes\n" ++ "NOTE_SPEED Notify when speed changes\n" ++ "NOTE_PROMISC_ON_PHYS Notify when PROMISC_PHYS is set\n" ++ "NOTE_PROMISC_OFF_PHYS Notify when PROMISC_PHYS is cleared\n" ++ "Returns a handle for this registration.\n" ++ "See dlpi_enabnotify(3DLPI).\n" ++); ++static PyObject * ++link_enabnotify(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ PyObject *func = NULL, *arg = NULL; ++ callback_data_t *cd; ++ uint_t notes = 0; ++ static char *keywords[] = {"events", "function", "arg", NULL}; ++ dlpi_notifyid_t id; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "IO|O", ++ keywords, ¬es, &func, &arg)) ++ return (NULL); ++ ++ if (!PyCallable_Check(func)) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ cd = malloc(sizeof(callback_data_t)); ++ if (cd == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ Py_INCREF(func); ++ Py_XINCREF(arg); ++ cd->pyfunc = func; ++ cd->pyarg = arg; ++ ++ if ((rval = dlpi_enabnotify(link->dlpihdl, notes, dlpi_callback, ++ cd, &id)) != DLPI_SUCCESS) { ++ free(cd); ++ Py_DECREF(func); ++ Py_XDECREF(arg); ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("k", id)); ++} ++ ++PyDoc_STRVAR(disabnotify_doc, ++ "disabnotify(handle) -> argument object, or None\n" ++ "\n" ++ "Disables the notification registration associated with handle.\n" ++ "You should get this handle by calling enabnotify().\n" ++ "Returns the argument passed in when registering the callback, or None.\n" ++ "See dlpi_disabnotify(3DLPI).\n" ++); ++static PyObject * ++link_disabnotify(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ dlpi_notifyid_t id; ++ callback_data_t *arg; ++ PyObject *pyargsaved; ++ static char *keywords[] = {"handle", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "k", keywords, &id)) ++ return (NULL); ++ ++ if ((rval = dlpi_disabnotify(link->dlpihdl, id, (void **)&arg)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ /* clean up */ ++ pyargsaved = arg->pyarg; ++ Py_XINCREF(pyargsaved); ++ Py_XDECREF(arg->pyarg); ++ Py_DECREF(arg->pyfunc); ++ free(arg); ++ ++ if (pyargsaved != NULL) ++ return (pyargsaved); ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(get_sap_doc, ++ "get_sap() -> unsigned int\n" ++ "\n" ++ "Returns the sap bound to this link.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_sap(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", info.di_sap)); ++} ++ ++PyDoc_STRVAR(get_fd_doc, ++ "get_fd() -> int\n" ++ "\n" ++ "Returns the integer file descriptor that can be used to directly\n" ++ "operate on the link.\n" ++ "See dlpi_fd(3DLPI).\n" ++); ++static PyObject * ++link_get_fd(pylink_t *link) ++{ ++ int fd; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((fd = dlpi_fd(link->dlpihdl)) == -1) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("i", fd)); ++} ++ ++PyDoc_STRVAR(get_linkname_doc, ++ "get_linkname() -> string\n" ++ "\n" ++ "Returns the name of the link.\n" ++ "See dlpi_linkname(3DLPI).\n" ++); ++static PyObject * ++link_get_linkname(pylink_t *link) ++{ ++ const char *name = NULL; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((name = dlpi_linkname(link->dlpihdl)) == NULL) { ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("s", name)); ++} ++ ++PyDoc_STRVAR(get_bcastaddr_doc, ++ "get_bcastaddr() -> string, or None\n" ++ "\n" ++ "Returns the broadcast address of the link.\n" ++ "Returns None if the broadcast address is empty.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_bcastaddr(pylink_t *link) ++{ ++ char *addr[DLPI_PHYSADDR_MAX]; ++ size_t addrlen = 0; ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ if (info.di_bcastaddrlen == 0) { ++ Py_INCREF(Py_None); ++ return (Py_None); ++ } ++ ++ return (Py_BuildValue("s#", info.di_bcastaddr, info.di_bcastaddrlen)); ++} ++ ++PyDoc_STRVAR(get_physaddr_doc, ++ "get_physaddr(addrtype) -> string, or None\n" ++ "\n" ++ "Addrtype can be any one of the value listed below:\n" ++ "FACT_PHYS_ADDR Factory physical address\n" ++ "CURR_PHYS_ADDR Current physical address\n" ++ "Returns the corresponding physical address of the link.\n" ++ "See dlpi_get_physaddr(3DLPI).\n" ++); ++static PyObject * ++link_get_physaddr(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr[DLPI_PHYSADDR_MAX]; ++ size_t addrlen = DLPI_PHYSADDR_MAX; ++ static char *keywords[] = {"addrtype", NULL}; ++ uint_t type; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &type)) ++ return (NULL); ++ ++ if ((rval = dlpi_get_physaddr(link->dlpihdl, type, addr, &addrlen)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("s#", addr, addrlen)); ++} ++ ++PyDoc_STRVAR(set_physaddr_doc, ++ "set_physaddr(address) -> None\n" ++ "\n" ++ "Sets the physical address of the link.\n" ++ "See dlpi_set_physaddr(3DLPI).\n" ++); ++static PyObject * ++link_set_physaddr(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ char *addr = NULL; ++ size_t addrlen = 0; ++ static char *keywords[] = {"address", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", keywords, ++ &addr, &addrlen)) ++ return (NULL); ++ ++ if ((rval = dlpi_set_physaddr(link->dlpihdl, DL_CURR_PHYS_ADDR, ++ addr, addrlen)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(promiscon_doc, ++ "promiscon([level]) -> None\n" ++ "\n" ++ "Enables promiscuous mode for the link at levels:\n" ++ "PROMISC_PHYS Promiscuous mode at the physical level(default)\n" ++ "PROMISC_SAP Promiscuous mode at the SAP level\n" ++ "PROMISC_MULTI Promiscuous mode for all multicast addresses\n" ++ "See dlpi_promiscon(3DLPI).\n" ++); ++static PyObject * ++link_promiscon(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ uint_t level = DL_PROMISC_PHYS; ++ static char *keywords[] = {"level", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|I", keywords, &level)) ++ return (NULL); ++ ++ if ((rval = dlpi_promiscon(link->dlpihdl, level)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(promiscoff_doc, ++ "promiscoff([level]) -> None\n" ++ "\n" ++ "Disables promiscuous mode for the link at levels:\n" ++ "PROMISC_PHYS Promiscuous mode at the physical level(default)\n" ++ "PROMISC_SAP Promiscuous mode at the SAP level\n" ++ "PROMISC_MULTI Promiscuous mode for all multicast addresses\n" ++ "See dlpi_promiscoff(3DLPI).\n" ++); ++static PyObject * ++link_promiscoff(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ uint_t level = DL_PROMISC_PHYS; ++ static char *keywords[] = {"level", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "|I", keywords, &level)) ++ return (NULL); ++ ++ if ((rval = dlpi_promiscoff(link->dlpihdl, level)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(get_timeout_doc, ++ "get_timeout() -> int\n" ++ "\n" ++ "Returns current time out value of the link.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_timeout(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("i", info.di_timeout)); ++} ++ ++PyDoc_STRVAR(get_mactype_doc, ++ "get_mactype() -> unsigned char\n" ++ "\n" ++ "Returns MAC type of the link.\n" ++ "See for the list of possible MAC types.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_mactype(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("B", info.di_mactype)); ++} ++ ++PyDoc_STRVAR(set_timeout_doc, ++ "set_timeout(timeout) -> None\n" ++ "\n" ++ "Sets time out value of the link (default value: DEF_TIMEOUT).\n" ++ "See dlpi_set_timeout(3DLPI).\n" ++); ++static PyObject * ++link_set_timeout(pylink_t *link, PyObject *args, PyObject *kwds) ++{ ++ int timeout = DLPI_DEF_TIMEOUT; ++ static char *keywords[] = {"timeout", NULL}; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", keywords, &timeout)) ++ return (NULL); ++ ++ if ((rval = dlpi_set_timeout(link->dlpihdl, timeout)) != DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ Py_INCREF(Py_None); ++ return (Py_None); ++} ++ ++PyDoc_STRVAR(get_sdu_doc, ++ "get_sdu() -> (unsigned int, unsigned int)\n" ++ "\n" ++ "Returns (min sdu, max sdu).\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_sdu(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("II", info.di_min_sdu, info.di_max_sdu)); ++} ++ ++PyDoc_STRVAR(get_state_doc, ++ "get_state() -> unsigned int\n" ++ "\n" ++ "Returns current state of the link (either UNBOUND or IDLE).\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_state(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", info.di_state)); ++} ++ ++PyDoc_STRVAR(get_qos_select_doc, ++ "get_qos_select() -> (unsigned int, int, int, int)\n" ++ "\n" ++ "Returns (qos type, trans delay, priority, residul err).\n" ++ "Unsupported QOS parameters are set to UNKNOWN.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_qos_select(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("Iiiii", ++ info.di_qos_sel.dl_qos_type, ++ info.di_qos_sel.dl_trans_delay, ++ info.di_qos_sel.dl_priority, ++ info.di_qos_sel.dl_residual_error)); ++} ++ ++PyDoc_STRVAR(get_qos_range_doc, ++ "get_qos_range() -> \n" ++ " (unsigned int, (int, int), (int, int), (int, int), int)\n" ++ "\n" ++ "Returns (qos type, (trans delay target, trans delay accept),\n" ++ "(min priority, max priority), (min protection, max protection),\n" ++ "residual err).\n" ++ "Unsupported QOS range values are set to UNKNOWN.\n" ++ "See dlpi_info(3DLPI).\n" ++); ++static PyObject * ++link_get_qos_range(pylink_t *link) ++{ ++ dlpi_info_t info; ++ int rval; ++ ++ if (link->dlpihdl == NULL) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ if ((rval = dlpi_info(link->dlpihdl, &info, 0)) != ++ DLPI_SUCCESS) { ++ dlpi_raise_exception(rval); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I(ii)(ii)(ii)i", ++ info.di_qos_range.dl_qos_type, ++ info.di_qos_range.dl_trans_delay.dl_target_value, ++ info.di_qos_range.dl_trans_delay.dl_accept_value, ++ info.di_qos_range.dl_priority.dl_min, ++ info.di_qos_range.dl_priority.dl_max, ++ info.di_qos_range.dl_protection.dl_min, ++ info.di_qos_range.dl_protection.dl_max, ++ info.di_qos_range.dl_residual_error)); ++} ++ ++static PyMethodDef pylink_methods[] = { ++ {"bind", (PyCFunction)link_bind, METH_VARARGS|METH_KEYWORDS, bind_doc}, ++ {"unbind", (PyCFunction)link_unbind, METH_NOARGS, unbind_doc}, ++ {"send", (PyCFunction)link_send, METH_VARARGS|METH_KEYWORDS, ++ send_doc}, ++ {"recv", (PyCFunction)link_recv, METH_VARARGS|METH_KEYWORDS, ++ recv_doc}, ++ {"disabmulti", (PyCFunction)link_disabmulti, METH_VARARGS|METH_KEYWORDS, ++ disabmulti_doc}, ++ {"enabmulti", (PyCFunction)link_enabmulti, METH_VARARGS|METH_KEYWORDS, ++ enabmulti_doc}, ++ {"enabnotify", (PyCFunction)link_enabnotify, ++ METH_VARARGS|METH_KEYWORDS, enabnotify_doc}, ++ {"disabnotify", (PyCFunction)link_disabnotify, ++ METH_VARARGS|METH_KEYWORDS, disabnotify_doc}, ++ {"get_fd", (PyCFunction)link_get_fd, METH_NOARGS, get_fd_doc}, ++ {"get_sap", (PyCFunction)link_get_sap, METH_NOARGS, get_sap_doc}, ++ {"get_mactype", (PyCFunction)link_get_mactype, METH_NOARGS, ++ get_mactype_doc}, ++ {"get_linkname", (PyCFunction)link_get_linkname, METH_NOARGS, ++ get_linkname_doc}, ++ {"get_bcastaddr", (PyCFunction)link_get_bcastaddr, METH_NOARGS, ++ get_bcastaddr_doc}, ++ {"get_physaddr", (PyCFunction)link_get_physaddr, ++ METH_VARARGS|METH_KEYWORDS, get_physaddr_doc}, ++ {"set_physaddr", (PyCFunction)link_set_physaddr, ++ METH_VARARGS|METH_KEYWORDS, set_physaddr_doc}, ++ {"promiscon", (PyCFunction)link_promiscon, METH_VARARGS|METH_KEYWORDS, ++ promiscon_doc}, ++ {"promiscoff", (PyCFunction)link_promiscoff, METH_VARARGS|METH_KEYWORDS, ++ promiscoff_doc}, ++ {"get_timeout", (PyCFunction)link_get_timeout, METH_NOARGS, ++ get_timeout_doc}, ++ {"set_timeout", (PyCFunction)link_set_timeout, ++ METH_VARARGS|METH_KEYWORDS, set_timeout_doc}, ++ {"get_sdu", (PyCFunction)link_get_sdu, METH_NOARGS, get_sdu_doc}, ++ {"get_state", (PyCFunction)link_get_state, METH_NOARGS, ++ get_state_doc}, ++ {"get_qos_select", (PyCFunction)link_get_qos_select, METH_NOARGS, ++ get_qos_select_doc}, ++ {"get_qos_range", (PyCFunction)link_get_qos_range, METH_NOARGS, ++ get_qos_range_doc}, ++ {NULL} ++}; ++ ++static PyTypeObject pylink_type = { ++ PyObject_HEAD_INIT(0) /* Must fill in type value later */ ++ 0, /* ob_size */ ++ "dlpi.link", /* tp_name */ ++ sizeof(pylink_t), /* tp_basicsize */ ++ 0, /* tp_itemsize */ ++ (destructor)link_dealloc, /* tp_dealloc */ ++ 0, /* tp_print */ ++ 0, /* tp_getattr */ ++ 0, /* tp_setattr */ ++ 0, /* tp_compare */ ++ 0, /* tp_repr */ ++ 0, /* tp_as_number */ ++ 0, /* tp_as_sequence */ ++ 0, /* tp_as_mapping */ ++ 0, /* tp_hash */ ++ 0, /* tp_call */ ++ 0, /* tp_str */ ++ 0, /* tp_getattro */ ++ 0, /* tp_setattro */ ++ 0, /* tp_as_buffer */ ++ Py_TPFLAGS_DEFAULT, /* tp_flags */ ++ link_doc, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ 0, /* tp_iter */ ++ 0, /* tp_iternext */ ++ pylink_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)link_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ PyType_GenericNew, /* tp_new */ ++ 0, /* tp_free */ ++}; ++ ++PyDoc_STRVAR(arptype_doc, ++ "arptype(arptype) -> unsigned int\n" ++ "\n" ++ "Converts a DLPI MAC type to an ARP hardware type defined\n" ++ " in \n" ++ "See dlpi_arptype(3DLPI)\n" ++); ++static PyObject * ++arptype(PyObject *dlpi, PyObject *args, PyObject *kwds) ++{ ++ static char *keywords[] = {"arptype", NULL}; ++ uint_t dlpityp, arptyp; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &dlpityp)) ++ return (NULL); ++ ++ if ((arptyp = dlpi_arptype(dlpityp)) == 0) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", arptyp)); ++} ++ ++PyDoc_STRVAR(iftype_doc, ++ "iftype(iftype) -> unsigned int\n" ++ "\n" ++ "Converts a DLPI MAC type to a BSD socket interface type\n" ++ "defined in \n" ++ "See dlpi_iftype(3DLPI)\n" ++); ++static PyObject * ++iftype(PyObject *dlpi, PyObject *args, PyObject *kwds) ++{ ++ static char *keywords[] = {"iftype", NULL}; ++ uint_t dlpityp, iftyp; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &dlpityp)) ++ return (NULL); ++ ++ if ((iftyp = dlpi_iftype(dlpityp)) == 0) { ++ errno = EINVAL; ++ dlpi_raise_exception(DL_SYSERR); ++ return (NULL); ++ } ++ ++ return (Py_BuildValue("I", iftyp)); ++} ++ ++PyDoc_STRVAR(mactype_doc, ++ "mactype(mactype) -> string\n" ++ "\n" ++ "Returns a string that describes the specified mactype.\n" ++ "Valid mac types are defined in .\n" ++ "See dlpi_mactype(3DLPI)\n" ++); ++static PyObject * ++mactype(PyObject *dlpi, PyObject *args, PyObject *kwds) ++{ ++ static char *keywords[] = {"mactype", NULL}; ++ uint_t mactyp; ++ ++ if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", keywords, &mactyp)) ++ return (NULL); ++ ++ return (Py_BuildValue("s", dlpi_mactype(mactyp))); ++} ++ ++static boolean_t ++link_walker(const char *name, void *arg) ++{ ++ PyObject *linkname; ++ PyObject *list = (PyObject *)arg; ++ ++ if ((list == NULL) || !PyList_Check(list)) ++ return (B_FALSE); ++ ++ linkname = Py_BuildValue("s", name); ++ if (PyList_Append(list, linkname) == -1) ++ return (B_TRUE); ++ ++ Py_DECREF(linkname); ++ return (B_FALSE); ++} ++ ++PyDoc_STRVAR(listlink_doc, ++ "listlink() -> list\n" ++ "\n" ++ "Returns a list containing link names of all links on the system.\n" ++); ++static PyObject * ++listlink(PyObject *dlpi) ++{ ++ PyObject *list; ++ ++ if ((list = PyList_New(0)) == NULL) ++ return (NULL); ++ ++ dlpi_walk(link_walker, list, 0); ++ return (list); ++} ++ ++static PyMethodDef dlpi_methods[] = { ++ {"arptype", (PyCFunction)arptype, METH_VARARGS|METH_KEYWORDS, ++ arptype_doc}, ++ {"iftype", (PyCFunction)iftype, METH_VARARGS|METH_KEYWORDS, ++ iftype_doc}, ++ {"mactype", (PyCFunction)mactype, METH_VARARGS|METH_KEYWORDS, ++ mactype_doc}, ++ {"listlink", (PyCFunction)listlink, METH_NOARGS, listlink_doc}, ++ {NULL} ++}; ++ ++PyMODINIT_FUNC ++initdlpi(void) ++{ ++ PyObject *mod; ++ ++ if (PyType_Ready(&pylink_type) < 0) ++ return; ++ ++ mod = Py_InitModule("dlpi", dlpi_methods); ++ if (mod == NULL) ++ return; ++ ++ dlpi_err = PyErr_NewException("dlpi.error", NULL, NULL); ++ if (dlpi_err == NULL) ++ return; ++ PyModule_AddObject(mod, "error", dlpi_err); ++ ++ Py_INCREF(&pylink_type); ++ PyModule_AddObject(mod, "link", (PyObject *)&pylink_type); ++ PyModule_AddIntConstant(mod, "PASSIVE", DLPI_PASSIVE); ++ PyModule_AddIntConstant(mod, "RAW", DLPI_RAW); ++ PyModule_AddIntConstant(mod, "NATIVE", DLPI_NATIVE); ++ PyModule_AddIntConstant(mod, "ANY_SAP", DLPI_ANY_SAP); ++ PyModule_AddIntConstant(mod, "DEF_TIMEOUT", DLPI_DEF_TIMEOUT); ++ PyModule_AddIntConstant(mod, "NOTE_LINK_DOWN", DL_NOTE_LINK_DOWN); ++ PyModule_AddIntConstant(mod, "NOTE_LINK_UP", DL_NOTE_LINK_UP); ++ PyModule_AddIntConstant(mod, "NOTE_PHYS_ADDR", DL_NOTE_PHYS_ADDR); ++ PyModule_AddIntConstant(mod, "NOTE_SDU_SIZE", DL_NOTE_SDU_SIZE); ++ PyModule_AddIntConstant(mod, "NOTE_SPEED", DL_NOTE_SPEED); ++ PyModule_AddIntConstant(mod, "NOTE_PROMISC_ON_PHYS", ++ DL_NOTE_PROMISC_ON_PHYS); ++ PyModule_AddIntConstant(mod, "NOTE_PROMISC_OFF_PHYS", ++ DL_NOTE_PROMISC_OFF_PHYS); ++ PyModule_AddIntConstant(mod, "FACT_PHYS_ADDR", DL_FACT_PHYS_ADDR); ++ PyModule_AddIntConstant(mod, "CURR_PHYS_ADDR", DL_CURR_PHYS_ADDR); ++ PyModule_AddIntConstant(mod, "PROMISC_PHYS", DL_PROMISC_PHYS); ++ PyModule_AddIntConstant(mod, "PROMISC_SAP", DL_PROMISC_SAP); ++ PyModule_AddIntConstant(mod, "PROMISC_MULTI", DL_PROMISC_MULTI); ++ PyModule_AddIntConstant(mod, "UNKNOWN", DL_UNKNOWN); ++ PyModule_AddIntConstant(mod, "UNBOUND", DL_UNBOUND); ++ PyModule_AddIntConstant(mod, "IDLE", DL_IDLE); ++ PyModule_AddIntConstant(mod, "SYSERR", DL_SYSERR); ++} +diff --git Python-2.6.4/setup.py Python-2.6.4/setup.py +--- Python-2.6.4/setup.py ++++ Python-2.6.4/setup.py +@@ -1284,6 +1284,12 @@ + exts.append( Extension('ucred', ['ucred.c'], + libraries = ['tsol']) ) + ++ # dlpi module (Solaris) ++ dlpi_inc = find_file('libdlpi.h', [], inc_dirs) ++ if dlpi_inc is not None: ++ exts.append( Extension('dlpi', ['dlpimodule.c'], ++ libraries = ['dlpi']) ) ++ + # Thomas Heller's _ctypes module + self.detect_ctypes(inc_dirs, lib_dirs) + +diff --git Python-2.6.4/lib/test/dlpitest.py Python-2.6.4/Lib/test/dlpitest.py +new file mode 100644 +--- /dev/null 2011-02-12 03:13:26.000000000 -0600 ++++ Python-2.6.4/Lib/test/dlpitest.py 2011-01-20 13:52:42.895865414 -0600 +@@ -0,0 +1,96 @@ ++#!/usr/bin/python2.6 ++ ++import dlpi ++import sys ++import time ++import struct ++ ++#test listlink ++linklist = dlpi.listlink() ++print "Found %d links:" % len(linklist) ++print linklist ++ ++#pick up the first data link for below testing ++linkname = linklist[0] ++ ++#open link ++print "opening link: " + linkname + "..." ++testlink = dlpi.link(linkname) ++ ++#read some info of testlink ++print "linkname is %s" % testlink.get_linkname() ++print "link fd is %d" % testlink.get_fd() ++mactype = testlink.get_mactype() ++print "dlpi mactype is %d" % mactype ++print "after convert:" ++print "\tmactype is %s" % dlpi.mactype(mactype) ++print "\tiftype is %d" % dlpi.iftype(mactype) ++print "\tarptype is %d" % dlpi.arptype(mactype) ++bcastaddr = testlink.get_bcastaddr() ++print "broadcast addr is: ", ++print struct.unpack("BBBBBB",bcastaddr) ++physaddr = testlink.get_physaddr(dlpi.FACT_PHYS_ADDR) ++print "factory physical address is: ", ++print struct.unpack("BBBBBB",physaddr) ++print "current timeout value is %d" % testlink.get_timeout() ++print "sdu is:", ++print testlink.get_sdu() ++print "qos select is:", ++print testlink.get_qos_select() ++print "qos range is:", ++print testlink.get_qos_range() ++ ++#set some config value of testlink and read them again ++print "setting current physiacal addr to aa:0:10:13:27:5" ++testlink.set_physaddr('\xaa\0\x10\x13\x27\5') ++physaddr = testlink.get_physaddr(dlpi.CURR_PHYS_ADDR) ++print "current physical addr is: ", ++print struct.unpack("BBBBBB",physaddr) ++print "set timeout value to 6..." ++testlink.set_timeout(6) ++print "timeout value is %d" % testlink.get_timeout() ++ ++#test enable/disable multicast ++print "enable/disable multicast address 1:0:5e:0:0:5" ++testlink.enabmulti('\1\0\x5e\0\0\5') ++testlink.disabmulti('\1\0\x5e\0\0\5') ++ ++#test bind ++print "binding to SAP 0x9000..." ++testlink.bind(0x9000) ++print "sap is %x" % testlink.get_sap() ++print "state is: %d" % testlink.get_state() ++ ++#test send ++print "sending broadcast loopback packet..." ++testlink.send(bcastaddr, '\0\1\2\3\4\5') ++ ++#test notify functionality ++arg = "notification callback arg" ++def notify(arg, notes, value): ++ print "NOTE_PROMISC_ON_PHYS notification received with arg: '%s'" % arg ++print "enabled notification on NOTE_PROMISC_ON_PHYS" ++id = testlink.enabnotify(dlpi.NOTE_PROMISC_ON_PHYS, notify, arg) #enable notification ++testlink.promiscon() #trigger the event (will be seen while receiving pkt below) ++ ++#test receive ++print "testing receiving..." ++try: ++ testlink.recv(0, 0) #should see NOTE_PROMISC_ON_PHYS event here ++except dlpi.error, err: ++ errnum, errinfo = err ++ if errnum == 10006: ++ pass #timeout error is expected here ++ else: #test fails if reach here ++ print "test failed", ++ print errnum, ++ print err ++ ++testlink.promiscoff() ++testlink.disabnotify(id) #disable notification ++ ++#test unbind ++print "unbinding..." ++testlink.unbind() ++print "sap is %x" % testlink.get_sap() ++print "state is: %d" % testlink.get_state() diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/08-encoding-alias.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/08-encoding-alias.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,35 @@ +diff --git Python-2.6.4/Lib/encodings/aliases.py Python-2.6.4/Lib/encodings/aliases.py +--- Python-2.6.4/Lib/encodings/aliases.py ++++ Python-2.6.4/Lib/encodings/aliases.py +@@ -73,6 +73,7 @@ + + # cp1251 codec + '1251' : 'cp1251', ++ 'ansi_1251' : 'cp1251', + 'windows_1251' : 'cp1251', + + # cp1252 codec +@@ -217,6 +218,7 @@ + 'u_jis' : 'euc_jp', + + # euc_kr codec ++ '5601' : 'euc_kr', + 'euckr' : 'euc_kr', + 'korean' : 'euc_kr', + 'ksc5601' : 'euc_kr', +@@ -457,6 +459,7 @@ + 'shiftjis' : 'shift_jis', + 'sjis' : 'shift_jis', + 's_jis' : 'shift_jis', ++ 'pck' : 'shift_jis', + + # shift_jis_2004 codec + 'shiftjis2004' : 'shift_jis_2004', +@@ -476,6 +479,7 @@ + 'tis_620_0' : 'tis_620', + 'tis_620_2529_0' : 'tis_620', + 'tis_620_2529_1' : 'tis_620', ++ 'tis620.2533' : 'tis_620', + 'iso_ir_166' : 'tis_620', + + # utf_16 codec diff -r aa27b836c528 -r 2edc011b559e components/python/python27/patches/09-rbac.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/patches/09-rbac.patch Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,1574 @@ +diff --git Python-2.6.4/Modules/authattr.c Python-2.6.4/Modules/authattr.c +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/authattr.c +@@ -0,0 +1,261 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python - auth_attr functions ++ */ ++ ++#include ++#include "Python.h" ++#include "pyrbac.h" ++ ++static PyObject* ++pyrbac_setauthattr(PyObject* self, PyObject* args) { ++ setauthattr(); ++ return Py_None; ++} ++ ++static PyObject* ++pyrbac_endauthattr(PyObject* self, PyObject* args) { ++ endauthattr(); ++ return Py_None; ++} ++ ++PyObject* ++pyrbac_getauthnamattr(PyObject* self, char* authname, int mode) { ++ ++ ++ ++ authattr_t * ret_authattr = (mode == PYRBAC_NAM_MODE) ? getauthnam(authname) : getauthattr(); ++ if (ret_authattr == NULL) ++ return Py_None; ++ ++ PyObject* kv_data = PyDict_New(); ++ if (kv_data == NULL) { ++ free_authattr(ret_authattr); ++ return NULL; ++ } ++ ++ if(ret_authattr->attr != NULL) { ++ int len; ++ for(len = 0; len < ret_authattr->attr->length; len++) { ++ kv_t current = ret_authattr->attr->data[len]; ++ ++ PyObject* set = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(current.value, ",", &saveptr); ++ PyList_Append(set, PyString_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set, PyString_FromString(item)) != 0) { ++ Py_XDECREF(set); ++ Py_XDECREF(kv_data); ++ free_authattr(ret_authattr); ++ return NULL; ++ } ++ } ++ if(PyDict_SetItemString(kv_data, current.key, set)) { ++ free_authattr(ret_authattr); ++ return NULL; ++ } ++ } ++ } ++ PyObject * retval = Py_BuildValue("{s:s,s:s,s:s,s:s,s:s,s:O}", ++ "name",ret_authattr->name, ++ "res1",ret_authattr->res1, ++ "res2",ret_authattr->res2, ++ "short",ret_authattr->short_desc, ++ "long",ret_authattr->long_desc, ++ "attributes",kv_data); ++ ++ free_authattr(ret_authattr); ++ return retval; ++ ++} ++ ++static PyObject* ++pyrbac_getauthattr(PyObject* self, PyObject* args) { ++ return(pyrbac_getauthnamattr(self, NULL, PYRBAC_ATTR_MODE)); ++} ++ ++static PyObject* ++pyrbac_getauthnam(PyObject* self, PyObject* args) { ++ char* name = NULL; ++ if(!PyArg_ParseTuple(args, "s:getauthnam", &name)) ++ return NULL; ++ return(pyrbac_getauthnamattr(self, name, PYRBAC_NAM_MODE)); ++} ++ ++static PyObject * ++pyrbac_chkauthattr(PyObject* self, PyObject* args) { ++ char* authstring = NULL; ++ char* username = NULL; ++ if(!PyArg_ParseTuple(args, "ss:chkauthattr", &authstring, &username)) ++ return NULL; ++ return PyBool_FromLong((long)chkauthattr(authstring, username)); ++} ++ ++static PyObject* ++pyrbac_authattr_next(PyObject* self, PyObject* args) { ++ PyObject* retval = pyrbac_getauthattr(self, args); ++ if( retval == Py_None ) { ++ setauthattr(); ++ return NULL; ++ } ++ return retval; ++} ++static PyObject* ++pyrbac_authattr__iter__(PyObject* self, PyObject* args) { ++ return self; ++} ++ ++typedef struct { ++ PyObject_HEAD ++} Authattr; ++ ++static void ++Authattr_dealloc(Authattr* self) { ++ endauthattr(); ++ self->ob_type->tp_free((PyObject*) self); ++} ++ ++static PyObject* ++Authattr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ++ Authattr *self; ++ self = (Authattr*)type->tp_alloc(type, 0); ++ ++ return ((PyObject *) self); ++} ++ ++static int ++Authattr_init(Authattr* self, PyObject *args, PyObject *kwargs) { ++ setauthattr(); ++ return 0; ++} ++ ++static char pyrbac_authattr__doc__[]; ++ ++PyDoc_STRVAR(pyrbac_authattr__doc__, """provides interfaces to the auth_attr \ ++database. may be iterated over to return all auth_attr entries\n\n\ ++Methods provided:\n\ ++setauthattr\n\ ++endauthattr\n\ ++getauthattr\n\ ++chkauthattr\n\ ++getauthnam"""); ++ ++static char pyrbac_setauthattr__doc__[]; ++static char pyrbac_endauthattr__doc__[]; ++static char pyrbac_getauthattr__doc__[]; ++static char pyrbac_chkauthattr__doc__[]; ++ ++PyDoc_STRVAR(pyrbac_setauthattr__doc__, ++"\"rewinds\" the auth_attr functions to the first entry in the db. Called \ ++automatically by the constructor\n\tArguments: None\n\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_endauthattr__doc__, ++"closes the auth_attr database, cleans up storage. called automatically by \ ++the destructor\n\tArguments: None\n\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_chkauthattr__doc__, "verifies if a user has a given \ ++authorization.\n\tArguments: 2 Python strings, 'authname' and 'username'\n\ ++\tReturns: True if the user is authorized, False otherwise"); ++ ++PyDoc_STRVAR(pyrbac_getauthattr__doc__, ++"return one entry from the auth_attr database\n\ ++\tArguments: None\n\ ++\tReturns: a dict representing the authattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"short\": Short Description\n\ ++\t\t\"long\": Long Description\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getauthnam__doc__, ++"searches the auth_attr database for a given authorization name\n\ ++\tArguments: a Python string containing the auth name\n\ ++\tReturns: a dict representing the authattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"short\": Short Description\n\ ++\t\t\"long\": Long Description\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++static PyMethodDef Authattr_methods[] = { ++ {"setauthattr", pyrbac_setauthattr, METH_NOARGS, pyrbac_setauthattr__doc__}, ++ {"endauthattr", pyrbac_endauthattr, METH_NOARGS, pyrbac_endauthattr__doc__}, ++ {"chkauthattr", pyrbac_chkauthattr, METH_VARARGS, pyrbac_chkauthattr__doc__}, ++ {"getauthattr", pyrbac_getauthattr, METH_NOARGS, pyrbac_getauthattr__doc__}, ++ {"getauthnam", pyrbac_getauthnam, METH_VARARGS, pyrbac_getauthnam__doc__}, ++ {NULL} ++}; ++ ++PyTypeObject AuthattrType = { ++ PyObject_HEAD_INIT(NULL) ++ 0, /*ob_size*/ ++ "rbac.authattr", /*tp_name*/ ++ sizeof(Authattr), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ (destructor)Authattr_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_compare*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE | ++ Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ ++ pyrbac_authattr__doc__, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ pyrbac_authattr__iter__, /* tp_iter */ ++ pyrbac_authattr_next, /* tp_iternext */ ++ Authattr_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)Authattr_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ Authattr_new, /* tp_new */ ++}; +diff --git Python-2.6.4/Modules/execattr.c Python-2.6.4/Modules/execattr.c +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/execattr.c +@@ -0,0 +1,313 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python - exec_attr functions ++ */ ++ ++#include ++#include "Python.h" ++#include "pyrbac.h" ++ ++static PyObject * ++pyrbac_setexecattr(PyObject* self, PyObject* args) { ++ setexecattr(); ++ return Py_None; ++} ++ ++static PyObject * ++pyrbac_endexecattr(PyObject* self, PyObject* args) { ++ endexecattr(); ++ return Py_None; ++} ++ ++PyObject * ++pyrbac_getexecuserprofattr(PyObject* self, char* userprofname, char* type, char* id, int mode) { ++ ++ PyObject* ep_data = (mode == PYRBAC_ATTR_MODE) ? NULL : PyList_New(0); ++ ++ if (ep_data == NULL && mode != PYRBAC_ATTR_MODE ) ++ return NULL; ++ ++ execattr_t *execprof; ++ if (mode == PYRBAC_USER_MODE) ++ execprof = getexecuser(userprofname, type, id, GET_ALL); ++ else if (mode == PYRBAC_PROF_MODE) ++ execprof = getexecprof(userprofname, type, id, GET_ALL); ++ else if (mode == PYRBAC_ATTR_MODE) ++ execprof = getexecattr(); ++ else ++ return NULL; ++ ++ if (execprof == NULL) ++ return Py_None; ++ ++ execattr_t *execprof_head = execprof; ++ ++ while(execprof != NULL) { ++ ++ PyObject* kv_data = PyDict_New(); ++ ++ if(execprof->attr != NULL) { ++ int len; ++ for(len = 0; len < execprof->attr->length; len++) { ++ kv_t current = execprof->attr->data[len]; ++ ++ PyObject* set = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(current.value, ",", &saveptr); ++ PyList_Append(set, PyString_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set, PyString_FromString(item)) != 0) { ++ Py_XDECREF(set); ++ Py_XDECREF(kv_data); ++ free_execattr(execprof_head); ++ return NULL; ++ } ++ } ++ if(PyDict_SetItemString(kv_data, current.key, set)) { ++ free_execattr(execprof_head); ++ return NULL; ++ } ++ } ++ } ++ PyObject* entry = Py_BuildValue("{s:s,s:s,s:s,s:s,s:s,s:s,s:O}", ++ "name", execprof->name, ++ "type", execprof->type, ++ "policy", execprof->policy, ++ "res1", execprof->res1, ++ "res2", execprof->res2, ++ "id", execprof->id, ++ "attributes", kv_data); ++ ++ if (entry == NULL) { ++ Py_XDECREF(kv_data); ++ free_execattr(execprof_head); ++ return NULL; ++ } ++ ++ if (mode == PYRBAC_ATTR_MODE) { ++ free_execattr(execprof_head); ++ return(entry); ++ } ++ PyList_Append(ep_data, entry); ++ execprof = execprof->next; ++ } ++ ++ free_execattr(execprof_head); ++ return(ep_data); ++ ++} ++ ++static PyObject * ++pyrbac_getexecuser(PyObject* self, PyObject* args) { ++ char* username = NULL; ++ char* type = NULL; ++ char* id = NULL; ++ ++ if(!PyArg_ParseTuple(args, "sss:getexecuser", &username, &type, &id)) ++ return NULL; ++ ++ return (pyrbac_getexecuserprofattr(self, username, type, id, PYRBAC_USER_MODE)); ++} ++ ++static PyObject * ++pyrbac_getexecprof(PyObject* self, PyObject* args) { ++ ++ char* profname = NULL; ++ char* type = NULL; ++ char* id = NULL; ++ ++ if(!PyArg_ParseTuple(args, "sss:getexecprof", &profname, &type, &id)) ++ return NULL; ++ ++ return (pyrbac_getexecuserprofattr(self, profname, type, id, PYRBAC_PROF_MODE)); ++} ++ ++static PyObject* ++pyrbac_getexecattr(PyObject* self, PyObject* args) { ++ return pyrbac_getexecuserprofattr(self, NULL, NULL, NULL, PYRBAC_ATTR_MODE); ++} ++ ++static PyObject* ++pyrbac_execattr_next(PyObject* self, PyObject* args) { ++ PyObject* retval = pyrbac_getexecattr(self, args); ++ if( retval == Py_None ) { ++ setexecattr(); ++ return NULL; ++ } ++ return retval; ++} ++static PyObject* ++pyrbac_execattr__iter__(PyObject* self, PyObject* args) { ++ return self; ++} ++ ++typedef struct { ++ PyObject_HEAD ++} Execattr; ++ ++static void ++Execattr_dealloc(Execattr* self) { ++ endexecattr(); ++ self->ob_type->tp_free((PyObject*) self); ++} ++ ++static PyObject* ++Execattr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ++ Execattr *self; ++ self = (Execattr*)type->tp_alloc(type, 0); ++ ++ return ((PyObject *) self); ++} ++ ++static int ++Execattr_init(Execattr* self, PyObject *args, PyObject *kwargs) { ++ setexecattr(); ++ return 0; ++} ++ ++static char pyrbac_execattr__doc__[]; ++ ++PyDoc_STRVAR(pyrbac_execattr__doc__, "provides functions for \ ++interacting with the execution profiles database. May be iterated over to \ ++enumerate exec_attr(4) entries\n\n\ ++Methods provided:\n\ ++setexecattr\n\ ++endexecattr\n\ ++getexecattr\n\ ++getexecprof\n\ ++getexecuser"); ++ ++ ++static char pyrbac_getexecuser__doc__[]; ++static char pyrbac_getexecprof__doc__[]; ++static char pyrbac_getexecattr__doc__[]; ++static char pyrbac_setexecattr__doc__[]; ++static char pyrbac_endexecattr__doc__[]; ++ ++PyDoc_STRVAR(pyrbac_setexecattr__doc__, ++"\"rewinds\" the exec_attr functions to the first entry in the db. Called \ ++automatically by the constructor.\n\ ++\tArguments: None\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_endexecattr__doc__, ++"closes the exec_attr database, cleans up storage. called automatically by \ ++the destructor.\n\ ++\tArguments: None\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_getexecuser__doc__, "corresponds with getexecuser(3SECDB)\ ++\nTakes: \'username\', \'type\', \'id\'\n\ ++Return: a single exec_attr entry\n\ ++\tArguments: None\n\ ++\tReturns: a dict representation of an execattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"type\": Profile Type\n\ ++\t\t\"policy\": Policy attributes are relevant in\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"id\": unique identifier\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as\ ++either a list or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getexecprof__doc__, "corresponds with getexecprof(3SECDB)\ ++\nTakes: \'profile name\', \'type\', \'id\'\n\ ++\tReturns: a dict representation of an execattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"type\": Profile Type\n\ ++\t\t\"policy\": Policy attributes are relevant in\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"id\": unique identifier\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as\ ++either a list or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getexecattr__doc__, "corresponds with getexecattr(3SECDB)\ ++\nTakes 0 arguments\n\ ++\tReturns: a dict representation of an execattr_t struct:\n\ ++\t\t\"name\": Authorization Name\n\ ++\t\t\"type\": Profile Type\n\ ++\t\t\"policy\": Policy attributes are relevant in\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"id\": unique identifier\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as\ ++either a list or a string depending on value"); ++ ++static PyMethodDef Execattr_methods[] = { ++ {"setexecattr", pyrbac_setexecattr, METH_NOARGS, pyrbac_setexecattr__doc__}, ++ {"endexecattr", pyrbac_endexecattr, METH_NOARGS, pyrbac_endexecattr__doc__}, ++ {"getexecprof", pyrbac_getexecprof, METH_VARARGS, pyrbac_getexecprof__doc__}, ++ {"getexecuser", pyrbac_getexecuser, METH_VARARGS, pyrbac_getexecuser__doc__}, ++ {"getexecattr", pyrbac_getexecattr, METH_NOARGS, pyrbac_getexecattr__doc__}, ++ {NULL} ++}; ++ ++PyTypeObject ExecattrType = { ++ PyObject_HEAD_INIT(NULL) ++ 0, /*ob_size*/ ++ "rbac.execattr", /*tp_name*/ ++ sizeof(Execattr), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ (destructor)Execattr_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_compare*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE | ++ Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ ++ pyrbac_execattr__doc__, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ pyrbac_execattr__iter__, /* tp_iter */ ++ pyrbac_execattr_next, /* tp_iternext */ ++ Execattr_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)Execattr_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ Execattr_new, /* tp_new */ ++}; +diff --git Python-2.6.4/Modules/privileges.c Python-2.6.4/Modules/privileges.c +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/privileges.c +@@ -0,0 +1,229 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * privileges(5) bindings for Python ++ */ ++ ++#include ++#include "Python.h" ++ ++static PyObject * ++pyprivileges_setppriv( PyObject *self, PyObject *args) { ++ priv_op_t op = -1 ; ++ priv_ptype_t which = NULL; ++ ++ PyObject* set_list = NULL; ++ ++ priv_set_t * set = NULL; ++ ++ if(!PyArg_ParseTuple(args, "iiO:setppriv", &op, &which, &set_list)) ++ return NULL; ++ ++ if((op != PRIV_ON && op != PRIV_OFF && op != PRIV_SET) || ++ (which != PRIV_PERMITTED && which != PRIV_EFFECTIVE && ++ which != PRIV_INHERITABLE && which != PRIV_LIMIT)) ++ return NULL; ++ ++ PyObject* set_string = PyList_GetItem(set_list, 0); ++ int i; ++ for (i = 1; i < PyList_Size(set_list); ++i) { ++ PyString_Concat(&set_string, PyString_FromString(",")); ++ PyString_Concat(&set_string, PyList_GetItem(set_list, i)); ++ } ++ ++ set = priv_str_to_set(PyString_AsString(set_string), ",", NULL ); ++ ++ if ( set == NULL ) ++ return NULL; ++ ++ long ret = (long) setppriv(op, which, set); ++ priv_freeset(set); ++ // Python inverts true & false ++ if(ret) ++ Py_RETURN_FALSE; ++ ++ Py_RETURN_TRUE; ++} ++ ++static PyObject * ++pyprivileges_getppriv( PyObject *self, PyObject *args) { ++ ++ char* set_str = NULL; ++ priv_ptype_t which = NULL; ++ priv_set_t * set = priv_allocset(); ++ if (set == NULL) ++ return NULL; ++ ++ if(!PyArg_ParseTuple(args, "i:getppriv", &which)) ++ return NULL; ++ ++ if (which != PRIV_PERMITTED && which != PRIV_EFFECTIVE && ++ which != PRIV_INHERITABLE && which != PRIV_LIMIT) ++ return NULL; ++ ++ if (getppriv(which, set) != 0) ++ return NULL; ++ ++ set_str = priv_set_to_str(set, ',', PRIV_STR_LIT); ++ priv_freeset(set); ++ ++ PyObject* set_list = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(set_str, ",", &saveptr); ++ PyList_Append(set_list, PyString_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set_list, PyString_FromString(item)) != 0) { ++ Py_XDECREF(set_list); ++ return NULL; ++ } ++ } ++ ++ return(set_list); ++} ++ ++static PyObject * ++pyprivileges_priv_inverse( PyObject *self, PyObject *args ) { ++ ++ PyObject* set_list_in = NULL; ++ if(!PyArg_ParseTuple(args, "O:priv_inverse", &set_list_in)) ++ return NULL; ++ ++ PyObject* set_string = PyList_GetItem(set_list_in, 0); ++ int i; ++ for (i = 1; i < PyList_Size(set_list_in); ++i) { ++ PyString_Concat(set_string, PyString_FromString(",")); ++ PyString_Concat(set_string, PyList_GetItem(set_list_in, i)); ++ } ++ ++ priv_set_t * set = priv_str_to_set(PyString_AsString(set_string), ",", NULL); ++ if (set == NULL) ++ return NULL; ++ priv_inverse(set); ++ char * ret_str = priv_set_to_str(set, ',', PRIV_STR_LIT); ++ priv_freeset(set); ++ ++ PyObject* set_list_out = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(ret_str, ",", &saveptr); ++ PyList_Append(set_list_out, PyString_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set_list_out, PyString_FromString(item)) != 0) { ++ Py_XDECREF(set_list_out); ++ return NULL; ++ } ++ } ++ ++ Py_XDECREF(set_list_in); ++ ++ return(set_list_out); ++} ++ ++/* priv_ineffect is a convienient wrapper to priv_get ++ * however priv_set is, in the context of python, not ++ * much of a convienience, so it's omitted ++ */ ++static PyObject * ++pyprivileges_priv_ineffect(PyObject* self, PyObject* args) { ++ char* privstring=NULL; ++ if (!PyArg_ParseTuple(args, "s:priv_ineffect", &privstring)) ++ return NULL; ++ return PyBool_FromLong(priv_ineffect(privstring)); ++} ++ ++ ++static char pyprivileges__doc__[]; ++PyDoc_STRVAR(pyprivileges__doc__, ++"Provides functions for interacting with the Solaris privileges(5) framework\n\ ++Functions provided:\n\ ++setppriv\n\ ++getppriv\n\ ++priv_ineffect\n\ ++priv_inverse"); ++ ++static char pyprivileges_setppriv__doc__[]; ++static char pyprivileges_getppriv__doc__[]; ++static char pyprivileges_priv_ineffect__doc__[]; ++static char pyprivileges_priv_inverse__doc__[]; ++ ++PyDoc_STRVAR(pyprivileges_setppriv__doc__, ++"Facilitates setting the permitted/inheritable/limit/effective privileges set\n\ ++\tArguments:\n\ ++\t\tone of (PRIV_ON|PRIV_OFF|PRIV_SET)\n\ ++\t\tone of (PRIV_PERMITTED|PRIV_INHERITABLE|PRIV_LIMIT|PRIV_EFFECTIVE)\n\ ++\t\tset of privileges: a list of strings\n\ ++\tReturns: True on success, False on failure\ ++"); ++ ++PyDoc_STRVAR(pyprivileges_getppriv__doc__, ++"Return the process privilege set\n\ ++\tArguments:\n\ ++\t\tone of (PRIV_PERMITTED|PRIV_INHERITABLE|PRIV_LIMIT|PRIV_EFFECTIVE)\n\ ++\tReturns: a Python list of strings"); ++ ++PyDoc_STRVAR(pyprivileges_priv_ineffect__doc__, ++"Checks for a privileges presence in the effective set\n\ ++\tArguments: a String\n\ ++\tReturns: True if the privilege is in effect, False otherwise"); ++ ++PyDoc_STRVAR(pyprivileges_priv_inverse__doc__, ++"The complement of the set of privileges\n\ ++\tArguments: a list of strings\n\tReturns: a list of strings"); ++ ++static PyMethodDef module_methods[] = { ++ {"setppriv", pyprivileges_setppriv, METH_VARARGS, pyprivileges_setppriv__doc__}, ++ {"getppriv", pyprivileges_getppriv, METH_VARARGS, pyprivileges_getppriv__doc__}, ++ {"priv_ineffect", pyprivileges_priv_ineffect, METH_VARARGS, pyprivileges_priv_ineffect__doc__}, ++ {"priv_inverse", pyprivileges_priv_inverse, METH_VARARGS, pyprivileges_priv_inverse__doc__}, ++ {NULL} ++}; ++ ++ ++#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ ++#define PyMODINIT_FUNC void ++#endif ++PyMODINIT_FUNC ++initprivileges(void) { ++ PyObject* m; ++ ++ m = Py_InitModule3("privileges", module_methods, pyprivileges__doc__); ++ if ( m == NULL ) ++ return; ++ ++ PyObject* d = PyModule_GetDict(m); ++ if (d == NULL) ++ return; ++ ++ PyDict_SetItemString(d, "PRIV_ON", PyInt_FromLong((long)PRIV_ON)); ++ PyDict_SetItemString(d, "PRIV_OFF", PyInt_FromLong((long)PRIV_OFF)); ++ PyDict_SetItemString(d, "PRIV_SET", PyInt_FromLong((long)PRIV_SET)); ++ ++ PyDict_SetItemString(d, "PRIV_PERMITTED", PyInt_FromLong((long)PRIV_PERMITTED)); ++ PyDict_SetItemString(d, "PRIV_INHERITABLE", PyInt_FromLong((long)PRIV_INHERITABLE)); ++ PyDict_SetItemString(d, "PRIV_LIMIT", PyInt_FromLong((long)PRIV_LIMIT)); ++ PyDict_SetItemString(d, "PRIV_EFFECTIVE", PyInt_FromLong((long)PRIV_EFFECTIVE)); ++} +diff --git Python-2.6.4/Modules/pyrbac.c Python-2.6.4/Modules/pyrbac.c +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/pyrbac.c +@@ -0,0 +1,68 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python ++ */ ++ ++#include ++#include "pyrbac.h" ++ ++static PyMethodDef module_methods[] = {NULL}; ++static char pyrbac__doc__[]; ++ ++PyDoc_STRVAR(pyrbac__doc__, "provides access to some objects \ ++for interaction with the Solaris Role-Based Access Control \ ++framework.\n\nDynamic objects:\n\ ++userattr -- for interacting with user_attr(4)\n\ ++authattr -- for interacting with auth_attr(4)\n\ ++execattr -- for interacting with exec_attr(4)\n"); ++ ++#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ ++#define PyMODINIT_FUNC void ++#endif ++PyMODINIT_FUNC ++initrbac(void) { ++ PyObject* m; ++ if (PyType_Ready(&AuthattrType) < 0 || ++ PyType_Ready(&ExecattrType) < 0 || ++ PyType_Ready(&UserattrType) < 0 ) ++ return; ++ ++ m = Py_InitModule3("rbac", module_methods, pyrbac__doc__); ++ if ( m == NULL ) ++ return; ++ ++ Py_INCREF(&AuthattrType); ++ PyModule_AddObject(m, "authattr", (PyObject*)&AuthattrType); ++ ++ Py_INCREF(&ExecattrType); ++ PyModule_AddObject(m, "execattr", (PyObject*)&ExecattrType); ++ ++ Py_INCREF(&UserattrType); ++ PyModule_AddObject(m, "userattr", (PyObject*)&UserattrType); ++ ++} ++ +diff --git Python-2.6.4/Modules/pyrbac.h Python-2.6.4/Modules/pyrbac.h +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/pyrbac.h +@@ -0,0 +1,45 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC bindings for python ++ */ ++#ifndef PYRBAC_H ++#define PYRBAC_H ++ ++#include ++ ++ ++#define PYRBAC_USER_MODE 1 ++#define PYRBAC_PROF_MODE 2 ++#define PYRBAC_ATTR_MODE 3 ++#define PYRBAC_NAM_MODE 4 ++#define PYRBAC_UID_MODE 5 ++ ++PyTypeObject AuthattrType; ++PyTypeObject ExecattrType; ++PyTypeObject UserattrType; ++ ++#endif +diff --git Python-2.6.4/Modules/userattr.c Python-2.6.4/Modules/userattr.c +new file mode 100644 +--- /dev/null ++++ Python-2.6.4/Modules/userattr.c +@@ -0,0 +1,308 @@ ++/* ++ * CDDL HEADER START ++ * ++ * The contents of this file are subject to the terms of the ++ * Common Development and Distribution License (the "License"). ++ * You may not use this file except in compliance with the License. ++ * ++ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++ * or http://www.opensolaris.org/os/licensing. ++ * See the License for the specific language governing permissions ++ * and limitations under the License. ++ * ++ * When distributing Covered Code, include this CDDL HEADER in each ++ * file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++ * If applicable, add the following below this CDDL HEADER, with the ++ * fields enclosed by brackets "[]" replaced with your own identifying ++ * information: Portions Copyright [yyyy] [name of copyright owner] ++ * ++ * CDDL HEADER END ++ */ ++ ++/* ++ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ */ ++ ++/* ++ * RBAC Bindings for Python - user_attr functions ++ */ ++ ++#include ++#include ++#include "Python.h" ++#include "pyrbac.h" ++ ++static PyObject* ++pyrbac_setuserattr(PyObject* self, PyObject* args) { ++ setuserattr(); ++ return Py_None; ++} ++ ++static PyObject* ++pyrbac_enduserattr(PyObject* self, PyObject* args) { ++ enduserattr(); ++ return Py_None; ++} ++ ++PyObject* ++pyrbac_getuseruidnamattr(PyObject* self, void* arg, int mode, char* filename) { ++ ++ userattr_t *ret_userattr; ++ ++ if (mode == PYRBAC_ATTR_MODE) { ++ if (filename != NULL) { ++ FILE* file = fopen(filename, "r"); ++ if (file == NULL) ++ return NULL; ++ ret_userattr = fgetuserattr(file); ++ if (fclose(file)) ++ return NULL; ++ } ++ else ++ ret_userattr = getuserattr(); ++ } ++ else if (mode == PYRBAC_NAM_MODE) ++ ret_userattr = getusernam((char*) arg); ++ else if (mode == PYRBAC_UID_MODE) ++ ret_userattr = getuseruid(*((uid_t*) arg)); ++ ++ if (ret_userattr == NULL) ++ return Py_None; ++ ++ PyObject* entry = PyTuple_New(5); ++ if (entry == NULL) { ++ free_userattr(ret_userattr); ++ return NULL; ++ } ++ ++ PyObject* kv_data = PyDict_New(); ++ ++ if(ret_userattr->attr != NULL) { ++ int len; ++ for(len = 0; len < ret_userattr->attr->length; len++) { ++ kv_t current = ret_userattr->attr->data[len]; ++ ++ PyObject* set = PyList_New(NULL); ++ char* saveptr; ++ char* item = strtok_r(current.value, ",", &saveptr); ++ PyList_Append(set, PyString_FromString(item)); ++ ++ while((item = strtok_r(NULL, ",", &saveptr)) != NULL) { ++ if(PyList_Append(set, PyString_FromString(item)) != 0) { ++ Py_XDECREF(set); ++ Py_XDECREF(kv_data); ++ free_userattr(ret_userattr); ++ return NULL; ++ } ++ } ++ if(PyDict_SetItemString(kv_data, current.key, set)) { ++ free_userattr(ret_userattr); ++ return NULL; ++ } ++ } ++ } ++ entry = Py_BuildValue("{s:s,s:s,s:s,s:s,s:O}", ++ "name", ret_userattr->name, ++ "qualifier", ret_userattr->qualifier, ++ "res1", ret_userattr->res1, ++ "res2", ret_userattr->res2, ++ "attributes", kv_data); ++ ++ free_userattr(ret_userattr); ++ ++ return entry; ++} ++ ++ ++static PyObject* ++pyrbac_getuserattr(PyObject* self, PyObject* args) { ++ return(pyrbac_getuseruidnamattr(self, (void*) NULL, PYRBAC_ATTR_MODE, NULL)); ++} ++ ++static PyObject* ++pyrbac_fgetuserattr(PyObject* self, PyObject* args) { ++ char* filename = NULL; ++ if(!PyArg_ParseTuple(args, "s:fgetuserattr", &filename)) ++ return NULL; ++ return(pyrbac_getuseruidnamattr(self, NULL, PYRBAC_ATTR_MODE, filename)); ++} ++ ++static PyObject* ++pyrbac_getusernam(PyObject* self, PyObject* args) { ++ char* name = NULL; ++ if(!PyArg_ParseTuple(args, "s:getusernam", &name)) ++ return NULL; ++ return(pyrbac_getuseruidnamattr(self, (void*) name, PYRBAC_NAM_MODE, NULL)); ++} ++ ++static PyObject* ++pyrbac_getuseruid(PyObject* self, PyObject* args) { ++ uid_t uid; ++ if(!PyArg_ParseTuple(args, "i:getuseruid", &uid)) ++ return NULL; ++ return(pyrbac_getuseruidnamattr(self, (void*) &uid, PYRBAC_UID_MODE, NULL)); ++} ++ ++static PyObject* ++pyrbac_userattr_next(PyObject* self, PyObject* args) { ++ PyObject* retval = pyrbac_getuserattr(self, args); ++ if( retval == Py_None ) { ++ setuserattr(); ++ return NULL; ++ } ++ return retval; ++} ++static PyObject* ++pyrbac_userattr__iter__(PyObject* self, PyObject* args) { ++ return self; ++} ++ ++typedef struct { ++ PyObject_HEAD ++} Userattr; ++ ++static void ++Userattr_dealloc(Userattr* self) { ++ enduserattr(); ++ self->ob_type->tp_free((PyObject*) self); ++} ++ ++static PyObject* ++Userattr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ++ Userattr *self; ++ self = (Userattr*)type->tp_alloc(type, 0); ++ ++ return ((PyObject *) self); ++} ++ ++static int ++Userattr_init(Userattr* self, PyObject *args, PyObject *kwargs) { ++ setuserattr(); ++ return 0; ++} ++ ++static char pyrbac_userattr__doc__[]; ++PyDoc_STRVAR(pyrbac_userattr__doc__, "provides functions for \ ++interacting with the extended user attributes database. May be iterated over \ ++to enumerate user_attr(4) entries\n\n\ ++Methods provided:\n\ ++setuserattr\n\ ++enduserattr\n\ ++getuserattr\n\ ++fgetuserattr\n\ ++getusernam\n\ ++getuseruid"); ++ ++static char pyrbac_setuserattr__doc__[]; ++static char pyrbac_enduserattr__doc__[]; ++static char pyrbac_getuserattr__doc__[]; ++static char pyrbac_getusernam__doc__[]; ++static char pyrbac_getuseruid__doc__[]; ++ ++PyDoc_STRVAR(pyrbac_setuserattr__doc__, "\"rewinds\" the user_attr functions \ ++to the first entry in the db. Called automatically by the constructor.\n\ ++\tArguments: None\n\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_enduserattr__doc__, "closes the user_attr database, \ ++cleans up storage. called automatically by the destructor\n\ ++\tArguments: None\n\ ++\tReturns: None"); ++ ++PyDoc_STRVAR(pyrbac_getuserattr__doc__, "Return a single user_attr entry\n \ ++\tArguments: None\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value" ++); ++ ++PyDoc_STRVAR(pyrbac_fgetuserattr__doc__, "Return a single user_attr entry \ ++from a file, bypassing nsswitch.conf\n\ ++\tArguments: \'filename\'\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getusernam__doc__, "Searches for a user_attr entry with a \ ++given user name\n\ ++\tArgument: \'username\'\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++PyDoc_STRVAR(pyrbac_getuseruid__doc__, "Searches for a user_attr entry with a \ ++given uid\n\ ++\tArgument: uid\n\ ++\tReturns: a dict representation of a userattr_t struct:\n\ ++\t\t\"name\": username\n\ ++\t\t\"qualifier\": reserved\n\ ++\t\t\"res1\": reserved\n\ ++\t\t\"res2\": reserved\n\ ++\t\t\"attributes\": A Python dict keyed by attribute & valued as either a list \ ++or a string depending on value"); ++ ++static PyMethodDef Userattr_methods[] = { ++ {"setuserattr", pyrbac_setuserattr, METH_NOARGS, pyrbac_setuserattr__doc__}, ++ {"enduserattr", pyrbac_enduserattr, METH_NOARGS, pyrbac_enduserattr__doc__}, ++ {"getuserattr", pyrbac_getuserattr, METH_NOARGS, pyrbac_getuserattr__doc__}, ++ {"fgetuserattr", pyrbac_fgetuserattr, METH_VARARGS, pyrbac_fgetuserattr__doc__}, ++ {"getusernam", pyrbac_getusernam, METH_VARARGS, pyrbac_getusernam__doc__}, ++ {"getuseruid", pyrbac_getuseruid, METH_VARARGS, pyrbac_getuseruid__doc__}, ++ {NULL} ++}; ++ ++PyTypeObject UserattrType = { ++ PyObject_HEAD_INIT(NULL) ++ 0, /*ob_size*/ ++ "rbac.userattr", /*tp_name*/ ++ sizeof(Userattr), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ ++ (destructor)Userattr_dealloc, /*tp_dealloc*/ ++ 0, /*tp_print*/ ++ 0, /*tp_getattr*/ ++ 0, /*tp_setattr*/ ++ 0, /*tp_compare*/ ++ 0, /*tp_repr*/ ++ 0, /*tp_as_number*/ ++ 0, /*tp_as_sequence*/ ++ 0, /*tp_as_mapping*/ ++ 0, /*tp_hash */ ++ 0, /*tp_call*/ ++ 0, /*tp_str*/ ++ 0, /*tp_getattro*/ ++ 0, /*tp_setattro*/ ++ 0, /*tp_as_buffer*/ ++ Py_TPFLAGS_DEFAULT | ++ Py_TPFLAGS_BASETYPE | ++ Py_TPFLAGS_HAVE_ITER, /*tp_flags*/ ++ pyrbac_userattr__doc__, /* tp_doc */ ++ 0, /* tp_traverse */ ++ 0, /* tp_clear */ ++ 0, /* tp_richcompare */ ++ 0, /* tp_weaklistoffset */ ++ pyrbac_userattr__iter__, /* tp_iter */ ++ pyrbac_userattr_next, /* tp_iternext */ ++ Userattr_methods, /* tp_methods */ ++ 0, /* tp_members */ ++ 0, /* tp_getset */ ++ 0, /* tp_base */ ++ 0, /* tp_dict */ ++ 0, /* tp_descr_get */ ++ 0, /* tp_descr_set */ ++ 0, /* tp_dictoffset */ ++ (initproc)Userattr_init, /* tp_init */ ++ 0, /* tp_alloc */ ++ Userattr_new, /* tp_new */ ++}; +diff --git Python-2.6.4/setup.py Python-2.6.4/setup.py +--- Python-2.6.4/setup.py ++++ Python-2.6.4/setup.py +@@ -1290,6 +1290,22 @@ + exts.append( Extension('dlpi', ['dlpimodule.c'], + libraries = ['dlpi']) ) + ++ # privileges module (Solaris) ++ priv_inc = find_file('priv.h', [], inc_dirs) ++ if priv_inc is not None: ++ exts.append( Extension('privileges', ['privileges.c'])) ++ ++ # rbac module (Solaris) ++ secdb_inc = find_file('secdb.h', [], inc_dirs) ++ aa_inc = find_file('auth_attr.h', [], inc_dirs) ++ ea_inc = find_file('exec_attr.h', [], inc_dirs) ++ ua_inc = find_file('user_attr.h', [], inc_dirs) ++ if secdb_inc is not None and aa_inc is not None and \ ++ ea_inc is not None and ua_inc is not None: ++ exts.append( Extension('rbac', ['pyrbac.c', 'authattr.c', \ ++ 'execattr.c', 'userattr.c'], ++ libraries = ['nsl', 'socket', 'secdb']) ) ++ + # Thomas Heller's _ctypes module + self.detect_ctypes(inc_dirs, lib_dirs) + +diff --git Python-2.6.4/Lib/test/privrbac.py Python-2.6.4/Lib/test/privrbac.py +new file mode 100644 +--- /dev/null 2011-02-12 03:13:57.000000000 -0600 ++++ Python-2.6.4/Lib/test/privrbactest.py 2011-01-20 13:52:42.862305331 -0600 +@@ -0,0 +1,289 @@ ++#!/usr/bin/python2.6 ++# ++# CDDL HEADER START ++# ++# The contents of this file are subject to the terms of the ++# Common Development and Distribution License (the "License"). ++# You may not use this file except in compliance with the License. ++# ++# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE ++# or http://www.opensolaris.org/os/licensing. ++# See the License for the specific language governing permissions ++# and limitations under the License. ++# ++# When distributing Covered Code, include this CDDL HEADER in each ++# file and include the License file at usr/src/OPENSOLARIS.LICENSE. ++# If applicable, add the following below this CDDL HEADER, with the ++# fields enclosed by brackets "[]" replaced with your own identifying ++# information: Portions Copyright [yyyy] [name of copyright owner] ++# ++# CDDL HEADER END ++# ++ ++# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ ++import privileges ++import rbac ++import os ++import sys ++import tempfile ++ ++# privileges tests ++ ++def test_setppriv(): ++ amchild = os.fork() ++ if amchild == 0: ++ if privileges.setppriv(privileges.PRIV_OFF, privileges.PRIV_EFFECTIVE, ++ ['proc_fork']): ++ try: ++ os.fork() ++ sys.exit(1) ++ except OSError, e: ++ sys.exit(0) ++ ++ child = os.wait() ++ if child[1] is not 0: ++ print "setppriv. Bad exit status from pid %i\n" % child[0] ++ return False ++ return True ++ ++def test_getppriv(): ++ if 'proc_fork' in privileges.getppriv(privileges.PRIV_LIMIT): ++ return True ++ print "getppriv or PRIV_PROC_FORK not in PRIV_LIMIT.\n" ++ return False ++ ++def test_priv_ineffect(): ++ if privileges.priv_ineffect('proc_fork'): ++ return True ++ print "priv_ineffect or PRIV_PROC_FORK not in effect\n" ++ return False ++ ++# authattr tests ++ ++def test_chkauthattr(): ++ try: ++ a = rbac.authattr() ++ except Exception, e: ++ print "Could not instantiate authattr object: %s\n" % e ++ return False ++ try: ++ res = a.chkauthattr('solaris.*', 'root') ++ except Exception, e: ++ print "chkauthattr failed: %s\n" % e ++ return False ++ if not res: ++ print "chkauthattr failed or \'root\' lacks \'solaris.*\'\n" ++ return False ++ return True ++ ++def test_getauthattr(): ++ try: ++ a = rbac.authattr() ++ except Exception, e: ++ print "Could not instantiate authattr object: %s\n" % e ++ return False ++ try: ++ res = a.getauthattr() ++ except Exception, e: ++ print "getauthattr failed: %s\n" % e ++ return False ++ if not 'name' in res.keys(): ++ print "getauthattr failed\n" ++ return False ++ return True ++ ++def test_getauthnam(): ++ try: ++ a = rbac.authattr() ++ except Exception, e: ++ print "Could not instantiate authattr object: %s\n" % e ++ return False ++ try: ++ res = a.getauthnam('solaris.') ++ except Exception, e: ++ print "getauthnam failed: %s\n" % e ++ return False ++ if not res: ++ print "getauthnam failed or \'solaris.\' not in auth_attr(4)\n" ++ return False ++ return True ++ ++def test_authattr_iter(): ++ try: ++ a = rbac.authattr() ++ except Exception, e: ++ print "Could not instantiate authattr object: %s\n" % e ++ return False ++ res = a.next() ++ if not 'name' in res.keys() or type(a) != type(a.__iter__()): ++ print "authattr object is not an iterable\n" ++ return False ++ return True ++ ++# execattr tests ++ ++def test_getexecattr(): ++ try: ++ a = rbac.execattr() ++ except Exception, e: ++ print "Could not instantiate execattr object: %s\n" % e ++ return False ++ try: ++ res = a.getexecattr() ++ except Exception, e: ++ print "getexecattr failed: %s\n" % e ++ return False ++ if not 'name' in res.keys(): ++ print "getexecattr failed\n" ++ return False ++ return True ++ ++def test_getexecuser(): ++ try: ++ a = rbac.execattr() ++ except Exception, e: ++ print "Could not instantiate execattr object: %s\n" % e ++ return False ++ try: ++ res = a.getexecuser("root", "act", "*;*;*;*;*") ++ except Exception, e: ++ print "getexecuser failed: %s\n" % e ++ return False ++ if not res: ++ print "getexecuser failed or \'root\' not assigned to \'act\', " \ ++ "\'*;*;*;*;*\' \n" ++ return False ++ return True ++ ++ ++def test_getexecprof(): ++ try: ++ a = rbac.execattr() ++ except Exception, e: ++ print "Could not instantiate execattr object: %s\n" % e ++ return False ++ try: ++ res = a.getexecprof("All", "cmd", "*") ++ except Exception, e: ++ print "getexecprof failed: %s\n" % e ++ return False ++ if not res: ++ print "getexecprof failed or \'All\' not granted \'cmd\' : \'*\'\n" ++ return False ++ return True ++ ++def test_execattr_iter(): ++ try: ++ a = rbac.execattr() ++ except Exception, e: ++ print "Could not instantiate execattr object: %s\n" % e ++ return False ++ res = a.next() ++ if not 'name' in res.keys() or type(a) != type(a.__iter__()): ++ print "execattr object is not an iterable\n" ++ return False ++ return True ++ ++# userattr tests ++ ++def test_getuserattr(): ++ try: ++ a = rbac.userattr() ++ except Exception, e: ++ print "Could not instantiate userattr object: %s\n" % e ++ return False ++ try: ++ res = a.getuserattr() ++ except Exception, e: ++ print "getuserattr failed: %s\n" % e ++ return False ++ if not 'name' in res.keys(): ++ print "getuserattr failed\n" ++ return False ++ return True ++ ++def test_fgetuserattr(): ++ temp = tempfile.NamedTemporaryFile() ++ temp.write("user::::profiles=Software Installation;roles=foo;"\ ++ "auths=solaris.foo.bar") ++ temp.seek(0) ++ try: ++ a = rbac.userattr() ++ except Exception, e: ++ print "Could not instantiate userattr object: %s\n" % e ++ return False ++ try: ++ res = a.fgetuserattr(temp.name) ++ temp.close() ++ except Exception, e: ++ print "fgetuserattr failed: %s\n" % e ++ temp.close() ++ return False ++ if not 'name' in res.keys(): ++ print "fgetuserattr failed\n" ++ return False ++ return True ++ ++def test_getuseruid(): ++ try: ++ a = rbac.userattr() ++ except Exception, e: ++ print "Could not instantiate userattr object: %s\n" % e ++ return False ++ try: ++ res = a.getuseruid(0) ++ except Exception, e: ++ print "getusernam failed: %s\n" % e ++ return False ++ if not 'name' in res: ++ print "getusernam failed or no uid 0\n" ++ return False ++ return True ++ ++def test_getusernam(): ++ try: ++ a = rbac.userattr() ++ except Exception, e: ++ print "Could not instantiate userattr object: %s\n" % e ++ return False ++ try: ++ res = a.getusernam('root') ++ except Exception, e: ++ print "getusernam failed: %s\n" % e ++ return False ++ if not 'name' in res: ++ print "getusernam failed or no \'root\' user\n" ++ return False ++ return True ++ ++def test_userattr_iter(): ++ try: ++ a = rbac.userattr() ++ except Exception, e: ++ print "Could not instantiate userattr object: %s\n" % e ++ return False ++ res = a.next() ++ if not 'name' in res.keys() or type(a) != type(a.__iter__()): ++ print "userattr object is not an iterable\n" ++ return False ++ return True ++ ++if not test_setppriv() or not test_getppriv() or not test_priv_ineffect(): ++ print "*** Failures detected in privileges module\n" ++ sys.exit(1) ++ ++if not test_getauthattr() or not test_chkauthattr() or not test_getauthnam() \ ++ or not test_authattr_iter: ++ print "*** Failures detected in rbac.authattr\n" ++ sys.exit(1) ++ ++if not test_getexecattr() or not test_getexecuser() or not test_getexecprof() \ ++ or not test_execattr_iter(): ++ print "*** Failures detected in rbac.execattr\n" ++ sys.exit(1) ++ ++if not test_getuserattr() or not test_fgetuserattr() or not test_getusernam()\ ++ or not test_getuseruid() or not test_userattr_iter(): ++ print "*** Failures detected in rbac.userattr\n" ++ sys.exit(1) diff -r aa27b836c528 -r 2edc011b559e components/python/python27/python-27-tests.p5m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/python-27-tests.p5m Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,952 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# + +# python doesn't generate .pyc version of these test files. + \ + set pkg.tmp.autopyc false > + \ + set pkg.tmp.autopyc false > +set name=pkg.fmri \ + value=pkg:/runtime/python-27/tests@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="The Python tests" +set name=info.classification \ + value=org.opensolaris.category.2008:Development/Python +set name=info.source_url value=$(COMPONENT_ARCHIVE_URL) +set name=info.upstream_url value=http://python.org/ +set name=opensolaris.arc_url \ + value=http://arc.opensolaris.org/caselog/PSARC/2008/514 \ + value=http://arc.opensolaris.org/caselog/PSARC/2009/529 \ + value=http://arc.opensolaris.org/caselog/PSARC/2011/XXX +# PSARC 2008/514 Python interface to dlpi(7P) +# PSARC 2009/529 Python interface to privileges(5) & rbac(5) + +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) + +# pkgdepend doesn't like python 2.7 yet + \ + default pkg.depend.bypass-generate .* > + +license python27.license license="PSFv2" + +dir path=usr +dir path=usr/lib +dir path=usr/lib/python2.7 +dir path=usr/lib/python2.7/bsddb/test +dir path=usr/lib/python2.7/ctypes/test +dir path=usr/lib/python2.7/distutils/tests +dir path=usr/lib/python2.7/email/test +dir path=usr/lib/python2.7/email/test/data +dir path=usr/lib/python2.7/idlelib +dir path=usr/lib/python2.7/json/tests +dir path=usr/lib/python2.7/lib-dynload +dir path=usr/lib/python2.7/lib-dynload/64 +dir path=usr/lib/python2.7/lib-tk/test +dir path=usr/lib/python2.7/lib-tk/test/test_tkinter +dir path=usr/lib/python2.7/lib-tk/test/test_ttk +dir path=usr/lib/python2.7/lib2to3/tests +dir path=usr/lib/python2.7/lib2to3/tests/data +dir path=usr/lib/python2.7/lib2to3/tests/data/fixers +dir path=usr/lib/python2.7/lib2to3/tests/data/fixers/myfixes +dir path=usr/lib/python2.7/sqlite3/test +dir path=usr/lib/python2.7/test +dir path=usr/lib/python2.7/test/data +dir path=usr/lib/python2.7/test/decimaltestdata +dir path=usr/lib/python2.7/test/tracedmodules +dir path=usr/lib/python2.7/test/xmltestdata + +file path=usr/lib/python2.7/bsddb/test/__init__.py +file path=usr/lib/python2.7/bsddb/test/test_all.py +file path=usr/lib/python2.7/bsddb/test/test_associate.py +file path=usr/lib/python2.7/bsddb/test/test_basics.py +file path=usr/lib/python2.7/bsddb/test/test_compare.py +file path=usr/lib/python2.7/bsddb/test/test_compat.py +file path=usr/lib/python2.7/bsddb/test/test_cursor_pget_bug.py +file path=usr/lib/python2.7/bsddb/test/test_db.py +file path=usr/lib/python2.7/bsddb/test/test_dbenv.py +file path=usr/lib/python2.7/bsddb/test/test_dbobj.py +file path=usr/lib/python2.7/bsddb/test/test_dbshelve.py +file path=usr/lib/python2.7/bsddb/test/test_dbtables.py +file path=usr/lib/python2.7/bsddb/test/test_distributed_transactions.py +file path=usr/lib/python2.7/bsddb/test/test_early_close.py +file path=usr/lib/python2.7/bsddb/test/test_fileid.py +file path=usr/lib/python2.7/bsddb/test/test_get_none.py +file path=usr/lib/python2.7/bsddb/test/test_join.py +file path=usr/lib/python2.7/bsddb/test/test_lock.py +file path=usr/lib/python2.7/bsddb/test/test_misc.py +file path=usr/lib/python2.7/bsddb/test/test_pickle.py +file path=usr/lib/python2.7/bsddb/test/test_queue.py +file path=usr/lib/python2.7/bsddb/test/test_recno.py +file path=usr/lib/python2.7/bsddb/test/test_replication.py +file path=usr/lib/python2.7/bsddb/test/test_sequence.py +file path=usr/lib/python2.7/bsddb/test/test_thread.py +file path=usr/lib/python2.7/ctypes/test/__init__.py +file path=usr/lib/python2.7/ctypes/test/runtests.py +file path=usr/lib/python2.7/ctypes/test/test_anon.py +file path=usr/lib/python2.7/ctypes/test/test_array_in_pointer.py +file path=usr/lib/python2.7/ctypes/test/test_arrays.py +file path=usr/lib/python2.7/ctypes/test/test_as_parameter.py +file path=usr/lib/python2.7/ctypes/test/test_bitfields.py +file path=usr/lib/python2.7/ctypes/test/test_buffers.py +file path=usr/lib/python2.7/ctypes/test/test_byteswap.py +file path=usr/lib/python2.7/ctypes/test/test_callbacks.py +file path=usr/lib/python2.7/ctypes/test/test_cast.py +file path=usr/lib/python2.7/ctypes/test/test_cfuncs.py +file path=usr/lib/python2.7/ctypes/test/test_checkretval.py +file path=usr/lib/python2.7/ctypes/test/test_delattr.py +file path=usr/lib/python2.7/ctypes/test/test_errcheck.py +file path=usr/lib/python2.7/ctypes/test/test_errno.py +file path=usr/lib/python2.7/ctypes/test/test_find.py +file path=usr/lib/python2.7/ctypes/test/test_frombuffer.py +file path=usr/lib/python2.7/ctypes/test/test_funcptr.py +file path=usr/lib/python2.7/ctypes/test/test_functions.py +file path=usr/lib/python2.7/ctypes/test/test_incomplete.py +file path=usr/lib/python2.7/ctypes/test/test_init.py +file path=usr/lib/python2.7/ctypes/test/test_integers.py +file path=usr/lib/python2.7/ctypes/test/test_internals.py +file path=usr/lib/python2.7/ctypes/test/test_keeprefs.py +file path=usr/lib/python2.7/ctypes/test/test_libc.py +file path=usr/lib/python2.7/ctypes/test/test_loading.py +file path=usr/lib/python2.7/ctypes/test/test_macholib.py +file path=usr/lib/python2.7/ctypes/test/test_memfunctions.py +file path=usr/lib/python2.7/ctypes/test/test_numbers.py +file path=usr/lib/python2.7/ctypes/test/test_objects.py +file path=usr/lib/python2.7/ctypes/test/test_parameters.py +file path=usr/lib/python2.7/ctypes/test/test_pep3118.py +file path=usr/lib/python2.7/ctypes/test/test_pickling.py +file path=usr/lib/python2.7/ctypes/test/test_pointers.py +file path=usr/lib/python2.7/ctypes/test/test_prototypes.py +file path=usr/lib/python2.7/ctypes/test/test_python_api.py +file path=usr/lib/python2.7/ctypes/test/test_random_things.py +file path=usr/lib/python2.7/ctypes/test/test_refcounts.py +file path=usr/lib/python2.7/ctypes/test/test_repr.py +file path=usr/lib/python2.7/ctypes/test/test_returnfuncptrs.py +file path=usr/lib/python2.7/ctypes/test/test_simplesubclasses.py +file path=usr/lib/python2.7/ctypes/test/test_sizes.py +file path=usr/lib/python2.7/ctypes/test/test_slicing.py +file path=usr/lib/python2.7/ctypes/test/test_stringptr.py +file path=usr/lib/python2.7/ctypes/test/test_strings.py +file path=usr/lib/python2.7/ctypes/test/test_struct_fields.py +file path=usr/lib/python2.7/ctypes/test/test_structures.py +file path=usr/lib/python2.7/ctypes/test/test_unaligned_structures.py +file path=usr/lib/python2.7/ctypes/test/test_unicode.py +file path=usr/lib/python2.7/ctypes/test/test_values.py +file path=usr/lib/python2.7/ctypes/test/test_varsize_struct.py +file path=usr/lib/python2.7/ctypes/test/test_win32.py +file path=usr/lib/python2.7/distutils/tests/Setup.sample +file path=usr/lib/python2.7/distutils/tests/__init__.py +file path=usr/lib/python2.7/distutils/tests/setuptools_build_ext.py +file path=usr/lib/python2.7/distutils/tests/setuptools_extension.py +file path=usr/lib/python2.7/distutils/tests/support.py +file path=usr/lib/python2.7/distutils/tests/test_archive_util.py +file path=usr/lib/python2.7/distutils/tests/test_bdist.py +file path=usr/lib/python2.7/distutils/tests/test_bdist_dumb.py +file path=usr/lib/python2.7/distutils/tests/test_bdist_msi.py +file path=usr/lib/python2.7/distutils/tests/test_bdist_rpm.py +file path=usr/lib/python2.7/distutils/tests/test_bdist_wininst.py +file path=usr/lib/python2.7/distutils/tests/test_build.py +file path=usr/lib/python2.7/distutils/tests/test_build_clib.py +file path=usr/lib/python2.7/distutils/tests/test_build_ext.py +file path=usr/lib/python2.7/distutils/tests/test_build_py.py +file path=usr/lib/python2.7/distutils/tests/test_build_scripts.py +file path=usr/lib/python2.7/distutils/tests/test_ccompiler.py +file path=usr/lib/python2.7/distutils/tests/test_check.py +file path=usr/lib/python2.7/distutils/tests/test_clean.py +file path=usr/lib/python2.7/distutils/tests/test_cmd.py +file path=usr/lib/python2.7/distutils/tests/test_config.py +file path=usr/lib/python2.7/distutils/tests/test_config_cmd.py +file path=usr/lib/python2.7/distutils/tests/test_core.py +file path=usr/lib/python2.7/distutils/tests/test_dep_util.py +file path=usr/lib/python2.7/distutils/tests/test_dir_util.py +file path=usr/lib/python2.7/distutils/tests/test_dist.py +file path=usr/lib/python2.7/distutils/tests/test_file_util.py +file path=usr/lib/python2.7/distutils/tests/test_filelist.py +file path=usr/lib/python2.7/distutils/tests/test_install.py +file path=usr/lib/python2.7/distutils/tests/test_install_data.py +file path=usr/lib/python2.7/distutils/tests/test_install_headers.py +file path=usr/lib/python2.7/distutils/tests/test_install_lib.py +file path=usr/lib/python2.7/distutils/tests/test_install_scripts.py +file path=usr/lib/python2.7/distutils/tests/test_msvc9compiler.py +file path=usr/lib/python2.7/distutils/tests/test_register.py +file path=usr/lib/python2.7/distutils/tests/test_sdist.py +file path=usr/lib/python2.7/distutils/tests/test_spawn.py +file path=usr/lib/python2.7/distutils/tests/test_sysconfig.py +file path=usr/lib/python2.7/distutils/tests/test_text_file.py +file path=usr/lib/python2.7/distutils/tests/test_unixccompiler.py +file path=usr/lib/python2.7/distutils/tests/test_upload.py +file path=usr/lib/python2.7/distutils/tests/test_util.py +file path=usr/lib/python2.7/distutils/tests/test_version.py +file path=usr/lib/python2.7/distutils/tests/test_versionpredicate.py +file path=usr/lib/python2.7/email/test/__init__.py +file path=usr/lib/python2.7/email/test/data/PyBanner048.gif +file path=usr/lib/python2.7/email/test/data/audiotest.au +file path=usr/lib/python2.7/email/test/data/msg_01.txt +file path=usr/lib/python2.7/email/test/data/msg_02.txt +file path=usr/lib/python2.7/email/test/data/msg_03.txt +file path=usr/lib/python2.7/email/test/data/msg_04.txt +file path=usr/lib/python2.7/email/test/data/msg_05.txt +file path=usr/lib/python2.7/email/test/data/msg_06.txt +file path=usr/lib/python2.7/email/test/data/msg_07.txt +file path=usr/lib/python2.7/email/test/data/msg_08.txt +file path=usr/lib/python2.7/email/test/data/msg_09.txt +file path=usr/lib/python2.7/email/test/data/msg_10.txt +file path=usr/lib/python2.7/email/test/data/msg_11.txt +file path=usr/lib/python2.7/email/test/data/msg_12.txt +file path=usr/lib/python2.7/email/test/data/msg_12a.txt +file path=usr/lib/python2.7/email/test/data/msg_13.txt +file path=usr/lib/python2.7/email/test/data/msg_14.txt +file path=usr/lib/python2.7/email/test/data/msg_15.txt +file path=usr/lib/python2.7/email/test/data/msg_16.txt +file path=usr/lib/python2.7/email/test/data/msg_17.txt +file path=usr/lib/python2.7/email/test/data/msg_18.txt +file path=usr/lib/python2.7/email/test/data/msg_19.txt +file path=usr/lib/python2.7/email/test/data/msg_20.txt +file path=usr/lib/python2.7/email/test/data/msg_21.txt +file path=usr/lib/python2.7/email/test/data/msg_22.txt +file path=usr/lib/python2.7/email/test/data/msg_23.txt +file path=usr/lib/python2.7/email/test/data/msg_24.txt +file path=usr/lib/python2.7/email/test/data/msg_25.txt +file path=usr/lib/python2.7/email/test/data/msg_26.txt +file path=usr/lib/python2.7/email/test/data/msg_27.txt +file path=usr/lib/python2.7/email/test/data/msg_28.txt +file path=usr/lib/python2.7/email/test/data/msg_29.txt +file path=usr/lib/python2.7/email/test/data/msg_30.txt +file path=usr/lib/python2.7/email/test/data/msg_31.txt +file path=usr/lib/python2.7/email/test/data/msg_32.txt +file path=usr/lib/python2.7/email/test/data/msg_33.txt +file path=usr/lib/python2.7/email/test/data/msg_34.txt +file path=usr/lib/python2.7/email/test/data/msg_35.txt +file path=usr/lib/python2.7/email/test/data/msg_36.txt +file path=usr/lib/python2.7/email/test/data/msg_37.txt +file path=usr/lib/python2.7/email/test/data/msg_38.txt +file path=usr/lib/python2.7/email/test/data/msg_39.txt +file path=usr/lib/python2.7/email/test/data/msg_40.txt +file path=usr/lib/python2.7/email/test/data/msg_41.txt +file path=usr/lib/python2.7/email/test/data/msg_42.txt +file path=usr/lib/python2.7/email/test/data/msg_43.txt +file path=usr/lib/python2.7/email/test/data/msg_44.txt +file path=usr/lib/python2.7/email/test/data/msg_45.txt +file path=usr/lib/python2.7/email/test/data/msg_46.txt +file path=usr/lib/python2.7/email/test/test_email.py +file path=usr/lib/python2.7/email/test/test_email_codecs.py +file path=usr/lib/python2.7/email/test/test_email_codecs_renamed.py +file path=usr/lib/python2.7/email/test/test_email_renamed.py +file path=usr/lib/python2.7/email/test/test_email_torture.py +file path=usr/lib/python2.7/idlelib/testcode.py +file path=usr/lib/python2.7/json/tests/__init__.py +file path=usr/lib/python2.7/json/tests/test_check_circular.py +file path=usr/lib/python2.7/json/tests/test_decode.py +file path=usr/lib/python2.7/json/tests/test_default.py +file path=usr/lib/python2.7/json/tests/test_dump.py +file path=usr/lib/python2.7/json/tests/test_encode_basestring_ascii.py +file path=usr/lib/python2.7/json/tests/test_fail.py +file path=usr/lib/python2.7/json/tests/test_float.py +file path=usr/lib/python2.7/json/tests/test_indent.py +file path=usr/lib/python2.7/json/tests/test_pass1.py +file path=usr/lib/python2.7/json/tests/test_pass2.py +file path=usr/lib/python2.7/json/tests/test_pass3.py +file path=usr/lib/python2.7/json/tests/test_recursion.py +file path=usr/lib/python2.7/json/tests/test_scanstring.py +file path=usr/lib/python2.7/json/tests/test_separators.py +file path=usr/lib/python2.7/json/tests/test_speedups.py +file path=usr/lib/python2.7/json/tests/test_unicode.py +file path=usr/lib/python2.7/lib-dynload/64/_ctypes_test.so +file path=usr/lib/python2.7/lib-dynload/64/_testcapi.so +file path=usr/lib/python2.7/lib-dynload/_ctypes_test.so +file path=usr/lib/python2.7/lib-dynload/_testcapi.so +file path=usr/lib/python2.7/lib-tk/test/README +file path=usr/lib/python2.7/lib-tk/test/runtktests.py +file path=usr/lib/python2.7/lib-tk/test/test_tkinter/__init__.py +file path=usr/lib/python2.7/lib-tk/test/test_tkinter/test_loadtk.py +file path=usr/lib/python2.7/lib-tk/test/test_tkinter/test_text.py +file path=usr/lib/python2.7/lib-tk/test/test_ttk/__init__.py +file path=usr/lib/python2.7/lib-tk/test/test_ttk/support.py +file path=usr/lib/python2.7/lib-tk/test/test_ttk/test_extensions.py +file path=usr/lib/python2.7/lib-tk/test/test_ttk/test_functions.py +file path=usr/lib/python2.7/lib-tk/test/test_ttk/test_style.py +file path=usr/lib/python2.7/lib-tk/test/test_ttk/test_widgets.py +file path=usr/lib/python2.7/lib2to3/tests/__init__.py +file path=usr/lib/python2.7/lib2to3/tests/data/README +file path=usr/lib/python2.7/lib2to3/tests/data/bom.py +file path=usr/lib/python2.7/lib2to3/tests/data/crlf.py +file path=usr/lib/python2.7/lib2to3/tests/data/different_encoding.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/bad_order.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/myfixes/__init__.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_explicit.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_first.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_last.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_parrot.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/myfixes/fix_preorder.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/no_fixer_cls.py +file path=usr/lib/python2.7/lib2to3/tests/data/fixers/parrot_example.py +file path=usr/lib/python2.7/lib2to3/tests/data/infinite_recursion.py +file path=usr/lib/python2.7/lib2to3/tests/data/py2_test_grammar.py +file path=usr/lib/python2.7/lib2to3/tests/data/py3_test_grammar.py +file path=usr/lib/python2.7/lib2to3/tests/pytree_idempotency.py +file path=usr/lib/python2.7/lib2to3/tests/support.py +file path=usr/lib/python2.7/lib2to3/tests/test_all_fixers.py +file path=usr/lib/python2.7/lib2to3/tests/test_fixers.py +file path=usr/lib/python2.7/lib2to3/tests/test_main.py +file path=usr/lib/python2.7/lib2to3/tests/test_parser.py +file path=usr/lib/python2.7/lib2to3/tests/test_pytree.py +file path=usr/lib/python2.7/lib2to3/tests/test_refactor.py +file path=usr/lib/python2.7/lib2to3/tests/test_util.py +file path=usr/lib/python2.7/sqlite3/test/__init__.py +file path=usr/lib/python2.7/sqlite3/test/dbapi.py +file path=usr/lib/python2.7/sqlite3/test/dump.py +file path=usr/lib/python2.7/sqlite3/test/factory.py +file path=usr/lib/python2.7/sqlite3/test/hooks.py +file path=usr/lib/python2.7/sqlite3/test/py25tests.py +file path=usr/lib/python2.7/sqlite3/test/regression.py +file path=usr/lib/python2.7/sqlite3/test/transactions.py +file path=usr/lib/python2.7/sqlite3/test/types.py +file path=usr/lib/python2.7/sqlite3/test/userfunctions.py +file path=usr/lib/python2.7/test/185test.db +file path=usr/lib/python2.7/test/Sine-1000Hz-300ms.aif +file path=usr/lib/python2.7/test/__init__.py +file path=usr/lib/python2.7/test/audiotest.au +file path=usr/lib/python2.7/test/autotest.py +file path=usr/lib/python2.7/test/bad_coding.py +file path=usr/lib/python2.7/test/bad_coding2.py +file path=usr/lib/python2.7/test/badcert.pem +file path=usr/lib/python2.7/test/badkey.pem +file path=usr/lib/python2.7/test/badsyntax_future3.py +file path=usr/lib/python2.7/test/badsyntax_future4.py +file path=usr/lib/python2.7/test/badsyntax_future5.py +file path=usr/lib/python2.7/test/badsyntax_future6.py +file path=usr/lib/python2.7/test/badsyntax_future7.py +file path=usr/lib/python2.7/test/badsyntax_future8.py +file path=usr/lib/python2.7/test/badsyntax_future9.py +file path=usr/lib/python2.7/test/badsyntax_nocaret.py +file path=usr/lib/python2.7/test/buffer_tests.py +file path=usr/lib/python2.7/test/cfgparser.1 +file path=usr/lib/python2.7/test/check_soundcard.vbs +file path=usr/lib/python2.7/test/cjkencodings_test.py +file path=usr/lib/python2.7/test/cmath_testcases.txt +file path=usr/lib/python2.7/test/curses_tests.py +file path=usr/lib/python2.7/test/data/README +file path=usr/lib/python2.7/test/decimaltestdata/abs.decTest +file path=usr/lib/python2.7/test/decimaltestdata/add.decTest +file path=usr/lib/python2.7/test/decimaltestdata/and.decTest +file path=usr/lib/python2.7/test/decimaltestdata/base.decTest +file path=usr/lib/python2.7/test/decimaltestdata/clamp.decTest +file path=usr/lib/python2.7/test/decimaltestdata/class.decTest +file path=usr/lib/python2.7/test/decimaltestdata/compare.decTest +file path=usr/lib/python2.7/test/decimaltestdata/comparetotal.decTest +file path=usr/lib/python2.7/test/decimaltestdata/comparetotmag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/copy.decTest +file path=usr/lib/python2.7/test/decimaltestdata/copyabs.decTest +file path=usr/lib/python2.7/test/decimaltestdata/copynegate.decTest +file path=usr/lib/python2.7/test/decimaltestdata/copysign.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddAbs.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddAdd.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddAnd.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddBase.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCanonical.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddClass.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCompare.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCompareSig.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCompareTotal.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCompareTotalMag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCopy.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCopyAbs.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCopyNegate.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddCopySign.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddDivide.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddDivideInt.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddEncode.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddFMA.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddInvert.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddLogB.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddMax.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddMaxMag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddMin.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddMinMag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddMinus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddMultiply.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddNextMinus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddNextPlus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddNextToward.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddOr.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddPlus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddQuantize.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddReduce.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddRemainder.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddRemainderNear.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddRotate.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddSameQuantum.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddScaleB.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddShift.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddSubtract.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddToIntegral.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ddXor.decTest +file path=usr/lib/python2.7/test/decimaltestdata/decDouble.decTest +file path=usr/lib/python2.7/test/decimaltestdata/decQuad.decTest +file path=usr/lib/python2.7/test/decimaltestdata/decSingle.decTest +file path=usr/lib/python2.7/test/decimaltestdata/divide.decTest +file path=usr/lib/python2.7/test/decimaltestdata/divideint.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqAbs.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqAdd.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqAnd.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqBase.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCanonical.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqClass.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCompare.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCompareSig.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCompareTotal.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCompareTotalMag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCopy.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCopyAbs.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCopyNegate.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqCopySign.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqDivide.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqDivideInt.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqEncode.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqFMA.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqInvert.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqLogB.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqMax.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqMaxMag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqMin.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqMinMag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqMinus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqMultiply.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqNextMinus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqNextPlus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqNextToward.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqOr.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqPlus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqQuantize.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqReduce.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqRemainder.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqRemainderNear.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqRotate.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqSameQuantum.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqScaleB.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqShift.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqSubtract.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqToIntegral.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dqXor.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dsBase.decTest +file path=usr/lib/python2.7/test/decimaltestdata/dsEncode.decTest +file path=usr/lib/python2.7/test/decimaltestdata/exp.decTest +file path=usr/lib/python2.7/test/decimaltestdata/extra.decTest +file path=usr/lib/python2.7/test/decimaltestdata/fma.decTest +file path=usr/lib/python2.7/test/decimaltestdata/inexact.decTest +file path=usr/lib/python2.7/test/decimaltestdata/invert.decTest +file path=usr/lib/python2.7/test/decimaltestdata/ln.decTest +file path=usr/lib/python2.7/test/decimaltestdata/log10.decTest +file path=usr/lib/python2.7/test/decimaltestdata/logb.decTest +file path=usr/lib/python2.7/test/decimaltestdata/max.decTest +file path=usr/lib/python2.7/test/decimaltestdata/maxmag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/min.decTest +file path=usr/lib/python2.7/test/decimaltestdata/minmag.decTest +file path=usr/lib/python2.7/test/decimaltestdata/minus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/multiply.decTest +file path=usr/lib/python2.7/test/decimaltestdata/nextminus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/nextplus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/nexttoward.decTest +file path=usr/lib/python2.7/test/decimaltestdata/or.decTest +file path=usr/lib/python2.7/test/decimaltestdata/plus.decTest +file path=usr/lib/python2.7/test/decimaltestdata/power.decTest +file path=usr/lib/python2.7/test/decimaltestdata/powersqrt.decTest +file path=usr/lib/python2.7/test/decimaltestdata/quantize.decTest +file path=usr/lib/python2.7/test/decimaltestdata/randomBound32.decTest +file path=usr/lib/python2.7/test/decimaltestdata/randoms.decTest +file path=usr/lib/python2.7/test/decimaltestdata/reduce.decTest +file path=usr/lib/python2.7/test/decimaltestdata/remainder.decTest +file path=usr/lib/python2.7/test/decimaltestdata/remainderNear.decTest +file path=usr/lib/python2.7/test/decimaltestdata/rescale.decTest +file path=usr/lib/python2.7/test/decimaltestdata/rotate.decTest +file path=usr/lib/python2.7/test/decimaltestdata/rounding.decTest +file path=usr/lib/python2.7/test/decimaltestdata/samequantum.decTest +file path=usr/lib/python2.7/test/decimaltestdata/scaleb.decTest +file path=usr/lib/python2.7/test/decimaltestdata/shift.decTest +file path=usr/lib/python2.7/test/decimaltestdata/squareroot.decTest +file path=usr/lib/python2.7/test/decimaltestdata/subtract.decTest +file path=usr/lib/python2.7/test/decimaltestdata/testall.decTest +file path=usr/lib/python2.7/test/decimaltestdata/tointegral.decTest +file path=usr/lib/python2.7/test/decimaltestdata/tointegralx.decTest +file path=usr/lib/python2.7/test/decimaltestdata/xor.decTest +file path=usr/lib/python2.7/test/dlpitest.py +file path=usr/lib/python2.7/test/doctest_aliases.py +file path=usr/lib/python2.7/test/double_const.py +file path=usr/lib/python2.7/test/empty.vbs +file path=usr/lib/python2.7/test/exception_hierarchy.txt +file path=usr/lib/python2.7/test/floating_points.txt +file path=usr/lib/python2.7/test/fork_wait.py +file path=usr/lib/python2.7/test/formatfloat_testcases.txt +file path=usr/lib/python2.7/test/gdb_sample.py +file path=usr/lib/python2.7/test/greyrgb.uue +file path=usr/lib/python2.7/test/https_svn_python_org_root.pem +file path=usr/lib/python2.7/test/ieee754.txt +file path=usr/lib/python2.7/test/infinite_reload.py +file path=usr/lib/python2.7/test/inspect_fodder.py +file path=usr/lib/python2.7/test/inspect_fodder2.py +file path=usr/lib/python2.7/test/keycert.pem +file path=usr/lib/python2.7/test/list_tests.py +file path=usr/lib/python2.7/test/lock_tests.py +file path=usr/lib/python2.7/test/mapping_tests.py +file path=usr/lib/python2.7/test/math_testcases.txt +file path=usr/lib/python2.7/test/nullcert.pem +file path=usr/lib/python2.7/test/outstanding_bugs.py +file path=usr/lib/python2.7/test/pickletester.py +file path=usr/lib/python2.7/test/privrbactest.py +file path=usr/lib/python2.7/test/profilee.py +file path=usr/lib/python2.7/test/pyclbr_input.py +file path=usr/lib/python2.7/test/pydoc_mod.py +file path=usr/lib/python2.7/test/pydocfodder.py +file path=usr/lib/python2.7/test/pystone.py +file path=usr/lib/python2.7/test/randv2_32.pck +file path=usr/lib/python2.7/test/randv2_64.pck +file path=usr/lib/python2.7/test/randv3.pck +file path=usr/lib/python2.7/test/re_tests.py +file path=usr/lib/python2.7/test/regex_tests.py +file path=usr/lib/python2.7/test/regrtest.py +file path=usr/lib/python2.7/test/relimport.py +file path=usr/lib/python2.7/test/reperf.py +file path=usr/lib/python2.7/test/sample_doctest.py +file path=usr/lib/python2.7/test/script_helper.py +file path=usr/lib/python2.7/test/seq_tests.py +file path=usr/lib/python2.7/test/sgml_input.html +file path=usr/lib/python2.7/test/sha256.pem +file path=usr/lib/python2.7/test/sortperf.py +file path=usr/lib/python2.7/test/ssl_cert.pem +file path=usr/lib/python2.7/test/ssl_key.pem +file path=usr/lib/python2.7/test/string_tests.py +file path=usr/lib/python2.7/test/svn_python_org_https_cert.pem +file path=usr/lib/python2.7/test/test_MimeWriter.py +file path=usr/lib/python2.7/test/test_SimpleHTTPServer.py +file path=usr/lib/python2.7/test/test_StringIO.py +file path=usr/lib/python2.7/test/test___all__.py +file path=usr/lib/python2.7/test/test___future__.py +file path=usr/lib/python2.7/test/test__locale.py +file path=usr/lib/python2.7/test/test_abc.py +file path=usr/lib/python2.7/test/test_abstract_numbers.py +file path=usr/lib/python2.7/test/test_aepack.py +file path=usr/lib/python2.7/test/test_aifc.py +file path=usr/lib/python2.7/test/test_al.py +file path=usr/lib/python2.7/test/test_anydbm.py +file path=usr/lib/python2.7/test/test_applesingle.py +file path=usr/lib/python2.7/test/test_argparse.py +file path=usr/lib/python2.7/test/test_array.py +file path=usr/lib/python2.7/test/test_ascii_formatd.py +file path=usr/lib/python2.7/test/test_ast.py +file path=usr/lib/python2.7/test/test_asynchat.py +file path=usr/lib/python2.7/test/test_asyncore.py +file path=usr/lib/python2.7/test/test_atexit.py +file path=usr/lib/python2.7/test/test_audioop.py +file path=usr/lib/python2.7/test/test_augassign.py +file path=usr/lib/python2.7/test/test_base64.py +file path=usr/lib/python2.7/test/test_bastion.py +file path=usr/lib/python2.7/test/test_bigaddrspace.py +file path=usr/lib/python2.7/test/test_bigmem.py +file path=usr/lib/python2.7/test/test_binascii.py +file path=usr/lib/python2.7/test/test_binhex.py +file path=usr/lib/python2.7/test/test_binop.py +file path=usr/lib/python2.7/test/test_bisect.py +file path=usr/lib/python2.7/test/test_bool.py +file path=usr/lib/python2.7/test/test_bsddb.py +file path=usr/lib/python2.7/test/test_bsddb185.py +file path=usr/lib/python2.7/test/test_bsddb3.py +file path=usr/lib/python2.7/test/test_buffer.py +file path=usr/lib/python2.7/test/test_bufio.py +file path=usr/lib/python2.7/test/test_builtin.py +file path=usr/lib/python2.7/test/test_bytes.py +file path=usr/lib/python2.7/test/test_bz2.py +file path=usr/lib/python2.7/test/test_calendar.py +file path=usr/lib/python2.7/test/test_call.py +file path=usr/lib/python2.7/test/test_capi.py +file path=usr/lib/python2.7/test/test_cd.py +file path=usr/lib/python2.7/test/test_cfgparser.py +file path=usr/lib/python2.7/test/test_cgi.py +file path=usr/lib/python2.7/test/test_charmapcodec.py +file path=usr/lib/python2.7/test/test_cl.py +file path=usr/lib/python2.7/test/test_class.py +file path=usr/lib/python2.7/test/test_cmath.py +file path=usr/lib/python2.7/test/test_cmd.py +file path=usr/lib/python2.7/test/test_cmd_line.py +file path=usr/lib/python2.7/test/test_cmd_line_script.py +file path=usr/lib/python2.7/test/test_code.py +file path=usr/lib/python2.7/test/test_codeccallbacks.py +file path=usr/lib/python2.7/test/test_codecencodings_cn.py +file path=usr/lib/python2.7/test/test_codecencodings_hk.py +file path=usr/lib/python2.7/test/test_codecencodings_jp.py +file path=usr/lib/python2.7/test/test_codecencodings_kr.py +file path=usr/lib/python2.7/test/test_codecencodings_tw.py +file path=usr/lib/python2.7/test/test_codecmaps_cn.py +file path=usr/lib/python2.7/test/test_codecmaps_hk.py +file path=usr/lib/python2.7/test/test_codecmaps_jp.py +file path=usr/lib/python2.7/test/test_codecmaps_kr.py +file path=usr/lib/python2.7/test/test_codecmaps_tw.py +file path=usr/lib/python2.7/test/test_codecs.py +file path=usr/lib/python2.7/test/test_codeop.py +file path=usr/lib/python2.7/test/test_coding.py +file path=usr/lib/python2.7/test/test_coercion.py +file path=usr/lib/python2.7/test/test_collections.py +file path=usr/lib/python2.7/test/test_colorsys.py +file path=usr/lib/python2.7/test/test_commands.py +file path=usr/lib/python2.7/test/test_compare.py +file path=usr/lib/python2.7/test/test_compile.py +file path=usr/lib/python2.7/test/test_compileall.py +file path=usr/lib/python2.7/test/test_compiler.py +file path=usr/lib/python2.7/test/test_complex.py +file path=usr/lib/python2.7/test/test_complex_args.py +file path=usr/lib/python2.7/test/test_contains.py +file path=usr/lib/python2.7/test/test_contextlib.py +file path=usr/lib/python2.7/test/test_cookie.py +file path=usr/lib/python2.7/test/test_cookielib.py +file path=usr/lib/python2.7/test/test_copy.py +file path=usr/lib/python2.7/test/test_copy_reg.py +file path=usr/lib/python2.7/test/test_cpickle.py +file path=usr/lib/python2.7/test/test_cprofile.py +file path=usr/lib/python2.7/test/test_crypt.py +file path=usr/lib/python2.7/test/test_csv.py +file path=usr/lib/python2.7/test/test_ctypes.py +file path=usr/lib/python2.7/test/test_curses.py +file path=usr/lib/python2.7/test/test_datetime.py +file path=usr/lib/python2.7/test/test_dbm.py +file path=usr/lib/python2.7/test/test_decimal.py +file path=usr/lib/python2.7/test/test_decorators.py +file path=usr/lib/python2.7/test/test_defaultdict.py +file path=usr/lib/python2.7/test/test_deque.py +file path=usr/lib/python2.7/test/test_descr.py +file path=usr/lib/python2.7/test/test_descrtut.py +file path=usr/lib/python2.7/test/test_dict.py +file path=usr/lib/python2.7/test/test_dictcomps.py +file path=usr/lib/python2.7/test/test_dictviews.py +file path=usr/lib/python2.7/test/test_difflib.py +file path=usr/lib/python2.7/test/test_difflib_expect.html +file path=usr/lib/python2.7/test/test_dircache.py +file path=usr/lib/python2.7/test/test_dis.py +file path=usr/lib/python2.7/test/test_distutils.py +file path=usr/lib/python2.7/test/test_dl.py +file path=usr/lib/python2.7/test/test_doctest.py +file path=usr/lib/python2.7/test/test_doctest.txt +file path=usr/lib/python2.7/test/test_doctest2.py +file path=usr/lib/python2.7/test/test_doctest2.txt +file path=usr/lib/python2.7/test/test_doctest3.txt +file path=usr/lib/python2.7/test/test_doctest4.txt +file path=usr/lib/python2.7/test/test_docxmlrpc.py +file path=usr/lib/python2.7/test/test_dumbdbm.py +file path=usr/lib/python2.7/test/test_dummy_thread.py +file path=usr/lib/python2.7/test/test_dummy_threading.py +file path=usr/lib/python2.7/test/test_email.py +file path=usr/lib/python2.7/test/test_email_codecs.py +file path=usr/lib/python2.7/test/test_email_renamed.py +file path=usr/lib/python2.7/test/test_enumerate.py +file path=usr/lib/python2.7/test/test_eof.py +file path=usr/lib/python2.7/test/test_epoll.py +file path=usr/lib/python2.7/test/test_errno.py +file path=usr/lib/python2.7/test/test_exception_variations.py +file path=usr/lib/python2.7/test/test_exceptions.py +file path=usr/lib/python2.7/test/test_extcall.py +file path=usr/lib/python2.7/test/test_fcntl.py +file path=usr/lib/python2.7/test/test_file.py +file path=usr/lib/python2.7/test/test_file2k.py +file path=usr/lib/python2.7/test/test_filecmp.py +file path=usr/lib/python2.7/test/test_fileinput.py +file path=usr/lib/python2.7/test/test_fileio.py +file path=usr/lib/python2.7/test/test_float.py +file path=usr/lib/python2.7/test/test_fnmatch.py +file path=usr/lib/python2.7/test/test_fork1.py +file path=usr/lib/python2.7/test/test_format.py +file path=usr/lib/python2.7/test/test_fpformat.py +file path=usr/lib/python2.7/test/test_fractions.py +file path=usr/lib/python2.7/test/test_frozen.py +file path=usr/lib/python2.7/test/test_ftplib.py +file path=usr/lib/python2.7/test/test_funcattrs.py +file path=usr/lib/python2.7/test/test_functools.py +file path=usr/lib/python2.7/test/test_future.py +file path=usr/lib/python2.7/test/test_future1.py +file path=usr/lib/python2.7/test/test_future2.py +file path=usr/lib/python2.7/test/test_future3.py +file path=usr/lib/python2.7/test/test_future4.py +file path=usr/lib/python2.7/test/test_future5.py +file path=usr/lib/python2.7/test/test_future_builtins.py +file path=usr/lib/python2.7/test/test_gc.py +file path=usr/lib/python2.7/test/test_gdb.py +file path=usr/lib/python2.7/test/test_gdbm.py +file path=usr/lib/python2.7/test/test_generators.py +file path=usr/lib/python2.7/test/test_genericpath.py +file path=usr/lib/python2.7/test/test_genexps.py +file path=usr/lib/python2.7/test/test_getargs.py +file path=usr/lib/python2.7/test/test_getargs2.py +file path=usr/lib/python2.7/test/test_getopt.py +file path=usr/lib/python2.7/test/test_gettext.py +file path=usr/lib/python2.7/test/test_gl.py +file path=usr/lib/python2.7/test/test_glob.py +file path=usr/lib/python2.7/test/test_global.py +file path=usr/lib/python2.7/test/test_grammar.py +file path=usr/lib/python2.7/test/test_grp.py +file path=usr/lib/python2.7/test/test_gzip.py +file path=usr/lib/python2.7/test/test_hash.py +file path=usr/lib/python2.7/test/test_hashlib.py +file path=usr/lib/python2.7/test/test_heapq.py +file path=usr/lib/python2.7/test/test_hmac.py +file path=usr/lib/python2.7/test/test_hotshot.py +file path=usr/lib/python2.7/test/test_htmllib.py +file path=usr/lib/python2.7/test/test_htmlparser.py +file path=usr/lib/python2.7/test/test_httplib.py +file path=usr/lib/python2.7/test/test_httpservers.py +file path=usr/lib/python2.7/test/test_imageop.py +file path=usr/lib/python2.7/test/test_imaplib.py +file path=usr/lib/python2.7/test/test_imgfile.py +file path=usr/lib/python2.7/test/test_imp.py +file path=usr/lib/python2.7/test/test_import.py +file path=usr/lib/python2.7/test/test_importhooks.py +file path=usr/lib/python2.7/test/test_importlib.py +file path=usr/lib/python2.7/test/test_index.py +file path=usr/lib/python2.7/test/test_inspect.py +file path=usr/lib/python2.7/test/test_int.py +file path=usr/lib/python2.7/test/test_int_literal.py +file path=usr/lib/python2.7/test/test_io.py +file path=usr/lib/python2.7/test/test_ioctl.py +file path=usr/lib/python2.7/test/test_isinstance.py +file path=usr/lib/python2.7/test/test_iter.py +file path=usr/lib/python2.7/test/test_iterlen.py +file path=usr/lib/python2.7/test/test_itertools.py +file path=usr/lib/python2.7/test/test_json.py +file path=usr/lib/python2.7/test/test_kqueue.py +file path=usr/lib/python2.7/test/test_largefile.py +file path=usr/lib/python2.7/test/test_lib2to3.py +file path=usr/lib/python2.7/test/test_linecache.py +file path=usr/lib/python2.7/test/test_linuxaudiodev.py +file path=usr/lib/python2.7/test/test_list.py +file path=usr/lib/python2.7/test/test_locale.py +file path=usr/lib/python2.7/test/test_logging.py +file path=usr/lib/python2.7/test/test_long.py +file path=usr/lib/python2.7/test/test_long_future.py +file path=usr/lib/python2.7/test/test_longexp.py +file path=usr/lib/python2.7/test/test_macos.py +file path=usr/lib/python2.7/test/test_macostools.py +file path=usr/lib/python2.7/test/test_macpath.py +file path=usr/lib/python2.7/test/test_mailbox.py +file path=usr/lib/python2.7/test/test_marshal.py +file path=usr/lib/python2.7/test/test_math.py +file path=usr/lib/python2.7/test/test_md5.py +file path=usr/lib/python2.7/test/test_memoryio.py +file path=usr/lib/python2.7/test/test_memoryview.py +file path=usr/lib/python2.7/test/test_mhlib.py +file path=usr/lib/python2.7/test/test_mimetools.py +file path=usr/lib/python2.7/test/test_mimetypes.py +file path=usr/lib/python2.7/test/test_minidom.py +file path=usr/lib/python2.7/test/test_mmap.py +file path=usr/lib/python2.7/test/test_module.py +file path=usr/lib/python2.7/test/test_modulefinder.py +file path=usr/lib/python2.7/test/test_multibytecodec.py +file path=usr/lib/python2.7/test/test_multibytecodec_support.py +file path=usr/lib/python2.7/test/test_multifile.py +file path=usr/lib/python2.7/test/test_multiprocessing.py +file path=usr/lib/python2.7/test/test_mutants.py +file path=usr/lib/python2.7/test/test_mutex.py +file path=usr/lib/python2.7/test/test_netrc.py +file path=usr/lib/python2.7/test/test_new.py +file path=usr/lib/python2.7/test/test_nis.py +file path=usr/lib/python2.7/test/test_normalization.py +file path=usr/lib/python2.7/test/test_ntpath.py +file path=usr/lib/python2.7/test/test_old_mailbox.py +file path=usr/lib/python2.7/test/test_opcodes.py +file path=usr/lib/python2.7/test/test_openpty.py +file path=usr/lib/python2.7/test/test_operator.py +file path=usr/lib/python2.7/test/test_optparse.py +file path=usr/lib/python2.7/test/test_os.py +file path=usr/lib/python2.7/test/test_ossaudiodev.py +file path=usr/lib/python2.7/test/test_parser.py +file path=usr/lib/python2.7/test/test_pdb.py +file path=usr/lib/python2.7/test/test_peepholer.py +file path=usr/lib/python2.7/test/test_pep247.py +file path=usr/lib/python2.7/test/test_pep263.py +file path=usr/lib/python2.7/test/test_pep277.py +file path=usr/lib/python2.7/test/test_pep292.py +file path=usr/lib/python2.7/test/test_pep352.py +file path=usr/lib/python2.7/test/test_pickle.py +file path=usr/lib/python2.7/test/test_pickletools.py +file path=usr/lib/python2.7/test/test_pipes.py +file path=usr/lib/python2.7/test/test_pkg.py +file path=usr/lib/python2.7/test/test_pkgimport.py +file path=usr/lib/python2.7/test/test_pkgutil.py +file path=usr/lib/python2.7/test/test_platform.py +file path=usr/lib/python2.7/test/test_plistlib.py +file path=usr/lib/python2.7/test/test_poll.py +file path=usr/lib/python2.7/test/test_popen.py +file path=usr/lib/python2.7/test/test_popen2.py +file path=usr/lib/python2.7/test/test_poplib.py +file path=usr/lib/python2.7/test/test_posix.py +file path=usr/lib/python2.7/test/test_posixpath.py +file path=usr/lib/python2.7/test/test_pow.py +file path=usr/lib/python2.7/test/test_pprint.py +file path=usr/lib/python2.7/test/test_print.py +file path=usr/lib/python2.7/test/test_profile.py +file path=usr/lib/python2.7/test/test_property.py +file path=usr/lib/python2.7/test/test_pstats.py +file path=usr/lib/python2.7/test/test_pty.py +file path=usr/lib/python2.7/test/test_pwd.py +file path=usr/lib/python2.7/test/test_py3kwarn.py +file path=usr/lib/python2.7/test/test_pyclbr.py +file path=usr/lib/python2.7/test/test_pydoc.py +file path=usr/lib/python2.7/test/test_pyexpat.py +file path=usr/lib/python2.7/test/test_queue.py +file path=usr/lib/python2.7/test/test_quopri.py +file path=usr/lib/python2.7/test/test_random.py +file path=usr/lib/python2.7/test/test_re.py +file path=usr/lib/python2.7/test/test_readline.py +file path=usr/lib/python2.7/test/test_repr.py +file path=usr/lib/python2.7/test/test_resource.py +file path=usr/lib/python2.7/test/test_rfc822.py +file path=usr/lib/python2.7/test/test_richcmp.py +file path=usr/lib/python2.7/test/test_rlcompleter.py +file path=usr/lib/python2.7/test/test_robotparser.py +file path=usr/lib/python2.7/test/test_runpy.py +file path=usr/lib/python2.7/test/test_sax.py +file path=usr/lib/python2.7/test/test_scope.py +file path=usr/lib/python2.7/test/test_scriptpackages.py +file path=usr/lib/python2.7/test/test_select.py +file path=usr/lib/python2.7/test/test_set.py +file path=usr/lib/python2.7/test/test_setcomps.py +file path=usr/lib/python2.7/test/test_sets.py +file path=usr/lib/python2.7/test/test_sgmllib.py +file path=usr/lib/python2.7/test/test_sha.py +file path=usr/lib/python2.7/test/test_shelve.py +file path=usr/lib/python2.7/test/test_shlex.py +file path=usr/lib/python2.7/test/test_shutil.py +file path=usr/lib/python2.7/test/test_signal.py +file path=usr/lib/python2.7/test/test_site.py +file path=usr/lib/python2.7/test/test_slice.py +file path=usr/lib/python2.7/test/test_smtplib.py +file path=usr/lib/python2.7/test/test_smtpnet.py +file path=usr/lib/python2.7/test/test_socket.py +file path=usr/lib/python2.7/test/test_socketserver.py +file path=usr/lib/python2.7/test/test_softspace.py +file path=usr/lib/python2.7/test/test_sort.py +file path=usr/lib/python2.7/test/test_sqlite.py +file path=usr/lib/python2.7/test/test_ssl.py +file path=usr/lib/python2.7/test/test_startfile.py +file path=usr/lib/python2.7/test/test_str.py +file path=usr/lib/python2.7/test/test_strftime.py +file path=usr/lib/python2.7/test/test_string.py +file path=usr/lib/python2.7/test/test_stringprep.py +file path=usr/lib/python2.7/test/test_strop.py +file path=usr/lib/python2.7/test/test_strptime.py +file path=usr/lib/python2.7/test/test_strtod.py +file path=usr/lib/python2.7/test/test_struct.py +file path=usr/lib/python2.7/test/test_structmembers.py +file path=usr/lib/python2.7/test/test_structseq.py +file path=usr/lib/python2.7/test/test_subprocess.py +file path=usr/lib/python2.7/test/test_sunaudiodev.py +file path=usr/lib/python2.7/test/test_sundry.py +file path=usr/lib/python2.7/test/test_support.py +file path=usr/lib/python2.7/test/test_symtable.py +file path=usr/lib/python2.7/test/test_syntax.py +file path=usr/lib/python2.7/test/test_sys.py +file path=usr/lib/python2.7/test/test_sys_setprofile.py +file path=usr/lib/python2.7/test/test_sys_settrace.py +file path=usr/lib/python2.7/test/test_sysconfig.py +file path=usr/lib/python2.7/test/test_tarfile.py +file path=usr/lib/python2.7/test/test_tcl.py +file path=usr/lib/python2.7/test/test_telnetlib.py +file path=usr/lib/python2.7/test/test_tempfile.py +file path=usr/lib/python2.7/test/test_textwrap.py +file path=usr/lib/python2.7/test/test_thread.py +file path=usr/lib/python2.7/test/test_threaded_import.py +file path=usr/lib/python2.7/test/test_threadedtempfile.py +file path=usr/lib/python2.7/test/test_threading.py +file path=usr/lib/python2.7/test/test_threading_local.py +file path=usr/lib/python2.7/test/test_threadsignals.py +file path=usr/lib/python2.7/test/test_time.py +file path=usr/lib/python2.7/test/test_timeout.py +file path=usr/lib/python2.7/test/test_tk.py +file path=usr/lib/python2.7/test/test_tokenize.py +file path=usr/lib/python2.7/test/test_trace.py +file path=usr/lib/python2.7/test/test_traceback.py +file path=usr/lib/python2.7/test/test_transformer.py +file path=usr/lib/python2.7/test/test_ttk_guionly.py +file path=usr/lib/python2.7/test/test_ttk_textonly.py +file path=usr/lib/python2.7/test/test_tuple.py +file path=usr/lib/python2.7/test/test_typechecks.py +file path=usr/lib/python2.7/test/test_types.py +file path=usr/lib/python2.7/test/test_ucn.py +file path=usr/lib/python2.7/test/test_unary.py +file path=usr/lib/python2.7/test/test_undocumented_details.py +file path=usr/lib/python2.7/test/test_unicode.py +file path=usr/lib/python2.7/test/test_unicode_file.py +file path=usr/lib/python2.7/test/test_unicodedata.py +file path=usr/lib/python2.7/test/test_unittest.py +file path=usr/lib/python2.7/test/test_univnewlines.py +file path=usr/lib/python2.7/test/test_univnewlines2k.py +file path=usr/lib/python2.7/test/test_unpack.py +file path=usr/lib/python2.7/test/test_urllib.py +file path=usr/lib/python2.7/test/test_urllib2.py +file path=usr/lib/python2.7/test/test_urllib2_localnet.py +file path=usr/lib/python2.7/test/test_urllib2net.py +file path=usr/lib/python2.7/test/test_urllibnet.py +file path=usr/lib/python2.7/test/test_urlparse.py +file path=usr/lib/python2.7/test/test_userdict.py +file path=usr/lib/python2.7/test/test_userlist.py +file path=usr/lib/python2.7/test/test_userstring.py +file path=usr/lib/python2.7/test/test_uu.py +file path=usr/lib/python2.7/test/test_uuid.py +file path=usr/lib/python2.7/test/test_wait3.py +file path=usr/lib/python2.7/test/test_wait4.py +file path=usr/lib/python2.7/test/test_warnings.py +file path=usr/lib/python2.7/test/test_wave.py +file path=usr/lib/python2.7/test/test_weakref.py +file path=usr/lib/python2.7/test/test_weakset.py +file path=usr/lib/python2.7/test/test_whichdb.py +file path=usr/lib/python2.7/test/test_winreg.py +file path=usr/lib/python2.7/test/test_winsound.py +file path=usr/lib/python2.7/test/test_with.py +file path=usr/lib/python2.7/test/test_wsgiref.py +file path=usr/lib/python2.7/test/test_xdrlib.py +file path=usr/lib/python2.7/test/test_xml_etree.py +file path=usr/lib/python2.7/test/test_xml_etree_c.py +file path=usr/lib/python2.7/test/test_xmllib.py +file path=usr/lib/python2.7/test/test_xmlrpc.py +file path=usr/lib/python2.7/test/test_xpickle.py +file path=usr/lib/python2.7/test/test_xrange.py +file path=usr/lib/python2.7/test/test_zipfile.py +file path=usr/lib/python2.7/test/test_zipfile64.py +file path=usr/lib/python2.7/test/test_zipimport.py +file path=usr/lib/python2.7/test/test_zipimport_support.py +file path=usr/lib/python2.7/test/test_zlib.py +file path=usr/lib/python2.7/test/testall.py +file path=usr/lib/python2.7/test/testcodec.py +file path=usr/lib/python2.7/test/testimg.uue +file path=usr/lib/python2.7/test/testimgr.uue +file path=usr/lib/python2.7/test/testrgb.uue +file path=usr/lib/python2.7/test/testtar.tar +file path=usr/lib/python2.7/test/tf_inherit_check.py +file path=usr/lib/python2.7/test/threaded_import_hangers.py +file path=usr/lib/python2.7/test/time_hashlib.py +file path=usr/lib/python2.7/test/tokenize_tests.txt +file path=usr/lib/python2.7/test/tracedmodules/__init__.py +file path=usr/lib/python2.7/test/tracedmodules/testmod.py +file path=usr/lib/python2.7/test/ucredtest.py +file path=usr/lib/python2.7/test/warning_tests.py +file path=usr/lib/python2.7/test/win_console_handler.py +file path=usr/lib/python2.7/test/wrongcert.pem +file path=usr/lib/python2.7/test/xmltestdata/simple-ns.xml +file path=usr/lib/python2.7/test/xmltestdata/simple.xml +file path=usr/lib/python2.7/test/xmltestdata/test.xml +file path=usr/lib/python2.7/test/xmltestdata/test.xml.out +file path=usr/lib/python2.7/test/xmltests.py +file path=usr/lib/python2.7/test/zipdir.zip diff -r aa27b836c528 -r 2edc011b559e components/python/python27/python-27.p5m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/python-27.p5m Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,1073 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# + + default mangler.man.stability uncommitted> +set name=pkg.fmri \ + value=pkg:/runtime/python-27@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="The Python interpreter, libraries and utilities" +set name=info.classification \ + value=org.opensolaris.category.2008:Development/Python +set name=info.source_url value=$(COMPONENT_ARCHIVE_URL) +set name=info.upstream_url value=http://python.org/ +set name=opensolaris.arc_url \ + value=http://arc.opensolaris.org/caselog/PSARC/2008/514 \ + value=http://arc.opensolaris.org/caselog/PSARC/2009/529 \ + value=http://arc.opensolaris.org/caselog/PSARC/2011/XXX +# PSARC 2008/514 Python interface to dlpi(7P) +# PSARC 2009/529 Python interface to privileges(5) & rbac(5) + +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) + +# pkgdepend doesn't like python 2.7 yet + \ + default pkg.depend.bypass-generate .* > + +license python27.license license=PSFv2 + +dir path=usr +dir path=usr/bin +dir path=usr/bin/$(MACH32) +dir path=usr/bin/$(MACH64) +dir path=usr/include +dir path=usr/include/python2.7 +dir path=usr/lib +dir path=usr/lib/$(MACH64) +dir path=usr/lib/$(MACH64)/pkgconfig +#dir path=usr/lib/$(MACH64)/python2.7 +#dir path=usr/lib/$(MACH64)/python2.7/config +dir path=usr/lib/pkgconfig +dir path=usr/lib/python2.7 +dir path=usr/lib/python2.7/bsddb +dir path=usr/lib/python2.7/compiler +dir path=usr/lib/python2.7/config +dir path=usr/lib/python2.7/ctypes +dir path=usr/lib/python2.7/ctypes/macholib +dir path=usr/lib/python2.7/curses +dir path=usr/lib/python2.7/distutils +dir path=usr/lib/python2.7/distutils/command +dir path=usr/lib/python2.7/email +dir path=usr/lib/python2.7/email/mime +dir path=usr/lib/python2.7/encodings +dir path=usr/lib/python2.7/hotshot +dir path=usr/lib/python2.7/idlelib +dir path=usr/lib/python2.7/idlelib/Icons +dir path=usr/lib/python2.7/importlib +dir path=usr/lib/python2.7/json +dir path=usr/lib/python2.7/lib-dynload +dir path=usr/lib/python2.7/lib-dynload/64 +dir path=usr/lib/python2.7/lib-old +dir path=usr/lib/python2.7/lib2to3 +dir path=usr/lib/python2.7/lib2to3/fixes +dir path=usr/lib/python2.7/lib2to3/pgen2 +dir path=usr/lib/python2.7/logging +dir path=usr/lib/python2.7/multiprocessing +dir path=usr/lib/python2.7/multiprocessing/dummy +dir path=usr/lib/python2.7/plat-sunos5 +dir path=usr/lib/python2.7/pydoc_data +dir path=usr/lib/python2.7/site-packages +dir path=usr/lib/python2.7/sqlite3 +dir path=usr/lib/python2.7/unittest +dir path=usr/lib/python2.7/unittest/test +dir path=usr/lib/python2.7/vendor-packages +dir path=usr/lib/python2.7/vendor-packages/64 +dir path=usr/lib/python2.7/wsgiref +dir path=usr/lib/python2.7/xml +dir path=usr/lib/python2.7/xml/dom +dir path=usr/lib/python2.7/xml/etree +dir path=usr/lib/python2.7/xml/parsers +dir path=usr/lib/python2.7/xml/sax +dir path=usr/share +dir path=usr/share/man +dir path=usr/share/man/man1 + +# These are commented out until python 2.7 becomes the default +#file path=usr/bin/$(MACH64)/2to3 pkg.depend.bypass-generate=.* +#file path=usr/bin/$(MACH64)/idle pkg.depend.bypass-generate=.* +#file path=usr/bin/$(MACH64)/pydoc pkg.depend.bypass-generate=.* +#file path=usr/bin/$(MACH64)/python +#file path=usr/bin/$(MACH64)/smtpd.py pkg.depend.bypass-generate=.* pkg.tmp.autopyc=false +#file path=usr/bin/2to3 pkg.depend.bypass-generate=.* +#file path=usr/bin/idle pkg.depend.bypass-generate=.* +#file path=usr/bin/pydoc pkg.depend.bypass-generate=.* +#file path=usr/bin/python +#file path=usr/bin/smtpd.py pkg.depend.bypass-generate=.* pkg.tmp.autopyc=false + +file usr/bin/python2.7 path=usr/bin/$(MACH32)/isapython2.7 +file usr/bin/$(MACH64)/python2.7 path=usr/bin/$(MACH64)/isapython2.7 + +file path=usr/bin/$(MACH64)/python2.7-config pkg.depend.bypass-generate=.* +file path=usr/bin/python2.7-config pkg.depend.bypass-generate=.* +file path=usr/include/python2.7/Python-ast.h +file path=usr/include/python2.7/Python.h +file path=usr/include/python2.7/abstract.h +file path=usr/include/python2.7/asdl.h +file path=usr/include/python2.7/ast.h +file path=usr/include/python2.7/bitset.h +file path=usr/include/python2.7/boolobject.h +file path=usr/include/python2.7/bufferobject.h +file path=usr/include/python2.7/bytearrayobject.h +file path=usr/include/python2.7/bytes_methods.h +file path=usr/include/python2.7/bytesobject.h +file path=usr/include/python2.7/cStringIO.h +file path=usr/include/python2.7/cellobject.h +file path=usr/include/python2.7/ceval.h +file path=usr/include/python2.7/classobject.h +file path=usr/include/python2.7/cobject.h +file path=usr/include/python2.7/code.h +file path=usr/include/python2.7/codecs.h +file path=usr/include/python2.7/compile.h +file path=usr/include/python2.7/complexobject.h +file path=usr/include/python2.7/datetime.h +file path=usr/include/python2.7/descrobject.h +file path=usr/include/python2.7/dictobject.h +file path=usr/include/python2.7/dtoa.h +file path=usr/include/python2.7/enumobject.h +file path=usr/include/python2.7/errcode.h +file path=usr/include/python2.7/eval.h +file path=usr/include/python2.7/fileobject.h +file path=usr/include/python2.7/floatobject.h +file path=usr/include/python2.7/frameobject.h +file path=usr/include/python2.7/funcobject.h +file path=usr/include/python2.7/genobject.h +file path=usr/include/python2.7/graminit.h +file path=usr/include/python2.7/grammar.h +file path=usr/include/python2.7/import.h +file path=usr/include/python2.7/intobject.h +file path=usr/include/python2.7/intrcheck.h +file path=usr/include/python2.7/iterobject.h +file path=usr/include/python2.7/listobject.h +file path=usr/include/python2.7/longintrepr.h +file path=usr/include/python2.7/longobject.h +file path=usr/include/python2.7/marshal.h +file path=usr/include/python2.7/memoryobject.h +file path=usr/include/python2.7/metagrammar.h +file path=usr/include/python2.7/methodobject.h +file path=usr/include/python2.7/modsupport.h +file path=usr/include/python2.7/moduleobject.h +file path=usr/include/python2.7/node.h +file path=usr/include/python2.7/object.h +file path=usr/include/python2.7/objimpl.h +file path=usr/include/python2.7/opcode.h +file path=usr/include/python2.7/osdefs.h +file path=usr/include/python2.7/parsetok.h +file path=usr/include/python2.7/patchlevel.h +file path=usr/include/python2.7/pgen.h +file path=usr/include/python2.7/pgenheaders.h +file path=usr/include/python2.7/py_curses.h +file path=usr/include/python2.7/pyarena.h +file path=usr/include/python2.7/pycapsule.h +file path=usr/include/python2.7/pyconfig.h +file path=usr/include/python2.7/pyctype.h +file path=usr/include/python2.7/pydebug.h +file path=usr/include/python2.7/pyerrors.h +file path=usr/include/python2.7/pyexpat.h +file path=usr/include/python2.7/pyfpe.h +file path=usr/include/python2.7/pygetopt.h +file path=usr/include/python2.7/pymacconfig.h +file path=usr/include/python2.7/pymactoolbox.h +file path=usr/include/python2.7/pymath.h +file path=usr/include/python2.7/pymem.h +file path=usr/include/python2.7/pyport.h +file path=usr/include/python2.7/pystate.h +file path=usr/include/python2.7/pystrcmp.h +file path=usr/include/python2.7/pystrtod.h +file path=usr/include/python2.7/pythonrun.h +file path=usr/include/python2.7/pythread.h +file path=usr/include/python2.7/rangeobject.h +file path=usr/include/python2.7/setobject.h +file path=usr/include/python2.7/sliceobject.h +file path=usr/include/python2.7/stringobject.h +file path=usr/include/python2.7/structmember.h +file path=usr/include/python2.7/structseq.h +file path=usr/include/python2.7/symtable.h +file path=usr/include/python2.7/sysmodule.h +file path=usr/include/python2.7/timefuncs.h +file path=usr/include/python2.7/token.h +file path=usr/include/python2.7/traceback.h +file path=usr/include/python2.7/tupleobject.h +file path=usr/include/python2.7/ucnhash.h +file path=usr/include/python2.7/unicodeobject.h +file path=usr/include/python2.7/warnings.h +file path=usr/include/python2.7/weakrefobject.h +file path=usr/lib/$(MACH64)/libpython2.7.so.1.0 +file path=usr/lib/$(MACH64)/pkgconfig/python-2.7.pc +#file path=usr/lib/$(MACH64)/python2.7/config/Makefile +#file path=usr/lib/$(MACH64)/python2.7/config/Setup +#file path=usr/lib/$(MACH64)/python2.7/config/Setup.config +#file path=usr/lib/$(MACH64)/python2.7/config/Setup.local +#file path=usr/lib/$(MACH64)/python2.7/config/config.c +#file path=usr/lib/$(MACH64)/python2.7/config/config.c.in +#file path=usr/lib/$(MACH64)/python2.7/config/install-sh mode=0555 +#file path=usr/lib/$(MACH64)/python2.7/config/makesetup mode=0555 +#file path=usr/lib/$(MACH64)/python2.7/config/python.o +file path=usr/lib/libpython2.7.so.1.0 +file path=usr/lib/pkgconfig/python-2.7.pc +file path=usr/lib/python2.7/BaseHTTPServer.py +file path=usr/lib/python2.7/Bastion.py +file path=usr/lib/python2.7/CGIHTTPServer.py +file path=usr/lib/python2.7/ConfigParser.py +file path=usr/lib/python2.7/Cookie.py +file path=usr/lib/python2.7/DocXMLRPCServer.py +file path=usr/lib/python2.7/HTMLParser.py +file path=usr/lib/python2.7/LICENSE.txt +file path=usr/lib/python2.7/MimeWriter.py +file path=usr/lib/python2.7/Queue.py +file path=usr/lib/python2.7/SimpleHTTPServer.py +file path=usr/lib/python2.7/SimpleXMLRPCServer.py +file path=usr/lib/python2.7/SocketServer.py +file path=usr/lib/python2.7/StringIO.py +file path=usr/lib/python2.7/UserDict.py +file path=usr/lib/python2.7/UserList.py +file path=usr/lib/python2.7/UserString.py +file path=usr/lib/python2.7/_LWPCookieJar.py +file path=usr/lib/python2.7/_MozillaCookieJar.py +file path=usr/lib/python2.7/__future__.py +file path=usr/lib/python2.7/__phello__.foo.py +file path=usr/lib/python2.7/_abcoll.py +file path=usr/lib/python2.7/_pyio.py +file path=usr/lib/python2.7/_strptime.py +file path=usr/lib/python2.7/_threading_local.py +file path=usr/lib/python2.7/_weakrefset.py +file path=usr/lib/python2.7/abc.py +file path=usr/lib/python2.7/aifc.py +file path=usr/lib/python2.7/antigravity.py +file path=usr/lib/python2.7/anydbm.py +file path=usr/lib/python2.7/argparse.py +file path=usr/lib/python2.7/ast.py +file path=usr/lib/python2.7/asynchat.py +file path=usr/lib/python2.7/asyncore.py +file path=usr/lib/python2.7/atexit.py +file path=usr/lib/python2.7/audiodev.py +file path=usr/lib/python2.7/base64.py +file path=usr/lib/python2.7/bdb.py +file path=usr/lib/python2.7/binhex.py +file path=usr/lib/python2.7/bisect.py +file path=usr/lib/python2.7/bsddb/__init__.py +file path=usr/lib/python2.7/bsddb/db.py +file path=usr/lib/python2.7/bsddb/dbobj.py +file path=usr/lib/python2.7/bsddb/dbrecio.py +file path=usr/lib/python2.7/bsddb/dbshelve.py +file path=usr/lib/python2.7/bsddb/dbtables.py +file path=usr/lib/python2.7/bsddb/dbutils.py +file path=usr/lib/python2.7/cProfile.py +file path=usr/lib/python2.7/calendar.py +file path=usr/lib/python2.7/cgi.py +file path=usr/lib/python2.7/cgitb.py +file path=usr/lib/python2.7/chunk.py +file path=usr/lib/python2.7/cmd.py +file path=usr/lib/python2.7/code.py +file path=usr/lib/python2.7/codecs.py +file path=usr/lib/python2.7/codeop.py +file path=usr/lib/python2.7/collections.py +file path=usr/lib/python2.7/colorsys.py +file path=usr/lib/python2.7/commands.py +file path=usr/lib/python2.7/compileall.py +file path=usr/lib/python2.7/compiler/__init__.py +file path=usr/lib/python2.7/compiler/ast.py +file path=usr/lib/python2.7/compiler/consts.py +file path=usr/lib/python2.7/compiler/future.py +file path=usr/lib/python2.7/compiler/misc.py +file path=usr/lib/python2.7/compiler/pyassem.py +file path=usr/lib/python2.7/compiler/pycodegen.py +file path=usr/lib/python2.7/compiler/symbols.py +file path=usr/lib/python2.7/compiler/syntax.py +file path=usr/lib/python2.7/compiler/transformer.py +file path=usr/lib/python2.7/compiler/visitor.py +file path=usr/lib/python2.7/config/Makefile +file path=usr/lib/python2.7/config/Setup +file path=usr/lib/python2.7/config/Setup.config +file path=usr/lib/python2.7/config/Setup.local +file path=usr/lib/python2.7/config/config.c +file path=usr/lib/python2.7/config/config.c.in +file path=usr/lib/python2.7/config/install-sh mode=0555 +file path=usr/lib/python2.7/config/makesetup mode=0555 +file path=usr/lib/python2.7/config/python.o +file path=usr/lib/python2.7/contextlib.py +file path=usr/lib/python2.7/cookielib.py +file path=usr/lib/python2.7/copy.py +file path=usr/lib/python2.7/copy_reg.py +file path=usr/lib/python2.7/csv.py +file path=usr/lib/python2.7/ctypes/__init__.py +file path=usr/lib/python2.7/ctypes/_endian.py +file path=usr/lib/python2.7/ctypes/macholib/README.ctypes +file path=usr/lib/python2.7/ctypes/macholib/__init__.py +file path=usr/lib/python2.7/ctypes/macholib/dyld.py +file path=usr/lib/python2.7/ctypes/macholib/dylib.py +file path=usr/lib/python2.7/ctypes/macholib/fetch_macholib mode=0555 +file path=usr/lib/python2.7/ctypes/macholib/fetch_macholib.bat +file path=usr/lib/python2.7/ctypes/macholib/framework.py +file path=usr/lib/python2.7/ctypes/util.py +file path=usr/lib/python2.7/ctypes/wintypes.py +file path=usr/lib/python2.7/curses/__init__.py +file path=usr/lib/python2.7/curses/ascii.py +file path=usr/lib/python2.7/curses/has_key.py +file path=usr/lib/python2.7/curses/panel.py +file path=usr/lib/python2.7/curses/textpad.py +file path=usr/lib/python2.7/curses/wrapper.py +file path=usr/lib/python2.7/dbhash.py +file path=usr/lib/python2.7/decimal.py +file path=usr/lib/python2.7/difflib.py +file path=usr/lib/python2.7/dircache.py +file path=usr/lib/python2.7/dis.py +file path=usr/lib/python2.7/distutils/README +file path=usr/lib/python2.7/distutils/__init__.py +file path=usr/lib/python2.7/distutils/archive_util.py +file path=usr/lib/python2.7/distutils/bcppcompiler.py +file path=usr/lib/python2.7/distutils/ccompiler.py +file path=usr/lib/python2.7/distutils/cmd.py +file path=usr/lib/python2.7/distutils/command/__init__.py +file path=usr/lib/python2.7/distutils/command/bdist.py +file path=usr/lib/python2.7/distutils/command/bdist_dumb.py +file path=usr/lib/python2.7/distutils/command/bdist_msi.py +file path=usr/lib/python2.7/distutils/command/bdist_rpm.py +file path=usr/lib/python2.7/distutils/command/bdist_wininst.py +file path=usr/lib/python2.7/distutils/command/build.py +file path=usr/lib/python2.7/distutils/command/build_clib.py +file path=usr/lib/python2.7/distutils/command/build_ext.py +file path=usr/lib/python2.7/distutils/command/build_py.py +file path=usr/lib/python2.7/distutils/command/build_scripts.py +file path=usr/lib/python2.7/distutils/command/check.py +file path=usr/lib/python2.7/distutils/command/clean.py +file path=usr/lib/python2.7/distutils/command/command_template +file path=usr/lib/python2.7/distutils/command/config.py +file path=usr/lib/python2.7/distutils/command/install.py +file path=usr/lib/python2.7/distutils/command/install_data.py +file path=usr/lib/python2.7/distutils/command/install_egg_info.py +file path=usr/lib/python2.7/distutils/command/install_headers.py +file path=usr/lib/python2.7/distutils/command/install_lib.py +file path=usr/lib/python2.7/distutils/command/install_scripts.py +file path=usr/lib/python2.7/distutils/command/register.py +file path=usr/lib/python2.7/distutils/command/sdist.py +file path=usr/lib/python2.7/distutils/command/upload.py +file path=usr/lib/python2.7/distutils/command/wininst-6.0.exe +file path=usr/lib/python2.7/distutils/command/wininst-7.1.exe +file path=usr/lib/python2.7/distutils/command/wininst-8.0.exe +file path=usr/lib/python2.7/distutils/command/wininst-9.0-amd64.exe +file path=usr/lib/python2.7/distutils/command/wininst-9.0.exe +file path=usr/lib/python2.7/distutils/config.py +file path=usr/lib/python2.7/distutils/core.py +file path=usr/lib/python2.7/distutils/cygwinccompiler.py +file path=usr/lib/python2.7/distutils/debug.py +file path=usr/lib/python2.7/distutils/dep_util.py +file path=usr/lib/python2.7/distutils/dir_util.py +file path=usr/lib/python2.7/distutils/dist.py +file path=usr/lib/python2.7/distutils/emxccompiler.py +file path=usr/lib/python2.7/distutils/errors.py +file path=usr/lib/python2.7/distutils/extension.py +file path=usr/lib/python2.7/distutils/fancy_getopt.py +file path=usr/lib/python2.7/distutils/file_util.py +file path=usr/lib/python2.7/distutils/filelist.py +file path=usr/lib/python2.7/distutils/log.py +file path=usr/lib/python2.7/distutils/msvc9compiler.py +file path=usr/lib/python2.7/distutils/msvccompiler.py +file path=usr/lib/python2.7/distutils/spawn.py +file path=usr/lib/python2.7/distutils/sysconfig.py +file path=usr/lib/python2.7/distutils/text_file.py +file path=usr/lib/python2.7/distutils/unixccompiler.py +file path=usr/lib/python2.7/distutils/util.py +file path=usr/lib/python2.7/distutils/version.py +file path=usr/lib/python2.7/distutils/versionpredicate.py +file path=usr/lib/python2.7/doctest.py +file path=usr/lib/python2.7/dumbdbm.py +file path=usr/lib/python2.7/dummy_thread.py +file path=usr/lib/python2.7/dummy_threading.py +file path=usr/lib/python2.7/email/__init__.py +file path=usr/lib/python2.7/email/_parseaddr.py +file path=usr/lib/python2.7/email/base64mime.py +file path=usr/lib/python2.7/email/charset.py +file path=usr/lib/python2.7/email/encoders.py +file path=usr/lib/python2.7/email/errors.py +file path=usr/lib/python2.7/email/feedparser.py +file path=usr/lib/python2.7/email/generator.py +file path=usr/lib/python2.7/email/header.py +file path=usr/lib/python2.7/email/iterators.py +file path=usr/lib/python2.7/email/message.py +file path=usr/lib/python2.7/email/mime/__init__.py +file path=usr/lib/python2.7/email/mime/application.py +file path=usr/lib/python2.7/email/mime/audio.py +file path=usr/lib/python2.7/email/mime/base.py +file path=usr/lib/python2.7/email/mime/image.py +file path=usr/lib/python2.7/email/mime/message.py +file path=usr/lib/python2.7/email/mime/multipart.py +file path=usr/lib/python2.7/email/mime/nonmultipart.py +file path=usr/lib/python2.7/email/mime/text.py +file path=usr/lib/python2.7/email/parser.py +file path=usr/lib/python2.7/email/quoprimime.py +file path=usr/lib/python2.7/email/utils.py +file path=usr/lib/python2.7/encodings/__init__.py +file path=usr/lib/python2.7/encodings/aliases.py +file path=usr/lib/python2.7/encodings/ascii.py +file path=usr/lib/python2.7/encodings/base64_codec.py +file path=usr/lib/python2.7/encodings/big5.py +file path=usr/lib/python2.7/encodings/big5hkscs.py +file path=usr/lib/python2.7/encodings/bz2_codec.py +file path=usr/lib/python2.7/encodings/charmap.py +file path=usr/lib/python2.7/encodings/cp037.py +file path=usr/lib/python2.7/encodings/cp1006.py +file path=usr/lib/python2.7/encodings/cp1026.py +file path=usr/lib/python2.7/encodings/cp1140.py +file path=usr/lib/python2.7/encodings/cp1250.py +file path=usr/lib/python2.7/encodings/cp1251.py +file path=usr/lib/python2.7/encodings/cp1252.py +file path=usr/lib/python2.7/encodings/cp1253.py +file path=usr/lib/python2.7/encodings/cp1254.py +file path=usr/lib/python2.7/encodings/cp1255.py +file path=usr/lib/python2.7/encodings/cp1256.py +file path=usr/lib/python2.7/encodings/cp1257.py +file path=usr/lib/python2.7/encodings/cp1258.py +file path=usr/lib/python2.7/encodings/cp424.py +file path=usr/lib/python2.7/encodings/cp437.py +file path=usr/lib/python2.7/encodings/cp500.py +file path=usr/lib/python2.7/encodings/cp720.py +file path=usr/lib/python2.7/encodings/cp737.py +file path=usr/lib/python2.7/encodings/cp775.py +file path=usr/lib/python2.7/encodings/cp850.py +file path=usr/lib/python2.7/encodings/cp852.py +file path=usr/lib/python2.7/encodings/cp855.py +file path=usr/lib/python2.7/encodings/cp856.py +file path=usr/lib/python2.7/encodings/cp857.py +file path=usr/lib/python2.7/encodings/cp858.py +file path=usr/lib/python2.7/encodings/cp860.py +file path=usr/lib/python2.7/encodings/cp861.py +file path=usr/lib/python2.7/encodings/cp862.py +file path=usr/lib/python2.7/encodings/cp863.py +file path=usr/lib/python2.7/encodings/cp864.py +file path=usr/lib/python2.7/encodings/cp865.py +file path=usr/lib/python2.7/encodings/cp866.py +file path=usr/lib/python2.7/encodings/cp869.py +file path=usr/lib/python2.7/encodings/cp874.py +file path=usr/lib/python2.7/encodings/cp875.py +file path=usr/lib/python2.7/encodings/cp932.py +file path=usr/lib/python2.7/encodings/cp949.py +file path=usr/lib/python2.7/encodings/cp950.py +file path=usr/lib/python2.7/encodings/euc_jis_2004.py +file path=usr/lib/python2.7/encodings/euc_jisx0213.py +file path=usr/lib/python2.7/encodings/euc_jp.py +file path=usr/lib/python2.7/encodings/euc_kr.py +file path=usr/lib/python2.7/encodings/gb18030.py +file path=usr/lib/python2.7/encodings/gb2312.py +file path=usr/lib/python2.7/encodings/gbk.py +file path=usr/lib/python2.7/encodings/hex_codec.py +file path=usr/lib/python2.7/encodings/hp_roman8.py +file path=usr/lib/python2.7/encodings/hz.py +file path=usr/lib/python2.7/encodings/idna.py +file path=usr/lib/python2.7/encodings/iso2022_jp.py +file path=usr/lib/python2.7/encodings/iso2022_jp_1.py +file path=usr/lib/python2.7/encodings/iso2022_jp_2.py +file path=usr/lib/python2.7/encodings/iso2022_jp_2004.py +file path=usr/lib/python2.7/encodings/iso2022_jp_3.py +file path=usr/lib/python2.7/encodings/iso2022_jp_ext.py +file path=usr/lib/python2.7/encodings/iso2022_kr.py +file path=usr/lib/python2.7/encodings/iso8859_1.py +file path=usr/lib/python2.7/encodings/iso8859_10.py +file path=usr/lib/python2.7/encodings/iso8859_11.py +file path=usr/lib/python2.7/encodings/iso8859_13.py +file path=usr/lib/python2.7/encodings/iso8859_14.py +file path=usr/lib/python2.7/encodings/iso8859_15.py +file path=usr/lib/python2.7/encodings/iso8859_16.py +file path=usr/lib/python2.7/encodings/iso8859_2.py +file path=usr/lib/python2.7/encodings/iso8859_3.py +file path=usr/lib/python2.7/encodings/iso8859_4.py +file path=usr/lib/python2.7/encodings/iso8859_5.py +file path=usr/lib/python2.7/encodings/iso8859_6.py +file path=usr/lib/python2.7/encodings/iso8859_7.py +file path=usr/lib/python2.7/encodings/iso8859_8.py +file path=usr/lib/python2.7/encodings/iso8859_9.py +file path=usr/lib/python2.7/encodings/johab.py +file path=usr/lib/python2.7/encodings/koi8_r.py +file path=usr/lib/python2.7/encodings/koi8_u.py +file path=usr/lib/python2.7/encodings/latin_1.py +file path=usr/lib/python2.7/encodings/mac_arabic.py +file path=usr/lib/python2.7/encodings/mac_centeuro.py +file path=usr/lib/python2.7/encodings/mac_croatian.py +file path=usr/lib/python2.7/encodings/mac_cyrillic.py +file path=usr/lib/python2.7/encodings/mac_farsi.py +file path=usr/lib/python2.7/encodings/mac_greek.py +file path=usr/lib/python2.7/encodings/mac_iceland.py +file path=usr/lib/python2.7/encodings/mac_latin2.py +file path=usr/lib/python2.7/encodings/mac_roman.py +file path=usr/lib/python2.7/encodings/mac_romanian.py +file path=usr/lib/python2.7/encodings/mac_turkish.py +file path=usr/lib/python2.7/encodings/mbcs.py +file path=usr/lib/python2.7/encodings/palmos.py +file path=usr/lib/python2.7/encodings/ptcp154.py +file path=usr/lib/python2.7/encodings/punycode.py +file path=usr/lib/python2.7/encodings/quopri_codec.py +file path=usr/lib/python2.7/encodings/raw_unicode_escape.py +file path=usr/lib/python2.7/encodings/rot_13.py +file path=usr/lib/python2.7/encodings/shift_jis.py +file path=usr/lib/python2.7/encodings/shift_jis_2004.py +file path=usr/lib/python2.7/encodings/shift_jisx0213.py +file path=usr/lib/python2.7/encodings/string_escape.py +file path=usr/lib/python2.7/encodings/tis_620.py +file path=usr/lib/python2.7/encodings/undefined.py +file path=usr/lib/python2.7/encodings/unicode_escape.py +file path=usr/lib/python2.7/encodings/unicode_internal.py +file path=usr/lib/python2.7/encodings/utf_16.py +file path=usr/lib/python2.7/encodings/utf_16_be.py +file path=usr/lib/python2.7/encodings/utf_16_le.py +file path=usr/lib/python2.7/encodings/utf_32.py +file path=usr/lib/python2.7/encodings/utf_32_be.py +file path=usr/lib/python2.7/encodings/utf_32_le.py +file path=usr/lib/python2.7/encodings/utf_7.py +file path=usr/lib/python2.7/encodings/utf_8.py +file path=usr/lib/python2.7/encodings/utf_8_sig.py +file path=usr/lib/python2.7/encodings/uu_codec.py +file path=usr/lib/python2.7/encodings/zlib_codec.py +file path=usr/lib/python2.7/filecmp.py +file path=usr/lib/python2.7/fileinput.py +file path=usr/lib/python2.7/fnmatch.py +file path=usr/lib/python2.7/formatter.py +file path=usr/lib/python2.7/fpformat.py +file path=usr/lib/python2.7/fractions.py +file path=usr/lib/python2.7/ftplib.py +file path=usr/lib/python2.7/functools.py +file path=usr/lib/python2.7/genericpath.py +file path=usr/lib/python2.7/getopt.py +file path=usr/lib/python2.7/getpass.py +file path=usr/lib/python2.7/gettext.py +file path=usr/lib/python2.7/glob.py +file path=usr/lib/python2.7/gzip.py +file path=usr/lib/python2.7/hashlib.py +file path=usr/lib/python2.7/heapq.py +file path=usr/lib/python2.7/hmac.py +file path=usr/lib/python2.7/hotshot/__init__.py +file path=usr/lib/python2.7/hotshot/log.py +file path=usr/lib/python2.7/hotshot/stats.py +file path=usr/lib/python2.7/hotshot/stones.py +file path=usr/lib/python2.7/htmlentitydefs.py +file path=usr/lib/python2.7/htmllib.py +file path=usr/lib/python2.7/httplib.py +file path=usr/lib/python2.7/idlelib/AutoComplete.py +file path=usr/lib/python2.7/idlelib/AutoCompleteWindow.py +file path=usr/lib/python2.7/idlelib/AutoExpand.py +file path=usr/lib/python2.7/idlelib/Bindings.py +file path=usr/lib/python2.7/idlelib/CREDITS.txt +file path=usr/lib/python2.7/idlelib/CallTipWindow.py +file path=usr/lib/python2.7/idlelib/CallTips.py +file path=usr/lib/python2.7/idlelib/ChangeLog +file path=usr/lib/python2.7/idlelib/ClassBrowser.py +file path=usr/lib/python2.7/idlelib/CodeContext.py +file path=usr/lib/python2.7/idlelib/ColorDelegator.py +file path=usr/lib/python2.7/idlelib/Debugger.py +file path=usr/lib/python2.7/idlelib/Delegator.py +file path=usr/lib/python2.7/idlelib/EditorWindow.py +file path=usr/lib/python2.7/idlelib/FileList.py +file path=usr/lib/python2.7/idlelib/FormatParagraph.py +file path=usr/lib/python2.7/idlelib/GrepDialog.py +file path=usr/lib/python2.7/idlelib/HISTORY.txt +file path=usr/lib/python2.7/idlelib/HyperParser.py +file path=usr/lib/python2.7/idlelib/IOBinding.py +file path=usr/lib/python2.7/idlelib/Icons/folder.gif +file path=usr/lib/python2.7/idlelib/Icons/idle.icns +file path=usr/lib/python2.7/idlelib/Icons/minusnode.gif +file path=usr/lib/python2.7/idlelib/Icons/openfolder.gif +file path=usr/lib/python2.7/idlelib/Icons/plusnode.gif +file path=usr/lib/python2.7/idlelib/Icons/python.gif +file path=usr/lib/python2.7/idlelib/Icons/tk.gif +file path=usr/lib/python2.7/idlelib/IdleHistory.py +file path=usr/lib/python2.7/idlelib/MultiCall.py +file path=usr/lib/python2.7/idlelib/MultiStatusBar.py +file path=usr/lib/python2.7/idlelib/NEWS.txt +file path=usr/lib/python2.7/idlelib/ObjectBrowser.py +file path=usr/lib/python2.7/idlelib/OutputWindow.py +file path=usr/lib/python2.7/idlelib/ParenMatch.py +file path=usr/lib/python2.7/idlelib/PathBrowser.py +file path=usr/lib/python2.7/idlelib/Percolator.py +file path=usr/lib/python2.7/idlelib/PyParse.py +file path=usr/lib/python2.7/idlelib/PyShell.py +file path=usr/lib/python2.7/idlelib/README.txt +file path=usr/lib/python2.7/idlelib/RemoteDebugger.py +file path=usr/lib/python2.7/idlelib/RemoteObjectBrowser.py +file path=usr/lib/python2.7/idlelib/ReplaceDialog.py +file path=usr/lib/python2.7/idlelib/RstripExtension.py +file path=usr/lib/python2.7/idlelib/ScriptBinding.py +file path=usr/lib/python2.7/idlelib/ScrolledList.py +file path=usr/lib/python2.7/idlelib/SearchDialog.py +file path=usr/lib/python2.7/idlelib/SearchDialogBase.py +file path=usr/lib/python2.7/idlelib/SearchEngine.py +file path=usr/lib/python2.7/idlelib/StackViewer.py +file path=usr/lib/python2.7/idlelib/TODO.txt +file path=usr/lib/python2.7/idlelib/ToolTip.py +file path=usr/lib/python2.7/idlelib/TreeWidget.py +file path=usr/lib/python2.7/idlelib/UndoDelegator.py +file path=usr/lib/python2.7/idlelib/WidgetRedirector.py +file path=usr/lib/python2.7/idlelib/WindowList.py +file path=usr/lib/python2.7/idlelib/ZoomHeight.py +file path=usr/lib/python2.7/idlelib/__init__.py +file path=usr/lib/python2.7/idlelib/aboutDialog.py +file path=usr/lib/python2.7/idlelib/config-extensions.def +file path=usr/lib/python2.7/idlelib/config-highlight.def +file path=usr/lib/python2.7/idlelib/config-keys.def +file path=usr/lib/python2.7/idlelib/config-main.def +file path=usr/lib/python2.7/idlelib/configDialog.py +file path=usr/lib/python2.7/idlelib/configHandler.py +file path=usr/lib/python2.7/idlelib/configHelpSourceEdit.py +file path=usr/lib/python2.7/idlelib/configSectionNameDialog.py +file path=usr/lib/python2.7/idlelib/dynOptionMenuWidget.py +file path=usr/lib/python2.7/idlelib/extend.txt +file path=usr/lib/python2.7/idlelib/help.txt +file path=usr/lib/python2.7/idlelib/idle.bat mode=0555 +file path=usr/lib/python2.7/idlelib/idle.py +file path=usr/lib/python2.7/idlelib/idle.pyw +file path=usr/lib/python2.7/idlelib/idlever.py +file path=usr/lib/python2.7/idlelib/keybindingDialog.py +file path=usr/lib/python2.7/idlelib/macosxSupport.py +file path=usr/lib/python2.7/idlelib/rpc.py +file path=usr/lib/python2.7/idlelib/run.py +file path=usr/lib/python2.7/idlelib/tabbedpages.py +file path=usr/lib/python2.7/idlelib/textView.py +file path=usr/lib/python2.7/ihooks.py +file path=usr/lib/python2.7/imaplib.py +file path=usr/lib/python2.7/imghdr.py +file path=usr/lib/python2.7/importlib/__init__.py +file path=usr/lib/python2.7/imputil.py +file path=usr/lib/python2.7/inspect.py +file path=usr/lib/python2.7/io.py +file path=usr/lib/python2.7/json/__init__.py +file path=usr/lib/python2.7/json/decoder.py +file path=usr/lib/python2.7/json/encoder.py +file path=usr/lib/python2.7/json/scanner.py +file path=usr/lib/python2.7/json/tool.py +file path=usr/lib/python2.7/keyword.py +file path=usr/lib/python2.7/lib-dynload/Python-2.7.1-py2.7.egg-info +file path=usr/lib/python2.7/lib-dynload/64/_bisect.so +file path=usr/lib/python2.7/lib-dynload/64/_codecs_cn.so +file path=usr/lib/python2.7/lib-dynload/64/_codecs_hk.so +file path=usr/lib/python2.7/lib-dynload/64/_codecs_iso2022.so +file path=usr/lib/python2.7/lib-dynload/64/_codecs_jp.so +file path=usr/lib/python2.7/lib-dynload/64/_codecs_kr.so +file path=usr/lib/python2.7/lib-dynload/64/_codecs_tw.so +file path=usr/lib/python2.7/lib-dynload/64/_collections.so +file path=usr/lib/python2.7/lib-dynload/64/_csv.so +file path=usr/lib/python2.7/lib-dynload/64/_ctypes.so +file path=usr/lib/python2.7/lib-dynload/64/_curses.so +file path=usr/lib/python2.7/lib-dynload/64/_curses_panel.so +file path=usr/lib/python2.7/lib-dynload/64/_elementtree.so +file path=usr/lib/python2.7/lib-dynload/64/_functools.so +file path=usr/lib/python2.7/lib-dynload/64/_hashlib.so +file path=usr/lib/python2.7/lib-dynload/64/_heapq.so +file path=usr/lib/python2.7/lib-dynload/64/_hotshot.so +file path=usr/lib/python2.7/lib-dynload/64/_io.so +file path=usr/lib/python2.7/lib-dynload/64/_json.so +file path=usr/lib/python2.7/lib-dynload/64/_locale.so +file path=usr/lib/python2.7/lib-dynload/64/_lsprof.so +file path=usr/lib/python2.7/lib-dynload/64/_multibytecodec.so +file path=usr/lib/python2.7/lib-dynload/64/_multiprocessing.so +file path=usr/lib/python2.7/lib-dynload/64/_random.so +file path=usr/lib/python2.7/lib-dynload/64/_socket.so +file path=usr/lib/python2.7/lib-dynload/64/_sqlite3.so +file path=usr/lib/python2.7/lib-dynload/64/_ssl.so +file path=usr/lib/python2.7/lib-dynload/64/_struct.so +file path=usr/lib/python2.7/lib-dynload/64/array.so +file path=usr/lib/python2.7/lib-dynload/64/audioop.so +file path=usr/lib/python2.7/lib-dynload/64/binascii.so +file path=usr/lib/python2.7/lib-dynload/64/bz2.so +file path=usr/lib/python2.7/lib-dynload/64/cPickle.so +file path=usr/lib/python2.7/lib-dynload/64/cStringIO.so +file path=usr/lib/python2.7/lib-dynload/64/cmath.so +file path=usr/lib/python2.7/lib-dynload/64/crypt.so +file path=usr/lib/python2.7/lib-dynload/64/datetime.so +file path=usr/lib/python2.7/lib-dynload/64/dbm.so +file path=usr/lib/python2.7/lib-dynload/64/dlpi.so +file path=usr/lib/python2.7/lib-dynload/64/fcntl.so +file path=usr/lib/python2.7/lib-dynload/64/future_builtins.so +file path=usr/lib/python2.7/lib-dynload/64/gdbm.so +file path=usr/lib/python2.7/lib-dynload/64/grp.so +file path=usr/lib/python2.7/lib-dynload/64/itertools.so +file path=usr/lib/python2.7/lib-dynload/64/math.so +file path=usr/lib/python2.7/lib-dynload/64/mmap.so +file path=usr/lib/python2.7/lib-dynload/64/nis.so +file path=usr/lib/python2.7/lib-dynload/64/operator.so +file path=usr/lib/python2.7/lib-dynload/64/parser.so +file path=usr/lib/python2.7/lib-dynload/64/privileges.so +file path=usr/lib/python2.7/lib-dynload/64/pyexpat.so +file path=usr/lib/python2.7/lib-dynload/64/rbac.so +file path=usr/lib/python2.7/lib-dynload/64/readline.so +file path=usr/lib/python2.7/lib-dynload/64/resource.so +file path=usr/lib/python2.7/lib-dynload/64/select.so +file path=usr/lib/python2.7/lib-dynload/64/spwd.so +file path=usr/lib/python2.7/lib-dynload/64/strop.so +file path=usr/lib/python2.7/lib-dynload/64/sunaudiodev.so +file path=usr/lib/python2.7/lib-dynload/64/syslog.so +file path=usr/lib/python2.7/lib-dynload/64/termios.so +file path=usr/lib/python2.7/lib-dynload/64/time.so +file path=usr/lib/python2.7/lib-dynload/64/ucred.so +file path=usr/lib/python2.7/lib-dynload/64/unicodedata.so +file path=usr/lib/python2.7/lib-dynload/64/zlib.so +file path=usr/lib/python2.7/lib-dynload/_bisect.so +file path=usr/lib/python2.7/lib-dynload/_codecs_cn.so +file path=usr/lib/python2.7/lib-dynload/_codecs_hk.so +file path=usr/lib/python2.7/lib-dynload/_codecs_iso2022.so +file path=usr/lib/python2.7/lib-dynload/_codecs_jp.so +file path=usr/lib/python2.7/lib-dynload/_codecs_kr.so +file path=usr/lib/python2.7/lib-dynload/_codecs_tw.so +file path=usr/lib/python2.7/lib-dynload/_collections.so +file path=usr/lib/python2.7/lib-dynload/_csv.so +file path=usr/lib/python2.7/lib-dynload/_ctypes.so +file path=usr/lib/python2.7/lib-dynload/_curses.so +file path=usr/lib/python2.7/lib-dynload/_curses_panel.so +file path=usr/lib/python2.7/lib-dynload/_elementtree.so +file path=usr/lib/python2.7/lib-dynload/_functools.so +file path=usr/lib/python2.7/lib-dynload/_hashlib.so +file path=usr/lib/python2.7/lib-dynload/_heapq.so +file path=usr/lib/python2.7/lib-dynload/_hotshot.so +file path=usr/lib/python2.7/lib-dynload/_io.so +file path=usr/lib/python2.7/lib-dynload/_json.so +file path=usr/lib/python2.7/lib-dynload/_locale.so +file path=usr/lib/python2.7/lib-dynload/_lsprof.so +file path=usr/lib/python2.7/lib-dynload/_multibytecodec.so +file path=usr/lib/python2.7/lib-dynload/_multiprocessing.so +file path=usr/lib/python2.7/lib-dynload/_random.so +file path=usr/lib/python2.7/lib-dynload/_socket.so +file path=usr/lib/python2.7/lib-dynload/_sqlite3.so +file path=usr/lib/python2.7/lib-dynload/_ssl.so +file path=usr/lib/python2.7/lib-dynload/_struct.so +file path=usr/lib/python2.7/lib-dynload/array.so +file path=usr/lib/python2.7/lib-dynload/audioop.so +file path=usr/lib/python2.7/lib-dynload/binascii.so +file path=usr/lib/python2.7/lib-dynload/bz2.so +file path=usr/lib/python2.7/lib-dynload/cPickle.so +file path=usr/lib/python2.7/lib-dynload/cStringIO.so +file path=usr/lib/python2.7/lib-dynload/cmath.so +file path=usr/lib/python2.7/lib-dynload/crypt.so +file path=usr/lib/python2.7/lib-dynload/datetime.so +file path=usr/lib/python2.7/lib-dynload/dbm.so +file path=usr/lib/python2.7/lib-dynload/dl.so +file path=usr/lib/python2.7/lib-dynload/dlpi.so +file path=usr/lib/python2.7/lib-dynload/fcntl.so +file path=usr/lib/python2.7/lib-dynload/future_builtins.so +file path=usr/lib/python2.7/lib-dynload/gdbm.so +file path=usr/lib/python2.7/lib-dynload/grp.so +file path=usr/lib/python2.7/lib-dynload/imageop.so +file path=usr/lib/python2.7/lib-dynload/itertools.so +file path=usr/lib/python2.7/lib-dynload/math.so +file path=usr/lib/python2.7/lib-dynload/mmap.so +file path=usr/lib/python2.7/lib-dynload/nis.so +file path=usr/lib/python2.7/lib-dynload/operator.so +file path=usr/lib/python2.7/lib-dynload/parser.so +file path=usr/lib/python2.7/lib-dynload/privileges.so +file path=usr/lib/python2.7/lib-dynload/pyexpat.so +file path=usr/lib/python2.7/lib-dynload/rbac.so +file path=usr/lib/python2.7/lib-dynload/readline.so +file path=usr/lib/python2.7/lib-dynload/resource.so +file path=usr/lib/python2.7/lib-dynload/select.so +file path=usr/lib/python2.7/lib-dynload/spwd.so +file path=usr/lib/python2.7/lib-dynload/strop.so +file path=usr/lib/python2.7/lib-dynload/sunaudiodev.so +file path=usr/lib/python2.7/lib-dynload/syslog.so +file path=usr/lib/python2.7/lib-dynload/termios.so +file path=usr/lib/python2.7/lib-dynload/time.so +file path=usr/lib/python2.7/lib-dynload/ucred.so +file path=usr/lib/python2.7/lib-dynload/unicodedata.so +file path=usr/lib/python2.7/lib-dynload/zlib.so +file path=usr/lib/python2.7/lib2to3/Grammar.txt +file path=usr/lib/python2.7/lib2to3/Grammar2.7.1.final.0.pickle +file path=usr/lib/python2.7/lib2to3/PatternGrammar.txt +file path=usr/lib/python2.7/lib2to3/PatternGrammar2.7.1.final.0.pickle +file path=usr/lib/python2.7/lib2to3/__init__.py +file path=usr/lib/python2.7/lib2to3/btm_matcher.py +file path=usr/lib/python2.7/lib2to3/btm_utils.py +file path=usr/lib/python2.7/lib2to3/fixer_base.py +file path=usr/lib/python2.7/lib2to3/fixer_util.py +file path=usr/lib/python2.7/lib2to3/fixes/__init__.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_apply.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_basestring.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_buffer.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_callable.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_dict.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_except.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_exec.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_execfile.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_exitfunc.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_filter.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_funcattrs.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_future.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_getcwdu.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_has_key.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_idioms.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_import.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_imports.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_imports2.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_input.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_intern.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_isinstance.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_itertools.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_itertools_imports.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_long.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_map.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_metaclass.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_methodattrs.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_ne.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_next.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_nonzero.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_numliterals.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_operator.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_paren.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_print.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_raise.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_raw_input.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_reduce.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_renames.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_repr.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_set_literal.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_standarderror.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_sys_exc.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_throw.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_tuple_params.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_types.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_unicode.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_urllib.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_ws_comma.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_xrange.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_xreadlines.py +file path=usr/lib/python2.7/lib2to3/fixes/fix_zip.py +file path=usr/lib/python2.7/lib2to3/main.py +file path=usr/lib/python2.7/lib2to3/patcomp.py +file path=usr/lib/python2.7/lib2to3/pgen2/__init__.py +file path=usr/lib/python2.7/lib2to3/pgen2/conv.py +file path=usr/lib/python2.7/lib2to3/pgen2/driver.py +file path=usr/lib/python2.7/lib2to3/pgen2/grammar.py +file path=usr/lib/python2.7/lib2to3/pgen2/literals.py +file path=usr/lib/python2.7/lib2to3/pgen2/parse.py +file path=usr/lib/python2.7/lib2to3/pgen2/pgen.py +file path=usr/lib/python2.7/lib2to3/pgen2/token.py +file path=usr/lib/python2.7/lib2to3/pgen2/tokenize.py +file path=usr/lib/python2.7/lib2to3/pygram.py +file path=usr/lib/python2.7/lib2to3/pytree.py +file path=usr/lib/python2.7/lib2to3/refactor.py +file path=usr/lib/python2.7/linecache.py +file path=usr/lib/python2.7/locale.py +file path=usr/lib/python2.7/logging/__init__.py +file path=usr/lib/python2.7/logging/config.py +file path=usr/lib/python2.7/logging/handlers.py +file path=usr/lib/python2.7/macpath.py +file path=usr/lib/python2.7/macurl2path.py +file path=usr/lib/python2.7/mailbox.py +file path=usr/lib/python2.7/mailcap.py +file path=usr/lib/python2.7/markupbase.py +file path=usr/lib/python2.7/md5.py +file path=usr/lib/python2.7/mhlib.py +file path=usr/lib/python2.7/mimetools.py +file path=usr/lib/python2.7/mimetypes.py +file path=usr/lib/python2.7/mimify.py +file path=usr/lib/python2.7/modulefinder.py +file path=usr/lib/python2.7/multifile.py +file path=usr/lib/python2.7/multiprocessing/__init__.py +file path=usr/lib/python2.7/multiprocessing/connection.py +file path=usr/lib/python2.7/multiprocessing/dummy/__init__.py +file path=usr/lib/python2.7/multiprocessing/dummy/connection.py +file path=usr/lib/python2.7/multiprocessing/forking.py +file path=usr/lib/python2.7/multiprocessing/heap.py +file path=usr/lib/python2.7/multiprocessing/managers.py +file path=usr/lib/python2.7/multiprocessing/pool.py +file path=usr/lib/python2.7/multiprocessing/process.py +file path=usr/lib/python2.7/multiprocessing/queues.py +file path=usr/lib/python2.7/multiprocessing/reduction.py +file path=usr/lib/python2.7/multiprocessing/sharedctypes.py +file path=usr/lib/python2.7/multiprocessing/synchronize.py +file path=usr/lib/python2.7/multiprocessing/util.py +file path=usr/lib/python2.7/mutex.py +file path=usr/lib/python2.7/netrc.py +file path=usr/lib/python2.7/new.py +file path=usr/lib/python2.7/nntplib.py +file path=usr/lib/python2.7/ntpath.py +file path=usr/lib/python2.7/nturl2path.py +file path=usr/lib/python2.7/numbers.py +file path=usr/lib/python2.7/opcode.py +file path=usr/lib/python2.7/optparse.py +file path=usr/lib/python2.7/os.py +file path=usr/lib/python2.7/os2emxpath.py +file path=usr/lib/python2.7/pdb.doc +file path=usr/lib/python2.7/pdb.py +file path=usr/lib/python2.7/pickle.py +file path=usr/lib/python2.7/pickletools.py +file path=usr/lib/python2.7/pipes.py +file path=usr/lib/python2.7/pkgutil.py +file path=usr/lib/python2.7/plat-sunos5/CDIO.py +file path=usr/lib/python2.7/plat-sunos5/DLFCN.py +file path=usr/lib/python2.7/plat-sunos5/IN.py +file path=usr/lib/python2.7/plat-sunos5/STROPTS.py +file path=usr/lib/python2.7/plat-sunos5/SUNAUDIODEV.py +file path=usr/lib/python2.7/plat-sunos5/TYPES.py +file path=usr/lib/python2.7/plat-sunos5/regen mode=0555 +file path=usr/lib/python2.7/platform.py +file path=usr/lib/python2.7/plistlib.py +file path=usr/lib/python2.7/popen2.py +file path=usr/lib/python2.7/poplib.py +file path=usr/lib/python2.7/posixfile.py +file path=usr/lib/python2.7/posixpath.py +file path=usr/lib/python2.7/pprint.py +file path=usr/lib/python2.7/profile.py +file path=usr/lib/python2.7/pstats.py +file path=usr/lib/python2.7/pty.py +file path=usr/lib/python2.7/py_compile.py +file path=usr/lib/python2.7/pyclbr.py +file path=usr/lib/python2.7/pydoc.py +file path=usr/lib/python2.7/pydoc_data/__init__.py +file path=usr/lib/python2.7/pydoc_data/topics.py +file path=usr/lib/python2.7/quopri.py +file path=usr/lib/python2.7/random.py +file path=usr/lib/python2.7/re.py +file path=usr/lib/python2.7/repr.py +file path=usr/lib/python2.7/rexec.py +file path=usr/lib/python2.7/rfc822.py +file path=usr/lib/python2.7/rlcompleter.py +file path=usr/lib/python2.7/robotparser.py +file path=usr/lib/python2.7/runpy.py +file path=usr/lib/python2.7/sched.py +file path=usr/lib/python2.7/sets.py +file path=usr/lib/python2.7/sgmllib.py +file path=usr/lib/python2.7/sha.py +file path=usr/lib/python2.7/shelve.py +file path=usr/lib/python2.7/shlex.py +file path=usr/lib/python2.7/shutil.py +file path=usr/lib/python2.7/site-packages/README +file path=usr/lib/python2.7/site-packages/vendor-packages.pth +file path=usr/lib/python2.7/site.py +file path=usr/lib/python2.7/smtpd.py +file path=usr/lib/python2.7/smtplib.py +file path=usr/lib/python2.7/sndhdr.py +file path=usr/lib/python2.7/socket.py +file path=usr/lib/python2.7/sqlite3/__init__.py +file path=usr/lib/python2.7/sqlite3/dbapi2.py +file path=usr/lib/python2.7/sqlite3/dump.py +file path=usr/lib/python2.7/sre.py +file path=usr/lib/python2.7/sre_compile.py +file path=usr/lib/python2.7/sre_constants.py +file path=usr/lib/python2.7/sre_parse.py +file path=usr/lib/python2.7/ssl.py +file path=usr/lib/python2.7/stat.py +file path=usr/lib/python2.7/statvfs.py +file path=usr/lib/python2.7/string.py +file path=usr/lib/python2.7/stringold.py +file path=usr/lib/python2.7/stringprep.py +file path=usr/lib/python2.7/struct.py +file path=usr/lib/python2.7/subprocess.py +file path=usr/lib/python2.7/sunau.py +file path=usr/lib/python2.7/sunaudio.py +file path=usr/lib/python2.7/symbol.py +file path=usr/lib/python2.7/symtable.py +file path=usr/lib/python2.7/sysconfig.py +file path=usr/lib/python2.7/tabnanny.py +file path=usr/lib/python2.7/tarfile.py +file path=usr/lib/python2.7/telnetlib.py +file path=usr/lib/python2.7/tempfile.py +file path=usr/lib/python2.7/textwrap.py +file path=usr/lib/python2.7/this.py +file path=usr/lib/python2.7/threading.py +file path=usr/lib/python2.7/timeit.py +file path=usr/lib/python2.7/toaiff.py +file path=usr/lib/python2.7/token.py +file path=usr/lib/python2.7/tokenize.py +file path=usr/lib/python2.7/trace.py +file path=usr/lib/python2.7/traceback.py +file path=usr/lib/python2.7/tty.py +file path=usr/lib/python2.7/types.py +file path=usr/lib/python2.7/unittest/__init__.py +file path=usr/lib/python2.7/unittest/__main__.py +file path=usr/lib/python2.7/unittest/case.py +file path=usr/lib/python2.7/unittest/loader.py +file path=usr/lib/python2.7/unittest/main.py +file path=usr/lib/python2.7/unittest/result.py +file path=usr/lib/python2.7/unittest/runner.py +file path=usr/lib/python2.7/unittest/signals.py +file path=usr/lib/python2.7/unittest/suite.py +file path=usr/lib/python2.7/unittest/test/__init__.py +file path=usr/lib/python2.7/unittest/test/dummy.py +file path=usr/lib/python2.7/unittest/test/support.py +file path=usr/lib/python2.7/unittest/test/test_assertions.py +file path=usr/lib/python2.7/unittest/test/test_break.py +file path=usr/lib/python2.7/unittest/test/test_case.py +file path=usr/lib/python2.7/unittest/test/test_discovery.py +file path=usr/lib/python2.7/unittest/test/test_functiontestcase.py +file path=usr/lib/python2.7/unittest/test/test_loader.py +file path=usr/lib/python2.7/unittest/test/test_program.py +file path=usr/lib/python2.7/unittest/test/test_result.py +file path=usr/lib/python2.7/unittest/test/test_runner.py +file path=usr/lib/python2.7/unittest/test/test_setups.py +file path=usr/lib/python2.7/unittest/test/test_skipping.py +file path=usr/lib/python2.7/unittest/test/test_suite.py +file path=usr/lib/python2.7/unittest/util.py +file path=usr/lib/python2.7/urllib.py +file path=usr/lib/python2.7/urllib2.py +file path=usr/lib/python2.7/urlparse.py +file path=usr/lib/python2.7/user.py +file path=usr/lib/python2.7/uu.py +file path=usr/lib/python2.7/uuid.py +file path=usr/lib/python2.7/warnings.py +file path=usr/lib/python2.7/wave.py +file path=usr/lib/python2.7/weakref.py +file path=usr/lib/python2.7/webbrowser.py +file path=usr/lib/python2.7/whichdb.py +file path=usr/lib/python2.7/wsgiref.egg-info +file path=usr/lib/python2.7/wsgiref/__init__.py +file path=usr/lib/python2.7/wsgiref/handlers.py +file path=usr/lib/python2.7/wsgiref/headers.py +file path=usr/lib/python2.7/wsgiref/simple_server.py +file path=usr/lib/python2.7/wsgiref/util.py +file path=usr/lib/python2.7/wsgiref/validate.py +file path=usr/lib/python2.7/xdrlib.py +file path=usr/lib/python2.7/xml/__init__.py +file path=usr/lib/python2.7/xml/dom/NodeFilter.py +file path=usr/lib/python2.7/xml/dom/__init__.py +file path=usr/lib/python2.7/xml/dom/domreg.py +file path=usr/lib/python2.7/xml/dom/expatbuilder.py +file path=usr/lib/python2.7/xml/dom/minicompat.py +file path=usr/lib/python2.7/xml/dom/minidom.py +file path=usr/lib/python2.7/xml/dom/pulldom.py +file path=usr/lib/python2.7/xml/dom/xmlbuilder.py +file path=usr/lib/python2.7/xml/etree/ElementInclude.py +file path=usr/lib/python2.7/xml/etree/ElementPath.py +file path=usr/lib/python2.7/xml/etree/ElementTree.py +file path=usr/lib/python2.7/xml/etree/__init__.py +file path=usr/lib/python2.7/xml/etree/cElementTree.py +file path=usr/lib/python2.7/xml/parsers/__init__.py +file path=usr/lib/python2.7/xml/parsers/expat.py +file path=usr/lib/python2.7/xml/sax/__init__.py +file path=usr/lib/python2.7/xml/sax/_exceptions.py +file path=usr/lib/python2.7/xml/sax/expatreader.py +file path=usr/lib/python2.7/xml/sax/handler.py +file path=usr/lib/python2.7/xml/sax/saxutils.py +file path=usr/lib/python2.7/xml/sax/xmlreader.py +file path=usr/lib/python2.7/xmllib.py +file path=usr/lib/python2.7/xmlrpclib.py +file path=usr/lib/python2.7/zipfile.py +file path=usr/share/man/man1/python2.7.1 + +hardlink path=usr/bin/isapython2.7 target=../lib/isaexec + +# commented out until 2.7 is the default +#link path=usr/bin/$(MACH64)/python-config target=python2.7-config +#link path=usr/bin/python-config target=python2.7-config +#link path=usr/lib/$(MACH64)/pkgconfig/python.pc target=python-2.7.pc +#link path=usr/lib/pkgconfig/python.pc target=python-2.7.pc +link path=usr/bin/$(MACH32)/python2.7 target=isapython2.7 +link path=usr/bin/$(MACH64)/python2.7 target=isapython2.7 +link path=usr/bin/python2.7 target=$(MACH32)/isapython2.7 +link path=usr/lib/$(MACH64)/libpython2.7.so target=libpython2.7.so.1.0 +link path=usr/lib/libpython2.7.so target=libpython2.7.so.1.0 + +# This optionally brings in the python tk support if tk is installed +depend type=conditional fmri=library/python-2/tkinter-27 predicate=runtime/tk-8 + diff -r aa27b836c528 -r 2edc011b559e components/python/python27/python27.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/python27.license Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,956 @@ +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations (now Zope +Corporation, see http://www.zope.com). In 2001, the Python Software +Foundation (PSF, see http://www.python.org/psf/) was formed, a +non-profit organization created specifically to own Python-related +Intellectual Property. Zope Corporation is a sponsoring member of +the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.2 2.1.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2.1 2.2 2002 PSF yes + 2.2.2 2.2.1 2002 PSF yes + 2.2.3 2.2.2 2003 PSF yes + 2.3 2.2.2 2002-2003 PSF yes + 2.3.1 2.3 2002-2003 PSF yes + 2.3.2 2.3.1 2002-2003 PSF yes + 2.3.3 2.3.2 2002-2003 PSF yes + 2.3.4 2.3.3 2004 PSF yes + 2.3.5 2.3.4 2005 PSF yes + 2.4 2.3 2004 PSF yes + 2.4.1 2.4 2005 PSF yes + 2.4.2 2.4.1 2005 PSF yes + 2.4.3 2.4.2 2006 PSF yes + 2.4.4 2.4.3 2006 PSF yes + 2.5 2.4 2006 PSF yes + 2.5.1 2.5 2007 PSF yes + 2.5.2 2.5.1 2008 PSF yes + 2.5.3 2.5.2 2008 PSF yes + 2.6 2.5 2008 PSF yes + 2.6.1 2.6 2008 PSF yes + 2.6.2 2.6.1 2009 PSF yes + 2.6.3 2.6.2 2009 PSF yes + 2.6.4 2.6.3 2009 PSF yes + 2.6.5 2.6.4 2010 PSF yes + 2.7 2.6 2010 PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +Python Software Foundation; All Rights Reserved" are retained in Python alone or +in any derivative version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +Licenses and Acknowledgements for Incorporated Software +======================================================= + +This section is an incomplete, but growing list of licenses and acknowledgements +for third-party software incorporated in the Python distribution. + + +Mersenne Twister +---------------- + +The :mod:`_random` module includes code based on a download from +http://www.math.keio.ac.jp/ matumoto/MT2002/emt19937ar.html. The following are +the verbatim comments from the original code:: + + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Any feedback is very welcome. + http://www.math.keio.ac.jp/matumoto/emt.html + email: matumoto@math.keio.ac.jp + + +Sockets +------- + +The :mod:`socket` module uses the functions, :func:`getaddrinfo`, and +:func:`getnameinfo`, which are coded in separate source files from the WIDE +Project, http://www.wide.ad.jp/. :: + + Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + GAI_ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + FOR GAI_ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON GAI_ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN GAI_ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + +Floating point exception control +-------------------------------- + +The source for the :mod:`fpectl` module includes the following notice:: + + --------------------------------------------------------------------- + / Copyright (c) 1996. \ + | The Regents of the University of California. | + | All rights reserved. | + | | + | Permission to use, copy, modify, and distribute this software for | + | any purpose without fee is hereby granted, provided that this en- | + | tire notice is included in all copies of any software which is or | + | includes a copy or modification of this software and in all | + | copies of the supporting documentation for such software. | + | | + | This work was produced at the University of California, Lawrence | + | Livermore National Laboratory under contract no. W-7405-ENG-48 | + | between the U.S. Department of Energy and The Regents of the | + | University of California for the operation of UC LLNL. | + | | + | DISCLAIMER | + | | + | This software was prepared as an account of work sponsored by an | + | agency of the United States Government. Neither the United States | + | Government nor the University of California nor any of their em- | + | ployees, makes any warranty, express or implied, or assumes any | + | liability or responsibility for the accuracy, completeness, or | + | usefulness of any information, apparatus, product, or process | + | disclosed, or represents that its use would not infringe | + | privately-owned rights. Reference herein to any specific commer- | + | cial products, process, or service by trade name, trademark, | + | manufacturer, or otherwise, does not necessarily constitute or | + | imply its endorsement, recommendation, or favoring by the United | + | States Government or the University of California. The views and | + | opinions of authors expressed herein do not necessarily state or | + | reflect those of the United States Government or the University | + | of California, and shall not be used for advertising or product | + \ endorsement purposes. / + --------------------------------------------------------------------- + + +MD5 message digest algorithm +---------------------------- + +The source code for the :mod:`md5` module contains the following notice:: + + Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321, whose + text is available at + http://www.ietf.org/rfc/rfc1321.txt + The code is derived from the text of the RFC, including the test suite + (section A.5) but excluding the rest of Appendix A. It does not include + any code or documentation that is identified in the RFC as being + copyrighted. + + The original and principal author of md5.h is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 2002-04-13 lpd Removed support for non-ANSI compilers; removed + references to Ghostscript; clarified derivation from RFC 1321; + now handles byte order either statically or dynamically. + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); + added conditionalization for C++ compilation from Martin + Purschke . + 1999-05-03 lpd Original version. + + +Asynchronous socket services +---------------------------- + +The :mod:`asynchat` and :mod:`asyncore` modules contain the following notice:: + + Copyright 1996 by Sam Rushing + + All Rights Reserved + + Permission to use, copy, modify, and distribute this software and + its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that copyright notice and this permission + notice appear in supporting documentation, and that the name of Sam + Rushing not be used in advertising or publicity pertaining to + distribution of the software without specific, written prior + permission. + + SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN + NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +Cookie management +----------------- + +The :mod:`Cookie` module contains the following notice:: + + Copyright 2000 by Timothy O'Malley + + All Rights Reserved + + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that copyright notice and this permission + notice appear in supporting documentation, and that the name of + Timothy O'Malley not be used in advertising or publicity + pertaining to distribution of the software without specific, written + prior permission. + + Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR + ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + + +Profiling +--------- + +The :mod:`profile` and :mod:`pstats` modules contain the following notice:: + + Copyright 1994, by InfoSeek Corporation, all rights reserved. + Written by James Roskind + + Permission to use, copy, modify, and distribute this Python software + and its associated documentation for any purpose (subject to the + restriction in the following sentence) without fee is hereby granted, + provided that the above copyright notice appears in all copies, and + that both that copyright notice and this permission notice appear in + supporting documentation, and that the name of InfoSeek not be used in + advertising or publicity pertaining to distribution of the software + without specific, written prior permission. This permission is + explicitly restricted to the copying and modification of the software + to remain in Python, compiled Python, or other languages (such as C) + wherein the modified or derived code is exclusively imported into a + Python module. + + INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY + SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +Execution tracing +----------------- + +The :mod:`trace` module contains the following notice:: + + portions copyright 2001, Autonomous Zones Industries, Inc., all rights... + err... reserved and offered to the public under the terms of the + Python 2.2 license. + Author: Zooko O'Whielacronx + http://zooko.com/ + mailto:zooko@zooko.com + + Copyright 2000, Mojam Media, Inc., all rights reserved. + Author: Skip Montanaro + + Copyright 1999, Bioreason, Inc., all rights reserved. + Author: Andrew Dalke + + Copyright 1995-1997, Automatrix, Inc., all rights reserved. + Author: Skip Montanaro + + Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved. + + + Permission to use, copy, modify, and distribute this Python software and + its associated documentation for any purpose without fee is hereby + granted, provided that the above copyright notice appears in all copies, + and that both that copyright notice and this permission notice appear in + supporting documentation, and that the name of neither Automatrix, + Bioreason or Mojam Media be used in advertising or publicity pertaining to + distribution of the software without specific, written prior permission. + + +UUencode and UUdecode functions +------------------------------- + +The :mod:`uu` module contains the following notice:: + + Copyright 1994 by Lance Ellinghouse + Cathedral City, California Republic, United States of America. + All Rights Reserved + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, + provided that the above copyright notice appear in all copies and that + both that copyright notice and this permission notice appear in + supporting documentation, and that the name of Lance Ellinghouse + not be used in advertising or publicity pertaining to distribution + of the software without specific, written prior permission. + LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO + THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE CENTRUM BE LIABLE + FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Modified by Jack Jansen, CWI, July 1995: + - Use binascii module to do the actual line-by-line conversion + between ascii and binary. This results in a 1000-fold speedup. The C + version is still 5 times faster, though. + - Arguments more compliant with Python standard + + +XML Remote Procedure Calls +-------------------------- + +The :mod:`xmlrpclib` module contains the following notice:: + + The XML-RPC client interface is + + Copyright (c) 1999-2002 by Secret Labs AB + Copyright (c) 1999-2002 by Fredrik Lundh + + By obtaining, using, and/or copying this software and/or its + associated documentation, you agree that you have read, understood, + and will comply with the following terms and conditions: + + Permission to use, copy, modify, and distribute this software and + its associated documentation for any purpose and without fee is + hereby granted, provided that the above copyright notice appears in + all copies, and that both that copyright notice and this permission + notice appear in supporting documentation, and that the name of + Secret Labs AB or the author not be used in advertising or publicity + pertaining to distribution of the software without specific, written + prior permission. + + SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- + ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR + BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + OF THIS SOFTWARE. + + +test_epoll +---------- + +The :mod:`test_epoll` contains the following notice:: + + Copyright (c) 2001-2006 Twisted Matrix Laboratories. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Select kqueue +------------- + +The :mod:`select` and contains the following notice for the kqueue interface:: + + Copyright (c) 2000 Doug White, 2006 James Knight, 2007 Christian Heimes + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + +strtod and dtoa +--------------- + +The file :file:`Python/dtoa.c`, which supplies C functions dtoa and +strtod for conversion of C doubles to and from strings, is derived +from the file of the same name by David M. Gay, currently available +from http://www.netlib.org/fp/. The original file, as retrieved on +March 16, 2009, contains the following copyright and licensing +notice:: + + /**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991, 2000, 2001 by Lucent Technologies. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + + +OpenSSL +------- + +The modules :mod:`hashlib`, :mod:`posix`, :mod:`ssl`, :mod:`crypt` use +the OpenSSL library for added performance if made available by the +operating system. Additionally, the Windows installers for Python +include a copy of the OpenSSL libraries, so we include a copy of the +OpenSSL license here:: + + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + + /* ==================================================================== + * Copyright (c) 1998-2008 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + + /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +expat +----- + +The :mod:`pyexpat` extension is built using an included copy of the expat +sources unless the build is configured :option:`--with-system-expat`:: + + Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +libffi +------ + +The :mod:`_ctypes` extension is built using an included copy of the libffi +sources unless the build is configured :option:`--with-system-libffi`:: + + Copyright (c) 1996-2008 Red Hat, Inc and others. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + +zlib +---- + +The :mod:`zlib` extension is built using an included copy of the zlib +sources unless the zlib version found on the system is too old to be +used for the build:: + + Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + diff -r aa27b836c528 -r 2edc011b559e components/python/python27/tkinter-27.p5m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/python/python27/tkinter-27.p5m Thu Aug 04 19:59:04 2011 -0700 @@ -0,0 +1,66 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# + +set name=pkg.fmri \ + value=pkg:/library/python-2/tkinter-27@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="Python 2.7 bindings to tcl/tk" +set name=info.classification \ + value=org.opensolaris.category.2008:Development/Python +set name=info.source_url value=$(COMPONENT_ARCHIVE_URL) +set name=info.upstream_url value=http://python.org/ +set name=opensolaris.arc_url \ + value=http://arc.opensolaris.org/caselog/PSARC/2011/XXX +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) + +#pkgdepend doesn't like python 2.7 yet + \ + default pkg.depend.bypass-generate .* > + +license python27.license license=PSFv2 + +dir path=usr +dir path=usr/lib +dir path=usr/lib/python2.7 +dir path=usr/lib/python2.7/lib-dynload +dir path=usr/lib/python2.7/lib-dynload/64 +dir path=usr/lib/python2.7/lib-tk +file path=usr/lib/python2.7/lib-dynload/64/_tkinter.so +file path=usr/lib/python2.7/lib-dynload/_tkinter.so +file path=usr/lib/python2.7/lib-tk/Canvas.py +file path=usr/lib/python2.7/lib-tk/Dialog.py +file path=usr/lib/python2.7/lib-tk/FileDialog.py +file path=usr/lib/python2.7/lib-tk/FixTk.py +file path=usr/lib/python2.7/lib-tk/ScrolledText.py +file path=usr/lib/python2.7/lib-tk/SimpleDialog.py +file path=usr/lib/python2.7/lib-tk/Tix.py +file path=usr/lib/python2.7/lib-tk/Tkconstants.py +file path=usr/lib/python2.7/lib-tk/Tkdnd.py +file path=usr/lib/python2.7/lib-tk/Tkinter.py +file path=usr/lib/python2.7/lib-tk/tkColorChooser.py +file path=usr/lib/python2.7/lib-tk/tkCommonDialog.py +file path=usr/lib/python2.7/lib-tk/tkFileDialog.py +file path=usr/lib/python2.7/lib-tk/tkFont.py +file path=usr/lib/python2.7/lib-tk/tkMessageBox.py +file path=usr/lib/python2.7/lib-tk/tkSimpleDialog.py +file path=usr/lib/python2.7/lib-tk/ttk.py +file path=usr/lib/python2.7/lib-tk/turtle.py