#include #include #include #include #include #include #include #include #define bool int #define true 1 #define false 0 static bool check_directory (const char *path, bool *make_directory, bool *is_writable) { struct stat sb; char *parent, *path1; bool dummy = 0; bool ret; fprintf(stderr,"\ntrust/token.c (check_directory): ENTERING stat() path=%s, *make_directory=%d, *is_writable=%d\n", path, *make_directory, *is_writable); fflush(stderr); if (stat (path, &sb) == 0) { fprintf(stderr,"\ntrust/token.c (check_directory): stat(path, &sb) == 0 BEFORE *is_writable\n"); fflush(stderr); *make_directory = false; int err = access (path, W_OK); *is_writable = S_ISDIR (sb.st_mode) && (err == 0); fprintf(stderr,"\ntrust/token.c (check_directory): stat(path, &sb) == 0 AFTER *is_writable, access(2) sets errno\n"); fprintf(stderr,"\ntrust/token.c (check_directory): access(path, W_OK)=%d, errno=%s, *is_writable=%d\n", err, strerror(errno), *is_writable); fflush(stderr); return true; } switch (errno) { case EACCES: fprintf(stderr,"\ntrust/token.c (check_directory): case EACCES\n"); fflush(stderr); *is_writable = false; *make_directory = false; return true; case ENOENT: fprintf(stderr,"\ntrust/token.c (check_directory): case ENOENT\n"); fflush(stderr); *make_directory = true; //parent = p11_path_parent (path); path1 = strdup(path); parent = dirname (path1); if (parent == NULL) ret = false; else ret = check_directory (parent, &dummy, is_writable); return ret; default: fprintf(stderr,"\ntrust/token.c (check_directory): case default\n"); fflush(stderr); error (1, errno, "couldn't access: %s", path); return false; } } int main(void) { const char *path ="/non-existant"; bool ret = false, make_directory = false; int is_writable = 0; ret = check_directory (path, &make_directory, &is_writable); return ret; }