packvfs

annotate 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
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 }