util.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (c) 2024 Meta Platforms, Inc. and affiliates.
  4. * Copyright (c) 2024 David Vernet <dvernet@meta.com>
  5. */
  6. #include <errno.h>
  7. #include <fcntl.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <unistd.h>
  12. /* Returns read len on success, or -errno on failure. */
  13. static ssize_t read_text(const char *path, char *buf, size_t max_len)
  14. {
  15. ssize_t len;
  16. int fd;
  17. fd = open(path, O_RDONLY);
  18. if (fd < 0)
  19. return -errno;
  20. len = read(fd, buf, max_len - 1);
  21. if (len >= 0)
  22. buf[len] = 0;
  23. close(fd);
  24. return len < 0 ? -errno : len;
  25. }
  26. /* Returns written len on success, or -errno on failure. */
  27. static ssize_t write_text(const char *path, char *buf, ssize_t len)
  28. {
  29. int fd;
  30. ssize_t written;
  31. fd = open(path, O_WRONLY | O_APPEND);
  32. if (fd < 0)
  33. return -errno;
  34. written = write(fd, buf, len);
  35. close(fd);
  36. return written < 0 ? -errno : written;
  37. }
  38. long file_read_long(const char *path)
  39. {
  40. char buf[128];
  41. if (read_text(path, buf, sizeof(buf)) <= 0)
  42. return -1;
  43. return atol(buf);
  44. }
  45. int file_write_long(const char *path, long val)
  46. {
  47. char buf[64];
  48. int ret;
  49. ret = sprintf(buf, "%ld", val);
  50. if (ret < 0)
  51. return ret;
  52. if (write_text(path, buf, ret) <= 0)
  53. return -1;
  54. return 0;
  55. }