summaryrefslogtreecommitdiff
path: root/pkgtools/rpm2pkg
diff options
context:
space:
mode:
authorjlam <jlam>2003-07-16 09:33:46 +0000
committerjlam <jlam>2003-07-16 09:33:46 +0000
commite664449b954368894a4fd85edc962c90bc7b4903 (patch)
tree491111004206c0c3cb92ae9f1dd439e854e373be /pkgtools/rpm2pkg
parentf6cad14a16265838094c96c2784856bdf35df1a9 (diff)
downloadpkgsrc-e664449b954368894a4fd85edc962c90bc7b4903.tar.gz
Initial work in merging bits of the pkgviews branch into modern pkgsrc.
Currently, the pkgviews/buildlink2 integration is incomplete. People who work on this branch should also check out src/usr.sbin/pkg_install from the pkgviews branch.
Diffstat (limited to 'pkgtools/rpm2pkg')
-rw-r--r--pkgtools/rpm2pkg/DESCR3
-rw-r--r--pkgtools/rpm2pkg/Makefile33
-rw-r--r--pkgtools/rpm2pkg/PLIST3
-rw-r--r--pkgtools/rpm2pkg/files/rpm2pkg.8161
-rw-r--r--pkgtools/rpm2pkg/files/rpm2pkg.c756
5 files changed, 0 insertions, 956 deletions
diff --git a/pkgtools/rpm2pkg/DESCR b/pkgtools/rpm2pkg/DESCR
deleted file mode 100644
index 42e3a7c5cab..00000000000
--- a/pkgtools/rpm2pkg/DESCR
+++ /dev/null
@@ -1,3 +0,0 @@
-"rpm2pkg" can be used to convert RedHat Package Manager archives used by
-many Linux distribution like e.g. Red Hat or SuSE into NetBSD packages.
-It will extract the RPM files and create a NetBSD package list on the fly.
diff --git a/pkgtools/rpm2pkg/Makefile b/pkgtools/rpm2pkg/Makefile
deleted file mode 100644
index 8a406aecfe9..00000000000
--- a/pkgtools/rpm2pkg/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-# $NetBSD: Makefile,v 1.18 2003/07/13 13:53:04 wiz Exp $
-
-DISTNAME= rpm2pkg-1.3
-PKGREVISION= 1
-WRKSRC= ${WRKDIR}
-CATEGORIES= pkgtools
-MASTER_SITES= # empty
-DISTFILES= # empty
-
-MAINTAINER= tron@netbsd.org
-HOMEPAGE= ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/Packages.txt
-COMMENT= Convert RPM archives to NetBSD packages
-
-CONFLICTS+= suse-base<=6.4
-
-USE_BUILDLINK2= YES
-NO_CHECKSUM= YES
-
-CFLAGS+= ${BUILDLINK_CPPFLAGS.rpm}
-LIBS= -lrpm -lintl -lz
-
-do-build:
- ${BUILDLINK_CC} ${CFLAGS} ${LDFLAGS} -o ${WRKSRC}/rpm2pkg \
- ${FILESDIR}/rpm2pkg.c ${LIBS}
-
-do-install:
- ${INSTALL_PROGRAM} ${WRKSRC}/rpm2pkg ${PREFIX}/sbin
- ${INSTALL_MAN} ${FILESDIR}/rpm2pkg.8 ${PREFIX}/man/man8
-
-.include "../../devel/zlib/buildlink2.mk"
-.include "../../misc/rpm/buildlink2.mk"
-
-.include "../../mk/bsd.pkg.mk"
diff --git a/pkgtools/rpm2pkg/PLIST b/pkgtools/rpm2pkg/PLIST
deleted file mode 100644
index 34d30fc88a5..00000000000
--- a/pkgtools/rpm2pkg/PLIST
+++ /dev/null
@@ -1,3 +0,0 @@
-@comment $NetBSD: PLIST,v 1.1 2001/10/31 21:19:10 zuntum Exp $
-sbin/rpm2pkg
-man/man8/rpm2pkg.8
diff --git a/pkgtools/rpm2pkg/files/rpm2pkg.8 b/pkgtools/rpm2pkg/files/rpm2pkg.8
deleted file mode 100644
index 26b3362138f..00000000000
--- a/pkgtools/rpm2pkg/files/rpm2pkg.8
+++ /dev/null
@@ -1,161 +0,0 @@
-.\" $NetBSD: rpm2pkg.8,v 1.5 2001/12/03 19:03:23 wiz Exp $
-.\"
-.\" Copyright (c) 2001 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Emmanuel Dreyfus.
-.\"
-.\" 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 acknowledgement:
-.\" This product includes software developed by the NetBSD
-.\" Foundation, Inc. and its contributors.
-.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
-.\"
-.Dd January 27, 2001
-.Dt RPM2PKG 8
-.Os
-.Sh NAME
-.Nm rpm2pkg
-.Nd RPM to BSD package conversion helper
-.Sh SYNOPSIS
-.Nm
-.Op Fl d Ar directory
-.Op Fl f Ar package_list
-.Op Fl i Ar ignored_dir
-.Op Fl p Ar prefix
-.Op Fl s Ar strip_path_count
-.Ar rpm_file ...
-.Sh DESCRIPTION
-.Nm
-helps in building BSD packages from RPM files by unpacking each specified
-.Ar rpm_file ,
-and by building a
-.Ar package_list
-according to what was extracted. The
-.Ar package_list
-has the format expected by the
-.Nx
-package system.
-.Pp
-.Nm
-also provides a mechanism that helps in selecting what is actually
-extracted from the RPM files. It is therefore possible to reject files
-that are of no interest when building a BSD package. This is especially
-useful for files that are to be extracted in
-.Pa /var
-or
-.Pa /etc .
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl d Ar directory
-Change working directory to
-.Ar directory .
-.It Fl f Ar package_list
-Produce a
-.Nx
-package list
-.Ar package_list
-from what was actually extracted from the RPM files archives.
-.It Fl i Ar ignored_dir
-Do not extract files contained in the
-.Ar ignored_dir
-directory of the RPM file's archives.
-.It Fl p Ar prefix
-Use
-.Ar prefix
-when extracting files.
-.It Fl s Ar strip_path_count
-Strip
-.Ar strip_path_count
-leading directories in file names.
-.El
-.Sh EXAMPLES
-.Nm
-.Fl d Ar /usr/pkg
-.Fl f Ar /usr/pkgsrc/emulator/more_linux_lib/work/PLIST_DYNAMIC
-.Fl p Ar emul/linux
-.Fl i Ar tmp
-.Fl i Ar var
-.Fl i Ar usr/tmp
-.Ar /usr/pkgsrc/distfiles/more_linux_lib/foo.rpm
-.Ar /usr/pkgsrc/distfiles/more_linux_lib/bar.rpm
-.Pp
-This will extract
-.Pa foo.rpm
-and
-.Pa bar.rpm
-into
-.Pa /usr/pkg/emul/linux .
-A packing list called
-.Pa PLIST_DYNAMIC
-will be created, with pathnames relative to
-.Pa /usr/pkg ,
-because this is the directory into which we asked
-.Nm
-to change with the
-.Fl d
-option.
-.Pp
-.Nm
-will not extract files contained in the
-.Pa tmp ,
-.Pa var ,
-or
-.Pa usr/tmp
-directories of the RPM file's archives.
-.Pp
-.Nm
-.Fl s Ar 1
-.Fl d Ar /usr/pkg
-.Ar /usr/pkgsrc/distfiles/pack/bar.rpm
-.Pp
-This will extract the
-.Ar bar.rpm
-file in
-.Pa /usr/pkg
-while striping the leading directory of files path in
-.Ar bar.rpm .
-This is useful for dealing with RPM archives that contains files like
-.Pa usr/bin/foo ,
-which you would like to go in
-.Pa /usr/pkg/bin .
-.Sh COMPATIBILITY
-.Nm
-should work with any regular RPM file.
-.Sh SEE ALSO
-.Xr cpio 1 ,
-.Xr rpm 8 ,
-.Xr rpm2cpio 8
-.br
-.Em Dq Documentation on the NetBSD Package System ,
-.An Hubert Feyrer Aq hubert.feyrer@informatik.fh-regensburg.de ,
-.An Alistair Crooks Aq agc@pkgsrc.org
-.Sh AUTHORS
-.An Matthias Scheler Aq tron@netbsd.org
-.br
-This man page was written by
-.An Emmanuel Dreyfus Aq manu@netbsd.org
diff --git a/pkgtools/rpm2pkg/files/rpm2pkg.c b/pkgtools/rpm2pkg/files/rpm2pkg.c
deleted file mode 100644
index 6fead0ac2a3..00000000000
--- a/pkgtools/rpm2pkg/files/rpm2pkg.c
+++ /dev/null
@@ -1,756 +0,0 @@
-/*
-
- $NetBSD: rpm2pkg.c,v 1.3 2002/12/09 15:16:27 tron Exp $
-
-*/
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <cpio.h>
-#include <rpmlib.h>
-#include <zlib.h>
-
-char CPIOMagic[] = {'0','7','0','7','0','1'};
-
-#define CPIO_END_MARKER "TRAILER!!!"
-#define CPIO_FIELD_LENGTH 8
-
-#define CPIO_HDR_INODE 0
-#define CPIO_HDR_MODE 1
-#define CPIO_HDR_FILESIZE 6
-#define CPIO_HDR_NAMESIZE 11
-#define CPIO_NUM_HEADERS 13
-
-#define CP_IFMT 0170000
-
-#define TRUE 1
-#define FALSE 0
-
-#define GZREAD(s,b,l) (gzread((s),(b),(l))==l)
-
-extern char *__progname;
-
-struct ModeMap
- {
- long mm_CPIOMode;
- mode_t mm_SysMode;
- };
-struct ModeMap ModeMapTab[] =
- {
- {C_IRUSR,S_IRUSR},
- {C_IWUSR,S_IWUSR},
- {C_IXUSR,S_IXUSR},
- {C_IRGRP,S_IRGRP},
- {C_IWGRP,S_IWGRP},
- {C_IXGRP,S_IXGRP},
- {C_IROTH,S_IROTH},
- {C_IWOTH,S_IWOTH},
- {C_IXOTH,S_IXOTH},
- {C_ISUID,S_ISUID},
- {C_ISGID,S_ISGID},
- {C_ISVTX,S_ISVTX},
- {0,0}
- };
-
-typedef struct PListEntryStruct PListEntry;
-struct PListEntryStruct
- {
- PListEntry *pe_Childs[2];
- int pe_DirEmpty;
- mode_t pe_DirMode;
- long pe_INode;
- char *pe_Link;
- char pe_Name[1];
- };
-
-#define pe_Left pe_Childs[0]
-#define pe_Right pe_Childs[1]
-
-typedef void PListEntryFunc(PListEntry *,FILE *);
-
-#define PLIST_ORDER_FORWARD 0
-#define PLIST_ORDER_BACKWARD 1
-
-PListEntry *InsertPListEntry(PListEntry **Tree,char *Name)
-
-{
- PListEntry *Node;
-
- while ((Node=*Tree)!=NULL)
- Tree=&((strcmp(Name,Node->pe_Name)<0)?Node->pe_Left:Node->pe_Right);
-
- if ((Node=malloc(sizeof(PListEntry)+strlen(Name)))==NULL)
- {
- perror(__progname);
- exit(EXIT_FAILURE);
- }
-
- Node->pe_Left=NULL;
- Node->pe_Right=NULL;
- Node->pe_DirEmpty=FALSE;
- Node->pe_INode=0;
- Node->pe_Link=NULL;
- (void)strcpy(Node->pe_Name,Name);
-
- return *Tree=Node;
-}
-
-PListEntry *FindPListEntry(PListEntry *Tree,char *Name)
-
-{
- while (Tree!=NULL)
- {
- int Result;
-
- if ((Result=strcmp(Name,Tree->pe_Name))==0) break;
- Tree=(Result<0)?Tree->pe_Left:Tree->pe_Right;
- }
-
- return Tree;
-}
-
-void PListEntryFile(PListEntry *Node,FILE *Out)
-
-{
- (void)fputs(Node->pe_Name,Out);
- (void)fputc('\n',Out);
-}
-
-void PListEntryLink(PListEntry *Node,FILE *Out)
-
-{
- (void)fprintf(Out,"@exec ln -fs %s %%D/%s\n",Node->pe_Link,Node->pe_Name);
- (void)fprintf(Out,"@unexec rm -f %%D/%s\n",Node->pe_Name);
-}
-
-void PListEntryMakeDir(PListEntry *Node,FILE *Out)
-
-{
- if (Node->pe_DirEmpty)
- (void)fprintf(Out,
- "@exec mkdir -m %o -p %%D/%s\n",
- Node->pe_DirMode,
- Node->pe_Name);
-}
-
-void PListEntryRemoveDir(PListEntry *Node,FILE *Out)
-
-{
- (void)fprintf(Out,"@dirrm %s\n",Node->pe_Name);
-}
-
-void ProcessPList(PListEntry *Tree,PListEntryFunc Func,int Order,FILE *Out)
-
-{
- while (Tree!=NULL)
- {
- if (Tree->pe_Childs[Order]!=NULL)
- ProcessPList(Tree->pe_Childs[Order],Func,Order,Out);
- Func(Tree,Out);
- Tree=Tree->pe_Childs[1-Order];
- }
-}
-
-char **ArrayAdd(char **Array,char *String)
-
-{
- int Old;
-
- Old=0;
- if (Array!=NULL) while (Array[Old]!=NULL) Old++;
- if ((Array=realloc(Array,sizeof(char *)*(Old+2)))==NULL) return NULL;
-
- Array[Old++]=String;
- Array[Old]=NULL;
-
- return Array;
-}
-
-void Usage(void)
-
-{
- (void)fprintf(stderr,
- "Usage: %s [-d directory] [-f packlist] [[-i ignorepath] ...]\n"
- " [-p prefix] [-s strippath] rpmfile [...]\n",
- __progname);
- exit(EXIT_FAILURE);
-}
-
-int SkipAndAlign(gzFile In,long Skip)
-
-{
- z_off_t Pos,NewPos;
-
- if ((Pos=gztell(In))<0) return FALSE;
-
- NewPos=(Pos+Skip+3)&(~3);
- return ((Pos==NewPos)||(gzseek(In,NewPos,SEEK_SET)==NewPos));
-}
-
-char *GetData(gzFile In,long Length)
-
-{
- char *Ptr;
-
- if ((Ptr=malloc(Length+1))!=NULL)
- {
- if (GZREAD(In,Ptr,Length)&&SkipAndAlign(In,0))
- {
- Ptr[Length]='\0';
- return Ptr;
- }
- free(Ptr);
- }
-
- return NULL;
-}
-
-int GetCPIOHeader(gzFile In,long *Fields,char **Name)
-
-{
- char Buffer[CPIO_NUM_HEADERS*CPIO_FIELD_LENGTH];
- char *Ptr;
- int Index;
- long Value;
-
- *Name=NULL;
-
- if (!GZREAD(In,Buffer,sizeof(CPIOMagic))) return FALSE;
- if (memcmp(Buffer,CPIOMagic,sizeof(CPIOMagic))!=0) return FALSE;
-
- if (gzread(In,Buffer,sizeof(Buffer))!=sizeof(Buffer)) return FALSE;
- Ptr=Buffer;
- Index=sizeof(Buffer);
- Value=0;
- while (Index-->0)
- {
- Value<<=4;
- if ((*Ptr>='0')&&(*Ptr<='9')) Value+=(long)(*Ptr++-'0');
- else
- if ((*Ptr>='A')&&(*Ptr<='F')) Value+=(long)(*Ptr++-'A')+10;
- else
- if ((*Ptr>='a')&&(*Ptr<='f')) Value+=(long)(*Ptr++-'a')+10;
- else return FALSE;
-
- if ((Index%CPIO_FIELD_LENGTH)==0)
- {
- *Fields++=Value;
- Value=0;
- }
- }
-
- Value=Fields[CPIO_HDR_NAMESIZE-CPIO_NUM_HEADERS];
- if ((*Name=GetData(In,Value))==NULL) return FALSE;
- return ((*Name)[Value-1]=='\0');
-}
-
-mode_t ConvertMode(long CPIOMode)
-
-{
- mode_t Mode;
- int Index;
-
- Mode=0;
- Index=0;
- while (ModeMapTab[Index].mm_CPIOMode!=0)
- {
- if ((CPIOMode&ModeMapTab[Index].mm_CPIOMode)!=0)
- Mode|=ModeMapTab[Index].mm_SysMode;
- Index++;
- }
-
- return Mode;
-}
-
-int MakeTargetDir(char *Name,PListEntry **Dirs,int MarkNonEmpty)
-
-{
- char *Basename;
- PListEntry *Dir;
- struct stat Stat;
- int Result;
-
- if ((Basename=strrchr(Name,'/'))==NULL) return TRUE;
-
- *Basename='\0';
- if ((Dir=FindPListEntry(*Dirs,Name))!=NULL)
- {
- *Basename='/';
- Dir->pe_DirEmpty=!MarkNonEmpty;
- return TRUE;
- }
-
- if (!MakeTargetDir(Name,Dirs,TRUE))
- {
- *Basename='/';
- return FALSE;
- }
-
- if (stat(Name,&Stat)==0) Result=S_ISDIR(Stat.st_mode);
- else
- if (errno!=ENOENT) Result=FALSE;
- else
- if ((Result=(mkdir(Name,S_IRWXU|S_IRWXG|S_IRWXO)==0)))
- InsertPListEntry(Dirs,Name)->pe_DirMode=S_IRWXU|S_IRWXG|S_IRWXO;
-
- *Basename='/';
- return Result;
-}
-
-char *StrCat(char *Prefix,char *Suffix)
-
-{
- int Length;
- char *Str;
-
- Length=strlen(Prefix);
- if ((Str=malloc(Length+strlen(Suffix)+1))!=NULL)
- {
- (void)memcpy(Str,Prefix,Length);
- (void)strcpy(&Str[Length],Suffix);
- }
- return Str;
-}
-
-int MakeDir(char *Name,mode_t Mode,int *OldDir)
-
-{
- struct stat Stat;
-
- *OldDir=FALSE;
- if (mkdir(Name,Mode)==0) return TRUE;
-
- if ((errno!=EEXIST)||
- (lstat(Name,&Stat)<0)||
- !S_ISDIR(Stat.st_mode)) return FALSE;
-
- *OldDir=TRUE;
- return TRUE;
-}
-
-int MakeSymLink(char *Link,char *Name)
-
-{
- struct stat Stat;
-
- if (symlink(Link,Name)==0) return TRUE;
-
- if ((errno!=EEXIST)||
- (lstat(Name,&Stat)<0)||
- !S_ISLNK(Stat.st_mode)) return FALSE;
-
- return ((unlink(Name)==0)&&(symlink(Link,Name)==0));
-}
-
-int WriteFile(gzFile In,char *Name,mode_t Mode,long Length,char *Link)
-
-{
- int Out;
- struct stat Stat;
- static void *Buffer=NULL;
- static long BufferSize=0;
-
- if (lstat(Name,&Stat)==0)
- if (!S_ISREG(Stat.st_mode)||(unlink(Name)<0)) return FALSE;
-
- if (Buffer==NULL)
- {
- BufferSize=sysconf(_SC_PAGESIZE)*256;
- if ((Buffer=malloc(BufferSize))==NULL) return FALSE;
- }
-
- if (Link!=NULL)
- {
- if (link(Link,Name)<0) return FALSE;
- Out=open(Name,O_WRONLY,Mode);
- }
- else Out=open(Name,O_WRONLY|O_CREAT,Mode);
- if (Out<0) return FALSE;
-
- while (Length>0)
- {
- long Chunk;
-
- Chunk=(Length>BufferSize)?BufferSize:Length;
- if (!GZREAD(In,Buffer,Chunk)) break;
- if (write(Out,Buffer,Chunk)!=Chunk) break;
- Length-=Chunk;
- }
-
- if ((close(Out)==0)&&(Length==0)) return SkipAndAlign(In,0);
-
- (void)unlink(Name);
- return FALSE;
-}
-
-void CheckSymLinks(PListEntry **Links,PListEntry **Files,PListEntry **Dirs)
-
-{
- PListEntry *Link;
- struct stat Stat;
-
- while ((Link=*Links)!=NULL)
- {
- PListEntry *Ptr;
- char *Basename;
-
- if (Link->pe_Left!=NULL)
- CheckSymLinks(&Link->pe_Left,Files,Dirs);
-
- if ((stat(Link->pe_Name,&Stat)<0)||!S_ISREG(Stat.st_mode))
- {
- Links=&Link->pe_Right;
- continue;
- }
-
- (void)InsertPListEntry(Files,Link->pe_Name);
- if ((Basename=strrchr(Link->pe_Name,'/'))!=NULL)
- {
- *Basename='\0';
- if ((Ptr=FindPListEntry(*Dirs,Link->pe_Name))!=NULL)
- Ptr->pe_DirEmpty=FALSE;
- }
-
- if (Link->pe_Right==NULL)
- {
- *Links=Link->pe_Left;
- free(Link);
- break;
- }
-
- *Links=Link->pe_Right;
- Ptr=Link->pe_Left;
- free(Link);
-
- if (Ptr==NULL) continue;
-
- Link=*Links;
- while (Link->pe_Left!=NULL) Link=Link->pe_Left;
- Link->pe_Left=Ptr;
- }
-}
-
-int main(int argc,char **argv)
-
-{
- FILE *PList;
- char **Ignore,*Prefix;
- int Opt,Index,FD,IsSource,PathIndex,StripPath;
- PListEntry *Files,*Links,*Dirs;
- Header Hdr;
- gzFile In;
-
- PList=NULL;
- Ignore=NULL;
- Prefix=NULL;
- StripPath = 0;
- while ((Opt=getopt(argc,argv,"s:d:f:i:p:"))!=-1)
- switch (Opt)
- {
- case 's':
- StripPath=atoi(optarg);
- if (StripPath == 0) {
- fprintf(stderr,"Warning: -s argument to %s should be a positive integer, ignoring supplied argument\n",argv[Index]);
- }
- break;
- case 'f':
- if (PList!=NULL) (void)fclose(PList);
- if ((PList=fopen(optarg,"a"))==NULL)
- {
- perror(optarg);
- return EXIT_FAILURE;
- }
- break;
- case 'i':
- if ((Ignore=ArrayAdd(Ignore,optarg))==NULL)
- {
- perror(__progname);
- exit(EXIT_FAILURE);
- }
- break;
- case 'd':
- if (chdir(optarg))
- {
- perror(optarg);
- return EXIT_FAILURE;
- }
- break;
- case 'p':
- Prefix=optarg;
- break;
- default:
- Usage();
- }
-
- if (Prefix!=NULL)
- {
- int Length;
-
- Length=strlen(Prefix);
- if (Length==0) Prefix=NULL;
- else
- if ((Prefix[Length-1]!='/')&&((Prefix=StrCat(Prefix,"/"))==NULL))
- {
- perror(__progname);
- exit(EXIT_FAILURE);
- }
- }
-
- argc-=optind;
- argv+=optind;
- if (argc==0) Usage();
-
- Files=NULL;
- Links=NULL;
- Dirs=NULL;
- for (Index=0; Index<argc; Index++)
- {
- PListEntry *Last;
-
- if ((FD=open(argv[Index],O_RDONLY,0))<0)
- {
- perror(argv[Index]);
- return EXIT_FAILURE;
- }
-
- switch (rpmReadPackageHeader(FD,&Hdr,&IsSource,NULL,NULL))
- {
- case 0:
- break;
- case 1:
- (void)fprintf(stderr,"%s: file is not an RPM package.\n",argv[Index]);
- return EXIT_FAILURE;
- default:
- (void)fprintf(stderr,"%s: error reading header.\n",argv[Index]);
- return EXIT_FAILURE;
- }
-
- if ((In=gzdopen(FD,"r"))==NULL)
- {
- (void)fprintf(stderr,"%s: cannot read cpio data.\n",argv[Index]);
- return EXIT_FAILURE;
- }
-
- Last=NULL;
- for (;;)
- {
- long Fields[CPIO_NUM_HEADERS];
- char *Name;
- char *NewName;
- char *TmpName;
- mode_t Mode;
- long Length;
-
- if (!GetCPIOHeader(In,Fields,&Name))
- {
- (void)fprintf(stderr,"%s: error in cpio header.\n",argv[Index]);
- return EXIT_FAILURE;
- }
- if (strcmp(Name,CPIO_END_MARKER)==0)
- {
- free(Name);
- break;
- }
- if (*Name=='\0') Fields[CPIO_HDR_MODE]=0;
-
- if (Ignore!=NULL)
- {
- char **Ptr;
-
- Ptr=Ignore;
- while (*Ptr!=NULL)
- {
- int Length;
-
- Length=strlen(*Ptr);
- if ((strncmp(*Ptr,Name,Length)==0)&&
- ((Name[Length]=='\0')||(Name[Length]=='/'))) break;
- else Ptr++;
- }
- if (*Ptr!=NULL) Fields[CPIO_HDR_MODE]=0;
- }
-
- for (PathIndex=1; PathIndex<=StripPath; PathIndex++) {
- NewName=Name;
- do {
- NewName++;
- if (NewName[0]=='\0') {
- fprintf(stderr,"%s: Leading path to strip too big (-s %d)\n",
- argv[Index], StripPath);
- return EXIT_FAILURE;
- }
- } while (NewName[0]!='/');
- NewName++; /* We ended up with a leading /, and this must disapear */
- TmpName=malloc(strlen(NewName));
- if (TmpName==NULL)
- {
- perror(__progname);
- exit(EXIT_FAILURE);
- }
- strcpy(TmpName, NewName);
- free(Name);
- Name=TmpName;
- }
-
- if (Prefix!=NULL)
- {
- char *Fullname;
-
- if ((Fullname=StrCat(Prefix,Name))==NULL)
- {
- perror(__progname);
- exit(EXIT_FAILURE);
- }
- free(Name);
- Name=Fullname;
- }
-
- Mode=ConvertMode(Fields[CPIO_HDR_MODE]);
- Length=Fields[CPIO_HDR_FILESIZE];
- switch (Fields[CPIO_HDR_MODE]&CP_IFMT)
- {
- case C_ISDIR:
- {
- PListEntry *Dir;
- int OldDir;
-
- if (Length!=0)
- {
- (void)fprintf(stderr,"%s: error in cpio file.\n",argv[Index]);
- return EXIT_FAILURE;
- }
- if (!MakeTargetDir(Name,&Dirs,TRUE))
- {
- (void)fprintf(stderr,
- "%s: can't create parent directories for \"%s\".\n",
- argv[Index],
- Name);
- return EXIT_FAILURE;
- }
-
- if (!MakeDir(Name,Mode,&OldDir))
- {
- (void)fprintf(stderr,
- "%s: can't create directory \"%s\".\n",
- argv[Index],
- Name);
- return EXIT_FAILURE;
- }
-
- if (!OldDir)
- {
- Dir=InsertPListEntry(&Dirs,Name);
- Dir->pe_DirEmpty=TRUE;
- Dir->pe_DirMode=Mode;
- }
- break;
- }
- case C_ISLNK:
- {
- char *Link;
- struct stat Stat;
-
- if ((Link=GetData(In,Length))==NULL)
- {
- (void)fprintf(stderr,"%s: error in cpio file.\n",argv[Index]);
- return EXIT_FAILURE;
- }
-
- if (!MakeTargetDir(Name,&Dirs,FALSE))
- {
- (void)fprintf(stderr,
- "%s: can't create parent directories for \"%s\".\n",
- argv[Index],
- Name);
- return EXIT_FAILURE;
- }
-
- if (*Link=='/')
- {
- char *Ptr;
-
- (void)strcpy(Link,Link+1);
- Ptr=Name;
- if (Prefix!=NULL) Ptr+=strlen(Prefix);
- while ((Ptr=strchr(Ptr,'/'))!=NULL)
- {
- char *NewLink;
-
- if ((NewLink=StrCat("../",Link))==NULL)
- {
- perror(__progname);
- return EXIT_FAILURE;
- }
- free(Link);
- Link=NewLink;
-
- Ptr++;
- }
- }
- if (!MakeSymLink(Link,Name))
- {
- (void)fprintf(stderr,
- "%s: can't create symbolic link \"%s\".\n",
- argv[Index],
- Name);
- return EXIT_FAILURE;
- }
-
- InsertPListEntry(&Links,Name)->pe_Link=Link;
- break;
- }
- case C_ISREG:
- if (!MakeTargetDir(Name,&Dirs,TRUE))
- {
- (void)fprintf(stderr,
- "%s: can't create parent directories for \"%s\".\n",
- argv[Index],
- Name);
- return EXIT_FAILURE;
- }
-
- if ((Last!=NULL)&&(Last->pe_INode!=Fields[CPIO_HDR_INODE]))
- Last=NULL;
-
- if (!WriteFile(In,Name,Mode,Length,(Last!=NULL)?Last->pe_Name:NULL))
- {
- (void)fprintf(stderr,
- "%s: can't write file \"%s\".\n",
- argv[Index],
- Name);
- return EXIT_FAILURE;
- }
-
- Last=InsertPListEntry(&Files,Name);
- Last->pe_INode=Fields[CPIO_HDR_INODE];
- break;
- default:
- if ((Length>0)&&(gzseek(In,(Length+3)&(~3),SEEK_CUR)<0)) break;
- }
-
- free(Name);
- }
-
- (void)gzclose(In);
- (void)close(FD);
- }
-
- if (PList!=NULL)
- {
- ProcessPList(Files,PListEntryFile,PLIST_ORDER_FORWARD,PList);
- ProcessPList(Dirs,PListEntryMakeDir,PLIST_ORDER_FORWARD,PList);
- ProcessPList(Links,PListEntryLink,PLIST_ORDER_FORWARD,PList);
- ProcessPList(Dirs,PListEntryRemoveDir,PLIST_ORDER_BACKWARD,PList);
- (void)fclose(PList);
- }
-
- return EXIT_SUCCESS;
-}