diff options
Diffstat (limited to 'package/openwrt/libnvram')
-rw-r--r-- | package/openwrt/libnvram/Makefile | 54 | ||||
-rw-r--r-- | package/openwrt/libnvram/main.c | 78 | ||||
-rw-r--r-- | package/openwrt/libnvram/nvram_convert.c | 77 | ||||
-rw-r--r-- | package/openwrt/libnvram/nvram_convert.h | 7 | ||||
-rw-r--r-- | package/openwrt/libnvram/nvram_linux.c | 320 |
5 files changed, 536 insertions, 0 deletions
diff --git a/package/openwrt/libnvram/Makefile b/package/openwrt/libnvram/Makefile new file mode 100644 index 0000000000..d109a17483 --- /dev/null +++ b/package/openwrt/libnvram/Makefile @@ -0,0 +1,54 @@ +# +# Linux router shared code Makefile +# +# Copyright 2001-2003, Broadcom Corporation +# All Rights Reserved. +# +# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY +# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM +# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. +# +# $Id$ +include $(TOPDIR)/rules.mk + +PKG_NAME:=libnvram +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +EXTRA_CFLAGS := -c -I. -I../include + +all: compile + +define OBJ_template +$(PKG_BUILD_DIR)/$(1): $(PKG_BUILD_DIR) + $(TARGET_CC) $(TARGET_CFLAGS) $(EXTRA_CFLAGS) -o $$@ $$(patsubst %.o,%.c,$(1)) +endef + +OBJS := nvram_linux.o nvram_convert.o main.o +LIBNVRAM_OBJS:= $(PKG_BUILD_DIR)/nvram_linux.o $(PKG_BUILD_DIR)/nvram_convert.o +$(foreach obj,$(OBJS),$(eval $(call OBJ_template,$(obj)))) + +$(PKG_BUILD_DIR): + mkdir -p $(PKG_BUILD_DIR) + +$(PKG_BUILD_DIR)/nvram: $(PKG_BUILD_DIR)/main.o + $(TARGET_CC) $(TARGET_CFLAGS) -o $@ $^ -L$(PKG_BUILD_DIR) -lnvram + +$(PKG_BUILD_DIR)/libnvram.so: $(LIBNVRAM_OBJS) + $(TARGET_CC) -shared -o $@ $^ + +$(TARGET_DIR)/usr/lib/libnvram.so: $(PKG_BUILD_DIR)/libnvram.so + install -m 644 $< $@ + install -m 644 $< $(STAGING_DIR)/lib/libnvram.so + $(STRIP) $@ + +$(TARGET_DIR)/usr/sbin/nvram: $(PKG_BUILD_DIR)/nvram + mkdir -p $(TARGET_DIR)/usr/sbin + install -m 644 $< $@ + $(STRIP) $@ + +compile: $(PKG_BUILD_DIR)/libnvram.so $(PKG_BUILD_DIR)/nvram +install: $(TARGET_DIR)/usr/lib/libnvram.so $(TARGET_DIR)/usr/sbin/nvram + +clean: + rm -rf $(PKG_BUILD_DIR) diff --git a/package/openwrt/libnvram/main.c b/package/openwrt/libnvram/main.c new file mode 100644 index 0000000000..a64430f7bc --- /dev/null +++ b/package/openwrt/libnvram/main.c @@ -0,0 +1,78 @@ +/* + * Frontend command-line utility for Linux NVRAM layer + * + * Copyright 2004, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * $Id$ + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <typedefs.h> +#include <bcmnvram.h> + +static void +usage(void) +{ + fprintf(stderr, "usage: nvram [get name] [set name=value] [unset name] [show]\n"); + exit(0); +} + +/* NVRAM utility */ +int +main(int argc, char **argv) +{ + char *name, *value, buf[NVRAM_SPACE]; + int size; + + /* Skip program name */ + --argc; + ++argv; + + if (!*argv) + usage(); + + /* Process the remaining arguments. */ + for (; *argv; argv++) { + if (!strncmp(*argv, "get", 3)) { + if (*++argv) { + if ((value = nvram_get(*argv))) + puts(value); + } + } + else if (!strncmp(*argv, "set", 3)) { + if (*++argv) { + strncpy(value = buf, *argv, sizeof(buf)); + name = strsep(&value, "="); + nvram_set(name, value); + } + } + else if (!strncmp(*argv, "unset", 5)) { + if (*++argv) + nvram_unset(*argv); + } + else if (!strncmp(*argv, "commit", 5)) { + nvram_commit(); + } + else if (!strncmp(*argv, "show", 4) || + !strncmp(*argv, "getall", 6)) { + nvram_getall(buf, sizeof(buf)); + for (name = buf; *name; name += strlen(name) + 1) + puts(name); + size = sizeof(struct nvram_header) + (int) name - (int) buf; + fprintf(stderr, "size: %d bytes (%d left)\n", size, NVRAM_SPACE - size); + } + if (!*argv) + break; + } + + return 0; +} diff --git a/package/openwrt/libnvram/nvram_convert.c b/package/openwrt/libnvram/nvram_convert.c new file mode 100644 index 0000000000..485909026c --- /dev/null +++ b/package/openwrt/libnvram/nvram_convert.c @@ -0,0 +1,77 @@ + +#define WL(a) "wl_"a +#define WL0(a) "wl0_"a +#define D11G(a) "d11g_"a + +#define PPP(a) "ppp_"a +#define PPPOE(a) "pppoe_"a + +struct nvram_convert { + char *name; // for WEB + char *wl0_name; // for driver + char *d11g_name; // for old nv name +}; + +struct nvram_convert nvram_converts[] = { + // Bellow change from 3.11.48.7 + { WL("ssid"), WL0("ssid"), ""}, + { WL("radio"), WL0("mode"), ""}, + { WL("mode"), WL0("mode"), ""}, + { WL("wds"), WL0("wds"), ""}, + { WL("auth"), WL0("auth"), ""}, + { WL("key"), WL0("key"), ""}, + { WL("key1"), WL0("key1"), ""}, + { WL("key2"), WL0("key2"), ""}, + { WL("key3"), WL0("key3"), ""}, + { WL("key4"), WL0("key4"), ""}, + { WL("maclist"), WL0("maclist"), ""}, + { WL("channel"), WL0("channel"), D11G("channel")}, + { WL("rateset"), WL0("rateset"), D11G("rateset")}, + { WL("rts"), WL0("rts"), D11G("rts")}, + { WL("bcn"), WL0("bcn"), D11G("bcn")}, + { WL("gmode"), WL0("gmode"), "d11g_mode"}, + { WL("unit"), WL0("unit"), ""}, + { WL("ifname"), WL0("ifname"), ""}, + { WL("phytype"), WL0("phytype"), ""}, + { WL("country"), WL0("country"), ""}, + { WL("closed"), WL0("closed"), ""}, + { WL("lazywds"), WL0("lazywds"), ""}, + { WL("wep"), WL0("wep"), ""}, + { WL("macmode"), WL0("macmode"), ""}, + { WL("rate"), WL0("rate"), D11G("rate")}, + { WL("frag"), WL0("frag"), D11G("frag")}, + { WL("dtim"), WL0("dtim"), D11G("dtim")}, + { WL("plcphdr"), WL0("plcphdr"), ""}, + { WL("gmode_protection"), WL0("gmode_protection"), ""}, + { WL("radio"), WL0("radio"), ""}, + // Bellow change from 3.21.9.0 + { WL("auth_mode"), WL0("auth_mode"), ""}, + { WL("radius_ipaddr"), WL0("radius_ipaddr"), ""}, + { WL("radius_port"), WL0("radius_port"), ""}, + { WL("radius_key"), WL0("radius_key"), ""}, + { WL("wpa_psk"), WL0("wpa_psk"), ""}, + { WL("wpa_gtk_rekey"), WL0("wpa_gtk_rekey"), ""}, + { WL("frameburst"), WL0("frameburst"), ""}, + { WL("crypto"), WL0("crypto"), ""}, + { WL("ap_isolate"), WL0("ap_isolate"), ""}, + { WL("afterburner"), WL0("afterburner"), ""}, + // for PPPoE + { PPP("username"), PPPOE("username"), ""}, + { PPP("passwd"), PPPOE("passwd"), ""}, + { PPP("idletime"), PPPOE("idletime"), ""}, + { PPP("keepalive"), PPPOE("keepalive"), ""}, + { PPP("demand"), PPPOE("demand"), ""}, + { PPP("service"), PPPOE("service"), ""}, + { PPP("ac"), PPPOE("ac"), ""}, + { PPP("static"), PPPOE("static"), ""}, + { PPP("static_ip"), PPPOE("static_ip"), ""}, + { PPP("username_1"), PPPOE("username_1"), ""}, + { PPP("passwd_1"), PPPOE("passwd_1"), ""}, + { PPP("idletime_1"), PPPOE("idletime_1"), ""}, + { PPP("keepalive_1"), PPPOE("keepalive_1"), ""}, + { PPP("demand_1"), PPPOE("demand_1"), ""}, + { PPP("service_1"), PPPOE("service_1"), ""}, + { PPP("ac_1"), PPPOE("ac_1"), ""}, + + { 0, 0, 0}, +}; diff --git a/package/openwrt/libnvram/nvram_convert.h b/package/openwrt/libnvram/nvram_convert.h new file mode 100644 index 0000000000..70e12327d1 --- /dev/null +++ b/package/openwrt/libnvram/nvram_convert.h @@ -0,0 +1,7 @@ + +struct nvram_convert { + char *name; + char *wl0_name; + char *d11g_name; +}; + diff --git a/package/openwrt/libnvram/nvram_linux.c b/package/openwrt/libnvram/nvram_linux.c new file mode 100644 index 0000000000..c41e32118a --- /dev/null +++ b/package/openwrt/libnvram/nvram_linux.c @@ -0,0 +1,320 @@ +/* + * NVRAM variable manipulation (Linux user mode half) + * + * Copyright 2004, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * $Id$ + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> +#include <error.h> +#include <string.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/mman.h> + +#include <typedefs.h> +#include <bcmnvram.h> +#include <nvram_convert.h> +#include <shutils.h> +#include <utils.h> + +#define PATH_DEV_NVRAM "/dev/nvram" + +/* Globals */ +static int nvram_fd = -1; +static char *nvram_buf = NULL; +int check_action(void); +int file_to_buf(char *path, char *buf, int len); + +int +nvram_init(void *unused) +{ + if ((nvram_fd = open(PATH_DEV_NVRAM, O_RDWR)) < 0) + goto err; + + /* Map kernel string buffer into user space */ + if ((nvram_buf = mmap(NULL, NVRAM_SPACE, PROT_READ, MAP_SHARED, nvram_fd, 0)) == MAP_FAILED) { + close(nvram_fd); + nvram_fd = -1; + goto err; + } + + return 0; + + err: + perror(PATH_DEV_NVRAM); + return errno; +} + +char * +nvram_get(const char *name) +{ + size_t count = strlen(name) + 1; + char tmp[100], *value; + unsigned long *off = (unsigned long *) tmp; + + if (nvram_fd < 0) + if (nvram_init(NULL)) + return NULL; + + if (count > sizeof(tmp)) { + if (!(off = malloc(count))) + return NULL; + } + + /* Get offset into mmap() space */ + strcpy((char *) off, name); + + count = read(nvram_fd, off, count); + + if (count == sizeof(unsigned long)) + value = &nvram_buf[*off]; + else + value = NULL; + + if (count < 0) + perror(PATH_DEV_NVRAM); + + if (off != (unsigned long *) tmp) + free(off); + + return value; +} + +int +nvram_getall(char *buf, int count) +{ + int ret; + + if (nvram_fd < 0) + if ((ret = nvram_init(NULL))) + return ret; + + if (count == 0) + return 0; + + /* Get all variables */ + *buf = '\0'; + + ret = read(nvram_fd, buf, count); + + if (ret < 0) + perror(PATH_DEV_NVRAM); + + return (ret == count) ? 0 : ret; +} + +static int +_nvram_set(const char *name, const char *value) +{ + size_t count = strlen(name) + 1; + char tmp[100], *buf = tmp; + int ret; + + if (nvram_fd < 0) + if ((ret = nvram_init(NULL))) + return ret; + + /* Unset if value is NULL */ + if (value) + count += strlen(value) + 1; + + if (count > sizeof(tmp)) { + if (!(buf = malloc(count))) + return -ENOMEM; + } + + if (value) + sprintf(buf, "%s=%s", name, value); + else + strcpy(buf, name); + + ret = write(nvram_fd, buf, count); + + if (ret < 0) + perror(PATH_DEV_NVRAM); + + if (buf != tmp) + free(buf); + + return (ret == count) ? 0 : ret; +} + +int +nvram_set(const char *name, const char *value) +{ + extern struct nvram_convert nvram_converts[]; + struct nvram_convert *v; + int ret; + + ret = _nvram_set(name, value); + + for(v = nvram_converts ; v->name ; v++) { + if(!strcmp(v->name, name)){ + if(strcmp(v->wl0_name,"")) _nvram_set(v->wl0_name, value); + if(strcmp(v->d11g_name,"")) _nvram_set(v->d11g_name, value); + } + } + + return ret; +} + +int +nvram_unset(const char *name) +{ + return _nvram_set(name, NULL); +} + +int +nvram_commit(void) +{ + int ret; + + cprintf("nvram_commit(): start\n"); + + if((check_action() == ACT_IDLE) || + (check_action() == ACT_SW_RESTORE) || + (check_action() == ACT_HW_RESTORE)){ + if (nvram_fd < 0) + if ((ret = nvram_init(NULL))) + return ret; + + ret = ioctl(nvram_fd, NVRAM_MAGIC, NULL); + + if (ret < 0) + perror(PATH_DEV_NVRAM); + + cprintf("nvram_commit(): end\n"); + } + else + cprintf("nvram_commit(): nothing to do...\n"); + + return ret; +} + +int file2nvram(char *filename, char *varname) { + FILE *fp; + int c,count; + int i=0,j=0; + char mem[10000],buf[30000]; + + if ( !(fp=fopen(filename,"rb") )) + return 0; + + count=fread(mem,1,sizeof(mem),fp); + fclose(fp); + for (j=0;j<count;j++) { + if (i > sizeof(buf)-3 ) + break; + c=mem[j]; + if (c >= 32 && c <= 126 && c != '\\' && c != '~') { + buf[i++]=(unsigned char) c; + } else if (c==0) { + buf[i++]='~'; + } else { + buf[i++]='\\'; + sprintf(buf+i,"%02X",c); + i+=2; + } + } + if (i==0) return 0; + buf[i]=0; + //fprintf(stderr,"================ > file2nvram %s = [%s] \n",varname,buf); + nvram_set(varname,buf); + //nvram_commit(); //Barry adds for test +} + +int nvram2file(char *varname, char *filename) { + FILE *fp; + int c,tmp; + int i=0,j=0; + char *buf; + char mem[10000]; + + if ( !(fp=fopen(filename,"wb") )) + return 0; + + buf=strdup(nvram_safe_get(varname)); + //fprintf(stderr,"=================> nvram2file %s = [%s] \n",varname,buf); + while ( buf[i] && j < sizeof(mem)-3 ) { + if (buf[i] == '\\') { + i++; + tmp=buf[i+2]; + buf[i+2]=0; + sscanf(buf+i,"%02X",&c); + buf[i+2]=tmp; + i+=2; + mem[j]=c;j++; + } else if (buf[i] == '~') { + mem[j]=0;j++; + i++; + } else { + mem[j]=buf[i];j++; + i++; + } + } + if (j<=0) return j; + j=fwrite(mem,1,j,fp); + fclose(fp); + free(buf); + return j; +} + +int +check_action(void) +{ + char buf[80] = ""; + + if(file_to_buf(ACTION_FILE, buf, sizeof(buf))){ + if(!strcmp(buf, "ACT_TFTP_UPGRADE")){ + cprintf("Upgrading from tftp now, quiet exit....\n"); + return ACT_TFTP_UPGRADE; + } + else if(!strcmp(buf, "ACT_WEBS_UPGRADE")){ + cprintf("Upgrading from web (https) now, quiet exit....\n"); + return ACT_WEBS_UPGRADE; + } + else if(!strcmp(buf, "ACT_WEB_UPGRADE")){ + cprintf("Upgrading from web (http) now, quiet exit....\n"); + return ACT_WEB_UPGRADE; + } + else if(!strcmp(buf, "ACT_SW_RESTORE")){ + cprintf("Receive restore command from web, quiet exit....\n"); + return ACT_SW_RESTORE; + } + else if(!strcmp(buf, "ACT_HW_RESTORE")){ + cprintf("Receive restore commond from resetbutton, quiet exit....\n"); + return ACT_HW_RESTORE; + } + } + //fprintf(stderr, "Waiting for upgrading....\n"); + return ACT_IDLE; +} + +int +file_to_buf(char *path, char *buf, int len) +{ + FILE *fp; + + memset(buf, 0 , len); + + if ((fp = fopen(path, "r"))) { + fgets(buf, len, fp); + fclose(fp); + return 1; + } + + return 0; +} |