Partially implemented config file parser. Validates, but does not populate NetworkSetup object yet.

This commit is contained in:
Sears Russell 2004-12-30 23:07:47 +00:00
parent f119717b5e
commit 6fa948cd74
16 changed files with 323 additions and 81 deletions

View file

@ -46,6 +46,7 @@ AM_CONDITIONAL(HAVE_CHECK, test x$have_check = xtrue)
#fi #fi
AC_CHECK_LIB([m], [sqrt]) AC_CHECK_LIB([m], [sqrt])
AC_CHECK_LIB([db], [db_open])
AC_CHECK_LIB([pthread], [pthread_create]) AC_CHECK_LIB([pthread], [pthread_create])
# Checks for header files. # Checks for header files.
@ -59,14 +60,19 @@ AC_C_CONST
AC_TYPE_PID_T AC_TYPE_PID_T
AC_TYPE_SIZE_T AC_TYPE_SIZE_T
AC_HEADER_TIME AC_HEADER_TIME
AC_STRUCT_TM
# Checks for library functions. # Checks for library functions.
AC_FUNC_ERROR_AT_LINE
AC_FUNC_MALLOC AC_FUNC_MALLOC
AC_FUNC_MEMCMP AC_FUNC_MEMCMP
AC_FUNC_REALLOC
AC_FUNC_STAT AC_FUNC_STAT
AC_CHECK_FUNCS([bzero fdatasync getcwd gettimeofday inet_ntoa memmove memset mkdir socket sqrt strchr strdup strerror strrchr strstr strtoul]) AC_CHECK_FUNCS([bzero fdatasync getcwd gettimeofday inet_ntoa localtime_r memmove memset mkdir socket sqrt strchr strdup strerror strrchr strstr strtoul])
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile
benchmarks/Makefile
benchmarks/berkeleyDB/Makefile
libdfa/Makefile libdfa/Makefile
lladd/Makefile lladd/Makefile
pbl/Makefile pbl/Makefile
@ -78,8 +84,8 @@ AC_CONFIG_FILES([Makefile
src/libdfa/Makefile src/libdfa/Makefile
src/lladd/Makefile src/lladd/Makefile
src/pbl/Makefile src/pbl/Makefile
src/pobj/Makefile
src/timing/Makefile src/timing/Makefile
src/pobj/Makefile
test/2pc/Makefile test/2pc/Makefile
test/Makefile test/Makefile
test/cht/Makefile test/cht/Makefile
@ -88,9 +94,7 @@ AC_CONFIG_FILES([Makefile
test/lladd/Makefile test/lladd/Makefile
test/messages/Makefile test/messages/Makefile
test/monotree/Makefile test/monotree/Makefile
test/pobj/Makefile test/pobj/Makefile
utilities/Makefile utilities/Makefile
benchmarks/Makefile
benchmarks/berkeleyDB/Makefile
]) ])
AC_OUTPUT AC_OUTPUT

View file

