#define _GNU_SOURCE #include #include #include #include #include #include int main(int argc, char **argv) { char fn[PATH_MAX]; uid_t alte_euid; int rc; int fd; snprintf(fn, PATH_MAX, "/var/teammail/%s", argv[1]); /* Zum User werden */ alte_euid = geteuid(); seteuid(getuid()); /* Bestehende Datei oeffnen */ fd = open(fn, O_RDWR | O_NOFOLLOW); if (fd >= 0) { /* existiert, Zugriff erlaubt, abschneiden */ rc = ftruncate(fd, 0); close(fd); return (rc == 0); } /* Neue Datei erzeugen */ fd = open(fn, O_RDWR | O_NOFOLLOW | O_CREAT | O_EXCL, 0660); if (fd < 0) { return 1; } close(fd); /* Als Root die Gruppe setzen */ seteuid(alte_euid); rc = fchown(fd, getuid(), getgid()); if (rc != 0) { unlink(fn); return 1; } return 0; }