tarruby 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. data/README.txt +99 -0
  2. data/ext/extconf.rb +19 -0
  3. data/ext/libtar/COPYRIGHT +35 -0
  4. data/ext/libtar/ChangeLog +243 -0
  5. data/ext/libtar/ChangeLog-1.0.x +141 -0
  6. data/ext/libtar/INSTALL +183 -0
  7. data/ext/libtar/Makefile.in +51 -0
  8. data/ext/libtar/README +121 -0
  9. data/ext/libtar/TODO +10 -0
  10. data/ext/libtar/autoconf/ac_path_generic.m4 +136 -0
  11. data/ext/libtar/autoconf/aclocal.m4 +199 -0
  12. data/ext/libtar/autoconf/encap.m4 +133 -0
  13. data/ext/libtar/autoconf/install-sh +251 -0
  14. data/ext/libtar/autom4te.cache/output.0 +8102 -0
  15. data/ext/libtar/autom4te.cache/requests +112 -0
  16. data/ext/libtar/autom4te.cache/traces.0 +382 -0
  17. data/ext/libtar/compat/ChangeLog +31 -0
  18. data/ext/libtar/compat/README +12 -0
  19. data/ext/libtar/compat/TODO +4 -0
  20. data/ext/libtar/compat/basename.c +91 -0
  21. data/ext/libtar/compat/compat.h +260 -0
  22. data/ext/libtar/compat/dirname.c +96 -0
  23. data/ext/libtar/compat/fnmatch.c +237 -0
  24. data/ext/libtar/compat/gethostbyname_r.c +41 -0
  25. data/ext/libtar/compat/gethostname.c +36 -0
  26. data/ext/libtar/compat/getservbyname_r.c +41 -0
  27. data/ext/libtar/compat/glob.c +898 -0
  28. data/ext/libtar/compat/inet_aton.c +27 -0
  29. data/ext/libtar/compat/module.ac +591 -0
  30. data/ext/libtar/compat/snprintf.c +788 -0
  31. data/ext/libtar/compat/strdup.c +62 -0
  32. data/ext/libtar/compat/strlcat.c +72 -0
  33. data/ext/libtar/compat/strlcpy.c +68 -0
  34. data/ext/libtar/compat/strmode.c +199 -0
  35. data/ext/libtar/compat/strrstr.c +40 -0
  36. data/ext/libtar/compat/strsep.c +87 -0
  37. data/ext/libtar/config.h.in +187 -0
  38. data/ext/libtar/configure +8102 -0
  39. data/ext/libtar/configure.ac +114 -0
  40. data/ext/libtar/doc/Makefile.in +152 -0
  41. data/ext/libtar/doc/tar_append_file.3 +50 -0
  42. data/ext/libtar/doc/tar_block_read.3 +24 -0
  43. data/ext/libtar/doc/tar_extract_all.3 +43 -0
  44. data/ext/libtar/doc/tar_extract_file.3 +84 -0
  45. data/ext/libtar/doc/tar_open.3 +97 -0
  46. data/ext/libtar/doc/th_get_pathname.3 +63 -0
  47. data/ext/libtar/doc/th_print_long_ls.3 +22 -0
  48. data/ext/libtar/doc/th_read.3 +34 -0
  49. data/ext/libtar/doc/th_set_from_stat.3 +45 -0
  50. data/ext/libtar/lib/Makefile.in +92 -0
  51. data/ext/libtar/lib/append.c +272 -0
  52. data/ext/libtar/lib/block.c +384 -0
  53. data/ext/libtar/lib/decode.c +130 -0
  54. data/ext/libtar/lib/encode.c +237 -0
  55. data/ext/libtar/lib/extract.c +656 -0
  56. data/ext/libtar/lib/handle.c +150 -0
  57. data/ext/libtar/lib/internal.h +46 -0
  58. data/ext/libtar/lib/libtar.h +311 -0
  59. data/ext/libtar/lib/output.c +146 -0
  60. data/ext/libtar/lib/util.c +153 -0
  61. data/ext/libtar/lib/wrapper.c +175 -0
  62. data/ext/libtar/libtar/Makefile.in +73 -0
  63. data/ext/libtar/libtar/libtar.c +363 -0
  64. data/ext/libtar/listhash/ChangeLog +15 -0
  65. data/ext/libtar/listhash/TODO +21 -0
  66. data/ext/libtar/listhash/hash.c.in +344 -0
  67. data/ext/libtar/listhash/hash_new.3.in +74 -0
  68. data/ext/libtar/listhash/list.c.in +458 -0
  69. data/ext/libtar/listhash/list_new.3.in +86 -0
  70. data/ext/libtar/listhash/listhash.h.in +196 -0
  71. data/ext/libtar/listhash/module.ac +21 -0
  72. data/ext/libtar/win32/config.h +190 -0
  73. data/ext/libtar/win32/dirent.c +115 -0
  74. data/ext/libtar/win32/dirent.h +24 -0
  75. data/ext/libtar/win32/grp.h +4 -0
  76. data/ext/libtar/win32/listhash/libtar_hash.c +344 -0
  77. data/ext/libtar/win32/listhash/libtar_list.c +458 -0
  78. data/ext/libtar/win32/listhash/libtar_listhash.h +196 -0
  79. data/ext/libtar/win32/pwd.h +4 -0
  80. data/ext/libtar/win32/sys/param.h +8 -0
  81. data/ext/libtar/win32/tar.h +35 -0
  82. data/ext/libtar/win32/utime.h +6 -0
  83. data/ext/libtar/win32/win32/types.h +10 -0
  84. data/ext/tarruby.c +648 -0
  85. metadata +150 -0
