depends.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "talloc/talloc.h"
  2. #include "string/string.h"
  3. #include "tools.h"
  4. #include <err.h>
  5. #include <stdbool.h>
  6. static char ** __attribute__((format(printf, 3, 4)))
  7. lines_from_cmd(const void *ctx, unsigned int *num, char *format, ...)
  8. {
  9. va_list ap;
  10. char *cmd, *buffer;
  11. FILE *p;
  12. va_start(ap, format);
  13. cmd = talloc_vasprintf(ctx, format, ap);
  14. va_end(ap);
  15. p = popen(cmd, "r");
  16. if (!p)
  17. err(1, "Executing '%s'", cmd);
  18. buffer = grab_fd(ctx, fileno(p));
  19. if (!buffer)
  20. err(1, "Reading from '%s'", cmd);
  21. pclose(p);
  22. return strsplit(ctx, buffer, "\n", num);
  23. }
  24. static char **get_one_deps(const void *ctx, const char *dir, unsigned int *num)
  25. {
  26. char **deps, *cmd;
  27. cmd = talloc_asprintf(ctx, "%s/_info depends", dir);
  28. deps = lines_from_cmd(cmd, num, "%s", cmd);
  29. if (!deps)
  30. err(1, "Could not run '%s'", cmd);
  31. return deps;
  32. }
  33. static bool have_dep(char **deps, unsigned int num, const char *dep)
  34. {
  35. unsigned int i;
  36. for (i = 0; i < num; i++)
  37. if (streq(deps[i], dep))
  38. return true;
  39. return false;
  40. }
  41. /* Gets all the dependencies, recursively. */
  42. char **get_deps(const void *ctx, const char *dir)
  43. {
  44. char **deps;
  45. unsigned int i, num;
  46. deps = get_one_deps(ctx, dir, &num);
  47. for (i = 0; i < num; i++) {
  48. char **newdeps;
  49. unsigned int j, newnum;
  50. if (!strstarts(deps[i], "ccan/"))
  51. continue;
  52. newdeps = get_one_deps(ctx, deps[i], &newnum);
  53. /* Should be short, so brute-force out dups. */
  54. for (j = 0; j < newnum; j++) {
  55. if (have_dep(deps, num, newdeps[j]))
  56. continue;
  57. deps = talloc_realloc(NULL, deps, char *, num + 2);
  58. deps[num++] = newdeps[j];
  59. deps[num] = NULL;
  60. }
  61. }
  62. return deps;
  63. }