packvfs

view pvfsh/src/main.c @ 2:dc23ab0545a6

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