- char *cloned_flags;
- char *tmp;
- int flag_set = 0;
- int flags = 0;
- int size = 0;
-
- cloned_flags = strdup(data);
- if (cloned_flags == NULL) {
- fprintf(stderr, "Insufficient memory.\n");
- exit(-1);
- }
-
- for (tmp = strtok(cloned_flags, ":"); tmp;
- tmp = strtok(NULL, ":")) {
- int i;
-
- size = tmp - cloned_flags;
- for (i = 0; flag_table[i].flag != -1; i++) {
- if (!strcmp(tmp, flag_table[i].string)){
- flags |= flag_table[i].flag;
- size += strlen(flag_table[i].string);
- flag_set = 1;
- break;
- }
- }
- }
- free(cloned_flags);
-
- if (!flag_set) {
- *rflags = O_RDONLY;
- return 0;
- }
-
- *rflags = flags;
- return size;
+ char *cloned_flags;
+ char *tmp;
+ int flag_set = 0;
+ int flags = 0;
+ int size = 0;
+
+ cloned_flags = strdup(data);
+ if (!cloned_flags) {
+ fprintf(stderr, "Insufficient memory.\n");
+ exit(-1);
+ }
+
+ for (tmp = strtok(cloned_flags, ":"); tmp;
+ tmp = strtok(NULL, ":")) {
+ int i;
+
+ size = tmp - cloned_flags;
+ for (i = 0; flag_table[i].flag != -1; i++) {
+ if (!strcmp(tmp, flag_table[i].string)) {
+ flags |= flag_table[i].flag;
+ size += strlen(flag_table[i].string);
+ flag_set = 1;
+ break;
+ }
+ }
+ }
+ free(cloned_flags);
+
+ if (!flag_set) {
+ *rflags = O_RDONLY;
+ return 0;
+ }
+
+ *rflags = flags;
+ return size;
+}
+
+static int statahead(char *dname)
+{
+ DIR *d;
+ struct dirent *dent;
+ struct stat st;
+ char *buf;
+ int rc;
+
+ rc = 0;
+ d = opendir(dname);
+ if (!d)
+ return errno;
+ dent = readdir(d);
+ if (!dent) {
+ rc = errno;
+ goto out_closedir;
+ }
+ if (asprintf(&buf, "%s/%s", dname, dent->d_name) == -1) {
+ rc = errno;
+ goto out_closedir;
+ }
+ if (stat(buf, &st))
+ rc = errno;
+ free(buf);
+out_closedir:
+ closedir(d);
+ return rc;