ccan_dir.c 901 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include <ccan/talloc/talloc.h>
  2. #include <ccan/err/err.h>
  3. #include "tools.h"
  4. #include <assert.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. /* Walk up to find /ccan/ => ccan directory. */
  8. static unsigned int ccan_dir_prefix(const char *fulldir)
  9. {
  10. unsigned int i;
  11. assert(fulldir[0] == '/');
  12. for (i = strlen(fulldir) - 1; i > 0; i--) {
  13. if (strncmp(fulldir+i, "/ccan", 5) != 0)
  14. continue;
  15. if (fulldir[i+5] != '\0' && fulldir[i+5] != '/')
  16. continue;
  17. return i + 1;
  18. }
  19. return 0;
  20. }
  21. const char *find_ccan_dir(const char *base)
  22. {
  23. static char *ccan_dir;
  24. if (!ccan_dir) {
  25. if (base[0] != '/') {
  26. const char *tmpctx = talloc_getcwd(NULL);
  27. find_ccan_dir(talloc_asprintf(tmpctx, "%s/%s",
  28. tmpctx, base));
  29. talloc_free(tmpctx);
  30. } else {
  31. unsigned int prefix = ccan_dir_prefix(base);
  32. if (prefix)
  33. ccan_dir = talloc_strndup(NULL, base, prefix);
  34. }
  35. }
  36. return ccan_dir;
  37. }