pathutil.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "sandbox.h"
  2. #include <sys/stat.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. void find_fullpath(char **path, int _free)
  8. {
  9. char *result;
  10. char *cwd;
  11. cwd = get_current_dir_name();
  12. asprintf(&result, "%s/%s", cwd, *path);
  13. if (_free)
  14. free(*path);
  15. free(cwd);
  16. *path = result;
  17. }
  18. int fileinfo_compare(const void *a, const void *b)
  19. {
  20. return strcmp(((t_fileinfo *)a)->filename, (char *)b) == 0;
  21. }
  22. int fileinfo_compare_fd(const void *a, const void *fd)
  23. {
  24. return sllist_find(((t_fileinfo *)a)->fds, sllist_cmp_int, fd) != -1;
  25. }
  26. t_fileinfo *get_fileinfo(const struct s_sandboxenv *env, const char * filename)
  27. {
  28. int i;
  29. i = sllist_find(env->filetable, fileinfo_compare, filename);
  30. if (i == -1)
  31. return NULL;
  32. return sllist_at(env->filetable, i);
  33. }
  34. t_fileinfo *get_fileinfo_fd(const struct s_sandboxenv *env, const int fd)
  35. {
  36. int i;
  37. REGISTER_TYPE _fd = (REGISTER_TYPE) fd;
  38. i = sllist_find(env->filetable, fileinfo_compare_fd, (void *)_fd);
  39. if (i == -1)
  40. return NULL;
  41. return sllist_at(env->filetable, i);
  42. }
  43. int file_exists(const char*path)
  44. {
  45. struct stat buf;
  46. if (stat(path, &buf) == -1 && errno == ENOENT)
  47. return 0;
  48. return 1;
  49. }
  50. unsigned long long int hash_path(const char *filename)
  51. {
  52. unsigned long long int result;
  53. for (result =0; *filename; ++filename)
  54. result = (result << 5) - result + *filename;
  55. return result;
  56. }