summaryrefslogtreecommitdiff
path: root/application/spidlib
diff options
context:
space:
mode:
authorBenjamin Decavel2008-11-28 11:10:09 +0100
committerBenjamin Decavel2008-11-28 11:10:09 +0100
commit78b51bfac0fe491e3e4a269cc13ca0383fd00cf1 (patch)
tree71bdb36e306bcb020c920f98bf85334162878d50 /application/spidlib
parentbf9c59e4b79667e7b46f140b802a6f64eab3b042 (diff)
parent9c0c6e5afe319c06c1bfee6dfc19404e83014851 (diff)
merge
Diffstat (limited to 'application/spidlib')
-rw-r--r--application/spidlib/Makefile4
-rw-r--r--application/spidlib/check/Makefile2
-rw-r--r--application/spidlib/check/check.c4
-rw-r--r--application/spidlib/inc/network.h50
-rw-r--r--application/spidlib/inc/path.h12
-rw-r--r--application/spidlib/inc/system.h8
-rw-r--r--application/spidlib/src/config/read_config_param.c3
-rw-r--r--application/spidlib/src/network/ip_addr.c25
-rw-r--r--application/spidlib/src/network/ip_gateway.c15
-rw-r--r--application/spidlib/src/network/ip_mode.c184
-rw-r--r--application/spidlib/src/network/ip_netmask.c15
-rw-r--r--application/spidlib/src/network/mac.c146
-rw-r--r--application/spidlib/src/system/software_version.c2
13 files changed, 163 insertions, 307 deletions
diff --git a/application/spidlib/Makefile b/application/spidlib/Makefile
index 6728069a7c..d44e8c1835 100644
--- a/application/spidlib/Makefile
+++ b/application/spidlib/Makefile
@@ -13,12 +13,12 @@ OBJS = 8021x_supplicant_state.o 8021x_supplicant_identity.o 8021x_supplicant_p
ip_netmask.o ip_mode.o mac.o mac_limit.o mac_list.o meminfo.o \
mode.o nb_hosts.o processes.o read_config_param.o route_default.o snmp_state.o software_version.o serial_state.o \
serial_number.o speed.o static_spy.o system_version.o telnet_state.o tei.o uptime.o \
- vlan.o white_list.o reboot.o ip_gateway.o nvram.o image_desc.o \
+ vlan.o white_list.o write_config_param.o reboot.o ip_gateway.o nvram.o image_desc.o \
snmp_analog_alarm.o snmp_discrete_alarm.o \
admin_logical_id.o manufactory_info.o model_number.o vendor_info.o output_level.o
VPATH=$(SRCDIR) $(INCDIR)
-INCLUDE=-Iinc -I$(TOPDIR)/include/plc-drv -I$(TOPDIR)/include
+INCLUDE=-Iinc -I$(TOPDIR)/include/plc-drv -I$(TOPDIR)/include
export OBJS
diff --git a/application/spidlib/check/Makefile b/application/spidlib/check/Makefile
index 8d8a732905..f3a3b71ba7 100644
--- a/application/spidlib/check/Makefile
+++ b/application/spidlib/check/Makefile
@@ -2,7 +2,7 @@ PROGS = check
OBJDIR = obj
OBJDIR_STAMP = $(OBJDIR)/stamp
-FILE = config ethernet system #network plc services
+FILE = config ethernet network system # plc services
CHECK_OBJS = $(FILE:%=$(OBJDIR)/check_%.o)
MAIN_OBJS = $(OBJS:%=$(OBJDIR)/%)
VPATH = ../src:../src/system:../src/plc:../src/ethernet:../src/network:../src/services:../src/config
diff --git a/application/spidlib/check/check.c b/application/spidlib/check/check.c
index 96f12abc25..41ff9b35e3 100644
--- a/application/spidlib/check/check.c
+++ b/application/spidlib/check/check.c
@@ -17,8 +17,8 @@ int main(void)
SRunner *sr = srunner_create(s);
srunner_add_suite(sr, config_suite());
srunner_add_suite(sr, ethernet_suite());
- /*srunner_add_suite(sr, network_suite());
- srunner_add_suite(sr, plc_suite());
+ srunner_add_suite(sr, network_suite());
+ /*srunner_add_suite(sr, plc_suite());
srunner_add_suite(sr, services_suite());*/
srunner_add_suite(sr, system_suite());
srunner_run_all(sr, CK_NORMAL);
diff --git a/application/spidlib/inc/network.h b/application/spidlib/inc/network.h
index cb07953829..475943dba2 100644
--- a/application/spidlib/inc/network.h
+++ b/application/spidlib/inc/network.h
@@ -14,12 +14,25 @@
#define _NETWORK_H_
#define IP_ADDRESS_STRING_MAX_LENGTH 16
-
#define INTERFACE_STRING_MAX_LENGTH 8
+#define MAC_STRING_MAX_LEN 18
+#define GATEWAY_STRING_MAX_LENGTH 16
+#define IP_MODE_STRING_MAX_LENGTH 8
+#define NETMASK_STRING_MAX_LENGTH 16
#define SPIDLIB_INTERFACE_BR0 "br0"
#define SPIDLIB_INTERFACE_PLC0 "plc0"
#define SPIDLIB_INTERFACE_ETH0 "eth0"
+#define SPIDLIB_IP_MODE_STATIC "static"
+#define SPIDLIB_IP_MODE_DHCP "dhcp"
+
+#define SPIDLIB_IS_INTERFACE_VALID(iface) \
+ (!strcmp(iface,SPIDLIB_INTERFACE_BR0) \
+ || !strcmp(iface, SPIDLIB_INTERFACE_PLC0) \
+ || !strcmp(iface, SPIDLIB_INTERFACE_ETH0))
+
+extern int spidlib_mac_str_to_bin(const char *str, unsigned char *bin);
+extern int spidlib_mac_bin_to_str(const unsigned char *bin, char *str);
/*---------------------- Function declarations ------------------------------*/
@@ -27,44 +40,17 @@ extern int spidlib_get_ip_addr(const char *iface, char *text, int buffer_len);
extern int spidlib_check_ip_addr(char *text);
extern int spidlib_set_ip_addr(const char *iface, char *text);
-#define GATEWAY_STRING_MAX_LENGTH 16
-
/*---------------------- Function declarations ------------------------------*/
extern int spidlib_get_ip_gateway(const char *iface, char *text, int buffer_len);
extern int spidlib_check_ip_gateway(char *text);
extern int spidlib_set_ip_gateway(const char *iface, char *text);
-#ifndef TEST
-#define NETWORK_INTERFACES_FILE "/usr/local/etc/network/interfaces"
-#define NETWORK_INTERFACES_TMP_FILE "/usr/local/etc/network/interfaces.tmp"
-#else
-#define NETWORK_INTERFACES_FILE "../test/etc/network/interfaces"
-#define NETWORK_INTERFACES_TMP_FILE "../test/etc/network/interfaces.tmp"
-#endif /* TEST */
-
-#define INTERFACES_MAX_LINE_LENGTH 512
-
-#ifndef TEST
-#define NETWORK_CONFIG_FILE "/etc/config/network"
-#define NETWORK_CONFIG_TMP_FILE "/etc/config/network.tmp"
-#else
-#define NETWORK_CONFIG_FILE "../test/etc/config/network"
-#define NETWORK_CONFIG_TMP_FILE "../test/etc/config/network.tmp"
-#endif /* TEST */
-
-#define IP_MODE_STRING_MAX_LENGTH 8
-
-#define SPIDLIB_IP_MODE_STATIC "static"
-#define SPIDLIB_IP_MODE_DHCP "dhcp"
-
/*---------------------- Function declarations ------------------------------*/
-extern int spidlib_get_ip_mode(const char *iface, char *text, int buffer_len);
-extern int spidlib_check_ip_mode(char *text);
-extern int spidlib_set_ip_mode(const char *iface, char *text);
-
-#define NETMASK_STRING_MAX_LENGTH 16
+extern int spidlib_get_ip_mode(char *mode, int buffer_len);
+extern int spidlib_check_ip_mode(const char *mode);
+extern int spidlib_set_ip_mode(const char *mode);
/*---------------------- Function declarations ------------------------------*/
@@ -72,8 +58,6 @@ extern int spidlib_get_ip_netmask(const char *iface, char *text, int buffer_len)
extern int spidlib_check_ip_netmask(char *text);
extern int spidlib_set_ip_netmask(const char *iface, char *text);
-#define MAC_ADDRESS_STRING_MAX_LENGTH 17
-
/*---------------------- Function declarations ------------------------------*/
extern int spidlib_get_mac(const char *iface, char *text, int buffer_len);
diff --git a/application/spidlib/inc/path.h b/application/spidlib/inc/path.h
index 80c9018e72..1e35f1db56 100644
--- a/application/spidlib/inc/path.h
+++ b/application/spidlib/inc/path.h
@@ -1,6 +1,16 @@
#ifndef _PATH_H_
#define _PATH_H_
-#define MAC_LIMIT_PATH "/proc/sys/net/plc/carp/mac_limit"
+#define NETWORK_INTERFACES_PATH "/etc/network/interfaces"
+#define NETWORK_CONFIG_PATH "/etc/config/network"
+
+#define MAC_LIMIT_PATH "/proc/sys/net/plc/carp/mac_limit"
+#define SOFTWARE_VERSION_PATH "/proc/sys/net/plc/software_version"
+#define UPTIME_FILE "/proc/uptime"
+#define BOOTLOG_MESSAGES_FILE "/var/log/messages"
+#define CPU_INFO_FILE "/proc/cpuinfo"
+#define INTERRUPTS_FILE "/proc/interrupts"
+#define MEMINFO_FILE "/proc/meminfo"
+#define SYSTEM_VERSION_FILE "/proc/version"
#endif
diff --git a/application/spidlib/inc/system.h b/application/spidlib/inc/system.h
index 727f917e3b..d17b6b4539 100644
--- a/application/spidlib/inc/system.h
+++ b/application/spidlib/inc/system.h
@@ -18,16 +18,8 @@
#define SPIDLIB_ADMIN_LOGICAL_ID_STRING_MAX_LENGTH 40
#define SPIDLIB_ADMIN_LOGICAL_ID_NAME "ADMIN_LOGICAL_ID"
-
-#define SPIDLIB_SOFTWARE_VERSION_FILE "/proc/sys/net/software_version"
-#define UPTIME_FILE "/proc/uptime"
-#define BOOTLOG_MESSAGES_FILE "/var/log/messages"
-#define CPU_INFO_FILE "/proc/cpuinfo"
#define MAX_HOSTNAME_LENGTH 128
-#define INTERRUPTS_FILE "/proc/interrupts"
-#define MEMINFO_FILE "/proc/meminfo"
#define PROCESSES_COMMAND "ps"
-#define SYSTEM_VERSION_FILE "/proc/version"
typedef enum {
SPIDLIB_IMAGE_DESC_TYPE_CURRENT,
diff --git a/application/spidlib/src/config/read_config_param.c b/application/spidlib/src/config/read_config_param.c
index 08d21ff293..f672355736 100644
--- a/application/spidlib/src/config/read_config_param.c
+++ b/application/spidlib/src/config/read_config_param.c
@@ -15,6 +15,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#include <errno.h>
#include "spidlib.h"
@@ -54,7 +55,7 @@ spidlib_read_config_param(const char *filename, const char *label, char *value,
return -errno;
}
- while(result = fgets(buffer, MAX_LINE_BUFFER_LEN - 1, fp))
+ while((result = fgets(buffer, MAX_LINE_BUFFER_LEN - 1, fp)))
{
/* get the label */
ptr = strtok_r(buffer, SPIDLIB_CONFIG_DELIMITER " \t", &strtok_ctx);
diff --git a/application/spidlib/src/network/ip_addr.c b/application/spidlib/src/network/ip_addr.c
index 9b5656c497..d2c085e53e 100644
--- a/application/spidlib/src/network/ip_addr.c
+++ b/application/spidlib/src/network/ip_addr.c
@@ -33,10 +33,11 @@
Note: -
-----------------------------------------------------------------------------*/
int
-spidlib_get_ip_addr(const char *iface, char *text, int buffer_len)
+spidlib_get_ip_addr(const char *iface, char *ip, int buffer_len)
{
+#if 0
FILE *fp;
- char buffer[INTERFACES_MAX_LINE_LENGTH];
+ char buffer[128];
char *p;
int state;
spidlib_boolean_t found_iface = SPIDLIB_FALSE;
@@ -57,10 +58,10 @@ spidlib_get_ip_addr(const char *iface, char *text, int buffer_len)
/* Reset IP address */
strcpy(text,"0.0.0.0");
- if (NULL != (fp = fopen(NETWORK_INTERFACES_FILE,"r")))
+ if (NULL != (fp = fopen(NETWORK_INTERFACES_PATH,"r")))
{
state = 0;
- while(fgets(buffer,INTERFACES_MAX_LINE_LENGTH,fp))
+ while(fgets(buffer,128,fp))
{
if ((p=strtok(buffer," \t\n")))
{
@@ -121,7 +122,7 @@ spidlib_get_ip_addr(const char *iface, char *text, int buffer_len)
/* Return 'No such file or directory' error */
return (-(errno = ENOENT));
}
-
+#endif
return 0;
}
@@ -166,8 +167,8 @@ int
spidlib_set_ip_addr(const char *iface, char *text)
{
FILE *fp_read, *fp_write;
- char buffer[INTERFACES_MAX_LINE_LENGTH];
- char tmp_buffer[INTERFACES_MAX_LINE_LENGTH];
+ char buffer[128];
+ char tmp_buffer[128];
char *p;
int state;
spidlib_boolean_t found_iface = SPIDLIB_FALSE;
@@ -189,13 +190,13 @@ spidlib_set_ip_addr(const char *iface, char *text)
}
/* Change IP address */
- if ( (NULL != (fp_read = fopen(NETWORK_INTERFACES_FILE,"r")))
- && (NULL != (fp_write = fopen(NETWORK_INTERFACES_TMP_FILE,"w"))) )
+ if ( (NULL != (fp_read = fopen(NETWORK_INTERFACES_PATH,"r")))
+ && (NULL != (fp_write = fopen(NETWORK_INTERFACES_PATH,"w"))) )
{
state = 0;
- while(fgets(buffer,INTERFACES_MAX_LINE_LENGTH,fp_read))
+ while(fgets(buffer,128,fp_read))
{
- memcpy(tmp_buffer, buffer, INTERFACES_MAX_LINE_LENGTH);
+ memcpy(tmp_buffer, buffer, 128);
if ((p=strtok(buffer," \t\n")))
{
/* Write into new file */
@@ -257,7 +258,7 @@ spidlib_set_ip_addr(const char *iface, char *text)
fclose(fp_write);
/* Replace old file by new one */
- if (0 != rename(NETWORK_INTERFACES_TMP_FILE, NETWORK_INTERFACES_FILE))
+ if (0 != rename(NETWORK_INTERFACES_PATH, NETWORK_INTERFACES_PATH))
{
return errno;
}
diff --git a/application/spidlib/src/network/ip_gateway.c b/application/spidlib/src/network/ip_gateway.c
index d1ade5ec26..de54bfbcd0 100644
--- a/application/spidlib/src/network/ip_gateway.c
+++ b/application/spidlib/src/network/ip_gateway.c
@@ -34,7 +34,8 @@
int
spidlib_get_ip_gateway(const char *iface, char *text, int buffer_len)
{
- FILE *fp;
+#if 0
+ FILE *fp;
char buffer[INTERFACES_MAX_LINE_LENGTH];
char *p;
int state;
@@ -120,7 +121,7 @@ spidlib_get_ip_gateway(const char *iface, char *text, int buffer_len)
/* Return 'No such file or directory' error */
return (-(errno = ENOENT));
}
-
+#endif
return 0;
}
@@ -138,14 +139,15 @@ spidlib_get_ip_gateway(const char *iface, char *text, int buffer_len)
int
spidlib_check_ip_gateway(char *text)
{
- /* Check max. string length */
+#if 0
+ /* Check max. string length */
if ( strlen(text) > GATEWAY_STRING_MAX_LENGTH )
return (-(errno = ERANGE));
/* Check for valid string */
if ( test_ip_addr(text) )
return (-(errno = EINVAL));
-
+#endif
return 0;
}
@@ -165,7 +167,8 @@ spidlib_check_ip_gateway(char *text)
int
spidlib_set_ip_gateway(const char *iface, char *text)
{
- FILE *fp_read, *fp_write;
+#if 0
+ FILE *fp_read, *fp_write;
char buffer[INTERFACES_MAX_LINE_LENGTH];
char tmp_buffer[INTERFACES_MAX_LINE_LENGTH];
char *p;
@@ -273,6 +276,6 @@ spidlib_set_ip_gateway(const char *iface, char *text)
/* Return 'No such file or directory' error */
return (-(errno = ENOENT));
}
-
+#endif
return 0;
}
diff --git a/application/spidlib/src/network/ip_mode.c b/application/spidlib/src/network/ip_mode.c
index 5e2fe1829d..818a6ea00d 100644
--- a/application/spidlib/src/network/ip_mode.c
+++ b/application/spidlib/src/network/ip_mode.c
@@ -32,73 +32,20 @@
Note: -
-----------------------------------------------------------------------------*/
int
-spidlib_get_ip_mode(const char *iface, char *text, int buffer_len)
+spidlib_get_ip_mode(char *mode, int buffer_len)
{
- FILE *fp;
- char buffer[INTERFACES_MAX_LINE_LENGTH];
- char *p;
- int state;
- spidlib_boolean_t found_mode = SPIDLIB_FALSE;
+
+ if((mode == NULL) || (buffer_len <= IP_MODE_STRING_MAX_LENGTH))
+ return -(errno = EINVAL);
- /* Check buffer_len argument */
- if ( (buffer_len <= 0) || (buffer_len > IP_MODE_STRING_MAX_LENGTH) )
+ if(spidlib_read_config_param(NETWORK_CONFIG_PATH, "DHCP", mode, buffer_len) < 0)
{
- errno = EINVAL;
- return -1;
+ strcpy(mode, SPIDLIB_IP_MODE_STATIC);
}
-
- /* Get "DHCP" entry if necessary in /etc/config/network */
- if ((fp = fopen(NETWORK_CONFIG_FILE,"rw")))
- {
- /* Browse through all lines */
- while(fgets(buffer, INTERFACES_MAX_LINE_LENGTH, fp))
- {
- state = 0;
- if ( (p = strtok(buffer," =\n")) )
- {
- if ( !strcmp(p,"DHCP") )
- state = 1;
- else
- /* Go to next line */
- continue;
-
- if ( (p=strtok(NULL," =\n")) )
- {
- switch(state)
- {
- case 1: /* DHCP */
- /* Determine mode type to be set */
- if (!strcmp(p,"no"))
- strcpy(text, SPIDLIB_IP_MODE_STATIC);
- else if (!strcmp(p,"yes"))
- strcpy(text, SPIDLIB_IP_MODE_DHCP);
- else
- continue;
- break;
-
- /* Go to next line */
- default:
- continue;
- }
- }
- }
- }
- fclose(fp);
-
- /* Check if IP mode found */
- if ( found_mode )
- {
- errno = -EFAULT;
- return -1;
- }
- }
+ if(tolower(*mode) == 'y')
+ strcpy(mode, SPIDLIB_IP_MODE_DHCP);
else
- {
- /* Return 'No such file or directory' error */
- errno = ENOENT;
- return -1;
- }
-
+ strcpy(mode, SPIDLIB_IP_MODE_STATIC);
return 0;
}
@@ -114,19 +61,12 @@ spidlib_get_ip_mode(const char *iface, char *text, int buffer_len)
Note: Possible values are "static" and "dhcp"
-----------------------------------------------------------------------------*/
int
-spidlib_check_ip_mode(char *text)
+spidlib_check_ip_mode(const char *mode)
{
- /* Check max. string length */
- if ( strlen(text) > IP_MODE_STRING_MAX_LENGTH )
- return (-(errno = ERANGE));
-
- /* Check format */
- if ( !strcmp(text,"dhcp") )
- return 0;
- else if ( !strcmp(text,"static") )
- return 0;
+ if((mode == NULL) || (strcmp(mode, SPIDLIB_IP_MODE_STATIC) && strcmp(mode, SPIDLIB_IP_MODE_DHCP)))
+ return -(errno = EINVAL);
else
- return (-(errno = EINVAL));
+ return 0;
}
/*-----------------------------------------------------------------------------
@@ -144,97 +84,13 @@ spidlib_check_ip_mode(char *text)
Note: -
-----------------------------------------------------------------------------*/
int
-spidlib_set_ip_mode(const char *iface, char *text)
+spidlib_set_ip_mode(const char *mode)
{
- FILE *fp_read, *fp_write;
- char buffer[INTERFACES_MAX_LINE_LENGTH];
- char tmp_buffer[INTERFACES_MAX_LINE_LENGTH];
- char *p;
- int state;
- spidlib_boolean_t found_mode = SPIDLIB_FALSE;
- int result;
+ if(spidlib_check_ip_mode(mode) < 0)
+ return -errno;
- /* Checking IP address format */
- result = spidlib_check_ip_mode(text);
- if ( result )
- {
- errno = -result;
- return (result);
- }
-
- /* Check for valid interface */
- if (strcmp(iface,"br0") && strcmp(iface,"plc0") && strcmp(iface,"eth0"))
- {
- return (-(errno = EINVAL));
- }
-
- /* Change IP address */
- if ( (NULL != (fp_read = fopen(NETWORK_CONFIG_FILE,"r")))
- && (NULL != (fp_write = fopen(NETWORK_CONFIG_TMP_FILE,"w"))) )
- {
- state = 0;
- while(fgets(buffer,INTERFACES_MAX_LINE_LENGTH,fp_read))
- {
- memcpy(tmp_buffer, buffer, INTERFACES_MAX_LINE_LENGTH);
- if ( (p = strtok(buffer," =\n")) )
- {
- if ( !strcmp(p,"DHCP") )
- state = 1;
- else
- {
- /* Write into new file */
- fputs(tmp_buffer, fp_write);
-
- state = 0;
- }
-
- if ((p=strtok(NULL," \t\n")))
- {
- switch(state)
- {
- case 1:
- found_mode = SPIDLIB_TRUE;
- state = 0;
-
- /* Write into new file */
- if (!strcmp(text, SPIDLIB_IP_MODE_DHCP))
- fprintf(fp_write, "DHCP=yes\n");
- else if (!strcmp(text, SPIDLIB_IP_MODE_STATIC))
- fprintf(fp_write, "DHCP=no\n");
-
- default:
- state = 0;
- continue;
- }
- }
- }
- else
- {
- /* Write into new file */
- fputs(tmp_buffer, fp_write);
- }
- }
-
- fclose(fp_read);
- fclose(fp_write);
-
- /* Replace old file by new one */
- if (0 != rename(NETWORK_CONFIG_TMP_FILE, NETWORK_CONFIG_FILE))
- {
- return errno;
- }
-
- /* Check if IP mode */
- if ( !found_mode )
- {
- return (-(errno = EFAULT));
- }
- }
- else
- {
- /* Return 'No such file or directory' error */
- return (-(errno = ENOENT));
- }
-
- return 0;
+ if(!strcmp(mode, SPIDLIB_IP_MODE_STATIC))
+ return spidlib_write_config_param(NETWORK_CONFIG_PATH, "DHCP", "no");
+ else
+ return spidlib_write_config_param(NETWORK_CONFIG_PATH, "DHCP", "yes");
}
diff --git a/application/spidlib/src/network/ip_netmask.c b/application/spidlib/src/network/ip_netmask.c
index abe7e0b574..44e28407bd 100644
--- a/application/spidlib/src/network/ip_netmask.c
+++ b/application/spidlib/src/network/ip_netmask.c
@@ -35,7 +35,8 @@
int
spidlib_get_ip_netmask(const char *iface, char *text, int buffer_len)
{
- FILE *fp;
+#if 0
+ FILE *fp;
char buffer[INTERFACES_MAX_LINE_LENGTH];
char *p;
int state;
@@ -123,7 +124,7 @@ spidlib_get_ip_netmask(const char *iface, char *text, int buffer_len)
/* Return 'No such file or directory' error */
return (-(errno = ENOENT));
}
-
+#endif
return 0;
}
@@ -141,14 +142,15 @@ spidlib_get_ip_netmask(const char *iface, char *text, int buffer_len)
int
spidlib_check_ip_netmask(char *text)
{
- /* Check max. string length */
+#if 0
+ /* Check max. string length */
if ( strlen(text) > NETMASK_STRING_MAX_LENGTH )
return (-(errno = ERANGE));
/* Check for valid string */
if ( test_ip_addr(text) )
return (-(errno = EINVAL));
-
+#endif
return 0;
}
@@ -168,7 +170,8 @@ spidlib_check_ip_netmask(char *text)
int
spidlib_set_ip_netmask(const char *iface, char *text)
{
- FILE *fp_read, *fp_write;
+#if 0
+ FILE *fp_read, *fp_write;
char buffer[INTERFACES_MAX_LINE_LENGTH];
char tmp_buffer[INTERFACES_MAX_LINE_LENGTH];
char *p;
@@ -276,6 +279,6 @@ spidlib_set_ip_netmask(const char *iface, char *text)
/* Return 'No such file or directory' error */
return (-(errno = ENOENT));
}
-
+#endif
return 0;
}
diff --git a/application/spidlib/src/network/mac.c b/application/spidlib/src/network/mac.c
index 2dc6edb915..6884d53325 100644
--- a/application/spidlib/src/network/mac.c
+++ b/application/spidlib/src/network/mac.c
@@ -2,11 +2,11 @@
File: mac.c
Description: Function to retrieve modem's MAC address.
Project: SPiDLIB
- Target: SPiDCOM modem w/ SPC200e
+ Target: SPiDCOM modem w/ SPC200
Version: 0.1
Revision list: -
- Company: SPiDCOM Eastern Europe
- Author: Slobodan Stanisic
+ Company: SPiDCOM
+ Author: Jerome Lefranc
Date: June 2008.
-----------------------------------------------------------------------------*/
@@ -15,6 +15,7 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#include <net/ethernet.h>
#include "spidlib.h"
/*-----------------------------------------------------------------------------
@@ -32,83 +33,88 @@
Note: -
-----------------------------------------------------------------------------*/
int
-spidlib_get_mac(const char *iface, char *text, int buffer_len)
+spidlib_get_mac(const char *iface, char *mac, int buffer_len)
{
- FILE *fp;
- char buffer[INTERFACES_MAX_LINE_LENGTH];
- char *p;
- int state;
- int found_mode = -1;
+ FILE *fp;
+ char buffer[128];
+ char *ptr;
-/* Check buffer_len argument */
- if ( (buffer_len <= 0) || (buffer_len > MAC_ADDRESS_STRING_MAX_LENGTH) )
- {
+ /* Check argument */
+ if ((iface == NULL) || (mac == NULL))
return (-(errno = EINVAL));
- }
-/* Check for valid interface */
- if ( strcmp(iface,"br0") )
- if ( strcmp(iface,"plc0") )
- if ( strcmp(iface,"eth0") )
- {
- return (-(errno = EINVAL));
- }
+ if(buffer_len <= MAC_STRING_MAX_LEN)
+ return -(errno = ENOSPC);
-/* Reset MAC address */
- strcpy(text,"00:00:00:00:00:00");
+ /* Check for valid interface */
+ if(!SPIDLIB_IS_INTERFACE_VALID(iface))
+ return (-(errno = EINVAL));
- if ((fp = popen("ifconfig","r")))
- {
- state = 0;
- while(fgets(buffer,INTERFACES_MAX_LINE_LENGTH,fp))
- {
- if ((p=strtok(buffer," \t\n")))
- {
-/* Check for valid interface */
- if (!strcmp(p,iface))
- {
- if ((p=strtok(NULL," \t\n")))
- {
-/* Skip next two tokens */
- if (!(p=strtok(NULL," \t\n")))
- continue;
+ /* start ifconfig */
+ if ((fp = popen("ifconfig","r")) == NULL)
+ {
+ return -errno;
+ }
- if (!(p=strtok(NULL," \t\n")))
- continue;
+ /* get 1st line */
+ if(fgets(buffer, 128 - 1, fp) == NULL)
+ {
+ errno = ENOENT;
+ goto error;
+ }
+ /* find HWaddr */
+ if((ptr = strstr(buffer, "HWaddr")) == NULL)
+ {
+ /* not found */
+ errno = ENOENT;
+ goto error;
+ }
+ ptr += strlen("HWaddr") + 1;
+ /* remove \n */
+ *(ptr + strlen(ptr) - 1) = '\0';
+ /* give mac */
+ strncpy(mac, ptr, MAC_STRING_MAX_LEN);
+ mac[MAC_STRING_MAX_LEN - 1] = '\0';
+ fclose(fp);
+ return 0;
+error:
+ fclose(fp);
+ return -errno;
+}
-/* Check for valid mode value */
- if (!strcmp(p,"HWaddr"))
- {
- if (!(p=strtok(NULL," \t\n")))
- continue;
- strcpy(text,p);
- state = 0;
- found_mode = 0;
- break;
- }
- }
- else
- continue;
- }
- else
- continue;
- }
- }
+int
+spidlib_mac_str_to_bin(const char *str, unsigned char *bin)
+{
+ int result, i;
+ unsigned int mac[ETH_ALEN];
+ if((str == NULL) || (bin == NULL))
+ return -(errno = EINVAL);
+ result = sscanf(str,"%2x:%2x:%2x:%2x:%2x:%2x",
+ mac + 0, mac + 1, mac + 2,
+ mac + 3, mac + 4, mac + 5);
+ for(i = 0; i < ETH_ALEN; i++)
+ bin[i]= mac[i];
- fclose(fp);
+ if(result == ETH_ALEN)
+ return 0;
+ else
+ return -(errno = EINVAL);
+}
-/* Check if MAC is found */
- if ( found_mode )
- {
- return (-(errno = EFAULT));
- }
+int
+spidlib_mac_bin_to_str(const unsigned char *bin, char *str)
+{
+ int i;
+ char *ptr = str;
+ if((bin == NULL) || (str == NULL))
+ return -(errno = EINVAL);
+ for (i = 0; i < ETH_ALEN; i++) {
+ ptr += sprintf(ptr, "%02x", bin[i]);
+ if (i < 5) {
+ ptr += sprintf(ptr, ":");
}
- else
- {
-/* Return 'No such file or directory' error */
- return (-(errno = ENOENT));
- }
-
- return 0;
+ }
+ *ptr = '\0';
+ return 0;
}
diff --git a/application/spidlib/src/system/software_version.c b/application/spidlib/src/system/software_version.c
index e9df4bb2a6..a641a9b068 100644
--- a/application/spidlib/src/system/software_version.c
+++ b/application/spidlib/src/system/software_version.c
@@ -56,7 +56,7 @@ spidlib_get_software_version(char *software_version, int buffer_len)
{
/* not found, look for sysctl or proc */
FILE *fp;
- if((fp = fopen(SPIDLIB_SOFTWARE_VERSION_FILE, "r")) == NULL)
+ if((fp = fopen(SOFTWARE_VERSION_PATH, "r")) == NULL)
return -errno;
fgets(software_version, buffer_len - 1, fp);
software_version[strlen(software_version) - 1] = '\0';