Files
RedBear-OS/recipes/tests/pwd.c
T
vasilito b9874d0941 feat: USB storage read/write proof + full Red Bear OS tree sync
Add redbear-usb-storage-check in-guest binary that validates USB mass
storage read and write I/O: discovers /scheme/disk/ devices, writes a
test pattern to sector 2048, reads it back, verifies match, restores
original content. Updates test-usb-storage-qemu.sh with write-proof
verification step.

Includes all accumulated Red Bear OS work: kernel patches, relibc
patches, driver infrastructure, DRM/GPU, KDE recipes, firmware,
validation tooling, build system hardening, and documentation.
2026-05-03 23:03:24 +01:00

106 lines
2.5 KiB
C

#include <errno.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include "test_helpers.h"
void print(struct passwd *pwd) {
printf("pw_name: %s\n", pwd->pw_name);
printf("pw_password: %s\n", pwd->pw_passwd);
printf("pw_uid: %u\n", pwd->pw_uid);
printf("pw_gid: %u\n", pwd->pw_gid);
printf("pw_gecos: %s\n", pwd->pw_gecos);
printf("pw_dir: %s\n", pwd->pw_dir);
printf("pw_shell: %s\n", pwd->pw_shell);
}
int main(void) {
puts("--- Checking getpwuid ---");
errno = 0;
struct passwd *pwd = getpwuid(0);
if (errno != 0) {
perror("getpwuid");
exit(EXIT_FAILURE);
}
if (pwd != NULL) {
print(pwd);
}
puts("--- Checking getpwnam ---");
errno = 0;
pwd = getpwnam("nobody");
if (errno != 0) {
perror("getpwnam");
exit(EXIT_FAILURE);
}
if (pwd != NULL) {
print(pwd);
}
puts("--- Checking getpwuid_r ---");
struct passwd pwd2;
struct passwd* result;
char* buf = malloc(300);
if (getpwuid_r(0, &pwd2, buf, 100, &result) < 0) {
perror("getpwuid_r");
free(buf);
exit(EXIT_FAILURE);
}
if (result != NULL) {
if (result != &pwd2) {
free(buf);
exit(EXIT_FAILURE);
}
print(&pwd2);
}
puts("--- Checking getpwnam_r ---");
if (getpwnam_r("nobody", &pwd2, buf, 300, &result) < 0) {
perror("getpwuid_r");
free(buf);
exit(EXIT_FAILURE);
}
if (result != NULL) {
if (result != &pwd2) {
free(buf);
exit(EXIT_FAILURE);
}
print(&pwd2);
}
free(buf);
puts("--- Checking getpwuid_r error handling ---");
char buf2[1];
if (getpwuid_r(0, &pwd2, buf2, 1, &result) == 0) {
puts("This shouldn't have succeeded, but it did!");
exit(EXIT_FAILURE);
}
if (errno != ERANGE) {
perror("getpwuid_r");
exit(EXIT_FAILURE);
}
puts("Returned ERANGE because the buffer was too small 👍");
errno = 0;
struct passwd *entry = NULL;
for (int i = 1; (entry = getpwent()); ++i) {
int backup = errno;
printf("--- getpwent #%d ---\n", i);
if (backup != 0) {
errno = backup;
perror("getpwent");
exit(EXIT_FAILURE);
}
print(entry);
}
puts("--- getpwent #1 (rewind) ---");
setpwent();
entry = getpwent();
perror("getpwent");
print(entry);
endpwent();
}