[Python-Dev] PyConfig.h On Solaris (original) (raw)

John Abel john.abel@pa.press.net
Tue, 22 Jul 2003 22:48:58 +0100


> OK, I can see why Python.h has to be first, but surely, abiding by the spec > shouldn't prevent code from executing properly? Should I raise a bug report > for this?

For what? That you can't compile a certain Solaris header, if the application adds some system-specifed #defines? That is a Solaris bug, not a Python bug. All system headers ought to work under LARGEFILESOURCE and FILEOFFSETBITS=64. > I'm guessing that only Solaris is affected (though maybe other > BSD-types are, too? AFAIK, only Solaris has the /proc oddity). I'd > like to be able to produce compliant modules. I'd like to help, if > I can. I don't see that Python can or should change here. We have to define FILEOFFSETBITS, and we have to define it consistently across all object files, or else we can't free exchange data structures which contain offt fields across functions. Martin,

Thanks for your help. It's a shame that Sun don't hurry up, and deprecate the ioctl method of reading /proc, as it seems that where most of the bother comes from. Maybe that's why no-one else seems to have written anything for parsing of /proc (in Python, or Perl). The module I've written, only uses open, lseek, and read. When it's finally finished, I'll distribute it with a warning.

Regards

John

PS, for those that are interested, I've included the working (non-compliant) code. I'd appreciate any pointers.

/* psinfomodule.c - a Python module to return PS information */

#include <procfs.h>

#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h>

#include "Python.h"

static PyObject * psinfo_pidinfo(PyObject *self, PyObject *args) { PyObject *queryPid; char procBuf[32]; char cmdLine[255]; char cmdArgs[255]; psinfo_t psBuf; int fdPSFile;

    if (!PyArg_ParseTuple(args, "l:pidinfo", &queryPid) ) {
        return NULL;
    }
    (void)sprintf(procBuf,"/proc/%ld/psinfo", (long)queryPid);
    if ((fdPSFile = open(procBuf, O_RDONLY)) != -1 ) {
        if ( read(fdPSFile, &psBuf, sizeof(psBuf)) == sizeof(psBuf) ) {
            (void)sprintf(cmdLine, "%s", psBuf.pr_fname );
            (void)sprintf(cmdArgs, "%s", psBuf.pr_psargs );
        }
        else{
            return NULL;
        }
        close(fdPSFile);
    }
    return Py_BuildValue( "ss", cmdLine, cmdArgs );

}

static PyObject * psinfo_fullpidinfo(PyObject *self, PyObject *args) { PyObject *queryPid; char procBuf[50]; char asBuf[50]; char argStr[512], cmdArgs[1024]; char **argvp; int fdFile, counter; struct psinfo psBuf;

if (!PyArg_ParseTuple(args, "i:pidinfo", &queryPid) ) {
    return NULL;
}

(void)sprintf(procBuf,"/proc/%i/psinfo", (int)queryPid);
(void)sprintf(asBuf,"/proc/%i/as", (int)queryPid);

if ((fdFile = open(procBuf, O_RDONLY)) != -1 ) {
    if (read(fdFile, &psBuf, sizeof(struct psinfo)) == -1 ) {
        return NULL;
    }
    close(fdFile);
    if ((fdFile = open(asBuf, O_RDONLY)) == -1 ) {
        return NULL;
    }
    else {

        argvp=(char **) malloc(sizeof(char *) * (psBuf.pr_argc + 1));

        if (lseek(fdFile, psBuf.pr_argv, SEEK_SET) == -1) {
            return NULL;
        }

        if (read(fdFile, argvp, sizeof(char *) * (psBuf.pr_argc + 1))

== -1 ) { printf( "Read Failed" ); return NULL; } for ( counter=0; counter < psBuf.pr_argc; counter++ ) { if (lseek(fdFile, argvp[ counter ], SEEK_SET) == -1) { printf( "2nd LSeek Failed"); return NULL; } if (read(fdFile, argStr, 512) == -1) { printf( "Read Of AS File Failed"); return NULL; } strcat( cmdArgs, argStr ); strcat( cmdArgs, " " ); } close(fdFile); } } else { return NULL; } return Py_BuildValue( "s", cmdArgs ); }

static struct PyMethodDef PSInfoMethods[]={ { "pidinfo", psinfo_pidinfo, METH_VARARGS, "Display Details For A Given PID" }, { "fullpidinfo", psinfo_fullpidinfo, METH_VARARGS, "Display Full Arg Details For A Given PID" }, { NULL, NULL, 0, NULL } };

void initpsinfo(void) {

(void)Py_InitModule("psinfo", PSInfoMethods);

}