Rev 3293 | Rev 3309 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3293 | Rev 3294 | ||
---|---|---|---|
1 | /* Automatically generated by mknewcmd on Mon Aug 11 00:22:09 PHT 2008 |
- | |
2 | * This is machine generated output. The author of mknewcmd claims no |
- | |
3 | * copyright over the contents of this file. Where legally permitted, the |
1 | /* Copyright (c) 2008, Tim Post <tinkertim@gmail.com> |
4 | * contents herein are donated to the public domain. |
2 | * All rights reserved. |
5 | * |
3 | * |
6 | * You should apply any license and copyright that you wish to this file, |
4 | * Redistribution and use in source and binary forms, with or without |
- | 5 | * modification, are permitted provided that the following conditions are met: |
|
- | 6 | * |
|
- | 7 | * Redistributions of source code must retain the above copyright notice, this |
|
- | 8 | * list of conditions and the following disclaimer. |
|
- | 9 | * |
|
- | 10 | * Redistributions in binary form must reproduce the above copyright notice, |
|
- | 11 | * this list of conditions and the following disclaimer in the documentation |
|
- | 12 | * and/or other materials provided with the distribution. |
|
- | 13 | * |
|
- | 14 | * Neither the name of the original program's authors nor the names of its |
|
- | 15 | * contributors may be used to endorse or promote products derived from this |
|
7 | * replacing this header in its entirety. */ |
16 | * software without specific prior written permission. |
- | 17 | * |
|
- | 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
|
- | 19 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
- | 20 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
- | 21 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
|
- | 22 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|
- | 23 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
|
- | 24 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
|
- | 25 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|
- | 26 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|
- | 27 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
|
- | 28 | * POSSIBILITY OF SUCH DAMAGE. |
|
- | 29 | */ |
|
8 | 30 | ||
- | 31 | /* NOTE: |
|
9 | /* Extremely primitive 'ls' implementation. Does not sort or stat files, |
32 | * This is a bit of an ugly hack, working around the absence of fstat / etc. |
10 | * just here for convenience */ |
33 | * As more stuff is completed and exposed in libc, this will improve */ |
11 | 34 | ||
12 | #include <stdio.h> |
35 | #include <stdio.h> |
13 | #include <stdlib.h> |
36 | #include <stdlib.h> |
14 | #include <unistd.h> |
37 | #include <unistd.h> |
15 | #include <dirent.h> |
38 | #include <dirent.h> |
16 | #include <fcntl.h> |
39 | #include <fcntl.h> |
17 | #include <sys/types.h> |
40 | #include <sys/types.h> |
18 | #include <sys/stat.h> |
41 | #include <sys/stat.h> |
19 | #include <string.h> |
42 | #include <string.h> |
20 | 43 | ||
21 | #include "errors.h" |
44 | #include "errors.h" |
22 | #include "config.h" |
45 | #include "config.h" |
23 | #include "util.h" |
46 | #include "util.h" |
24 | #include "entry.h" |
47 | #include "entry.h" |
25 | #include "ls.h" |
48 | #include "ls.h" |
26 | #include "cmds.h" |
49 | #include "cmds.h" |
27 | 50 | ||
28 | static char *cmdname = "ls"; |
51 | static char *cmdname = "ls"; |
29 | 52 | ||
30 | unsigned int ls_scope(const char *path) |
53 | unsigned int ls_scope(const char *path) |
31 | { |
54 | { |
32 | int fd; |
55 | int fd; |
33 | DIR *dirp; |
56 | DIR *dirp; |
34 | 57 | ||
35 | dirp = opendir(path); |
58 | dirp = opendir(path); |
36 | if (dirp) { |
59 | if (dirp) { |
37 | closedir(dirp); |
60 | closedir(dirp); |
38 | return LS_DIR; |
61 | return LS_DIR; |
39 | } |
62 | } |
40 | 63 | ||
41 | fd = open(path, O_RDONLY); |
64 | fd = open(path, O_RDONLY); |
42 | if (fd > 0) { |
65 | if (fd > 0) { |
43 | close(fd); |
66 | close(fd); |
44 | return LS_FILE; |
67 | return LS_FILE; |
45 | } |
68 | } |
46 | 69 | ||
47 | return LS_BOGUS; |
70 | return LS_BOGUS; |
48 | } |
71 | } |
49 | 72 | ||
50 | void ls_print(const char *f) |
73 | void ls_print(const char *f) |
51 | { |
74 | { |
52 | if (ls_scope(f) == LS_FILE) |
75 | if (ls_scope(f) == LS_FILE) |
53 | printf("%-40s\n", f); |
76 | printf("%-40s\n", f); |
54 | else |
77 | else |
55 | printf("%-40s <DIR>\n", f); |
78 | printf("%-40s <DIR>\n", f); |
56 | return; |
79 | return; |
57 | } |
80 | } |
58 | 81 | ||
59 | /* Dispays help for ls in various levels */ |
82 | /* Dispays help for ls in various levels */ |
60 | void * help_cmd_ls(unsigned int level) |
83 | void * help_cmd_ls(unsigned int level) |
61 | { |
84 | { |
- | 85 | if (level == HELP_SHORT) { |
|
62 | printf("This is the %s help for '%s'.\n", |
86 | printf("`%s' lists files and directories.\n", cmdname); |
- | 87 | } else { |
|
- | 88 | help_cmd_ls(HELP_SHORT); |
|
- | 89 | printf(" `%s' [path], if no path is given the current " |
|
63 | level ? EXT_HELP : SHORT_HELP, cmdname); |
90 | "working directory is used.\n", cmdname); |
- | 91 | } |
|
- | 92 | ||
64 | return CMD_VOID; |
93 | return CMD_VOID; |
65 | } |
94 | } |
66 | 95 | ||
67 | int * cmd_ls(char **argv) |
96 | int * cmd_ls(char **argv) |
68 | { |
97 | { |
69 | unsigned int argc; |
98 | unsigned int argc; |
70 | unsigned int scope; |
99 | unsigned int scope; |
71 | char *buff; |
100 | char *buff; |
72 | 101 | ||
73 | DIR *dirp; |
102 | DIR *dirp; |
74 | struct dirent *dp; |
103 | struct dirent *dp; |
75 | 104 | ||
76 | /* Count the arguments */ |
105 | /* Count the arguments */ |
77 | for (argc = 0; argv[argc] != NULL; argc ++); |
106 | for (argc = 0; argv[argc] != NULL; argc ++); |
78 | 107 | ||
79 | if (argc > 2) { |
108 | if (argc > 2) { |
80 | printf("%s - Too many arguments. Try `help %s extended'\n", |
109 | printf("%s - Too many arguments. Try `help %s extended'\n", |
81 | cmdname, cmdname); |
110 | cmdname, cmdname); |
82 | return CMD_FAILURE; |
111 | return CMD_FAILURE; |
83 | } |
112 | } |
84 | 113 | ||
85 | buff = (char *) malloc(PATH_MAX); |
114 | buff = (char *) malloc(PATH_MAX); |
86 | if (NULL == buff) { |
115 | if (NULL == buff) { |
87 | cli_error(CL_ENOMEM, "%s: ", cmdname); |
116 | cli_error(CL_ENOMEM, "%s: ", cmdname); |
88 | return CMD_FAILURE; |
117 | return CMD_FAILURE; |
89 | } |
118 | } |
90 | memset(buff, 0, sizeof(buff)); |
119 | memset(buff, 0, sizeof(buff)); |
91 | 120 | ||
92 | if (argc == 1) |
121 | if (argc == 1) |
93 | getcwd(buff, PATH_MAX); |
122 | getcwd(buff, PATH_MAX); |
94 | else |
123 | else |
95 | strncpy(buff, argv[1], PATH_MAX); |
124 | strncpy(buff, argv[1], PATH_MAX); |
96 | 125 | ||
97 | scope = ls_scope(buff); |
126 | scope = ls_scope(buff); |
98 | 127 | ||
99 | switch (scope) { |
128 | switch (scope) { |
100 | case LS_BOGUS: |
129 | case LS_BOGUS: |
101 | cli_error(CL_ENOENT, buff); |
130 | cli_error(CL_ENOENT, buff); |
102 | free(buff); |
131 | free(buff); |
103 | return CMD_FAILURE; |
132 | return CMD_FAILURE; |
104 | case LS_FILE: |
133 | case LS_FILE: |
105 | ls_print(buff); |
134 | ls_print(buff); |
106 | break; |
135 | break; |
107 | case LS_DIR: |
136 | case LS_DIR: |
108 | dirp = opendir(buff); |
137 | dirp = opendir(buff); |
109 | while ((dp = readdir(dirp))) |
138 | while ((dp = readdir(dirp))) |
110 | ls_print(dp->d_name); |
139 | ls_print(dp->d_name); |
111 | closedir(dirp); |
140 | closedir(dirp); |
112 | break; |
141 | break; |
113 | } |
142 | } |
114 | 143 | ||
115 | free(buff); |
144 | free(buff); |
116 | 145 | ||
117 | return CMD_SUCCESS; |
146 | return CMD_SUCCESS; |
118 | 147 | ||
119 | } |
148 | } |
120 | 149 | ||
121 | 150 |