diff --git a/common/environment.c b/common/environment.c index fd8307de0..d7e2ff586 100644 --- a/common/environment.c +++ b/common/environment.c @@ -1,3 +1,20 @@ +#ifdef HOST +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../include/envfs.h" +#define xmalloc malloc + +#else #include #include #include @@ -8,10 +25,11 @@ #include #include #include +#endif -int envfs_save(char *path, char *env_path) +int envfs_save(char *filename, char *dirname) { - struct dir *dir; + DIR *dir; struct dirent *d; int malloc_size = 0; struct stat s; @@ -23,7 +41,7 @@ int envfs_save(char *path, char *env_path) struct envfs_inode *inode = NULL; int fd; - envfd = open(path, O_WRONLY); + envfd = open(filename, O_WRONLY); if (envfd < 0) { perror("open"); return -1; @@ -33,7 +51,7 @@ int envfs_save(char *path, char *env_path) write(envfd, &super, sizeof(struct envfs_super)); - dir = opendir(env_path); + dir = opendir(dirname); if (!dir) { perror("opendir"); close(envfd); @@ -41,7 +59,7 @@ int envfs_save(char *path, char *env_path) } while ((d = readdir(dir))) { - sprintf(tmp, "%s/%s", env_path, d->name); + sprintf(tmp, "%s/%s", dirname, d->d_name); if (stat(tmp, &s)) { perror("stat"); goto out; @@ -54,6 +72,7 @@ int envfs_save(char *path, char *env_path) if (buf) free(buf); inode = xmalloc(isize); + buf = inode; malloc_size = isize; } fd = open(tmp, O_RDONLY); @@ -69,16 +88,17 @@ int envfs_save(char *path, char *env_path) close(fd); inode->magic = ENVFS_INODE_MAGIC; inode->size = s.st_size; - strcpy(inode->name, d->name); /* FIXME: strncpy */ - /* calc crc */ + strcpy(inode->name, d->d_name); /* FIXME: strncpy */ + /* FIXME: calc crc */ if (write(envfd, inode, isize) < isize) { perror("write"); goto out; } } - *(unsigned long *)tmp = ENVFS_END_MAGIC; - if (write(envfd, &tmp, 4) < 4) { + memset(inode, 0, sizeof(struct envfs_inode)); + inode->magic = ENVFS_END_MAGIC; + if (write(envfd, inode, sizeof(struct envfs_inode)) < sizeof(struct envfs_inode)) { perror("write"); goto out; } @@ -90,30 +110,32 @@ out: return 0; } -int do_envsave(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +#ifndef HOST +int do_saveenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - char *env, *envpath; + char *filename, *dirname; printf("saving environment\n"); if (argc < 3) - envpath = "/env"; + dirname = "/env"; else - envpath = argv[2]; + dirname = argv[2]; if (argc < 2) - env = "/dev/env0"; + filename = "/dev/env0"; else - env = argv[1]; + filename = argv[1]; - return envfs_save(env, envpath); + return envfs_save(filename, dirname); } -U_BOOT_CMD( - envsave, 3, 0, do_envsave, - "saveenv - save environment variables to persistent storage\n", - NULL -); +U_BOOT_CMD_START(saveenv) + .maxargs = 3, + .cmd = do_saveenv, + .usage = "saveenv - save environment to persistent storage\n", +U_BOOT_CMD_END +#endif -int envfs_load(char *path, char *env_path) +int envfs_load(char *filename, char *dirname) { int malloc_size = 0; struct envfs_super super; @@ -123,7 +145,7 @@ int envfs_load(char *path, char *env_path) struct envfs_inode inode; int fd; - envfd = open(path, O_RDONLY); + envfd = open(filename, O_RDONLY); if (envfd < 0) { perror("open"); return -1; @@ -142,7 +164,7 @@ int envfs_load(char *path, char *env_path) if (inode.magic == ENVFS_END_MAGIC) break; if (inode.magic != ENVFS_INODE_MAGIC) { - printf("envfs: wrong magic on %s\n", path); + printf("envfs: wrong magic on %s\n", filename); goto out; } if (inode.size > malloc_size) { @@ -155,7 +177,7 @@ int envfs_load(char *path, char *env_path) perror("read"); goto out; } - sprintf(tmp, "%s/%s", env_path, inode.name); + sprintf(tmp, "%s/%s", dirname, inode.name); fd = open(tmp, O_WRONLY | O_CREAT); if (fd < 0) { @@ -185,25 +207,63 @@ out: return errno; } -int do_envload(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +#ifndef HOST +int do_loadenv(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - char *env, *envpath; + char *filename, *dirname; if (argc < 3) - envpath = "/env"; + dirname = "/env"; else - envpath = argv[2]; + dirname = argv[2]; if (argc < 2) - env = "/dev/env0"; + filename = "/dev/env0"; else - env = argv[1]; - printf("loading environment\n"); - return envfs_load(env, envpath); + filename = argv[1]; + printf("loading environment from %s\n", filename); + return envfs_load(filename, dirname); } -U_BOOT_CMD( - envload, 3, 0, do_envload, - "envload - bla\n", - NULL -); +U_BOOT_CMD_START(loadenv) + .maxargs = 3, + .cmd = do_loadenv, + .usage = "loadenv - load environment from persistent storage\n", +U_BOOT_CMD_END +#endif +#ifdef HOST +int main(int argc, char *argv[]) +{ + int opt; + int save = 0, load = 0; + char *filename = NULL, *dirname = NULL; + + while((opt = getopt(argc, argv, "sld:f:")) != -1) { + switch (opt) { + case 's': + save = 1; + break; + case 'l': + load = 1; + break; + case 'f': + filename = optarg; + break; + case 'd': + dirname = optarg; + break; + } + } + + if (load) { + printf("loading env\n"); + envfs_load(filename, dirname); + } + if (save) { + printf("saving env\n"); + envfs_save(filename, dirname); + } + exit(0); +} + +#endif