home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #20 / NN_1992_20.iso / spool / gnu / utils / bug / 1537 < prev    next >
Encoding:
Text File  |  1992-09-10  |  9.9 KB  |  359 lines

  1. Newsgroups: gnu.utils.bug
  2. Path: sparky!uunet!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!cadlab.CAdlab.DE!joost
  3. From: joost@cadlab.CAdlab.DE (Michael Joosten)
  4. Subject: Re: GNU make-3.62, SVR4 and long filenames
  5. Message-ID: <JOOST.92Sep10194258@ori.cadlab.de>
  6. Sender: gnulists@ai.mit.edu
  7. Reply-To: joost@cadlab.cadlab.de
  8. Organization: CADLAB, Paderborn, FRG
  9. References: joost@cadlab.CAdlab.DE (Michael Joosten)
  10. Distribution: gnu
  11. Date: Thu, 10 Sep 1992 18:42:58 GMT
  12. Approved: bug-gnu-utils@prep.ai.mit.edu
  13. Lines: 344
  14.  
  15. In article <JOOST.92Sep9210420@ori.cadlab.de> joost@cadlab.CAdlab.DE (Michael Joosten) writes:
  16.  
  17.    again. Eventually I discovered that SVR4 has a special extension for archives,
  18.    allowing them to store filenames longer than 15 chars. This is made by a
  19.    special entry '/' (that is "//<8spaces here>") that contains a "filename
  20.    table". The code in arscan.c doesn't know about that and is thus failing for
  21.    archive files with longer names. 
  22.  
  23. Well, it wasn't really difficult, the most complicated part was to merge the
  24. #ifdef's (the best would be to separate the AIX AIAMAG stuff in a separate
  25. function). Here it a patch, combined with Chip Salzenberg's patches for SCO :
  26.  
  27. Note: Now you need also "-DUSGr4" in the "defines" variable in the Makefile:
  28. defines =-O -DUSG -DUSGr3 -DUSGr4 -DHAVE_SYS_WAIT -DPOSIX -DENUM_BITFIELD #for SysVR4
  29.  
  30. Michael
  31.  
  32. *** arscan.c    Wed Oct 23 02:30:25 1991
  33. --- /sun4_fw2/joost/arscan.c    Thu Sep 10 19:19:43 1992
  34. ***************
  35. *** 43,48 ****
  36. --- 43,52 ----
  37.   #define    ANSI_STRING
  38.   #else    /* No standard headers.  */
  39.   
  40. + #ifdef USGr4
  41. + #include <ctype.h>
  42. + #endif
  43.   #ifdef    USG
  44.   
  45.   #include <string.h>
  46. ***************
  47. *** 70,82 ****
  48.   #endif    /* Standard headers.  */
  49.   
  50.   #ifdef    ANSI_STRING
  51.   #define    index(s, c)    strchr((s), (c))
  52.   #define    rindex(s, c)    strrchr((s), (c))
  53.   
  54.   #define bcmp(s1, s2, n)    memcmp ((s1), (s2), (n))
  55.   #define bzero(s, n)    memset ((s), 0, (n))
  56.   #define bcopy(s, d, n)    memcpy ((d), (s), (n))
  57. ! #endif    ANSI_STRING
  58.   #undef    ANSI_STRING
  59.   
  60.   
  61. --- 74,90 ----
  62.   #endif    /* Standard headers.  */
  63.   
  64.   #ifdef    ANSI_STRING
  65. + #ifndef index
  66.   #define    index(s, c)    strchr((s), (c))
  67. + #endif
  68. + #ifndef rindex
  69.   #define    rindex(s, c)    strrchr((s), (c))
  70. + #endif
  71.   
  72.   #define bcmp(s1, s2, n)    memcmp ((s1), (s2), (n))
  73.   #define bzero(s, n)    memset ((s), 0, (n))
  74.   #define bcopy(s, d, n)    memcpy ((d), (s), (n))
  75. ! #endif    /* ANSI_STRING */
  76.   #undef    ANSI_STRING
  77.   
  78.   
  79. ***************
  80. *** 135,140 ****
  81. --- 143,153 ----
  82.   #ifdef AIAMAG
  83.     FL_HDR fl_header;
  84.   #endif
  85. + #ifdef USGr4
  86. +   char *name_table = (char*)0;
  87. +   char *real_name = (char*)0;
  88. +   extern char *malloc();
  89. + #endif
  90.     register int desc = open (archive, O_RDONLY, 0);
  91.     if (desc < 0)
  92.       return -1;
  93. ***************
  94. *** 160,169 ****
  95.     }
  96.   #else
  97.     {
  98. ! #ifndef M_XENIX
  99. !     int buf;
  100. ! #else
  101.       unsigned short int buf;
  102.   #endif
  103.       register int nread = read(desc, &buf, sizeof (buf));
  104.       if (nread != sizeof (buf) || buf != ARMAG)
  105. --- 173,182 ----
  106.     }
  107.   #else
  108.     {
  109. ! #if defined(M_XENIX) && !defined(M_UNIX)
  110.       unsigned short int buf;
  111. + #else
  112. +     int buf;
  113.   #endif
  114.       register int nread = read(desc, &buf, sizeof (buf));
  115.       if (nread != sizeof (buf) || buf != ARMAG)
  116. ***************
  117. *** 187,197 ****
  118.       sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset);
  119.       sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset);
  120.   #else
  121. ! #ifndef    M_XENIX
  122. !     register long int member_offset = sizeof (int);
  123. ! #else    /* Xenix.  */
  124.       register long int member_offset = sizeof (unsigned short int);
  125. ! #endif    /* Not Xenix.  */
  126.   #endif
  127.   #endif
  128.   
  129. --- 200,210 ----
  130.       sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset);
  131.       sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset);
  132.   #else
  133. ! #if defined(M_XENIX) && !defined(M_UNIX)
  134.       register long int member_offset = sizeof (unsigned short int);
  135. ! #else    /* Not Xenix.  */
  136. !     register long int member_offset = sizeof (int);
  137. ! #endif    /* Xenix.  */
  138.   #endif
  139.   #endif
  140.   
  141. ***************
  142. *** 215,220 ****
  143. --- 228,236 ----
  144.       if (lseek (desc, member_offset, 0) < 0)
  145.         {
  146.           (void) close (desc);
  147. + #ifdef USGr4
  148. +             if (name_table) free(name_table);
  149. + #endif
  150.           return -2;
  151.         }
  152.   
  153. ***************
  154. *** 254,260 ****
  155.                  dateval, uidval, gidval,
  156.                  eltmode, arg);
  157.   
  158. ! #else
  159.       nread = read (desc, (char *) &member_header, sizeof (struct ar_hdr));
  160.       if (nread == 0)
  161.         /* No data left means end of file; that is OK.  */
  162. --- 270,276 ----
  163.                  dateval, uidval, gidval,
  164.                  eltmode, arg);
  165.   
  166. ! #else /* ! AIAMAG */
  167.       nread = read (desc, (char *) &member_header, sizeof (struct ar_hdr));
  168.       if (nread == 0)
  169.         /* No data left means end of file; that is OK.  */
  170. ***************
  171. *** 267,272 ****
  172. --- 283,291 ----
  173.           )
  174.         {
  175.           (void) close (desc);
  176. + #ifdef USGr4
  177. +             if (name_table) free(name_table);
  178. + #endif
  179.           return -2;
  180.         }
  181.   
  182. ***************
  183. *** 281,313 ****
  184.   #endif
  185.       }
  186.   
  187. ! #ifndef    M_XENIX
  188. !     sscanf (member_header.ar_mode, "%o", &eltmode);
  189. !     eltsize = atol (member_header.ar_size);
  190. ! #else    /* Xenix.  */
  191. !     eltmode = (unsigned short int) member_header.ar_mode;
  192. !     eltsize = member_header.ar_size;
  193. ! #endif    /* Not Xenix.  */
  194.       fnval =
  195.         (*function) (desc, name, member_offset,
  196.                  member_offset + sizeof (member_header), eltsize,
  197. ! #ifndef    M_XENIX
  198. !                atol (member_header.ar_date),
  199. !                atoi (member_header.ar_uid),
  200. !                atoi (member_header.ar_gid),
  201. ! #else    /* Xenix.  */
  202. !                member_header.ar_date,
  203. !                member_header.ar_uid,
  204. !                member_header.ar_gid,
  205. ! #endif    /* Not Xenix.  */
  206.                  eltmode, arg);
  207.   
  208.   #endif  /* Not AIAMAG */
  209.   
  210.       if (fnval)
  211.         {
  212.           (void) close (desc);
  213.           return fnval;
  214.         }
  215.   
  216. --- 300,381 ----
  217.   #endif
  218.       }
  219.   
  220. ! #if   defined(M_XENIX) && !defined(M_UNIX)
  221. !       eltmode = (unsigned short int) member_header.ar_mode;
  222. !       eltsize = member_header.ar_size;
  223. ! #else /* Not Xenix.  */
  224. !       sscanf (member_header.ar_mode, "%o", &eltmode);
  225. !       eltsize = atol (member_header.ar_size);
  226. ! #endif        /* Xenix.  */
  227. ! #ifdef USGr4
  228. !         if (name[0] == '/' && name[1] == '\0') {
  229. !             /* this name indicates a SVR4 extension, the string table
  230. !              * of long (>15) file names. just read it in an appropriate
  231. !              * space for later use (mj) */
  232. !             register char *p;
  233. !             if (name_table) free(name_table);
  234. !             name_table = malloc((int)eltsize);
  235. !             nread = read(desc, name_table, eltsize);
  236. !             if (nread <= 0 || nread != eltsize) {
  237. !                 free(name_table);
  238. !                 (void) close (desc);
  239. !                 return -2;
  240. !             }
  241. !             fnval = 0;
  242. !             p = name_table+(int)eltsize;
  243. !             while (p > name_table)
  244. !                 if (*--p == '/') *p = '\0';
  245. !             
  246. !         }
  247. !         else {
  248. !             if (name[0] == '/' && isdigit(name[1])) {
  249. !                 /* this is (was) a long file name. instead of the name the
  250. !                  * decimal index of the string in the string table is 
  251. !                  * stored.  (mj) */
  252. !                 long offset = atol(name+1);
  253. !                 if (offset < 0) {
  254. !                     free(name_table);
  255. !                     (void) close (desc);
  256. !                     return -2;
  257. !                 }
  258. !                 real_name = &name_table[offset];
  259. !             }
  260. !             else real_name = name;
  261. !             fnval =
  262. !                 (*function) (desc, real_name, member_offset,
  263. !                              member_offset + sizeof (member_header), eltsize,
  264. !                              atol (member_header.ar_date),
  265. !                              atoi (member_header.ar_uid),
  266. !                              atoi (member_header.ar_gid),
  267. !                              eltmode, arg);
  268. !         }
  269. ! #else
  270. !             
  271.       fnval =
  272.         (*function) (desc, name, member_offset,
  273.                  member_offset + sizeof (member_header), eltsize,
  274. ! #if   defined(M_XENIX) && !defined(M_UNIX)
  275. !                      member_header.ar_date,
  276. !                      member_header.ar_uid,
  277. !                      member_header.ar_gid,
  278. ! #else /* Not Xenix.  */
  279. !                      atol (member_header.ar_date),
  280. !                      atoi (member_header.ar_uid),
  281. !                      atoi (member_header.ar_gid),
  282. ! #endif        /* Xenix.  */
  283.                  eltmode, arg);
  284.   
  285. + #endif  /* ! USGr4 */
  286.   #endif  /* Not AIAMAG */
  287.   
  288.       if (fnval)
  289.         {
  290.           (void) close (desc);
  291. + #ifdef USGr4
  292. +             if (name_table) free(name_table);
  293. + #endif
  294.           return fnval;
  295.         }
  296.   
  297. ***************
  298. *** 330,335 ****
  299. --- 398,406 ----
  300.     }
  301.   
  302.     close (desc);
  303. + #ifdef USGr4
  304. +   if (name_table) free(name_table);
  305. + #endif
  306.     return 0;
  307.   }
  308.   
  309. ***************
  310. *** 346,352 ****
  311.     if (p != 0)
  312.       name = p + 1;
  313.   
  314. ! #ifndef    APOLLO
  315.   
  316.     if (!strncmp (name, mem, AR_NAMELEN))
  317.       return 1;
  318. --- 417,424 ----
  319.     if (p != 0)
  320.       name = p + 1;
  321.   
  322. ! #if !defined(APOLLO) && !defined(USGr4)  /* SVR4 & APOLLO have long 
  323. !                                           * member names (mj) */
  324.   
  325.     if (!strncmp (name, mem, AR_NAMELEN))
  326.       return 1;
  327. ***************
  328. *** 365,371 ****
  329.       }
  330.     return 0;
  331.   
  332. ! #else    /* APOLLO.  */
  333.     return !strcmp (name, mem);
  334.   #endif
  335.   }
  336. --- 437,443 ----
  337.       }
  338.     return 0;
  339.   
  340. ! #else    /* APOLLO, USGr4  */
  341.     return !strcmp (name, mem);
  342.   #endif
  343.   }
  344. --
  345.  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  346. | Michael Joosten   |       Tel.  : (+49) (+) 5251-284 120                 |
  347. | CADLAB            |       Fax   : (+49) (+) 5251-284 140                 |
  348. | Bahnhofstr. 32    |       E-Mail: joost@cadlab.de                        |
  349. | D-4790 Paderborn  |                ...!uunet!unido!cadlab!joost           | 
  350. | FRG               | Mass mail to: joost@pbinfo.uni-paderborn.de          |
  351. |--------------------------------------------------------------------------|
  352. | CADLAB is a cooperation between Uni-GH Paderborn & SNI AG                |
  353.  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  354.  
  355.