@@ -0,0 +1,196 @@
1
+ /* @configure_input@ */
2
+
3
+ /*
4
+ ** Copyright 1998-2002 University of Illinois Board of Trustees
5
+ ** Copyright 1998-2002 Mark D. Roth
6
+ ** All rights reserved.
7
+ **
8
+ ** @LISTHASH_PREFIX@_listhash.h - header file for listhash module
9
+ **
10
+ ** Mark D. Roth <roth@uiuc.edu>
11
+ ** Campus Information Technologies and Educational Services
12
+ ** University of Illinois at Urbana-Champaign
13
+ */
14
+
15
+ #ifndef @LISTHASH_PREFIX@_LISTHASH_H
16
+ #define @LISTHASH_PREFIX@_LISTHASH_H
17
+
18
+
19
+ /***** list.c **********************************************************/
20
+
21
+ /*
22
+ ** Comparison function (used to determine order of elements in a list)
23
+ ** returns less than, equal to, or greater than 0
24
+ ** if data1 is less than, equal to, or greater than data2
25
+ */
26
+ typedef int (*@LISTHASH_PREFIX@_cmpfunc_t)(void *, void *);
27
+
28
+ /*
29
+ ** Free function (for freeing allocated memory in each element)
30
+ */
31
+ typedef void (*@LISTHASH_PREFIX@_freefunc_t)(void *);
32
+
33
+ /*
34
+ ** Plugin function for @LISTHASH_PREFIX@_list_iterate()
35
+ */
36
+ typedef int (*@LISTHASH_PREFIX@_iterate_func_t)(void *, void *);
37
+
38
+ /*
39
+ ** Matching function (used to find elements in a list)
40
+ ** first argument is the data to search for
41
+ ** second argument is the list element it's being compared to
42
+ ** returns 0 if no match is found, non-zero otherwise
43
+ */
44
+ typedef int (*@LISTHASH_PREFIX@_matchfunc_t)(void *, void *);
45
+
46
+
47
+ struct @LISTHASH_PREFIX@_node
48
+ {
49
+ void *data;
50
+ struct @LISTHASH_PREFIX@_node *next;
51
+ struct @LISTHASH_PREFIX@_node *prev;
52
+ };
53
+ typedef struct @LISTHASH_PREFIX@_node *@LISTHASH_PREFIX@_listptr_t;
54
+
55
+ struct @LISTHASH_PREFIX@_list
56
+ {
57
+ @LISTHASH_PREFIX@_listptr_t first;
58
+ @LISTHASH_PREFIX@_listptr_t last;
59
+ @LISTHASH_PREFIX@_cmpfunc_t cmpfunc;
60
+ int flags;
61
+ unsigned int nents;
62
+ };
63
+ typedef struct @LISTHASH_PREFIX@_list @LISTHASH_PREFIX@_list_t;
64
+
65
+
66
+ /* values for flags */
67
+ #define LIST_USERFUNC 0 /* use cmpfunc() to order */
68
+ #define LIST_STACK 1 /* new elements go in front */
69
+ #define LIST_QUEUE 2 /* new elements go at the end */
70
+
71
+
72
+ /* reset a list pointer */
73
+ void @LISTHASH_PREFIX@_listptr_reset(@LISTHASH_PREFIX@_listptr_t *);
74
+
75
+ /* retrieve the data being pointed to */
76
+ void *@LISTHASH_PREFIX@_listptr_data(@LISTHASH_PREFIX@_listptr_t *);
77
+
78
+ /* creates a new, empty list */
79
+ @LISTHASH_PREFIX@_list_t *@LISTHASH_PREFIX@_list_new(int, @LISTHASH_PREFIX@_cmpfunc_t);
80
+
81
+ /* call a function for every element in a list */
82
+ int @LISTHASH_PREFIX@_list_iterate(@LISTHASH_PREFIX@_list_t *,
83
+ @LISTHASH_PREFIX@_iterate_func_t, void *);
84
+
85
+ /* empty the list */
86
+ void @LISTHASH_PREFIX@_list_empty(@LISTHASH_PREFIX@_list_t *,
87
+ @LISTHASH_PREFIX@_freefunc_t);
88
+
89
+ /* remove and free() the entire list */
90
+ void @LISTHASH_PREFIX@_list_free(@LISTHASH_PREFIX@_list_t *,
91
+ @LISTHASH_PREFIX@_freefunc_t);
92
+
93
+ /* add elements */
94
+ int @LISTHASH_PREFIX@_list_add(@LISTHASH_PREFIX@_list_t *, void *);
95
+
96
+ /* removes an element from the list - returns -1 on error */
97
+ void @LISTHASH_PREFIX@_list_del(@LISTHASH_PREFIX@_list_t *,
98
+ @LISTHASH_PREFIX@_listptr_t *);
99
+
100
+ /* returns 1 when valid data is returned, or 0 at end of list */
101
+ int @LISTHASH_PREFIX@_list_next(@LISTHASH_PREFIX@_list_t *,
102
+ @LISTHASH_PREFIX@_listptr_t *);
103
+
104
+ /* returns 1 when valid data is returned, or 0 at end of list */
105
+ int @LISTHASH_PREFIX@_list_prev(@LISTHASH_PREFIX@_list_t *,
106
+ @LISTHASH_PREFIX@_listptr_t *);
107
+
108
+ /* return 1 if the data matches a list entry, 0 otherwise */
109
+ int @LISTHASH_PREFIX@_list_search(@LISTHASH_PREFIX@_list_t *,
110
+ @LISTHASH_PREFIX@_listptr_t *, void *,
111
+ @LISTHASH_PREFIX@_matchfunc_t);
112
+
113
+ /* return number of elements from list */
114
+ unsigned int @LISTHASH_PREFIX@_list_nents(@LISTHASH_PREFIX@_list_t *);
115
+
116
+ /* adds elements from a string delimited by delim */
117
+ int @LISTHASH_PREFIX@_list_add_str(@LISTHASH_PREFIX@_list_t *, char *, char *);
118
+
119
+ /* string matching function */
120
+ int @LISTHASH_PREFIX@_str_match(char *, char *);
121
+
122
+
123
+ /***** hash.c **********************************************************/
124
+
125
+ /*
126
+ ** Hashing function (determines which bucket the given key hashes into)
127
+ ** first argument is the key to hash
128
+ ** second argument is the total number of buckets
129
+ ** returns the bucket number
130
+ */
131
+ typedef unsigned int (*@LISTHASH_PREFIX@_hashfunc_t)(void *, unsigned int);
132
+
133
+
134
+ struct @LISTHASH_PREFIX@_hashptr
135
+ {
136
+ int bucket;
137
+ @LISTHASH_PREFIX@_listptr_t node;
138
+ };
139
+ typedef struct @LISTHASH_PREFIX@_hashptr @LISTHASH_PREFIX@_hashptr_t;
140
+
141
+ struct @LISTHASH_PREFIX@_hash
142
+ {
143
+ int numbuckets;
144
+ @LISTHASH_PREFIX@_list_t **table;
145
+ @LISTHASH_PREFIX@_hashfunc_t hashfunc;
146
+ unsigned int nents;
147
+ };
148
+ typedef struct @LISTHASH_PREFIX@_hash @LISTHASH_PREFIX@_hash_t;
149
+
150
+
151
+ /* reset a hash pointer */
152
+ void @LISTHASH_PREFIX@_hashptr_reset(@LISTHASH_PREFIX@_hashptr_t *);
153
+
154
+ /* retrieve the data being pointed to */
155
+ void *@LISTHASH_PREFIX@_hashptr_data(@LISTHASH_PREFIX@_hashptr_t *);
156
+
157
+ /* default hash function, optimized for 7-bit strings */
158
+ unsigned int @LISTHASH_PREFIX@_str_hashfunc(char *, unsigned int);
159
+
160
+ /* return number of elements from hash */
161
+ unsigned int @LISTHASH_PREFIX@_hash_nents(@LISTHASH_PREFIX@_hash_t *);
162
+
163
+ /* create a new hash */
164
+ @LISTHASH_PREFIX@_hash_t *@LISTHASH_PREFIX@_hash_new(int, @LISTHASH_PREFIX@_hashfunc_t);
165
+
166
+ /* empty the hash */
167
+ void @LISTHASH_PREFIX@_hash_empty(@LISTHASH_PREFIX@_hash_t *,
168
+ @LISTHASH_PREFIX@_freefunc_t);
169
+
170
+ /* delete all the @LISTHASH_PREFIX@_nodes of the hash and clean up */
171
+ void @LISTHASH_PREFIX@_hash_free(@LISTHASH_PREFIX@_hash_t *,
172
+ @LISTHASH_PREFIX@_freefunc_t);
173
+
174
+ /* returns 1 when valid data is returned, or 0 at end of list */
175
+ int @LISTHASH_PREFIX@_hash_next(@LISTHASH_PREFIX@_hash_t *,
176
+ @LISTHASH_PREFIX@_hashptr_t *);
177
+
178
+ /* return 1 if the data matches a list entry, 0 otherwise */
179
+ int @LISTHASH_PREFIX@_hash_search(@LISTHASH_PREFIX@_hash_t *,
180
+ @LISTHASH_PREFIX@_hashptr_t *, void *,
181
+ @LISTHASH_PREFIX@_matchfunc_t);
182
+
183
+ /* return 1 if the key matches a list entry, 0 otherwise */
184
+ int @LISTHASH_PREFIX@_hash_getkey(@LISTHASH_PREFIX@_hash_t *,
185
+ @LISTHASH_PREFIX@_hashptr_t *, void *,
186
+ @LISTHASH_PREFIX@_matchfunc_t);
187
+
188
+ /* inserting data */
189
+ int @LISTHASH_PREFIX@_hash_add(@LISTHASH_PREFIX@_hash_t *, void *);
190
+
191
+ /* delete an entry */
192
+ int @LISTHASH_PREFIX@_hash_del(@LISTHASH_PREFIX@_hash_t *,
193
+ @LISTHASH_PREFIX@_hashptr_t *);
194
+
195
+ #endif /* ! @LISTHASH_PREFIX@_LISTHASH_H */
196
+
@@ -0,0 +1,21 @@
1
+ AC_DEFUN(subdir[_INIT], [
2
+ AC_REQUIRE([COMPAT_FUNC_STRLCPY])
3
+ AC_REQUIRE([COMPAT_FUNC_STRSEP])
4
+
5
+ if test -z "$2"; then
6
+ LISTHASH_PREFIX="${PACKAGE_NAME}";
7
+ else
8
+ LISTHASH_PREFIX="$2";
9
+ fi
10
+ AC_SUBST([LISTHASH_PREFIX])
11
+
12
+ LISTHASH_DIR="$1";
13
+ AC_SUBST([LISTHASH_DIR])
14
+
15
+ AC_CONFIG_FILES([$1/${LISTHASH_PREFIX}_listhash.h:$1/listhash.h.in])
16
+ AC_CONFIG_FILES([$1/${LISTHASH_PREFIX}_list.c:$1/list.c.in])
17
+ AC_CONFIG_FILES([$1/${LISTHASH_PREFIX}_hash.c:$1/hash.c.in])
18
+ AC_CONFIG_FILES([$1/${LISTHASH_PREFIX}_list_new.3:$1/list_new.3.in])
19
+ AC_CONFIG_FILES([$1/${LISTHASH_PREFIX}_hash_new.3:$1/hash_new.3.in])
20
+ ])
21
+
@@ -0,0 +1,190 @@
1
+ /* config.h.in. Generated from configure.ac by autoheader. */
2
+
3
+ /* Define if your system has a working basename */
4
+ /* #undef HAVE_BASENAME */
5
+
6
+ /* Define to 1 if you have the <ctype.h> header file. */
7
+ #define HAVE_CTYPE_H 1
8
+
9
+ /* Define to 1 if the system has the type `dev_t'. */
10
+ /* #undef HAVE_DEV_T */
11
+
12
+ /* Define if your system has a working dirname */
13
+ /* #undef HAVE_DIRNAME */
14
+
15
+ /* Define to 1 if your system has a working POSIX `fnmatch' function. */
16
+ /* #undef HAVE_FNMATCH */
17
+
18
+ /* Define to 1 if you have the <fnmatch.h> header file. */
19
+ /* #undef HAVE_FNMATCH_H */
20
+
21
+ /* Define to 1 if you have the <inttypes.h> header file. */
22
+ /* #undef HAVE_INTTYPES_H */
23
+
24
+ /* Define to 1 if you have the `lchown' function. */
25
+ /* #undef HAVE_LCHOWN */
26
+
27
+ /* Define to 1 if you have the <libgen.h> header file. */
28
+ /* #undef HAVE_LIBGEN_H */
29
+
30
+ /* Define to 1 if you have the `z' library (-lz). */
31
+ #define HAVE_LIBZ 1
32
+
33
+ /* Define to 1 if the system has the type `major_t'. */
34
+ /* #undef HAVE_MAJOR_T */
35
+
36
+ /* Define to 1 if you have the <memory.h> header file. */
37
+ /* #undef HAVE_MEMORY_H */
38
+
39
+ /* Define to 1 if the system has the type `minor_t'. */
40
+ /* #undef HAVE_MINOR_T */
41
+
42
+ /* Define to 1 if the system has the type `nlink_t'. */
43
+ /* #undef HAVE_NLINK_T */
44
+
45
+ /* Define if your system has a working snprintf */
46
+ /* #undef HAVE_SNPRINTF */
47
+
48
+ /* Define to 1 if the system has the type `socklen_t'. */
49
+ /* #undef HAVE_SOCKLEN_T */
50
+
51
+ /* Define to 1 if you have the <stdint.h> header file. */
52
+ /* #undef HAVE_STDINT_H */
53
+
54
+ /* Define to 1 if you have the <stdlib.h> header file. */
55
+ /* #undef HAVE_STDLIB_H */
56
+
57
+ /* Define if you have the strdup function */
58
+ /* #undef HAVE_STRDUP */
59
+
60
+ /* Define to 1 if you have the `strftime' function. */
61
+ /* #undef HAVE_STRFTIME */
62
+
63
+ /* Define to 1 if you have the <strings.h> header file. */
64
+ /* #undef HAVE_STRINGS_H */
65
+
66
+ /* Define to 1 if you have the <string.h> header file. */
67
+ /* #undef HAVE_STRING_H */
68
+
69
+ /* Define if you have the strlcpy function */
70
+ /* #undef HAVE_STRLCPY */
71
+
72
+ /* Define if you have the strmode function */
73
+ /* #undef HAVE_STRMODE */
74
+
75
+ /* Define if you have the strsep function */
76
+ /* #undef HAVE_STRSEP */
77
+
78
+ /* Define to 1 if you have the <sys/stat.h> header file. */
79
+ /* #undef HAVE_SYS_STAT_H */
80
+
81
+ /* Define to 1 if you have the <sys/types.h> header file. */
82
+ /* #undef HAVE_SYS_TYPES_H */
83
+
84
+ /* Define to 1 if the system has the type `uint64_t'. */
85
+ /* #undef HAVE_UINT64_T */
86
+
87
+ /* Define to 1 if you have the <unistd.h> header file. */
88
+ /* #undef HAVE_UNISTD_H */
89
+
90
+ /* Define to 1 if `major', `minor', and `makedev' are declared in <mkdev.h>.
91
+ */
92
+ /* #undef MAJOR_IN_MKDEV */
93
+
94
+ /* Define to 1 if `major', `minor', and `makedev' are declared in
95
+ <sysmacros.h>. */
96
+ /* #undef MAJOR_IN_SYSMACROS */
97
+
98
+ /* Define as 1 if makedev expects three arguments */
99
+ /* #undef MAKEDEV_THREE_ARGS */
100
+
101
+ /* Define if you want to use the basename function */
102
+ #define NEED_BASENAME 1
103
+
104
+ /* Define if you want to use the dirname function */
105
+ #define NEED_DIRNAME 1
106
+
107
+ /* Define if you want to use the fnmatch function */
108
+ #define NEED_FNMATCH 1
109
+
110
+ /* Define if you want to use the glob function */
111
+ #define NEED_GLOB 1
112
+
113
+ /* Define if you want to use the makedev function */
114
+ #define NEED_MAKEDEV 1
115
+
116
+ /* Define if you want to use the snprintf function */
117
+ /* #undef NEED_SNPRINTF */
118
+
119
+ /* Define if you want to use the strdup function */
120
+ /* #undef NEED_STRDUP */
121
+
122
+ /* Define if you want to use the strlcpy function */
123
+ #define NEED_STRLCPY 1
124
+
125
+ /* Define if you want to use the strmode function */
126
+ #define NEED_STRMODE 1
127
+
128
+ /* Define if you want to use the strsep function */
129
+ #define NEED_STRSEP 1
130
+
131
+ /* Define to the address where bug reports for this package should be sent. */
132
+ #define PACKAGE_BUGREPORT ""
133
+
134
+ /* Define to the full name of this package. */
135
+ #define PACKAGE_NAME "libtar"
136
+
137
+ /* Define to the full name and version of this package. */
138
+ #define PACKAGE_STRING "libtar 1.2.11"
139
+
140
+ /* Define to the one symbol short name of this package. */
141
+ #define PACKAGE_TARNAME "libtar"
142
+
143
+ /* Define to the version of this package. */
144
+ #define PACKAGE_VERSION "1.2.11"
145
+
146
+ /* Define to 1 if you have the ANSI C header files. */
147
+ #define STDC_HEADERS 1
148
+
149
+ /* Define to 1 if on AIX 3.
150
+ System headers sometimes define this.
151
+ We just want to avoid a redefinition error message. */
152
+ /* #ifndef _ALL_SOURCE */
153
+ /* # undef _ALL_SOURCE */
154
+ /* #endif */
155
+
156
+ /* Define to empty if `const' does not conform to ANSI C. */
157
+ /* #undef const */
158
+
159
+ /* Define to `unsigned long' if not defined in system header files. */
160
+ /* #undef dev_t */
161
+
162
+ /* Define to `int' if <sys/types.h> doesn't define. */
163
+ /* #undef gid_t */
164
+
165
+ /* Define to `unsigned int' if not defined in system header files. */
166
+ /* #undef major_t */
167
+
168
+ /* Define to `unsigned int' if not defined in system header files. */
169
+ /* #undef minor_t */
170
+
171
+ /* Define to `int' if <sys/types.h> does not define. */
172
+ /* #undef mode_t */
173
+
174
+ /* Define to `unsigned short' if not defined in system header files. */
175
+ /* #undef nlink_t */
176
+
177
+ /* Define to `long' if <sys/types.h> does not define. */
178
+ /* #undef off_t */
179
+
180
+ /* Define to `unsigned' if <sys/types.h> does not define. */
181
+ /* #undef size_t */
182
+
183
+ /* Define to `unsigned long' if not defined in system header files. */
184
+ /* #undef socklen_t */
185
+
186
+ /* Define to `int' if <sys/types.h> doesn't define. */
187
+ /* #undef uid_t */
188
+
189
+ /* Define to `long long' if not defined in system header files. */
190
+ /* #undef uint64_t */
@@ -0,0 +1,115 @@
1
+ #include <windows.h>
2
+ #include <stdlib.h>
3
+ #include <malloc.h>
4
+ #include <sys/types.h>
5
+ #include <sys/stat.h>
6
+ #include <errno.h>
7
+ #include "dirent.h"
8
+
9
+ #define S_ISDIR(m) (((m) & (_S_IFMT)) == (_S_IFDIR))
10
+
11
+ DIR *opendir0(const char *name, int *errorp) {
12
+ char *path;
13
+ HANDLE h;
14
+ WIN32_FIND_DATAA *fd;
15
+ DIR *dir;
16
+ int namlen;
17
+ struct stat st;
18
+
19
+ if (name == NULL) {
20
+ return NULL;
21
+ }
22
+
23
+ if ((namlen = strlen(name)) == -1) {
24
+ return NULL;
25
+ }
26
+
27
+ if (stat(name, &st) == -1) {
28
+ return NULL;
29
+ }
30
+
31
+ if (!S_ISDIR(st.st_mode)) {
32
+ if (errorp) {
33
+ *errorp = ENOTDIR;
34
+ }
35
+
36
+ return NULL;
37
+ }
38
+
39
+ if (name[namlen -1] == '\\' || name[namlen -1] == '/') {
40
+ path = _alloca(namlen + 2);
41
+ strcpy_s(path, namlen + 2, name);
42
+ path[namlen] = '*';
43
+ path[namlen + 1] = '\0';
44
+ } else {
45
+ path = _alloca(namlen + 3);
46
+ strcpy_s(path, namlen + 3, name);
47
+
48
+ path[namlen] = (strchr(name, '/') != NULL) ? '/' : '\\';
49
+ path[namlen + 1] = '*';
50
+ path[namlen + 2] = '\0';
51
+ }
52
+
53
+ if ((fd = malloc(sizeof(WIN32_FIND_DATA))) == NULL) {
54
+ return NULL;
55
+ }
56
+
57
+ if ((h = FindFirstFileA(path, fd)) == INVALID_HANDLE_VALUE) {
58
+ free(fd);
59
+ return NULL;
60
+ }
61
+
62
+ if ((dir = malloc(sizeof(DIR))) == NULL) {
63
+ FindClose(h);
64
+ free(fd);
65
+ return NULL;
66
+ }
67
+
68
+ dir->h = h;
69
+ dir->fd = fd;
70
+ dir->has_next = TRUE;
71
+
72
+ return dir;
73
+ }
74
+
75
+ struct dirent *readdir(DIR *dir) {
76
+ char *cFileName;
77
+ char *d_name;
78
+
79
+ if (dir == NULL) {
80
+ return NULL;
81
+ }
82
+
83
+ if (dir->fd == NULL) {
84
+ return NULL;
85
+ }
86
+
87
+ if (!dir->has_next) {
88
+ return NULL;
89
+ }
90
+
91
+ cFileName = dir->fd->cFileName;
92
+ d_name = dir->entry.d_name;
93
+ strcpy_s(d_name, _MAX_PATH, cFileName);
94
+ dir->has_next = FindNextFileA(dir->h, dir->fd);
95
+
96
+ return &dir->entry;
97
+ }
98
+
99
+ int closedir(DIR *dir) {
100
+ if (dir == NULL) {
101
+ return -1;
102
+ }
103
+
104
+ if (dir->h && dir->h != INVALID_HANDLE_VALUE) {
105
+ FindClose(dir->h);
106
+ }
107
+
108
+ if (dir->fd) {
109
+ free(dir->fd);
110
+ }
111
+
112
+ free(dir);
113
+
114
+ return 0;
115
+ }
@@ -0,0 +1,24 @@
1
+ #ifndef __DIRENT_H__
2
+ #define __DIRENT_H__
3
+
4
+ #include <windows.h>
5
+ #include <sys/types.h>
6
+
7
+ struct dirent {
8
+ ino_t d_ino;
9
+ char d_name[_MAX_PATH];
10
+ };
11
+
12
+ typedef struct {
13
+ HANDLE h;
14
+ WIN32_FIND_DATAA *fd;
15
+ BOOL has_next;
16
+ struct dirent entry;
17
+ } DIR;
18
+
19
+ DIR *opendir0(const char *name, int *errorp);
20
+ #define opendir(n) opendir0((n), NULL)
21
+ struct dirent *readdir(DIR *dir);
22
+ int closedir(DIR *dir);
23
+
24
+ #endif
@@ -0,0 +1,4 @@
1
+ #ifndef __GRP_H__
2
+ #define __GRP_H__
3
+
4
+ #endif