From 8161355772d614d893d72499ba90601dae1bde32 Mon Sep 17 00:00:00 2001 From: tron Date: Mon, 9 Dec 2002 15:16:26 +0000 Subject: Add proper handling for hardlinks. This fixes e.g. the zero byte locale files in the "suse_base" package causing error messages like this: Gdk-WARNING **: locale not supported by C library Bump version number to 1.3. --- pkgtools/rpm2pkg/Makefile | 4 ++-- pkgtools/rpm2pkg/files/rpm2pkg.c | 29 +++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/pkgtools/rpm2pkg/Makefile b/pkgtools/rpm2pkg/Makefile index e2a6f31c357..3b6d902a55a 100644 --- a/pkgtools/rpm2pkg/Makefile +++ b/pkgtools/rpm2pkg/Makefile @@ -1,6 +1,6 @@ -# $NetBSD: Makefile,v 1.15 2002/10/20 23:23:53 jlam Exp $ +# $NetBSD: Makefile,v 1.16 2002/12/09 15:16:26 tron Exp $ -DISTNAME= rpm2pkg-1.2 +DISTNAME= rpm2pkg-1.3 CATEGORIES= pkgtools MASTER_SITES= # empty DISTFILES= # empty diff --git a/pkgtools/rpm2pkg/files/rpm2pkg.c b/pkgtools/rpm2pkg/files/rpm2pkg.c index 427312169b0..6fead0ac2a3 100644 --- a/pkgtools/rpm2pkg/files/rpm2pkg.c +++ b/pkgtools/rpm2pkg/files/rpm2pkg.c @@ -1,6 +1,6 @@ /* - $NetBSD: rpm2pkg.c,v 1.2 2001/03/20 20:18:07 manu Exp $ + $NetBSD: rpm2pkg.c,v 1.3 2002/12/09 15:16:27 tron Exp $ */ @@ -23,6 +23,7 @@ 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 @@ -65,6 +66,7 @@ struct PListEntryStruct PListEntry *pe_Childs[2]; int pe_DirEmpty; mode_t pe_DirMode; + long pe_INode; char *pe_Link; char pe_Name[1]; }; @@ -94,6 +96,7 @@ PListEntry *InsertPListEntry(PListEntry **Tree,char *Name) 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); @@ -347,7 +350,7 @@ int MakeSymLink(char *Link,char *Name) return ((unlink(Name)==0)&&(symlink(Link,Name)==0)); } -int WriteFile(gzFile In,char *Name,mode_t Mode,long Length) +int WriteFile(gzFile In,char *Name,mode_t Mode,long Length,char *Link) { int Out; @@ -364,7 +367,13 @@ int WriteFile(gzFile In,char *Name,mode_t Mode,long Length) if ((Buffer=malloc(BufferSize))==NULL) return FALSE; } - if ((Out=open(Name,O_WRONLY|O_CREAT,Mode))<=0) 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) { @@ -504,6 +513,8 @@ int main(int argc,char **argv) Dirs=NULL; for (Index=0; Indexpe_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", @@ -712,7 +728,9 @@ int main(int argc,char **argv) Name); return EXIT_FAILURE; } - (void)InsertPListEntry(&Files,Name); + + 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; @@ -736,4 +754,3 @@ int main(int argc,char **argv) return EXIT_SUCCESS; } - -- cgit v1.2.3