// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: arfile.cc,v 1.4 2002/09/20 05:30:33 tausq Exp $
+// $Id: arfile.cc,v 1.6.2.1 2004/01/16 18:58:50 mdz Exp $
/* ######################################################################
AR File - Handle an 'AR' archive
AR Archives have plain text headers at the start of each file
- section. The headers are aligned on a 2 byte boundry.
+ section. The headers are aligned on a 2 byte boundary.
Information about the structure of AR files can be found in ar(5)
on a BSD system, or in the binutils source.
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/arfile.h"
-#endif
+#include<config.h>
+
#include <apt-pkg/arfile.h>
#include <apt-pkg/strutl.h>
+#include <apt-pkg/fileutl.h>
#include <apt-pkg/error.h>
-#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <string>
+
+#include <apti18n.h>
/*}}}*/
struct ARArchive::MemberHeader
byte plain text header then the file data, another header, data, etc */
bool ARArchive::LoadHeaders()
{
- signed long Left = File.Size();
+ off_t Left = File.Size();
// Check the magic byte
char Magic[8];
if (File.Read(Magic,sizeof(Magic)) == false)
return false;
if (memcmp(Magic,"!<arch>\012",sizeof(Magic)) != 0)
- return _error->Error("Invalid archive signature");
+ return _error->Error(_("Invalid archive signature"));
Left -= sizeof(Magic);
// Read the member list
{
MemberHeader Head;
if (File.Read(&Head,sizeof(Head)) == false)
- return _error->Error("Error reading archive member header");
+ return _error->Error(_("Error reading archive member header"));
Left -= sizeof(Head);
// Convert all of the integer members
StrToNum(Head.Size,Memb->Size,sizeof(Head.Size)) == false)
{
delete Memb;
- return _error->Error("Invalid archive member header");
+ return _error->Error(_("Invalid archive member header %s"), Head.Name);
}
// Check for an extra long name string
char S[300];
unsigned long Len;
if (StrToNum(Head.Name+3,Len,sizeof(Head.Size)-3) == false ||
- Len >= strlen(S))
+ Len >= sizeof(S))
{
delete Memb;
- return _error->Error("Invalid archive member header");
+ return _error->Error(_("Invalid archive member header"));
}
if (File.Read(S,Len) == false)
+ {
+ delete Memb;
return false;
+ }
S[Len] = 0;
Memb->Name = S;
Memb->Size -= Len;
else
{
unsigned int I = sizeof(Head.Name) - 1;
- for (; Head.Name[I] == ' '; I--);
- Memb->Name = string(Head.Name,0,I+1);
+ for (; Head.Name[I] == ' ' || Head.Name[I] == '/'; I--);
+ Memb->Name = std::string(Head.Name,I+1);
}
// Account for the AR header alignment
- unsigned Skip = Memb->Size % 2;
+ off_t Skip = Memb->Size % 2;
// Add it to the list
Memb->Next = List;
Memb->Start = File.Tell();
if (File.Skip(Memb->Size + Skip) == false)
return false;
- if (Left < (signed)(Memb->Size + Skip))
- return _error->Error("Archive is too short");
+ if (Left < (off_t)(Memb->Size + Skip))
+ return _error->Error(_("Archive is too short"));
Left -= Memb->Size + Skip;
}
if (Left != 0)
- return _error->Error("Failed to read the archive headers");
+ return _error->Error(_("Failed to read the archive headers"));
return true;
}