rev |
line source |
nuclear@2
|
1 #include <stdio.h>
|
nuclear@2
|
2 #include <stdlib.h>
|
nuclear@2
|
3 #include <string.h>
|
nuclear@2
|
4 #include <ctype.h>
|
nuclear@2
|
5 #include "pvfs.h"
|
nuclear@2
|
6
|
nuclear@2
|
7 char *strip_wspace(char *str);
|
nuclear@2
|
8 char **tokenize(char *str);
|
nuclear@2
|
9 void cmdproc(int argc, char **argv);
|
nuclear@2
|
10
|
nuclear@2
|
11 int main(void)
|
nuclear@2
|
12 {
|
nuclear@2
|
13 int i;
|
nuclear@2
|
14 char buf[512];
|
nuclear@2
|
15
|
nuclear@2
|
16 printf("welcome to packvfs shell\n");
|
nuclear@2
|
17
|
nuclear@2
|
18 fputs("> ", stdout);
|
nuclear@2
|
19 fflush(stdout);
|
nuclear@2
|
20
|
nuclear@2
|
21 while(fgets(buf, sizeof buf, stdin)) {
|
nuclear@2
|
22 char *inp = strip_wspace(buf);
|
nuclear@2
|
23
|
nuclear@2
|
24 if(inp && *inp && *inp != '#') {
|
nuclear@2
|
25 char **tokens = tokenize(inp);
|
nuclear@2
|
26 for(i=0; tokens[i]; i++);
|
nuclear@2
|
27
|
nuclear@2
|
28 cmdproc(i, tokens);
|
nuclear@2
|
29 }
|
nuclear@2
|
30
|
nuclear@2
|
31 fputs("> ", stdout);
|
nuclear@2
|
32 fflush(stdout);
|
nuclear@2
|
33 }
|
nuclear@2
|
34 putchar('\n');
|
nuclear@2
|
35
|
nuclear@2
|
36 return 0;
|
nuclear@2
|
37 }
|
nuclear@2
|
38
|
nuclear@2
|
39 char *strip_wspace(char *str)
|
nuclear@2
|
40 {
|
nuclear@2
|
41 char *end = str + strlen(str) - 1;
|
nuclear@2
|
42
|
nuclear@2
|
43 while(*str && isspace(*str)) str++;
|
nuclear@2
|
44
|
nuclear@2
|
45 while(isspace(*end)) end--;
|
nuclear@2
|
46 end[1] = 0;
|
nuclear@2
|
47
|
nuclear@2
|
48 return str;
|
nuclear@2
|
49 }
|
nuclear@2
|
50
|
nuclear@2
|
51 #define SEP " \t\v\n\r"
|
nuclear@2
|
52
|
nuclear@2
|
53 char **tokenize(char *str)
|
nuclear@2
|
54 {
|
nuclear@2
|
55 int idx = 1;
|
nuclear@2
|
56 static char *argv[256];
|
nuclear@2
|
57
|
nuclear@2
|
58 argv[0] = strtok(str, SEP);
|
nuclear@2
|
59 while((argv[idx] = strtok(0, SEP))) idx++;
|
nuclear@2
|
60
|
nuclear@2
|
61 argv[idx] = 0;
|
nuclear@2
|
62 return argv;
|
nuclear@2
|
63 }
|
nuclear@2
|
64
|
nuclear@2
|
65 void cmd_chdir(int argc, char **argv);
|
nuclear@2
|
66 void cmd_list(int argc, char **argv);
|
nuclear@2
|
67 void cmd_train(int argc, char **argv);
|
nuclear@2
|
68 void cmd_cat(int argc, char **argv);
|
nuclear@2
|
69 void cmd_pwd(int argc, char **argv);
|
nuclear@2
|
70
|
nuclear@2
|
71 static struct { const char *cmd; void (*proc)(int, char**); } cmdlist[] = {
|
nuclear@2
|
72 {"cd", cmd_chdir},
|
nuclear@2
|
73 {"chdir", cmd_chdir},
|
nuclear@2
|
74 {"ls", cmd_list},
|
nuclear@2
|
75 {"sl", cmd_train},
|
nuclear@2
|
76 {"cat", cmd_cat},
|
nuclear@2
|
77 {"pwd", cmd_pwd},
|
nuclear@2
|
78 {0, 0}
|
nuclear@2
|
79 };
|
nuclear@2
|
80
|
nuclear@2
|
81 void cmdproc(int argc, char **argv)
|
nuclear@2
|
82 {
|
nuclear@2
|
83 int i;
|
nuclear@2
|
84
|
nuclear@2
|
85 for(i=0; cmdlist[i].cmd; i++) {
|
nuclear@2
|
86 if(strcmp(argv[0], cmdlist[i].cmd) == 0) {
|
nuclear@2
|
87 cmdlist[i].proc(argc, argv);
|
nuclear@2
|
88 return;
|
nuclear@2
|
89 }
|
nuclear@2
|
90 }
|
nuclear@2
|
91
|
nuclear@2
|
92 fprintf(stderr, "unknown command: %s\n", argv[0]);
|
nuclear@2
|
93 }
|
nuclear@2
|
94
|
nuclear@2
|
95 void cmd_chdir(int argc, char **argv)
|
nuclear@2
|
96 {
|
nuclear@2
|
97 if(argv[1]) {
|
nuclear@2
|
98 if(pvfs_chdir(argv[1]) == -1) {
|
nuclear@2
|
99 fprintf(stderr, "failed to change into directory: %s\n", argv[1]);
|
nuclear@2
|
100 }
|
nuclear@2
|
101 } else {
|
nuclear@2
|
102 fprintf(stderr, "syntax: cd <path>\n");
|
nuclear@2
|
103 }
|
nuclear@2
|
104 }
|
nuclear@2
|
105
|
nuclear@2
|
106 static int lscmp(const void *a, const void *b)
|
nuclear@2
|
107 {
|
nuclear@2
|
108 return strcmp(*(char**)a, *(char**)b);
|
nuclear@2
|
109 }
|
nuclear@2
|
110
|
nuclear@2
|
111 void cmd_list(int argc, char **argv)
|
nuclear@2
|
112 {
|
nuclear@2
|
113 char *dirpath = ".";
|
nuclear@2
|
114 PVFS_DIR *dir;
|
nuclear@2
|
115 struct pvfs_dirent *dent;
|
nuclear@2
|
116 char **entries;
|
nuclear@2
|
117 int i, num_entries = 0;
|
nuclear@2
|
118
|
nuclear@2
|
119 if(argv[1]) {
|
nuclear@2
|
120 dirpath = argv[1];
|
nuclear@2
|
121 }
|
nuclear@2
|
122
|
nuclear@2
|
123 if(!(dir = pvfs_opendir(dirpath))) {
|
nuclear@2
|
124 fprintf(stderr, "failed to open directory\n");
|
nuclear@2
|
125 return;
|
nuclear@2
|
126 }
|
nuclear@2
|
127
|
nuclear@2
|
128 while((dent = pvfs_readdir(dir))) {
|
nuclear@2
|
129 num_entries++;
|
nuclear@2
|
130 }
|
nuclear@2
|
131
|
nuclear@2
|
132 if(!(entries = malloc(num_entries * sizeof *entries))) {
|
nuclear@2
|
133 fprintf(stderr, "out of memory\n");
|
nuclear@2
|
134 pvfs_closedir(dir);
|
nuclear@2
|
135 return;
|
nuclear@2
|
136 }
|
nuclear@2
|
137
|
nuclear@2
|
138 i = 0;
|
nuclear@2
|
139 pvfs_rewinddir(dir);
|
nuclear@2
|
140 while((dent = pvfs_readdir(dir))) {
|
nuclear@2
|
141 entries[i++] = strdup(dent->d_name);
|
nuclear@2
|
142 }
|
nuclear@2
|
143 pvfs_closedir(dir);
|
nuclear@2
|
144
|
nuclear@2
|
145 qsort(entries, num_entries, sizeof *entries, lscmp);
|
nuclear@2
|
146 /*(int (*)(const void*, const void*))strcmp);*/
|
nuclear@2
|
147
|
nuclear@2
|
148 for(i=0; i<num_entries; i++) {
|
nuclear@2
|
149 puts(entries[i]);
|
nuclear@2
|
150 free(entries[i]);
|
nuclear@2
|
151 }
|
nuclear@2
|
152 free(entries);
|
nuclear@2
|
153 }
|
nuclear@2
|
154
|
nuclear@2
|
155 void cmd_train(int argc, char **argv)
|
nuclear@2
|
156 {
|
nuclear@2
|
157 printf("sorry, we're all out of trains at the moment\n");
|
nuclear@2
|
158 }
|
nuclear@2
|
159
|
nuclear@2
|
160 void cmd_cat(int argc, char **argv)
|
nuclear@2
|
161 {
|
nuclear@2
|
162 int i;
|
nuclear@2
|
163 char buf[512];
|
nuclear@2
|
164
|
nuclear@2
|
165 for(i=1; i<argc; i++) {
|
nuclear@2
|
166 size_t sz;
|
nuclear@2
|
167 PVFS_FILE *fp = pvfs_fopen(argv[i], "rb");
|
nuclear@2
|
168 if(!fp) {
|
nuclear@2
|
169 fprintf(stderr, "failed to open file: %s\n", argv[i]);
|
nuclear@2
|
170 continue;
|
nuclear@2
|
171 }
|
nuclear@2
|
172
|
nuclear@2
|
173 while((sz = pvfs_fread(buf, 1, sizeof buf, fp)) > 0) {
|
nuclear@2
|
174 fwrite(buf, 1, sz, stdout);
|
nuclear@2
|
175 }
|
nuclear@2
|
176 fflush(stdout);
|
nuclear@2
|
177 }
|
nuclear@2
|
178 }
|
nuclear@2
|
179
|
nuclear@2
|
180 void cmd_pwd(int argc, char **argv)
|
nuclear@2
|
181 {
|
nuclear@2
|
182 printf("not implemented yet!\n");
|
nuclear@2
|
183 }
|