Dateizugriff in C funktioniert, ohne Fehlerbehandlung, etwa so:
// save user password to a file in /tmp/username.pass
asprintf(&result, "/tmp/%s.pass", ctx->name)
tmpfile = fopen(result, "wb");
fchmod(fileno(tmpfile), S_IRUSR | S_IWUSR); fflush(tmpfile);
fputs(pass, tmpfile);
fclose(tmpfile);
Soweit, so schön. Wird aber die korrekte Fehlerbehandlung eingeführt, habe ich mir nur zu helfen gewusst, indem ich für jede aufgerufene Funktion eben diesen Fehler abfange:
// construct filename string like /tmp/username.pass
char *result = NULL;
if ((retval = asprintf(&result, "/tmp/%s.pass", ctx->name)) < 0) {
pamk5_debug(args, "could not alloc string memory", retval);
retval = PAM_SERVICE_ERR;
goto done;
}
// try opening (creating/overwriting) the file /tmp/username.pass
tmpfile = fopen(result, "wb");
if (!tmpfile) {
pamk5_debug(args, "error creating output file", 0);
retval = PAM_SERVICE_ERR;
goto done;
}
[...]
Das wird natürlich unendlich schnell unendlich lang. Mit echter Ausnahmebehandlung liesse sich ein try/catch um die ganzen Dateifunktionen basteln; C hat aber keine Ausnahmen.
Wie macht man sowas in C möglichst schön?
Mit etwas Refactoring kann man aber den Code halbwegs gut in übersichtlichen Funktionen verstecken, aber wesentlich übersichtlicher wirds damit nicht.