diff options
-rw-r--r-- | arscan.c | 70 |
1 files changed, 31 insertions, 39 deletions
@@ -29,25 +29,13 @@ (System V Release 1). There is no default, one or the other must be defined to have a nonzero value. */ -#if (defined(sun386) || defined(USGr3) || defined(HPUX) \ - && !defined(PORTAR) && !defined(PORT5AR)) +#if (!defined (PORTAR) || PORTAR == 0) && (!defined (PORT5AR) || PORT5AR == 0) +#undef PORTAR #define PORTAR 1 #endif #include <ar.h> -#ifndef AIAMAG -#if (defined(APOLLO) || defined(HPUX) || defined(hpux) || \ - (PORTAR == 1 && (defined(USGr3) || defined(u3b2) || defined(sun386)))) -#define AR_NAMELEN 14 -#define AR_TRAILING_SLASH /* Member names have a trailing slash. */ -#else -#define AR_NAMELEN 15 -#endif -#else /* AIX. */ -#define AR_NAMELEN 255 -#endif - /* Cray's <ar.h> apparently defines this. */ #ifndef AR_HDR_SIZE #define AR_HDR_SIZE (sizeof (struct ar_hdr)) @@ -153,7 +141,7 @@ ar_scan (archive, function, arg) register int nread; struct ar_hdr member_header; #ifdef AIAMAG - char name[AR_NAMELEN + 1]; + char name[256]; int name_len; long int dateval; int uidval, gidval; @@ -172,8 +160,7 @@ ar_scan (archive, function, arg) } #ifdef AIAMAG -#define AR_MEMHDR \ - (AR_HDR_SIZE - sizeof (member_header._ar_name)) +#define AR_MEMHDR (AR_HDR_SIZE - sizeof (member_header._ar_name)) nread = read (desc, (char *) &member_header, AR_MEMHDR); if (nread != AR_MEMHDR) @@ -207,7 +194,7 @@ ar_scan (archive, function, arg) dateval, uidval, gidval, eltmode, arg); -#else +#else /* Not AIAMAG. */ nread = read (desc, (char *) &member_header, AR_HDR_SIZE); if (nread == 0) /* No data left means end of file; that is OK. */ @@ -228,10 +215,10 @@ ar_scan (archive, function, arg) register char *p = name + sizeof member_header.ar_name; while (p > name && *--p == ' ') *p = '\0'; -#ifdef AR_TRAILING_SLASH + + /* On some systems, there is a slash after each member name. */ if (*p == '/') *p = '\0'; -#endif } #ifndef M_XENIX @@ -256,7 +243,7 @@ ar_scan (archive, function, arg) #endif /* Not Xenix. */ eltmode, arg); -#endif /* Not AIAMAG */ +#endif /* AIAMAG. */ if (fnval) { @@ -265,8 +252,9 @@ ar_scan (archive, function, arg) } #ifdef AIAMAG - if (member_offset == last_member_offset) /* end of chain? */ - break; + if (member_offset == last_member_offset) + /* End of the chain. */ + break; sscanf (member_header.ar_nxtmem, "%12ld", &member_offset); @@ -277,7 +265,8 @@ ar_scan (archive, function, arg) } #else member_offset += AR_HDR_SIZE + eltsize; - if (member_offset & 1) member_offset++; + if (member_offset % 2 != 0) + member_offset++; #endif } } @@ -294,32 +283,35 @@ ar_name_equal (name, mem) char *name, *mem; { char *p; + unsigned int namelen, memlen; + struct ar_hdr h; + unsigned int max = sizeof (h.ar_name); p = rindex (name, '/'); if (p != 0) name = p + 1; -#ifndef APOLLO +#if !defined (AIAMAG) && !defined (APOLLO) - if (!strncmp (name, mem, AR_NAMELEN)) - return 1; + /* `reallylongname.o' matches `reallylongnam.o'. + If member names have a trailing slash, that's `reallylongna.o'. */ - if (!strncmp (name, mem, AR_NAMELEN - 2)) - { - unsigned int namelen, memlen; + if (strncmp (name, mem, max - 3)) + return 0; - namelen = strlen (name); - memlen = strlen (mem); + namelen = strlen (name); + memlen = strlen (mem); + if (namelen > memlen && memlen >= max - 1 + && name[namelen - 2] == '.' && name[namelen - 1] == 'o' + && mem[memlen - 2] == '.' && mem[memlen - 1] == 'o') + return 1; - if (memlen == AR_NAMELEN - && mem[AR_NAMELEN - 2] == '.' && mem[AR_NAMELEN - 1] == 'o' - && name[namelen - 2] == '.' && name[namelen -1] == 'o') - return 1; - } - return 0; + return !strncmp (name + max - 3, mem + max - 3); + +#else /* AIX or APOLLO. */ -#else /* APOLLO. */ return !strcmp (name, mem); + #endif } |