Subversion Repositories HelenOS

Rev

Rev 4327 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4327 Rev 4718
Line 48... Line 48...
48
#include "ls.h"
48
#include "ls.h"
49
#include "cmds.h"
49
#include "cmds.h"
50
 
50
 
51
static char *cmdname = "ls";
51
static char *cmdname = "ls";
52
 
52
 
53
static inline off_t flen(const char *f)
-
 
54
{
-
 
55
    int fd;
-
 
56
    off_t size;
-
 
57
 
-
 
58
    fd = open(f, O_RDONLY);
-
 
59
    if (fd == -1)
-
 
60
        return 0;
-
 
61
 
-
 
62
    size = lseek(fd, 0, SEEK_END);
-
 
63
    close(fd);
-
 
64
 
-
 
65
    if (size < 0)
-
 
66
        size = 0;
-
 
67
 
-
 
68
    return size;
-
 
69
}
-
 
70
 
-
 
71
static unsigned int ls_scope(const char *path)
-
 
72
{
-
 
73
    int fd;
-
 
74
    DIR *dirp;
-
 
75
 
-
 
76
    dirp = opendir(path);
-
 
77
    if (dirp) {
-
 
78
        closedir(dirp);
-
 
79
        return LS_DIR;
-
 
80
    }
-
 
81
 
-
 
82
    fd = open(path, O_RDONLY);
-
 
83
    if (fd > 0) {
-
 
84
        close(fd);
-
 
85
        return LS_FILE;
-
 
86
    }
-
 
87
 
-
 
88
    return LS_BOGUS;
-
 
89
}
-
 
90
 
-
 
91
static void ls_scan_dir(const char *d, DIR *dirp)
53
static void ls_scan_dir(const char *d, DIR *dirp)
92
{
54
{
93
    struct dirent *dp;
55
    struct dirent *dp;
94
    unsigned int scope;
-
 
95
    char *buff;
56
    char *buff;
96
 
57
 
97
    if (! dirp)
58
    if (! dirp)
98
        return;
59
        return;
99
 
60
 
Line 106... Line 67...
106
    while ((dp = readdir(dirp))) {
67
    while ((dp = readdir(dirp))) {
107
        memset(buff, 0, sizeof(buff));
68
        memset(buff, 0, sizeof(buff));
108
        /* Don't worry if inserting a double slash, this will be fixed by
69
        /* Don't worry if inserting a double slash, this will be fixed by
109
         * absolutize() later with subsequent calls to open() or readdir() */
70
         * absolutize() later with subsequent calls to open() or readdir() */
110
        snprintf(buff, PATH_MAX - 1, "%s/%s", d, dp->d_name);
71
        snprintf(buff, PATH_MAX - 1, "%s/%s", d, dp->d_name);
111
        scope = ls_scope(buff);
-
 
112
        switch (scope) {
-
 
113
        case LS_DIR:
-
 
114
            ls_print_dir(dp->d_name);
-
 
115
            break;
-
 
116
        case LS_FILE:
-
 
117
            ls_print_file(dp->d_name, buff);
72
        ls_print(dp->d_name, buff);
118
            break;
-
 
119
        case LS_BOGUS:
-
 
120
            /* Odd chance it was deleted from the time readdir() found
-
 
121
             * it and the time that it was scoped */
-
 
122
            printf("ls: skipping bogus node %s\n", dp->d_name);
-
 
123
            break;
-
 
124
        }
-
 
125
    }
73
    }
126
 
74
 
127
    free(buff);
75
    free(buff);
128
 
76
 
129
    return;
77
    return;
130
}
78
}
131
 
79
 
132
/* ls_print_* currently does nothing more than print the entry.
80
/* ls_print currently does nothing more than print the entry.
133
 * in the future, we will likely pass the absolute path, and
81
 * in the future, we will likely pass the absolute path, and
134
 * some sort of ls_options structure that controls how each
82
 * some sort of ls_options structure that controls how each
135
 * entry is printed and what is printed about it.
83
 * entry is printed and what is printed about it.
136
 *
84
 *
137
 * Now we just print basic DOS style lists */