@ -54,8 +54,6 @@ terms specified in this license.
*/ */
#define DFA_MACHINE_COUNT 100 #define DFA_MACHINE_COUNT 100
/** TODO: Add transitions and states to dfaSet? */
typedef struct dfaSet { typedef struct dfaSet {
/* MonoTree monoTree; */ /* MonoTree monoTree; */
smash_t * smash; smash_t * smash;

View file

@ -44,7 +44,7 @@ terms specified in this license.
#define _MESSAGES_H #define _MESSAGES_H
#include <limits.h> #include <limits.h>
#include <libdfa/networksetup.h>
typedef unsigned long state_machine_id; typedef unsigned long state_machine_id;
/* Maximum size of a message payload, in bytes. Should be a multiple of the system word length.*/ /* Maximum size of a message payload, in bytes. Should be a multiple of the system word length.*/
@ -86,29 +86,6 @@ typedef struct message {
char payload[MAX_PAYLOAD]; char payload[MAX_PAYLOAD];
} Message; } Message;
/**
This struct contains the state for the messages (networking) layer.
Currently, everything here can be derived at startup, so this won't
need to be in transactional storage, with some luck. */
typedef struct networkSetup {
unsigned short localport;
char * localhost;
int socket;
/**
Same format as argv for main(). If a message is addressed to
"broadcast", then the message will be sent to each
"address:port" pair in this string. If you want to use proper
IP broadcast, then this list can simply contain one entry that
contains a subnet broadcast address like "1.2.3.0:1234".
It would be best to set this value to NULL and
broadcast_list_count to zero if you don't plan to use broadcast.
*/
char *** broadcast_lists;
int broadcast_lists_count;
int *broadcast_list_host_count;
} NetworkSetup;
int init_network(NetworkSetup *ns, unsigned short portnum); int init_network(NetworkSetup *ns, unsigned short portnum);
int init_network_broadcast(NetworkSetup * ns, unsigned short portnum, char * localhost, char *** broadcast_lists, int init_network_broadcast(NetworkSetup * ns, unsigned short portnum, char * localhost, char *** broadcast_lists,

36
libdfa/networksetup.h Normal file
View file

@ -0,0 +1,36 @@
#ifndef __NETWORKSETUP_H
#define __NETWORKSETUP_H
/**
This struct contains the state for the messages (networking) layer.
Currently, everything here can be derived at startup, so this won't
need to be in transactional storage, with some luck. */
typedef struct networkSetup {
unsigned short localport;
char * localhost;
int socket;
/**
Same format as argv for main(). If a message is addressed to
"broadcast", then the message will be sent to each
"address:port" pair in this string. If you want to use proper
IP broadcast, then this list can simply contain one entry that
contains a subnet broadcast address like "1.2.3.0:1234".
It would be best to set this value to NULL and
broadcast_list_count to zero if you don't plan to use broadcast.
*/
char *** broadcast_lists;
int broadcast_lists_count;
int *broadcast_list_host_count;
} NetworkSetup;
/** This site is the coordinator. */
#define COORDINATOR -1
/** Obtain the hostnumber from the config file. */
#define DEFAULT_HOST -2
/** Parses the network configuration file.
@param The name of the config file.
@param hostnumber COORDINATOR, or which subordinate this host is (zero indexed)
@return an initialized NetworkSetup struct.
*/
NetworkSetup * readNetworkConfig(char * name, int hostnumber);
#endif // __NETWORKSETUP_H

View file

@ -0,0 +1,7 @@
coordinator = 127.0.0.1:20000
subordinates = {
127.0.0.1:20001,
127.0.0.1:20002,
127.0.0.1:20003,
127.0.0.1:20004
}

View file

@ -11,14 +11,14 @@ filter.file.ignore.hidden=0
filter.dir.ignore.hidden=0 filter.dir.ignore.hidden=0
[filenumbers] [filenumbers]
0=135 0=1
1=1 1=1
2=1 2=12
3=113 3=2
4=51 4=50
5=439 5=3
6=545 6=25
7=122 7=24
8=30 8=30
9=1 9=1
10=67 10=67
@ -51,15 +51,14 @@ filter.dir.ignore.hidden=0
17= 17=
[filelist] [filelist]
0=/home/sears/lladd/lladd/constants.h 0=/home/sears/lladd/libdfa/messages.h
1=/home/sears/lladd/lladd/operations.h 1=/home/sears/lladd/test/dfa/Makefile.am
2=/home/sears/lladd/src/lladd/page.c 2=/home/sears/lladd/test/lladd/Makefile.am
3=/home/sears/lladd/src/lladd/operations/set.c 3=/home/sears/lladd/test/lladd/check_blobRecovery.c
4=/home/sears/lladd/src/lladd/operations/arrayList.c 4=/home/sears/lladd/test/dfa/check_networksetup.c
5=/home/sears/lladd/test/lladd/check_page.c 5=/home/sears/lladd/libdfa/networksetup.sample
6=/home/sears/lladd/test/lladd/check_operations.c 6=/home/sears/lladd/src/libdfa/networksetup.c
7=/home/sears/lladd/src/lladd/operations/alloc.c 7=/home/sears/lladd/libdfa/networksetup.h
8=/home/sears/lladd/lladd/operations/alloc.h
[Project Tree] [Project Tree]
0=0 0=0
@ -74,14 +73,17 @@ filter.dir.ignore.hidden=0
[File Tree] [File Tree]
0=0 0=0
1=0:6 1=0:5
2=0:6:2 2=0:6
3=0:9 3=0:6:2
4=0:9:4 4=0:9
5=0:9:4:3 5=0:10
6=0:9:4:4 6=0:10:0
7=0:10 7=0:10:2
8=0:10:5 8=0:10:3
9=0:11
10=0:11:4
11=0:11:5
[executer args] [executer args]
0=check_linearHash 0=check_linearHash

View file

@ -101,19 +101,20 @@ static unsigned char * responseType(Message *m) {
} }
/** TODO: Endianness. (ICK) */ /** TODO: Endianness. (ICK) */
//state_name request_type =*(requestType(m)); \sdsd
//state_name response_type =*(responseType(m)); \sd
//TwoPCMachineState * machine_state_2pc = (TwoPCMachineState*) &(stateMachine->app_state); \sd
#define setup_vars \ #define setup_vars \
state_name request_type =*(requestType(m)); \
state_name response_type =*(responseType(m)); \
TwoPCMachineState * machine_state_2pc = (TwoPCMachineState*) &(stateMachine->app_state); \
TwoPCAppState * app_state_2pc = ((TwoPCAppState*)(((DfaSet*)dfaSet)->app_setup)); \ TwoPCAppState * app_state_2pc = ((TwoPCAppState*)(((DfaSet*)dfaSet)->app_setup)); \
CHTAppState * app_state_cht = app_state_2pc->app_state; \ CHTAppState * app_state_cht = app_state_2pc->app_state; \
jbHashTable_t * xid_ht = app_state_cht->xid_ht; \ jbHashTable_t * xid_ht = app_state_cht->xid_ht; \
jbHashTable_t * ht_ht = app_state_cht->ht_ht; \ jbHashTable_t * ht_ht = app_state_cht->ht_ht; \
int ht_xid = app_state_cht->ht_xid; \ int ht_xid = app_state_cht->ht_xid; \
int xid; \ int xid; \
int xid_exists = (-1 != jbHtLookup(ht_xid, xid_ht, &(stateMachine->machine_id), sizeof(state_machine_id), &xid)); \ int xid_exists = (-1 != jbHtLookup(ht_xid, xid_ht,(byte*) &(stateMachine->machine_id), sizeof(state_machine_id), (byte*)&xid)); \
jbHashTable_t ht; \ jbHashTable_t ht; \
int ht_exists = (-1 != jbHtLookup(ht_xid, ht_ht, &(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), &ht)) int ht_exists = (-1 != jbHtLookup(ht_xid, ht_ht, (byte*)&(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t),(byte*) &ht))
@ -321,6 +322,16 @@ state_name init_xact_cht(void * dfaSet, StateMachine * stateMachine, Message * m
return 1; return 1;
} }
int xid_exists(int ht_xid, jbHashTable_t * xid_ht, StateMachine * stateMachine) {
int xid;
if (-1 == jbHtLookup(ht_xid, xid_ht, (byte*)&(stateMachine->machine_id), sizeof(state_machine_id), (byte*)&xid)) {
return 0;
} else {
assert(xid);
return xid;
}
}
callback_fcn abort_cht; callback_fcn abort_cht;
/* Begins new transaction, does the work the transaction requests, stores the message, and returns the corresponding error code. */ /* Begins new transaction, does the work the transaction requests, stores the message, and returns the corresponding error code. */
@ -329,6 +340,8 @@ state_name veto_or_prepare_cht(void * dfaSet, StateMachine * stateMachine, Messa
state_name ret; state_name ret;
setup_vars; setup_vars;
// int xid_exists = (-1 != jbHtLookup(ht_xid, app_state_cht->xid_ht, &(stateMachine->machine_id), sizeof(state_machine_id, &xid));
if(xid_exists) { printf("Warning: Stale xid found!\n"); } if(xid_exists) { printf("Warning: Stale xid found!\n"); }
assert(!xid_exists); assert(!xid_exists);
printf("requestType: %d, responseType: %d key: %d from %s:%ld\n", *requestType(m), *responseType(m), *(int*)getKeyAddr(m), m->initiator, m->initiator_machine_id); printf("requestType: %d, responseType: %d key: %d from %s:%ld\n", *requestType(m), *responseType(m), *(int*)getKeyAddr(m), m->initiator, m->initiator_machine_id);
@ -339,7 +352,7 @@ state_name veto_or_prepare_cht(void * dfaSet, StateMachine * stateMachine, Messa
printf("Tbegin failed; %d\n", xid); printf("Tbegin failed; %d\n", xid);
} else if(jbHtInsert(ht_xid, xid_ht, &(stateMachine->machine_id), sizeof(state_machine_id), &xid, sizeof(int)) == -1) { } else if(jbHtInsert(ht_xid, xid_ht, (byte*)&(stateMachine->machine_id), sizeof(state_machine_id), (byte*)&xid, sizeof(int)) == -1) {
printf("jbHtInsert failed.\n"); printf("jbHtInsert failed.\n");
@ -373,7 +386,7 @@ state_name abort_cht(void * dfaSet, StateMachine * stateMachine, Message * m, ch
printf("Aborting!!\n"); printf("Aborting!!\n");
if(response_type == AWAIT_COMMIT_POINT || response_type == AWAIT_RESULT) { if(*responseType(m) == AWAIT_COMMIT_POINT || *responseType(m) == AWAIT_RESULT) {
state_machine_id tmp = m->from_machine_id; state_machine_id tmp = m->from_machine_id;
/* TODO: Could the chages to from_machine_id be moved into libdfa (it does this anyway, but it does it too late.) */ /* TODO: Could the chages to from_machine_id be moved into libdfa (it does this anyway, but it does it too late.) */
@ -387,7 +400,7 @@ state_name abort_cht(void * dfaSet, StateMachine * stateMachine, Message * m, ch
assert(xid_exists); assert(xid_exists);
Tabort(xid); // !!!! Tabort(xid); // !!!!
jbHtRemove(ht_xid, xid_ht, &(stateMachine->machine_id), sizeof(state_machine_id), &xid); jbHtRemove(ht_xid, xid_ht, (byte*)&(stateMachine->machine_id), sizeof(state_machine_id), (byte*)&xid);
Tcommit(app_state_cht->ht_xid); Tcommit(app_state_cht->ht_xid);
app_state_cht->ht_xid = Tbegin(); app_state_cht->ht_xid = Tbegin();
return 1; return 1;
@ -402,13 +415,13 @@ state_name do_work(void * dfaSet, StateMachine * stateMachine, Message * m, char
/* printf("ht_ht = %x, ht = %x\n", ht_ht, ht); */ /* printf("ht_ht = %x, ht = %x\n", ht_ht, ht); */
switch(request_type) switch(*requestType(m))
{ {
case CREATE: case CREATE:
{ {
jbHashTable_t * new = jbHtCreate(ht_xid, 79); jbHashTable_t * new = jbHtCreate(ht_xid, 79);
if(new != NULL) { if(new != NULL) {
ret = (jbHtInsert(ht_xid, ht_ht, &(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), new, sizeof(jbHashTable_t)) >= 0); ret = (jbHtInsert(ht_xid, ht_ht, (byte*)&(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), (byte*)new, sizeof(jbHashTable_t)) >= 0);
} else { } else {
ret = 0; ret = 0;
} }
@ -427,7 +440,7 @@ state_name do_work(void * dfaSet, StateMachine * stateMachine, Message * m, char
if(!ht_exists) { printf ("Hash table %d doesn't exist!\n", (__header_ptr(m)->hashTable).id); fflush(NULL); ret = 0; } else { if(!ht_exists) { printf ("Hash table %d doesn't exist!\n", (__header_ptr(m)->hashTable).id); fflush(NULL); ret = 0; } else {
ret = (jbHtInsert(xid, &ht, getKeyAddr(m), getKeyLength(m), getValAddr(m), getValLength(m)) >= 0); ret = (jbHtInsert(xid, &ht, getKeyAddr(m), getKeyLength(m), getValAddr(m), getValLength(m)) >= 0);
printf("Insert: %d ht=%d (key length %d) %d -> %s\n", ret, (__header_ptr(m)->hashTable).id, getKeyLength(m), *(int*)getKeyAddr(m), getValAddr(m)); printf("Insert: %d ht=%d (key length %d) %d -> %s\n", ret, (__header_ptr(m)->hashTable).id, getKeyLength(m), *(int*)getKeyAddr(m), getValAddr(m));
(jbHtInsert(ht_xid, ht_ht, &(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), &ht, sizeof(jbHashTable_t))); (jbHtInsert(ht_xid, ht_ht, (byte*)&(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), (byte*)&ht, sizeof(jbHashTable_t)));
} }
} break; } break;
@ -444,7 +457,7 @@ state_name do_work(void * dfaSet, StateMachine * stateMachine, Message * m, char
{ {
if(!ht_exists) { printf ("Hash table doesn't exist!\n"); fflush(NULL); ret = 0; } else { if(!ht_exists) { printf ("Hash table doesn't exist!\n"); fflush(NULL); ret = 0; } else {
ret = (jbHtRemove(xid, &ht, getKeyAddr(m), getKeyLength(m), getValAddr(m)) >= 0); ret = (jbHtRemove(xid, &ht, getKeyAddr(m), getKeyLength(m), getValAddr(m)) >= 0);
(jbHtInsert(ht_xid, ht_ht, &(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), &ht, sizeof(jbHashTable_t))); (jbHtInsert(ht_xid, ht_ht, (byte*)&(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), (byte*)&ht, sizeof(jbHashTable_t)));
} }
} break; } break;
@ -452,7 +465,7 @@ state_name do_work(void * dfaSet, StateMachine * stateMachine, Message * m, char
{ {
if(!ht_exists) { printf ("Hash table doesn't exist!\n"); fflush(NULL); ret = 0; } else { if(!ht_exists) { printf ("Hash table doesn't exist!\n"); fflush(NULL); ret = 0; } else {
jbHtRemove(xid, ht_ht, getKeyAddr(m), getKeyLength(m), NULL); jbHtRemove(xid, ht_ht, getKeyAddr(m), getKeyLength(m), NULL);
(jbHtInsert(ht_xid, ht_ht, &(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), &ht, sizeof(jbHashTable_t))); (jbHtInsert(ht_xid, ht_ht, (byte*)&(__header_ptr(m)->hashTable), sizeof(clusterHashTable_t), (byte*)&ht, sizeof(jbHashTable_t)));
/* ret = (jbHtDelete(xid, &ht) >= 0); */ /* Don't need this--jbHtDelete just frees the (stack!) pointer. */ /* ret = (jbHtDelete(xid, &ht) >= 0); */ /* Don't need this--jbHtDelete just frees the (stack!) pointer. */
Tcommit(app_state_cht->ht_xid); Tcommit(app_state_cht->ht_xid);
app_state_cht->ht_xid = Tbegin(); app_state_cht->ht_xid = Tbegin();
@ -497,7 +510,7 @@ state_name do_work(void * dfaSet, StateMachine * stateMachine, Message * m, char
*/ */
default: default:
{ {
printf("Unknown request type: %d\n", request_type); printf("Unknown request type: %d\n", *requestType(m));
} }
} }
@ -510,12 +523,12 @@ state_name commit_cht(void * dfaSet, StateMachine * stateMachine, Message * m, c
assert(xid_exists); assert(xid_exists);
Tcommit(xid); Tcommit(xid);
jbHtRemove(ht_xid, xid_ht, &(stateMachine->machine_id), sizeof(state_machine_id), &xid); jbHtRemove(ht_xid, xid_ht, (byte*)&(stateMachine->machine_id), sizeof(state_machine_id), (byte*)&xid);
Tcommit(app_state_cht->ht_xid); Tcommit(app_state_cht->ht_xid);
app_state_cht->ht_xid = Tbegin(); app_state_cht->ht_xid = Tbegin();
/* }*/ /* }*/
if(response_type == AWAIT_RESULT) { if(*responseType(m) == AWAIT_RESULT) {
printf("commit_cht responding on an AWAIT_RESULT request.\n"); printf("commit_cht responding on an AWAIT_RESULT request.\n");
assert(0); assert(0);
/* respond_once(&((DfaSet*)dfaSet)->networkSetup, SUBORDINATE_ACKING_2PC, m, __header_ptr(m)->initiator); */ /* respond_once(&((DfaSet*)dfaSet)->networkSetup, SUBORDINATE_ACKING_2PC, m, __header_ptr(m)->initiator); */
@ -526,13 +539,13 @@ state_name commit_cht(void * dfaSet, StateMachine * stateMachine, Message * m, c
state_name tally_cht(void * dfaSet, StateMachine * stateMachine, Message * m, char * from) { state_name tally_cht(void * dfaSet, StateMachine * stateMachine, Message * m, char * from) {
setup_vars; // setup_vars;
/* TODO: Make sure this is after tally forces the log. Also, need to /* TODO: Make sure this is after tally forces the log. Also, need to
make sure that it increments the (currently unimplemented) make sure that it increments the (currently unimplemented)
sequence number before flushing... */ sequence number before flushing... */
if(response_type == AWAIT_COMMIT_POINT && stateMachine->current_state==COORDINATOR_START_2PC) { if(*responseType(m) == AWAIT_COMMIT_POINT && stateMachine->current_state==COORDINATOR_START_2PC) {
state_machine_id tmp = m->from_machine_id; state_machine_id tmp = m->from_machine_id;
/* TODO: Could the chages to from_machine_id be moved into libdfa (it does this anyway, but it does it too late.) */ /* TODO: Could the chages to from_machine_id be moved into libdfa (it does this anyway, but it does it too late.) */

View file

@ -1,5 +1,5 @@
#LDADD=$(top_builddir)/build/transactional.a $(top_builddir)/build/libpbl.a #LDADD=$(top_builddir)/build/transactional.a $(top_builddir)/build/libpbl.a
lib_LIBRARIES=libdfa.a librw.a lib_LIBRARIES=libdfa.a librw.a
libdfa_a_SOURCES=libdfa.c monotree.c smash.c callbacks.c messages.c libdfa_a_SOURCES=libdfa.c monotree.c smash.c callbacks.c messages.c networksetup.c
librw_a_SOURCES=rw.c librw_a_SOURCES=rw.c
AM_CFLAGS= -g -Wall -pedantic -std=gnu99 AM_CFLAGS= -g -Wall -pedantic -std=gnu99

View file

@ -95,17 +95,17 @@ short parse_port(const char * address) {
port_s = strtok_r(addr_copy, ":", &strtok_buf); port_s = strtok_r(addr_copy, ":", &strtok_buf);
if(port_s == NULL) { if(port_s == NULL) {
printf("Invalid address (%s) passed into parse_port", address); // printf("Invalid address (%s) passed into parse_port", address);
assert(0); // assert(0);
return -1; return 0;
} }
port_s = strtok_r(NULL, ":", &strtok_buf); port_s = strtok_r(NULL, ":", &strtok_buf);
if(port_s == NULL) { if(port_s == NULL) {
printf("Invalid address (%s) passed into parse_port", address); // printf("Invalid address (%s) passed into parse_port", address);
assert(0); // assert(0);
return -1; return 0;
} }
port = atoi(port_s); port = atoi(port_s);

76
src/libdfa/networksetup.c Normal file
View file

@ -0,0 +1,76 @@
#include <libdfa/networksetup.h>
#include <confuse.h>
#include <stdlib.h>
#include <libdfa/messages.h>
#include <string.h>
/** @todo could validate ip addresses a bit better. Currently, validate_host_port will accept 999.999.999.999:1
*/
int validate_host_port(cfg_t *cfg, cfg_opt_t *opt) {
char * hostport = cfg_opt_getnstr(opt, cfg_opt_size(opt) - 1);
if(strlen(hostport) > MAX_ADDRESS_LENGTH-1) {
cfg_error(cfg, "string option %s ('%s') too long.\n\tMust be less than %d characters in section '%s'",
opt->name, hostport, MAX_ADDRESS_LENGTH, cfg->name);
return -1;
}
char * addr = parse_addr(hostport);
if(addr == NULL) {
cfg_error(cfg, "Error parsing address portion of string option %s ('%s'). should be of form nnn.nnn.nnn.nnn:mmmmm where n and m are intergers in section '%s'",
opt->name, hostport, cfg->name);
return -1;
}
int i;
for(i = 0; i < strlen(addr); i++) {
if((addr[i] < '0' || addr[i] > '9') && addr[i] != '.') {
cfg_error(cfg, "Error parsing address from option %s ('%s'), should be IP address in section '%s'",
opt->name, addr, cfg->name);
return -1;
}
}
free(addr);
long int port = parse_port(hostport);
if(port < 1 || port > 65535)
{
cfg_error(cfg, "port number must be between 1 and 65535 in option %s ('%s') section '%s'",
opt->name, hostport, cfg->name);
return -1;
}
return 0;
}
cfg_opt_t opts[] = {
CFG_STR("coordinator", "127.0.0.1:10000", CFGF_NONE),
CFG_STR_LIST("subordinates",
"{127.0.0.1:10001,127.0.0.1:10002,127.0.0.1:10003}", CFGF_NONE),
CFG_END()
};
NetworkSetup * readNetworkConfig(char * name, int hostnumber) {
cfg_t *cfg;
cfg = cfg_init(opts, CFGF_NONE);
cfg_set_validate_func(cfg, "coordinator", validate_host_port);
cfg_set_validate_func(cfg, "subordinates", validate_host_port);
if(cfg_parse(cfg, name) == CFG_PARSE_ERROR) {
fprintf(stderr, "Configuration file parse error.\n");
fflush(NULL);
return NULL;
}
printf("coordinator: %s\n", cfg_getstr(cfg, "coordinator"));
printf("subordinate count: %d\n", cfg_size(cfg, "subordinates"));
int i;
for(i = 0; i < cfg_size(cfg, "subordinates"); i++) {
printf("\t%s\n", cfg_getnstr(cfg, "subordinates", i));
}
if(hostnumber == COORDINATOR) {
printf("I am coordinator\n");
} else {
printf("I am subordinate # %d\n", hostnumber);
}
cfg_free(cfg);
return NULL;
}

View file

@ -1,3 +1,12 @@
LDADD=$(top_builddir)/src/libdfa/libdfa.a $(top_builddir)/src/lladd/liblladd.a $(top_builddir)/src/pbl/libpbl.a $(top_builddir)/src/libdfa/librw.a LDADD= @CHECK_LIBS@ $(top_builddir)/src/libdfa/libdfa.a $(top_builddir)/src/lladd/liblladd.a $(top_builddir)/src/pbl/libpbl.a $(top_builddir)/src/libdfa/librw.a -lconfuse
bin_PROGRAMS=ping_pong_dfa fork_bomb star bin_PROGRAMS=ping_pong_dfa fork_bomb star
AM_FLAGS= -g -Wall -pedantic -std=c99 AM_FLAGS= -g -Wall -pedantic -std=c99
if HAVE_CHECK
TESTS = check_networksetup
else
TESTS =
endif
noinst_PROGRAMS = $(TESTS)
#LDADD = @CHECK_LIBS@ $(top_builddir)/src/lladd/liblladd.a $(top_builddir)/src/pbl/libpbl.a $(top_builddir)/src/libdfa/librw.a #-lefence
CLEANFILES = check_networksetup.log
#AM_CFLAGS= -g -Wall -pedantic -std=gnu99

View file

@ -0,0 +1,89 @@
/*---
This software is copyrighted by the Regents of the University of
California, and other parties. The following terms apply to all files
associated with the software unless explicitly disclaimed in
individual files.
The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose,
provided that existing copyright notices are retained in all copies
and that this notice is included verbatim in any distributions. No
written agreement, license, or royalty fee is required for any of the
authorized uses. Modifications to this software may be copyrighted by
their authors and need not follow the licensing terms described here,
provided that the new terms are clearly indicated on the first page of
each file where they apply.
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND
THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights" in
the software and related documentation as defined in the Federal
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are
acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license.
---*/
#include <config.h>
#include <check.h>
/*#include <assert.h> */
//#include <lladd/transactional.h>
//#include "../../src/lladd/logger/logWriter.h"
#include "../check_includes.h"
#include <assert.h>
#include <libdfa/networksetup.h>
#define LOG_NAME "check_networksetup.log"
/**
@test
*/
START_TEST (networksetup_check) {
readNetworkConfig("../../libdfa/networksetup.sample", COORDINATOR);
}
END_TEST
/**
@test
*/
START_TEST (networksetup_check_error) {
assert(!readNetworkConfig("networksetup.bad", COORDINATOR));
assert(!readNetworkConfig("networksetup.bad2", COORDINATOR));
assert(!readNetworkConfig("networksetup.bad3", COORDINATOR));
assert(!readNetworkConfig("networksetup.bad4", COORDINATOR));
}
END_TEST
/**
Add suite declarations here
*/
Suite * check_suite(void) {
Suite *s = suite_create("networksetup_suite");
/* Begin a new test */
TCase *tc = tcase_create("networksetup");
/* void * foobar; */ /* used to supress warnings. */
/* Sub tests are added, one per line, here */
tcase_add_test(tc, networksetup_check);
tcase_add_test(tc, networksetup_check_error);
/* --------------------------------------------- */
// tcase_add_checked_fixture(tc, setup, teardown);
suite_add_tcase(s, tc);
return s;
}
#include "../check_setup.h"

View file

@ -0,0 +1,7 @@
coordinator = 127.0.0.1:20000
subordinates = {
127.0.0.1:abcd,
127.0.0.1:20002,
127.0.0.1:20003,
127.0.0.1:20004
}

View file

@ -0,0 +1,7 @@
coordinator = 127.0.0.1:20000
subordinates = {
127.0.0.1:abcdThisOptionIsReallyLong,
127.0.0.1:20002,
127.0.0.1:20003,
127.0.0.1:20004
}

View file

@ -0,0 +1,7 @@
coordinator = 127.0.0.1:20000
subordinates = {
127.0.0.1,
127.0.0.1:20002,
127.0.0.1:20003,
127.0.0.1:20004
}

View file

@ -0,0 +1,10 @@
coordinator = 127.0.0.1:20000
## The library currently doesn't handle hostnames, so this should fail to validate.
subordinates = {
hedora.ath.cx:20001,
127.0.0.1:20002,
127.0.0.1:20003,
127.0.0.1:20004
}