diff options
author | jlam <jlam> | 2003-07-16 09:33:46 +0000 |
---|---|---|
committer | jlam <jlam> | 2003-07-16 09:33:46 +0000 |
commit | e664449b954368894a4fd85edc962c90bc7b4903 (patch) | |
tree | 491111004206c0c3cb92ae9f1dd439e854e373be /pkgtools/rpm2pkg | |
parent | f6cad14a16265838094c96c2784856bdf35df1a9 (diff) | |
download | pkgsrc-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/DESCR | 3 | ||||
-rw-r--r-- | pkgtools/rpm2pkg/Makefile | 33 | ||||
-rw-r--r-- | pkgtools/rpm2pkg/PLIST | 3 | ||||
-rw-r--r-- | pkgtools/rpm2pkg/files/rpm2pkg.8 | 161 | ||||
-rw-r--r-- | pkgtools/rpm2pkg/files/rpm2pkg.c | 756 |
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; -} |