85
 * Now we just print basic DOS style lists */
138
 
86
 
139
static void ls_print_dir(const char *d)
87
static void ls_print(const char *name, const char *pathname)
140
{
88
{
141
    printf("%-40s\t<dir>\n", d);
89
    struct stat s;
-
 
90
    int rc;
142
 
91
 
-
 
92
    rc = stat(pathname, &s);
-
 
93
    if (rc != 0) {
-
 
94
        /* Odd chance it was deleted from the time readdir() found it */
-
 
95
        printf("ls: skipping bogus node %s\n", pathname);
-
 
96
        printf("rc=%d\n", rc);
143
    return;
97
        return;
144
}
98
    }
145
 
99
   
-
 
100
    if (s.is_file)
146
static void ls_print_file(const char *name, const char *pathname)
101
        printf("%-40s\t%llu\n", name, (long long) s.size);
147
{
102
    else
148
    printf("%-40s\t%llu\n", name, (long long) flen(pathname));
103
        printf("%-40s\n", name);
149
 
104
 
150
    return;
105
    return;
151
}
106
}
152
 
107
 
153
void help_cmd_ls(unsigned int level)
108
void help_cmd_ls(unsigned int level)
Line 164... Line 119...
164
}
119
}
165
 
120
 
166
int cmd_ls(char **argv)
121
int cmd_ls(char **argv)
167
{
122
{
168
    unsigned int argc;
123
    unsigned int argc;
169
    unsigned int scope;
124
    struct stat s;
170
    char *buff;
125
    char *buff;
171
    DIR *dirp;
126
    DIR *dirp;
172
 
127
 
173
    argc = cli_count_args(argv);
128
    argc = cli_count_args(argv);
174
 
129
 
Line 182... Line 137...
182
    if (argc == 1)
137
    if (argc == 1)
183
        getcwd(buff, PATH_MAX);
138
        getcwd(buff, PATH_MAX);
184
    else
139
    else
185
        str_cpy(buff, PATH_MAX, argv[1]);
140
        str_cpy(buff, PATH_MAX, argv[1]);
186
 
141
 
187
    scope = ls_scope(buff);
-
 
188
 
-
 
189
    switch (scope) {
142
    if (stat(buff, &s)) {
190
    case LS_BOGUS:
-
 
191
        cli_error(CL_ENOENT, buff);
143
        cli_error(CL_ENOENT, buff);
192
        free(buff);
144
        free(buff);
193
        return CMD_FAILURE;
145
        return CMD_FAILURE;
-
 
146
    }
-
 
147
 
194
    case LS_FILE:
148
    if (s.is_file) {
195
        ls_print_file(buff, buff);
149
        ls_print(buff, buff);
196
        break;
150
    } else {
197
    case LS_DIR:
-
 
198
        dirp = opendir(buff);
151
        dirp = opendir(buff);
199
        if (! dirp) {
152
        if (!dirp) {
200
            /* May have been deleted between scoping it and opening it */
153
            /* May have been deleted between scoping it and opening it */
201
            cli_error(CL_EFAIL, "Could not stat %s", buff);
154
            cli_error(CL_EFAIL, "Could not stat %s", buff);
202
            free(buff);
155
            free(buff);
203
            return CMD_FAILURE;
156
            return CMD_FAILURE;
204
        }
157
        }
205
        ls_scan_dir(buff, dirp);
158
        ls_scan_dir(buff, dirp);
206
        closedir(dirp);
159
        closedir(dirp);
207
        break;
-
 
208
    }
160
    }
209
 
161
 
210
    free(buff);
162
    free(buff);
211
 
163
 
212
    return CMD_SUCCESS;
164
    return CMD_SUCCESS;