info_compiles.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <tools/ccanlint/ccanlint.h>
  2. #include <tools/tools.h>
  3. #include <ccan/tal/grab_file/grab_file.h>
  4. #include <ccan/read_write_all/read_write_all.h>
  5. #include <ccan/str/str.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include <limits.h>
  11. #include <errno.h>
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <err.h>
  15. #include <string.h>
  16. #include <ctype.h>
  17. static void check_info_compiles(struct manifest *m,
  18. unsigned int *timeleft UNNEEDED,
  19. struct score *score)
  20. {
  21. char *info_c_file, *info, *output;
  22. int fd;
  23. /* We don't really fail if we're in safe mode: our dependencies
  24. * still run. */
  25. if (safe_mode) {
  26. score->pass = true;
  27. score->score = 0;
  28. return;
  29. }
  30. /* Copy it to a file with proper .c suffix. */
  31. info = grab_file(score, m->info_file->fullname);
  32. if (!info) {
  33. score_file_error(score, m->info_file, 0,
  34. "could not be read: %s", strerror(errno));
  35. return;
  36. }
  37. info_c_file = temp_file(info, ".c", "_info");
  38. fd = open(info_c_file, O_WRONLY|O_CREAT|O_EXCL, 0600);
  39. if (fd < 0 || !write_all(fd, info, tal_count(info)-1))
  40. err(1, "Copying _info file");
  41. if (close(fd) != 0)
  42. err(1, "Closing _info file");
  43. m->info_file->compiled[COMPILE_NORMAL] = temp_file(m, "", "info");
  44. if (!compile_and_link(score, info_c_file, find_ccan_dir(m->dir), "",
  45. compiler, cflags, "",
  46. m->info_file->compiled[COMPILE_NORMAL],
  47. &output)) {
  48. score_file_error(score, m->info_file, 0,
  49. "Errors compiling _info:\n%s", output);
  50. return;
  51. }
  52. score->pass = true;
  53. score->score = 1;
  54. }
  55. struct ccanlint info_compiles = {
  56. .key = "info_compiles",
  57. .name = "_info compiles",
  58. .check = check_info_compiles,
  59. .needs = "info_exists",
  60. .compulsory = true
  61. };
  62. REGISTER_TEST(info_compiles);