home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / windows / x / 14650 < prev    next >
Encoding:
Text File  |  1992-07-30  |  5.5 KB  |  220 lines

  1. Newsgroups: comp.windows.x
  2. Path: sparky!uunet!snorkelwacker.mit.edu!bloom-beacon!INTERNET!dont-send-mail-to-path-lines
  3. From: dbl@osf.ORG
  4. Subject: utils/progs: minor diffs to lndir.c to preserve links
  5. Message-ID: <9207301254.AA24306@moonbeam.osf.org>
  6. Sender: daemon@athena.mit.edu (Mr Background)
  7. Organization: The Internet
  8. Date: Thu, 30 Jul 1992 12:54:04 GMT
  9. Lines: 209
  10.  
  11.  
  12.  
  13. VERSION:
  14.     R5, public-patch-13
  15.  
  16. CLIENT MACHINE and OPERATING SYSTEM:
  17.     Sparc/SunOS 4.1.1
  18.  
  19. DISPLAY TYPE:
  20.  
  21. WINDOW MANAGER:
  22.  
  23. COMPILER:
  24.  
  25. AREA:
  26.     util/progs
  27.  
  28. SYNOPSIS:
  29.     In some cases it is useful to have lndir preserve values of links.
  30.  
  31. DESCRIPTION:
  32.  
  33. Normally for a directory such as this:
  34.  
  35. craft% ls -lR ../src
  36. total 8
  37. -rw-r--r--  1 david           8 Jul 29 22:12 A
  38. lrwxrwxrwx  1 david           1 Jul 29 22:13 B -> A
  39. lrwxrwxrwx  1 david          12 Jul 29 22:10 C -> /tmp/junkdir
  40. lrwxrwxrwx  1 david           8 Jul 29 22:14 D -> /tmp/non
  41. lrwxrwxrwx  1 david           1 Jul 29 22:17 E -> .
  42. lrwxrwxrwx  1 david          12 Jul 29 22:17 F -> /usr/bin/X11
  43. drwxr-xr-x  2 david         512 Jul 29 22:16 subdir
  44. drwxr-xr-x  2 david         512 Jul 29 22:16 subdir2
  45.  
  46. ./src/subdir:
  47. total 2
  48. lrwxrwxrwx  1 david           7 Jul 29 22:16 testB -> testing
  49. -rw-r--r--  1 david           6 Jul 29 22:03 testing
  50.  
  51. ./src/subdir2:
  52. total 1
  53. lrwxrwxrwx  1 david          17 Jul 29 22:16 testing -> ../subdir/testing
  54.  
  55.  
  56. the lndir binary will produce 
  57.  
  58.  
  59. craft% lndir ../src
  60. craft% ls -lR 
  61. total 8
  62. lrwxrwxrwx  1 david           8 Jul 29 22:18 A -> ../src/A
  63. lrwxrwxrwx  1 david           8 Jul 29 22:18 B -> ../src/B
  64. lrwxrwxrwx  1 david           8 Jul 29 22:18 C -> ../src/C
  65. lrwxrwxrwx  1 david           8 Jul 29 22:18 D -> ../src/D
  66. lrwxrwxrwx  1 david           8 Jul 29 22:18 E -> ../src/E
  67. lrwxrwxrwx  1 david           8 Jul 29 22:18 F -> ../src/F
  68. drwxr-xr-x  2 david         512 Jul 29 22:18 subdir
  69. drwxr-xr-x  2 david         512 Jul 29 22:18 subdir2
  70.  
  71. subdir:
  72. total 2
  73. lrwxrwxrwx  1 david          22 Jul 29 22:18 testB -> ../../src/subdir/testB
  74. lrwxrwxrwx  1 david          24 Jul 29 22:18 testing -> ../../src/subdir/testing
  75.  
  76. subdir2:
  77. total 1
  78. lrwxrwxrwx  1 david          25 Jul 29 22:18 testing -> ../../src/subdir2/testing
  79.  
  80.  
  81. but in many cases it is useful to preserve the structure of the link tree --
  82. if file A changes in the local tree, for example, B is not correctly "updated"
  83. but points back to the original tree.  It would be useful to have this happen:
  84.  
  85.  
  86. craft% newlndir -preserve ../src
  87. craft% ls -lR
  88. total 8
  89. lrwxrwxrwx  1 david           8 Jul 29 22:20 A -> ../src/A
  90. lrwxrwxrwx  1 david           1 Jul 29 22:20 B -> A
  91. lrwxrwxrwx  1 david          12 Jul 29 22:20 C -> /tmp/junkdir
  92. lrwxrwxrwx  1 david           8 Jul 29 22:20 D -> /tmp/non
  93. lrwxrwxrwx  1 david           1 Jul 29 22:20 E -> .
  94. lrwxrwxrwx  1 david          12 Jul 29 22:20 F -> /usr/bin/X11
  95. drwxr-xr-x  2 david         512 Jul 29 22:20 subdir
  96. drwxr-xr-x  2 david         512 Jul 29 22:20 subdir2
  97.  
  98. subdir:
  99. total 2
  100. lrwxrwxrwx  1 david           7 Jul 29 22:20 testB -> testing
  101. lrwxrwxrwx  1 david          24 Jul 29 22:20 testing -> ../../src/subdir/testing
  102.  
  103. subdir2:
  104. total 1
  105. lrwxrwxrwx  1 david          17 Jul 29 22:20 testing -> ../subdir/testing
  106.  
  107.  
  108. where files which are links in the original tree preserve their relative 
  109. structure.
  110.  
  111. REPEAT BY:
  112.  
  113. Here's the set of diffs I'm using:
  114.     - one of my goals was changing as little as possible; there is 
  115.         probably a way to do this optimizing calls to readlink
  116.     - hasn't been tested exhaustively; caveat emptor
  117.  
  118. David B. Lewis      Yet another new address!: david%craft@uunet.uu.net 
  119. "This is a war of engines and octanes. I drink to the American auto industry 
  120. and the American oil industry." -- Joseph Stalin, sometime during WWII.
  121.  
  122.  
  123. SAMPLE FIX:
  124.  
  125. apply to mit/util/progs/lndir.c:
  126.  
  127. *** lndir.c    Mon Jul 22 14:48:57 1991
  128. --- newlndir.c    Wed Jul 29 21:22:43 1992
  129. ***************
  130. *** 55,60 ****
  131. --- 55,61 ----
  132.   
  133.   extern int errno;
  134.   int silent;
  135. + int preserveLinks;
  136.   
  137.   void
  138.   quit (code, fmt, a1, a2, a3)
  139. ***************
  140. *** 162,167 ****
  141. --- 163,181 ----
  142.       }
  143.   
  144.       /* non-directory */
  145. +     if (preserveLinks)
  146. +     {
  147. +     int srclen;
  148. +     /* if the original file is a link, preserve the value */
  149. +     srclen = readlink(buf, symbuf, sizeof(symbuf) -1);
  150. +     if ((-1 != srclen) && (srclen > 0))
  151. +         {
  152. +         symbuf[srclen] = '\0';
  153. +         if (symlink (symbuf, dp->d_name) == 0) 
  154. +             continue;
  155. +         /* else fall through and handle normally */
  156. +         }
  157. +     }
  158.       if (symlink (buf, dp->d_name) < 0) {
  159.           int saverrno = errno;
  160.           int symlen;
  161. ***************
  162. *** 183,202 ****
  163.   int ac;
  164.   char **av;
  165.   {
  166. !     char *fn, *tn;
  167.       struct stat fs, ts;
  168.   
  169.       silent = 0;
  170. !     if (ac > 1 && !strcmp(av[1], "-silent")) {
  171.       silent = 1;
  172. !     }
  173. !     if (ac < silent + 2 || ac > silent + 3)
  174. !     quit (1, "usage: %s [-silent] fromdir [todir]", av[0]);
  175. !     fn = av[silent + 1];
  176. !     if (ac == silent + 3)
  177. !     tn = av[silent + 2];
  178.       else
  179.       tn = ".";
  180.   
  181.       /* to directory */
  182. --- 197,231 ----
  183.   int ac;
  184.   char **av;
  185.   {
  186. !     char *fn = NULL, *tn = NULL;
  187.       struct stat fs, ts;
  188. +     int item;
  189.   
  190. + #define USAGE "usage: %s [-silent] [-preserve] fromdir [todir]"
  191.       silent = 0;
  192. !     preserveLinks = 0;
  193. !     for (item = 1; item < ac; item++)
  194. !     {
  195. !     if (!strcmp(av[item], "-silent")) 
  196.           silent = 1;
  197. !     else if (!strcmp(av[item], "-preserve")) 
  198. !         preserveLinks = 1;
  199.       else 
  200. +         {
  201. +         if (NULL == fn)
  202. +             fn = av[item];
  203. +         else
  204. +             {
  205. +             if (NULL == tn)
  206. +                 tn = av[item];
  207. +             else
  208. +                 quit (1, USAGE, av[0]); 
  209. +             }
  210. +         }
  211. +     }
  212. +     if (NULL == fn)
  213. +     quit (1, USAGE, av[0]); 
  214. +     if (NULL == tn)
  215.       tn = ".";
  216.   
  217.       /* to directory */
  218.  
  219.