// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
// $Id: apt_instmodule.cc,v 1.3 2002/01/08 06:53:04 jgg Exp $
/* ######################################################################
apt_intmodule - Top level for the python module. Create the internal
structures for the module in the interpriter.
Note, this module shares state (particularly global config) with the
apt_pkg module.
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
#include "apt_instmodule.h"
#include "generic.h"
#include
#include
#include
#include
#include
/*}}}*/
// debExtractControl - Exctract an arbitary control member /*{{{*/
// ---------------------------------------------------------------------
/* This is a common operation so this function will stay, but others that
expose the full range of the apt-inst .deb processing will join it some
day. */
static char *doc_debExtractControl =
"debExtractControl(File[,Member]) -> String\n"
"Returns the indicated file from the control tar. The default is 'control'\n";
static PyObject *debExtractControl(PyObject *Self,PyObject *Args)
{
char *Member = "control";
PyObject *File;
if (PyArg_ParseTuple(Args,"O!|s",&PyFile_Type,&File,&Member) == 0)
return 0;
// Subscope makes sure any clean up errors are properly handled.
PyObject *Res = 0;
{
// Open the file and associate the .deb
FileFd Fd(fileno(PyFile_AsFile(File)),false);
debDebFile Deb(Fd);
if (_error->PendingError() == true)
return HandleErrors();
debDebFile::MemControlExtract Extract(Member);
if (Extract.Read(Deb) == false)
return HandleErrors();
// Build the return result
if (Extract.Control == 0)
{
Py_INCREF(Py_None);
Res = Py_None;
}
else
Res = PyString_FromStringAndSize(Extract.Control,Extract.Length+2);
}
return HandleErrors(Res);
}
/*}}}*/
// debExtractArchive - Exctract the archive /*{{{*/
// ---------------------------------------------------------------------
static char *doc_debExtractArchive =
"debExtractArchve(File,rootdir) -> Bool\n"
"Extracts the Archive into the given root dir";
static PyObject *debExtractArchive(PyObject *Self,PyObject *Args)
{
char *Rootdir = NULL;
char cwd[512];
PyObject *File;
if (PyArg_ParseTuple(Args,"O!|s",&PyFile_Type,&File,&Rootdir) == 0)
return 0;
// Subscope makes sure any clean up errors are properly handled.
bool res = false;
{
if(Rootdir != NULL)
{
getcwd(cwd, sizeof(cwd));
chdir(Rootdir);
}
// Open the file and associate the .deb
FileFd Fd(fileno(PyFile_AsFile(File)),false);
debDebFile Deb(Fd);
if (_error->PendingError() == true) {
if (Rootdir != NULL)
chdir (cwd);
return HandleErrors(Py_BuildValue("b",false));
}
// extracts relative to the current dir
pkgDirStream Extract;
res = Deb.ExtractArchive(Extract);
if (Rootdir != NULL)
chdir (cwd);
if (res == false)
return HandleErrors(Py_BuildValue("b",res));
}
return HandleErrors(Py_BuildValue("b",res));
}
/*}}}*/
// arFindMember - Find member in AR archive /*{{{*/
// ---------------------------------------------------------------------
static char *doc_arCheckMember =
"arCheckMember(File, membername) -> Bool\n";
static PyObject *arCheckMember(PyObject *Self,PyObject *Args)
{
char *Member = NULL;
bool res = false;
PyObject *File;
if (PyArg_ParseTuple(Args,"O!s",&PyFile_Type,&File,&Member) == 0)
return 0;
// Open the file and associate the .deb
FileFd Fd(fileno(PyFile_AsFile(File)),false);
ARArchive AR(Fd);
if (_error->PendingError() == true)
return HandleErrors(Py_BuildValue("b",res));
if(AR.FindMember(Member) != 0)
res = true;
return HandleErrors(Py_BuildValue("b",res));
}
/*}}}*/
// initapt_inst - Core Module Initialization /*{{{*/
// ---------------------------------------------------------------------
/* */
static PyMethodDef methods[] =
{
// access to ar files
{"arCheckMember", arCheckMember, METH_VARARGS, doc_arCheckMember},
// access to deb files
{"debExtractControl",debExtractControl,METH_VARARGS,doc_debExtractControl},
{"debExtractArchive",debExtractArchive,METH_VARARGS,doc_debExtractArchive},
// access to tar streams
{"tarExtract",tarExtract,METH_VARARGS,doc_tarExtract},
{"debExtract",debExtract,METH_VARARGS,doc_debExtract},
{}
};
extern "C" void initapt_inst()
{
Py_InitModule("apt_inst",methods);
}
/*}}}*/