OSDN Git Service

Fix filename case conversion on utf8 system
[lha/lha.git] / src / lhdir.c
1 /* ------------------------------------------------------------------------ */
2 /* LHa for UNIX                                                             */
3 /*              lhdir.c -- Directory access routine                         */
4 /*                                                                          */
5 /*      Copyright (C) MCMLXXXIX Yooichi.Tagawa                              */
6 /*      Modified                Nobutaka Watazaki                           */
7 /*                                                                          */
8 /*  Emulate opendir(),readdir(),closedir() function for LHarc               */
9 /*                                                                          */
10 /*  Ver. 0.00  Original                             1988.05.31  Y.Tagawa    */
11 /*  Ver. 0.03  Release #3 for LHarc UNIX            1988.07.02  Y.Tagawa    */
12 /*  Ver. 1.00  Fixed                                1989.09.22  Y.Tagawa    */
13 /*  Ver. 1.14  Source All chagned                   1995.01.14  N.Watazaki  */
14 /* ------------------------------------------------------------------------ */
15 #include "lha.h"
16
17 /* Where is O_RDONLY ? (^_^) */
18 #include <sys/file.h>
19
20 #ifndef O_RDONLY
21 #include <fcntl.h>
22 #endif
23
24 #define direct old_direct
25
26 #include <sys/dir.h>
27
28 #undef direct
29
30 #ifndef DIRSIZ
31 /* Warning :  Are you sure? (normally defined in <sys/dir.h> */
32 #define DIRSIZ  14
33 #endif
34
35 #include "lhdir.h"
36
37 /* ------------------------------------------------------------------------ */
38 DIR            *
39 opendir(name)
40     char           *name;
41 {
42     register DIR   *dirp;
43     register int    fd;
44
45     if ((fd = open(name, O_RDONLY)) >= 0) {
46         if ((dirp = (DIR *) malloc(sizeof(DIR))) != (DIR *) 0) {
47             dirp->dd_fd = fd;
48             dirp->dd_loc = 0;
49             dirp->dd_size = 0;
50             return dirp;
51         }
52
53         close(fd);
54     }
55
56     return (DIR *) 0;
57 }
58
59 /* ------------------------------------------------------------------------ */
60 struct direct  *
61 readdir(dirp)
62     register DIR   *dirp;
63 {
64     static struct direct lhdir;
65     register struct old_direct *dp;
66
67     do {
68         if (dirp->dd_loc >= dirp->dd_size) {
69             dirp->dd_loc = 0;
70             if ((dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ)) <= 0)
71                 return (struct direct *) 0;
72         }
73
74         dp = (struct old_direct *) (dirp->dd_buf + dirp->dd_loc);
75
76         if (dirp->dd_loc + sizeof(struct old_direct) > dirp->dd_size)
77             return (struct direct *) 0;
78
79         dirp->dd_loc += sizeof(struct old_direct);
80
81     } while (dp->d_ino == 0);
82
83     /* construct new format */
84     lhdir.d_ino = dp->d_ino;
85     strncpy(lhdir.d_name, dp->d_name, DIRSIZ);
86     lhdir.d_name[DIRSIZ] = '\0';
87     lhdir.d_namlen = strlen(lhdir.d_name);
88
89     return &lhdir;
90 }
91
92 /* ------------------------------------------------------------------------ */
93 closedir(dirp)
94     DIR            *dirp;
95 {
96     close(dirp->dd_fd);
97     free(dirp);
98 }