7004671 Add Python 2.7.1
authorNorm Jacobs <Norm.Jacobs@Oracle.COM>
Thu, 04 Aug 2011 19:59:04 -0700
changeset 458 2edc011b559e
parent 457 aa27b836c528
child 459 c7579764bc73
7004671 Add Python 2.7.1
components/python/python27/Makefile
components/python/python27/patches/00-bits.patch
components/python/python27/patches/01-ext-stdio.patch
components/python/python27/patches/02-setup.patch
components/python/python27/patches/03-vendor-packages.patch
components/python/python27/patches/04-solaris-64-bit.patch
components/python/python27/patches/05-dtrace.patch
components/python/python27/patches/06-ucred.patch
components/python/python27/patches/07-dlpi.patch
components/python/python27/patches/08-encoding-alias.patch
components/python/python27/patches/09-rbac.patch
components/python/python27/python-27-tests.p5m
components/python/python27/python-27.p5m
components/python/python27/python27.license
components/python/python27/tkinter-27.p5m
--- /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
--- /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 <sys/isa_defs.h>
++
++/*
++ * 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 <stdint.h>
+         #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 <sys/types.h>
+-#endif
+-#ifdef HAVE_TIME_H
+-#include <time.h>
+-#endif
+-])
++dnl AC_CHECK_SIZEOF(time_t, [], [
++dnl #ifdef HAVE_SYS_TYPES_H
++dnl #include <sys/types.h>
++dnl #endif
++dnl #ifdef HAVE_TIME_H
++dnl #include <time.h>
++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";
--- /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 <floatingpoint.h>
+ #endif
+ 
++#if defined(sun) && defined(__SVR4) && !defined(_LP64)
++#define USE_EXTENDED_FILE_STDIO 1
++#include <stdio.h>
++#include <stdio_ext.h>
++#include <signal.h>
++#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);
+ }
--- /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')
--- /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')
+
--- /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 <windows.h>
--- /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 <ctype.h>
+ 
++#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 <stdio.h>
++#include <sys/types.h>
++
++#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
--- /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 <Python.h>
++
++#include <stdio.h>
++#include <priv.h>
++#include <ucred.h>
++#include <ctype.h>
++#include <tsol/label.h>
++
++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
--- /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 <Python.h>
++#include <stdio.h>
++#include <libdlpi.h>
++
++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, &notes, &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 <sys/dlpi.h> 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 <netinet/arp.h>\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 <net/if_types.h>\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 <sys/dlpi.h>.\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()
--- /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
--- /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 <auth_attr.h>
++#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 <exec_attr.h>
++#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 <priv.h>
++#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 <Python.h>
++#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 <secdb.h>
++
++
++#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 <stdio.h>
++#include <user_attr.h>
++#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)
--- /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.
+<transform file path=usr/lib/python2.7/lib2to3/tests/data/.+ -> \
+    set pkg.tmp.autopyc false >
+<transform file path=usr/lib/python2.7/test/bad.+ -> \
+    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
+<transform file path=.+\.py$ -> \
+    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
--- /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.
+#
+
+<transform file path=usr.*/man/.+ -> 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
+<transform file path=.+\.py$ -> \
+    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
+
--- /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: [email protected]
+
+
+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
+     [email protected]
+
+     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
+     <[email protected]>.  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 <[email protected]>.
+     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 <[email protected]>
+
+                  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:[email protected]
+
+   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 [email protected].
+
+  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
+     *    [email protected].
+     *
+     * 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
+     * ([email protected]).  This product includes software written by Tim
+     * Hudson ([email protected]).
+     *
+     */
+
+ Original SSLeay License
+ -----------------------
+
+    /* Copyright (C) 1995-1998 Eric Young ([email protected])
+     * All rights reserved.
+     *
+     * This package is an SSL implementation written
+     * by Eric Young ([email protected]).
+     * 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 ([email protected]).
+     *
+     * 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 ([email protected])"
+     *    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 ([email protected])"
+     *
+     * 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
+  [email protected]          [email protected]
+
--- /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
+<transform file path=.+\.py$ -> \
+    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