2
0

pwd.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <errno.h>
  2. #include <pwd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. void print(struct passwd *pwd) {
  6. printf("pw_name: %s\n", pwd->pw_name);
  7. printf("pw_password: %s\n", pwd->pw_passwd);
  8. printf("pw_uid: %u\n", pwd->pw_uid);
  9. printf("pw_gid: %u\n", pwd->pw_gid);
  10. printf("pw_gecos: %s\n", pwd->pw_gecos);
  11. printf("pw_dir: %s\n", pwd->pw_dir);
  12. printf("pw_shell: %s\n", pwd->pw_shell);
  13. }
  14. int main(void) {
  15. puts("--- Checking getpwuid ---");
  16. errno = 0;
  17. struct passwd *pwd = getpwuid(0);
  18. if (errno != 0) {
  19. perror("getpwuid");
  20. return 1;
  21. }
  22. if (pwd != NULL) {
  23. print(pwd);
  24. }
  25. puts("--- Checking getpwnam ---");
  26. errno = 0;
  27. pwd = getpwnam("nobody");
  28. if (errno != 0) {
  29. perror("getpwnam");
  30. return 1;
  31. }
  32. if (pwd != NULL) {
  33. print(pwd);
  34. }
  35. puts("--- Checking getpwuid_r ---");
  36. struct passwd pwd2;
  37. struct passwd* result;
  38. char* buf = malloc(100);
  39. if (getpwuid_r(0, &pwd2, buf, 100, &result) < 0) {
  40. perror("getpwuid_r");
  41. free(buf);
  42. return 1;
  43. }
  44. if (result != NULL) {
  45. if (result != &pwd2) {
  46. free(buf);
  47. return 1;
  48. }
  49. print(&pwd2);
  50. }
  51. puts("--- Checking getpwnam_r ---");
  52. if (getpwnam_r("nobody", &pwd2, buf, 100, &result) < 0) {
  53. perror("getpwuid_r");
  54. free(buf);
  55. return 1;
  56. }
  57. if (result != NULL) {
  58. if (result != &pwd2) {
  59. free(buf);
  60. return 1;
  61. }
  62. print(&pwd2);
  63. }
  64. free(buf);
  65. puts("--- Checking getpwuid_r error handling ---");
  66. char buf2[1];
  67. if (getpwuid_r(0, &pwd2, buf2, 1, &result) == 0) {
  68. puts("This shouldn't have succeeded, but did!");
  69. return 1;
  70. }
  71. if (errno != ERANGE) {
  72. perror("getpwuid_r");
  73. return 1;
  74. }
  75. puts("Returned ERANGE because the buffer was too small 👍");
  76. }