mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
7.8 KiB

  1. diff -dur mine-0.24/install.c mine-0.24-patch/install.c
  2. --- mine-0.24/install.c 2006-04-27 20:14:38.000000000 +0200
  3. +++ mine-0.24-patch/install.c 2006-04-27 20:15:52.000000000 +0200
  4. @@ -54,16 +54,19 @@
  5. int gem2bunzip[2] = { -1, -1 };
  6. int bunzip2tar[2] = { -1, -1 };
  7. - char * pname = NULL;
  8. + char *pname = NULL, *pbasename = NULL;
  9. int gem_fd = -1;
  10. struct cdb c;
  11. int pos, len;
  12. int rc;
  13. - char *filename;
  14. + char *filename = 0;
  15. char buffer[1024];
  16. char buffer2[1024];
  17. char buffer3[1024];
  18. + char buffer4[1024];
  19. + char cksums_buf[1024];
  20. + char md5sums_buf[1024];
  21. TAR *t = NULL;
  22. BZFILE *b = NULL;
  23. @@ -77,8 +80,18 @@
  24. if ( rc <= 0 ) goto error;
  25. pos = cdb_datapos(&c); len = cdb_datalen(&c);
  26. pname = malloc(len+1); pname[len] = 0;
  27. +
  28. if (cdb_read(&c, pname, len, pos) == -1) goto error;
  29. + if ((pbasename = strchr(pname, ':')) != NULL)
  30. + {
  31. + int baselen = (pbasename - pname);
  32. + pbasename = malloc(baselen+1);
  33. + snprintf (pbasename, baselen+1, pname);
  34. + pbasename[baselen] = 0;
  35. + } else
  36. + pbasename = pname;
  37. +
  38. pipe(gem2bunzip);
  39. pipe(bunzip2tar);
  40. @@ -152,10 +165,88 @@
  41. }
  42. }
  43. + snprintf(buffer, sizeof(buffer), "%s/var/adm/flists/%s", root, pname);
  44. + FILE *old_flist = fopen(buffer, "r");
  45. + snprintf(buffer, sizeof(buffer), "%s/var/adm/cksums/%s", root, pname);
  46. + FILE *old_cksums = fopen(buffer, "r");
  47. + snprintf(buffer, sizeof(buffer), "%s/var/adm/md5sums/%s", root, pname);
  48. + FILE *old_md5sums = fopen(buffer, "r");
  49. +
  50. + FILE *purgme_flist = 0, *purgme_cksums = 0, *purgme_md5sums = 0;
  51. filename = 0;
  52. + char *old_filename = 0;
  53. + int old_file_printed = 0;
  54. while (th_read(t) == 0)
  55. {
  56. filename = th_get_pathname(t);
  57. +
  58. + /* Here we check for 'obsolete' files, which are in the old
  59. + package version, but not in the new one. Obsolete files are
  60. + added to *:legacy packages for easy removal. */
  61. + if (old_flist != NULL && old_filename == NULL && fgets(buffer4, 1024, old_flist) != NULL)
  62. + {
  63. + fgets(cksums_buf, 1024, old_cksums);
  64. + fgets(md5sums_buf, 1024, old_md5sums);
  65. +
  66. + strtok(buffer4, " \t\n");
  67. + old_filename = strtok(NULL, "\n");
  68. + old_file_printed = 0;
  69. + }
  70. + if (old_filename != NULL)
  71. + {
  72. + while (strcmp(old_filename, filename) < 0)
  73. + {
  74. + snprintf(buffer, sizeof(buffer), "%s/%s", root, old_filename);
  75. + struct stat statbuf;
  76. + if (stat (buffer, &statbuf) != 0) { /* Ignore */ }
  77. + if (! S_ISDIR(statbuf.st_mode))
  78. + {
  79. + if (old_file_printed == 0 && purgme_flist == NULL)
  80. + {
  81. + snprintf(buffer, sizeof(buffer), "%s/var/adm/flists/%s:legacy", root, pbasename);
  82. + purgme_flist = fopen(buffer, "a");
  83. + snprintf(buffer, sizeof(buffer), "%s/var/adm/cksums/%s:legacy", root, pbasename);
  84. + purgme_cksums = fopen(buffer, "a");
  85. + snprintf(buffer, sizeof(buffer), "%s/var/adm/md5sums/%s:legacy", root, pbasename);
  86. + purgme_md5sums = fopen(buffer, "a");
  87. + snprintf(buffer, sizeof(buffer), "%s/var/adm/packages/%s:legacy", root, pbasename);
  88. + FILE *purgme_packages = fopen(buffer, "w");
  89. + snprintf(buffer, sizeof(buffer), "%s/var/adm/packages/%s", root, pname);
  90. + FILE *old_packages = fopen(buffer, "r");
  91. +
  92. + snprintf(buffer, sizeof(buffer), "Package Name and Version: %s:legacy 0000 0\n", pbasename);
  93. + fputs(buffer, purgme_packages);
  94. +
  95. + fgets(buffer, 1024, old_packages);
  96. + while (fgets(buffer, 1024, old_packages)) {
  97. + if (fputs(buffer, purgme_packages) == EOF) goto error_errno;
  98. + }
  99. +
  100. + fclose(old_packages);
  101. + fclose(purgme_packages);
  102. + }
  103. +
  104. + if (old_file_printed == 0)
  105. + {
  106. + fprintf(purgme_flist, "%s:legacy: %s\n", pbasename, old_filename);
  107. + fprintf(purgme_cksums, "%s", cksums_buf);
  108. + fprintf(purgme_md5sums, "%s", md5sums_buf);
  109. + old_file_printed = 1;
  110. + }
  111. + } /* ! (S_ISDIR(statbuf.st_mode)) */
  112. +
  113. + if (fgets(buffer4, 1024, old_flist) == NULL) break;
  114. +
  115. + fgets(cksums_buf, 1024, old_cksums);
  116. + fgets(md5sums_buf, 1024, old_md5sums);
  117. +
  118. + strtok(buffer4, " \t\n");
  119. + old_filename = strtok(NULL, "\n");
  120. + old_file_printed = 0;
  121. + }
  122. + if (strcmp(old_filename, filename) == 0) old_file_printed = 1;
  123. + }
  124. +
  125. snprintf(buffer, sizeof(buffer), "%s/%s", root, filename);
  126. snprintf(buffer2, sizeof(buffer), "%s.GEMnew", buffer);
  127. snprintf(buffer3, sizeof(buffer), "%s.GEMold", buffer);
  128. @@ -221,10 +312,83 @@
  129. }
  130. }
  131. + if (filename != NULL && old_filename != NULL &&
  132. + strcmp(old_filename, filename) > 0)
  133. + {
  134. + if (purgme_flist == NULL)
  135. + {
  136. + snprintf(buffer, sizeof(buffer), "%s/var/adm/flists/%s:legacy", root, pbasename);
  137. + purgme_flist = fopen(buffer, "a");
  138. + snprintf(buffer, sizeof(buffer), "%s/var/adm/cksums/%s:legacy", root, pbasename);
  139. + purgme_cksums = fopen(buffer, "a");
  140. + snprintf(buffer, sizeof(buffer), "%s/var/adm/md5sums/%s:legacy", root, pbasename);
  141. + purgme_md5sums = fopen(buffer, "a");
  142. + snprintf(buffer, sizeof(buffer), "%s/var/adm/packages/%s:legacy", root, pbasename);
  143. + FILE *purgme_packages = fopen(buffer, "w");
  144. + snprintf(buffer, sizeof(buffer), "%s/var/adm/packages/%s", root, pname);
  145. + FILE *old_packages = fopen(buffer, "r");
  146. +
  147. + snprintf(buffer, sizeof(buffer), "Package Name and Version: %s:legacy 0000 0\n", pbasename);
  148. + fputs(buffer, purgme_packages);
  149. +
  150. + fgets(buffer, 1024, old_packages);
  151. + while (fgets(buffer, 1024, old_packages)) {
  152. + if (fputs(buffer, purgme_packages) == EOF) goto error_errno;
  153. + }
  154. +
  155. + fclose(old_packages);
  156. + fclose(purgme_packages);
  157. + }
  158. + while (1) {
  159. + snprintf(buffer, sizeof(buffer), "%s/%s", root, old_filename);
  160. + struct stat statbuf;
  161. + if (stat (buffer, &statbuf) != 0) { /* Ignore */ }
  162. + if (! S_ISDIR(statbuf.st_mode))
  163. + {
  164. + fprintf(purgme_flist, "%s:legacy: %s\n", pbasename, old_filename);
  165. + fprintf(purgme_cksums, "%s", cksums_buf);
  166. + fprintf(purgme_md5sums, "%s", md5sums_buf);
  167. + }
  168. +
  169. + if (fgets(buffer4, 1024, old_flist) == NULL) break;
  170. +
  171. + fgets(cksums_buf, 1024, old_cksums);
  172. + fgets(md5sums_buf, 1024, old_md5sums);
  173. +
  174. + strtok(buffer4, " \t\n");
  175. + old_filename = strtok(NULL, "\n");
  176. + old_file_printed = 0;
  177. + };
  178. + }
  179. +
  180. + /* Finish *:legacy package, if existent */
  181. + if (purgme_flist != NULL)
  182. + {
  183. + fclose(purgme_cksums);
  184. + snprintf(buffer, sizeof(buffer), "%s:legacy: var/adm/cksums/%s:legacy\n", pbasename, pbasename);
  185. + fprintf(purgme_flist, buffer);
  186. + snprintf(buffer, sizeof(buffer), "%s:legacy: var/adm/flists/%s:legacy\n", pbasename, pbasename);
  187. + fprintf(purgme_flist, buffer);
  188. + snprintf(buffer, sizeof(buffer), "%s:legacy: var/adm/md5sums/%s:legacy\n", pbasename, pbasename);
  189. + fprintf(purgme_flist, buffer);
  190. + snprintf(buffer, sizeof(buffer), "%s:legacy: var/adm/packages/%s:legacy\n", pbasename, pbasename);
  191. + fprintf(purgme_flist, buffer);
  192. + fclose(purgme_flist);
  193. +
  194. + snprintf(buffer2, sizeof(buffer2), "var/adm/flists/%s:legacy", pbasename);
  195. + snprintf(buffer, sizeof(buffer), "%s %s\n", md5sum_create(root, buffer2), buffer2);
  196. + fprintf(purgme_md5sums, buffer);
  197. + fclose(purgme_md5sums);
  198. + }
  199. +
  200. tar_close(t); close(bunzip2tar[0]);
  201. cdb_free(&c); close(gem_fd);
  202. if ( logfile != NULL ) fclose(logfile);
  203. + if ( old_flist != NULL ) fclose(old_flist);
  204. +
  205. + if (pname != pbasename) free(pbasename);
  206. + free(pname);
  207. return 0;
  208. @@ -233,7 +397,7 @@
  209. error_errno:
  210. fprintf(stderr, "While installing GEM file %s%s%s%s: %s\n", package,
  211. - filename?" (":"", filename?filename:"", filename?"(":"",
  212. + filename?" (":"", filename?filename:"", filename?")":"",
  213. errno ? strerror(errno) : "Unknown error");
  214. if ( t != NULL) tar_close(t);
  215. if ( gem_fd != -1 ) { cdb_free(&c); close(gem_fd); }
  216. diff -dur mine-0.24/TODO mine-0.24-patch/TODO
  217. --- mine-0.24/TODO 2006-04-27 20:14:30.000000000 +0200
  218. +++ mine-0.24-patch/TODO 2006-04-27 20:15:56.000000000 +0200
  219. @@ -1,5 +1,7 @@
  220. Todos:
  221. - - Remove old files when updating a package (?)
  222. + - When mine adds files to a legacy package, it does not remove possible
  223. + duplicate entries in var/adm/{flists,cksums,md5sums} resulting in
  224. + bogus shared files.