unlnfs.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <libsec.h>
  5. enum
  6. {
  7. ENCLEN = 26,
  8. };
  9. typedef struct Name Name;
  10. struct Name {
  11. char shortname[ENCLEN + 1];
  12. char* longname;
  13. Name* next;
  14. };
  15. Name *names;
  16. void rename(char*, char*, char*);
  17. void renamedir(char*);
  18. void readnames(char*);
  19. void
  20. main(int argc, char **argv)
  21. {
  22. char lnfile[256], *d;
  23. d = ".";
  24. if(argc > 1)
  25. d = argv[1];
  26. snprint(lnfile, sizeof(lnfile), "%s/.longnames", d);
  27. readnames(lnfile);
  28. renamedir(d);
  29. }
  30. void
  31. renamedir(char *d)
  32. {
  33. int n;
  34. Dir *dir;
  35. char *sub;
  36. int fd, i;
  37. uchar digest[MD5dlen];
  38. Name *na;
  39. fd = open(d, OREAD);
  40. if (fd == -1)
  41. return;
  42. while((n = dirread(fd, &dir)) > 0){
  43. for(i = 0; i < n; i++){
  44. if(dir[i].mode & DMDIR){
  45. sub = malloc(strlen(d) + 1 + strlen(dir[i].name) + 1);
  46. sprint(sub, "%s/%s", d, dir[i].name);
  47. renamedir(sub);
  48. free(sub);
  49. }
  50. if(strlen(dir[i].name) != ENCLEN)
  51. continue;
  52. for (na = names; na != nil; na = na->next){
  53. if (strcmp(na->shortname, dir[i].name) == 0){
  54. rename(d, dir[i].name, na->longname);
  55. break;
  56. }
  57. }
  58. }
  59. free(dir);
  60. }
  61. close(fd);
  62. }
  63. void
  64. rename(char *d, char *old, char *new)
  65. {
  66. char *p;
  67. Dir dir;
  68. p = malloc(strlen(d) + 1 + strlen(old) + 1);
  69. sprint(p, "%s/%s", d, old);
  70. nulldir(&dir);
  71. dir.name = new;
  72. if(dirwstat(p, &dir) == -1)
  73. fprint(2, "unlnfs: cannot rename %s to %s: %r\n", p, new);
  74. free(p);
  75. }
  76. void
  77. long2short(char shortname[ENCLEN+1], char *longname)
  78. {
  79. uchar digest[MD5dlen];
  80. md5((uchar*)longname, strlen(longname), digest, nil);
  81. enc32(shortname, ENCLEN+1, digest, MD5dlen);
  82. }
  83. void
  84. readnames(char *lnfile)
  85. {
  86. Biobuf *bio;
  87. char *f;
  88. int slot;
  89. Name *n;
  90. bio = Bopen(lnfile, OREAD);
  91. if(bio == nil){
  92. fprint(2, "unlnfs: cannot open %s: %r\n", lnfile);
  93. exits("error");
  94. }
  95. while((f = Brdstr(bio, '\n', 1)) != nil){
  96. n = malloc(sizeof(Name));
  97. n->longname = f;
  98. long2short(n->shortname, f);
  99. n->next = names;
  100. names = n;
  101. }
  102. Bterm(bio);
  103. }