summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/OR_USING_C/04.1.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/OR_USING_C/04.1.c')
-rw-r--r--reference/C/CONTRIB/OR_USING_C/04.1.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/OR_USING_C/04.1.c b/reference/C/CONTRIB/OR_USING_C/04.1.c
new file mode 100644
index 0000000..bd0db3d
--- /dev/null
+++ b/reference/C/CONTRIB/OR_USING_C/04.1.c
@@ -0,0 +1,44 @@
+/*
+ * Non-BSD systems only.
+ */
+#include <sys/types.h>
+#include <sys/dir.h>
+#include <stdio.h>
+
+main()
+{
+ FILE *fp;
+ struct direct dir;
+ int n;
+
+ if ((fp = fopen(".", "r")) == NULL) {
+ perror("current directory");
+ exit(1);
+ }
+
+ /*
+ * Read directory entries. Since we're reading
+ * entries one at a time, we use the fread routine,
+ * which buffers them internally. Don't use the
+ * low-level read to do things this way, since
+ * reading very small quantities of data (16 bytes)
+ * at a time is very inefficient.
+ */
+ while ((n = fread(&dir, sizeof(dir), 1, fp)) > 0) {
+ /*
+ * Skip removed files.
+ */
+ if (dir.d_ino == 0)
+ continue;
+
+ /*
+ * Make sure we print no more than DIRSIZ
+ * characters.
+ */
+ printf("%.*s\n", DIRSIZ, dir.d_name);
+ }
+
+ fclose(fp);
+ exit(0);
+}
+