[dhcp-agent-commits] dhcp-agent/src dhcp-server-guile.c,1.2,1.3 dhcp-server-guile.h,1.3,1.4
Status: Alpha
Brought to you by:
actmodern
From: <act...@us...> - 2003-08-05 04:59:35
|
Update of /cvsroot/dhcp-agent/dhcp-agent/src In directory sc8-pr-cvs1:/tmp/cvs-serv26394/src Modified Files: dhcp-server-guile.c dhcp-server-guile.h Log Message: more work on server guile bindings Index: dhcp-server-guile.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-server-guile.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-server-guile.c 29 Jul 2003 02:38:14 -0000 1.2 --- dhcp-server-guile.c 5 Aug 2003 04:59:32 -0000 1.3 *************** *** 34,41 **** #include "dhcp-server-conf.h" #include "dhcp-server.h" #include "dhcp-server-guile.h" ! static scm_t_bits server_control_tag; ! static SCM initialize_leases, get_next_lease, lease_lookup, lease_expire; /* * * * * * * * * * * * * * * * * * * * --- 34,192 ---- #include "dhcp-server-conf.h" #include "dhcp-server.h" + #include "dhcp-guile-util.h" #include "dhcp-server-guile.h" ! static scm_t_bits server_control_tag, lease_tag; ! SCM leases_initialize, lease_available, lease_lookup, lease_acquire, lease_release, lease_expire; ! ! /* * * * * * * * * * * * * * * * * * * * ! * misc utilities * ! * * * * * * * * * * * * * * * * * * * */ ! ! static SCM make_lease_data_list(const char *hostname, eth_addr_t mac_addr, ip_addr_t giaddr, dhcp_opt_t *client_id) ! { ! SCM data_list; ! char *eth_addr_string, *giaddr_string, *client_id_string; ! ! eth_addr_string = eth_addr_to_string(mac_addr); ! giaddr_string = ip_addr_to_string(giaddr); ! client_id_string = dhcp_opt_get_user_string(client_id); ! ! data_list = SCM_EOL; ! data_list = scm_cons(scm_makfrom0str(client_id_string), data_list); ! data_list = scm_cons(scm_makfrom0str(giaddr_string), data_list); ! data_list = scm_cons(scm_makfrom0str(eth_addr_string), data_list); ! data_list = scm_cons(scm_makfrom0str(hostname), data_list); ! ! xfree(eth_addr_string); ! xfree(giaddr_string); ! xfree(client_id_string); ! ! return data_list; ! } ! ! /* * * * * * * * * * * * * * * * * * * * ! * lease smob * ! * * * * * * * * * * * * * * * * * * * */ ! ! /* mark a lease: we don't need to do any marking. */ ! static SCM scm_lease_mark(SCM scm_lease) ! { ! return SCM_BOOL_F; ! } ! ! /* free a lease scm. */ ! static size_t scm_lease_free(SCM scm_lease) ! { ! lease_smob_t *lease; ! ! lease = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); ! lease_destroy(lease->lease); ! xfree(lease); ! ! return sizeof(lease_smob_t); ! } ! ! /* print out a lease scm. */ ! static int scm_lease_print(SCM scm_lease, SCM port, scm_print_state *pstate) ! { ! scm_puts("#<lease>", port); ! return 1; ! } ! ! /* create a lease: this is called from within the scheme environment. */ ! static SCM scm_make_lease(SCM scm_ip_address, SCM scm_subnet_mask, SCM scm_lease_expiry, ! SCM scm_renew_time, SCM scm_rebind_time) ! { ! lease_smob_t *lease_smob; ! lease_t *lease; ! ip_addr_t ip_address, subnet_mask; ! uint32_t lease_expiry, renew_time, rebind_time; ! ! /* do assertions: all arguments can either be strings or inums */ ! ! SCM_ASSERT(SCM_STRINGP(scm_ip_address)|SCM_INUMP(scm_ip_address), ! scm_ip_address, SCM_ARG1, "make-lease"); ! ! SCM_ASSERT(SCM_STRINGP(scm_subnet_mask)|SCM_INUMP(scm_subnet_mask), ! scm_subnet_mask, SCM_ARG2, "make-lease"); ! ! SCM_ASSERT(SCM_STRINGP(scm_lease_expiry)|SCM_INUMP(scm_lease_expiry), ! scm_lease_expiry, SCM_ARG3, "make-lease"); ! ! SCM_ASSERT(SCM_STRINGP(scm_renew_time)|SCM_INUMP(scm_renew_time), ! scm_renew_time, SCM_ARG4, "make-lease"); ! ! SCM_ASSERT(SCM_STRINGP(scm_rebind_time)|SCM_INUMP(scm_rebind_time), ! scm_rebind_time, SCM_ARG5, "make-lease"); ! ! /* if string change to number first. */ ! ! if(SCM_STRINGP(scm_ip_address)) { ! ip_address = ntohl(scm_num2ulong(scm_inet_aton(scm_ip_address), 1, "make-lease")); ! } else { ! ip_address = scm_num2ulong(scm_ip_address, 1, "make-lease"); ! } ! ! if(SCM_STRINGP(scm_subnet_mask)) { ! subnet_mask = ntohl(scm_num2ulong(scm_inet_aton(scm_subnet_mask), 1, "make-lease")); ! } else { ! subnet_mask = scm_num2ulong(scm_subnet_mask, 1, "make-lease"); ! } ! ! if(SCM_STRINGP(scm_lease_expiry)) { ! lease_expiry = scm_num2ulong(scm_inet_aton(scm_lease_expiry), 1, "make-lease"); ! } else { ! lease_expiry = scm_num2ulong(scm_lease_expiry, 1, "make-lease"); ! } ! ! if(SCM_STRINGP(scm_renew_time)) { ! renew_time = scm_num2ulong(scm_inet_aton(scm_renew_time), 1, "make-lease"); ! } else { ! renew_time = scm_num2ulong(scm_renew_time, 1, "make-lease"); ! } ! ! if(SCM_STRINGP(scm_rebind_time)) { ! rebind_time = scm_num2ulong(scm_inet_aton(scm_rebind_time), 1, "make-lease"); ! } else { ! rebind_time = scm_num2ulong(scm_rebind_time, 1, "make-lease"); ! } ! ! lease = lease_create(ip_address, subnet_mask, lease_expiry, renew_time, rebind_time); ! lease_smob = scm_must_malloc(sizeof(lease_smob_t), "lease-make"); ! lease_smob->lease = lease; ! ! SCM_RETURN_NEWSMOB(lease_tag, lease); ! } ! ! /* create an SCM lease: this is called from the C code: a copy is ! made so garbage collection doesn't clubber our copy */ ! static SCM scm_c_make_lease(lease_t *lease) ! { ! return scm_make_lease(SCM_MAKINUM(lease_get_address(lease)), SCM_MAKINUM(lease_get_subnet_mask(lease)), ! SCM_MAKINUM(lease_get_expiry(lease)), SCM_MAKINUM(lease_get_renew(lease)), ! SCM_MAKINUM(lease_get_rebind(lease))); ! } ! ! /* get a copy of the lease from the scm lease: caled from C code. */ ! static lease_t * scm_c_get_lease(SCM scm_lease) ! { ! lease_smob_t *lease_smob; ! ! lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); ! return lease_copy(lease_smob->lease); ! } ! ! /* initialization routines for server control SMOB. */ ! static void init_lease_smob(void) ! { ! lease_tag = scm_make_smob_type("lease", sizeof(lease_smob_t)); ! ! scm_set_smob_free(lease_tag, scm_lease_free); ! scm_set_smob_mark(lease_tag, scm_lease_mark); ! scm_set_smob_print(lease_tag, scm_lease_print); ! ! return; ! } /* * * * * * * * * * * * * * * * * * * * *************** *** 72,80 **** server_control_smob_t *server_control_smob; ! server_control_smob = xmalloc(sizeof(server_control_smob_t)); server_control_smob->sc = sc; SCM_RETURN_NEWSMOB(server_control_tag, server_control_smob); - } --- 223,230 ---- server_control_smob_t *server_control_smob; ! server_control_smob = scm_must_malloc(sizeof(server_control_smob_t), "scm_make_server_control"); server_control_smob->sc = sc; SCM_RETURN_NEWSMOB(server_control_tag, server_control_smob); } *************** *** 85,90 **** /* bind mark, free, and print. */ - scm_set_smob_mark(server_control_tag, dhcp_scm_server_control_mark); scm_set_smob_free(server_control_tag, dhcp_scm_server_control_free); scm_set_smob_print(server_control_tag, dhcp_scm_server_control_print); --- 235,240 ---- /* bind mark, free, and print. */ scm_set_smob_free(server_control_tag, dhcp_scm_server_control_free); + scm_set_smob_mark(server_control_tag, dhcp_scm_server_control_mark); scm_set_smob_print(server_control_tag, dhcp_scm_server_control_print); *************** *** 135,147 **** void dhcp_guile_init(dhcp_server_control_t *sc) { - /* initialize the server control smob. */ init_server_control_smob(); /* bind symbols to top level so that the user defined script can hook into them. */ ! initialize_leases = scm_str2symbol("initialize-leases"); ! get_next_lease = scm_str2symbol("get-next-lease"); lease_lookup = scm_str2symbol("lease-lookup"); lease_expire = scm_str2symbol("lease-expire"); --- 285,301 ---- void dhcp_guile_init(dhcp_server_control_t *sc) { /* initialize the server control smob. */ init_server_control_smob(); + /* initialize lease smob. */ + init_lease_smob(); + /* bind symbols to top level so that the user defined script can hook into them. */ ! leases_initialize = scm_str2symbol("initialize-leases"); ! lease_available = scm_str2symbol("lease-available?"); lease_lookup = scm_str2symbol("lease-lookup"); + lease_acquire = scm_str2symbol("lease-acquire"); + lease_release = scm_str2symbol("lease-release"); lease_expire = scm_str2symbol("lease-expire"); *************** *** 149,161 **** * collector from swallowing these symbols up. */ ! scm_define(initialize_leases, SCM_BOOL_F); ! scm_define(get_next_lease, SCM_BOOL_F); scm_define(lease_lookup, SCM_BOOL_F); scm_define(lease_expire, SCM_BOOL_F); - /* define all the subroutines. */ - - /* TODO. */ - /* bind our server control object. */ scm_c_define("dhcp-server-control", --- 303,315 ---- * collector from swallowing these symbols up. */ ! /* bind false to all the subroutines. */ ! ! scm_define(leases_initialize, SCM_BOOL_F); ! scm_define(lease_available, SCM_BOOL_F); scm_define(lease_lookup, SCM_BOOL_F); + scm_define(lease_acquire, SCM_BOOL_F); + scm_define(lease_release, SCM_BOOL_F); scm_define(lease_expire, SCM_BOOL_F); /* bind our server control object. */ scm_c_define("dhcp-server-control", *************** *** 171,202 **** int dhcp_guile_initialize_leases(void) { ! scm_apply_0(initialize_leases, SCM_EOL); return 0; } /* ask if any leases are available. */ ! lease_definition_t *dhcp_guile_lease_available(const char *hostname, eth_addr_t mac_addr, ! ip_addr_t giaddr, dhcp_opt_t *client_id) { ! return NULL; } /* lookup a lease: lookup a lease. */ ! lease_definition_t *dhcp_guile_lookup_lease(ip_addr_t ip_addr, const char *hostname, eth_addr_t mac_addr, ip_addr_t giaddr, dhcp_opt_t *client_id) { ! return NULL; } /* get the next available lease. */ ! lease_definition_t *dhcp_guile_acquire_lease(lease_definition_t *definition) { ! return NULL; } /* lookup an existing lease. */ ! lease_definition_t *dhcp_guile_release_lease(lease_definition_t *definition) { ! return NULL; } --- 325,390 ---- int dhcp_guile_initialize_leases(void) { ! scm_call_0(scm_variable_ref(leases_initialize)); return 0; } /* ask if any leases are available. */ ! lease_t *dhcp_guile_lease_available(const char *hostname, eth_addr_t mac_addr, ! ip_addr_t giaddr, dhcp_opt_t *client_id) { ! SCM data_list, scm_lease; ! lease_t *lease; ! ! data_list = make_lease_data_list(hostname, mac_addr, giaddr, client_id); ! scm_lease = scm_call_1(scm_variable_ref(lease_available), data_list); ! ! lease = scm_c_get_lease(scm_lease); ! return lease; } /* lookup a lease: lookup a lease. */ ! lease_t *dhcp_guile_lookup_lease(ip_addr_t ip_addr, const char *hostname, eth_addr_t mac_addr, ip_addr_t giaddr, dhcp_opt_t *client_id) { ! SCM data_list, scm_lease; ! lease_t *lease; ! ! data_list = make_lease_data_list(hostname, mac_addr, giaddr, client_id); ! scm_lease = scm_call_1(scm_variable_ref(lease_lookup), data_list); ! ! lease = scm_c_get_lease(scm_lease); ! return lease; } /* get the next available lease. */ ! int dhcp_guile_acquire_lease(lease_t *lease) { ! SCM scm_lease; ! SCM scm_return; ! ! scm_lease = scm_c_make_lease(lease); ! ! scm_return = scm_call_1(scm_variable_ref(lease_acquire), scm_lease); ! ! if(scm_return == SCM_BOOL_T) ! return 0; ! else ! return 1; } /* lookup an existing lease. */ ! int dhcp_guile_release_lease(lease_t *lease) { ! SCM scm_lease; ! SCM scm_return; ! ! scm_lease = scm_c_make_lease(lease); ! ! scm_return = scm_call_1(scm_variable_ref(lease_release), scm_lease); ! ! if(scm_return == SCM_BOOL_T) ! return 0; ! else ! return 1; } *************** *** 204,207 **** --- 392,396 ---- void dhcp_guile_lease_expire(void) { + scm_call_0(scm_variable_ref(lease_expire)); return; } Index: dhcp-server-guile.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-server-guile.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dhcp-server-guile.h 29 Jul 2003 02:38:14 -0000 1.3 --- dhcp-server-guile.h 5 Aug 2003 04:59:32 -0000 1.4 *************** *** 26,45 **** #define DHCP_SERVER_GUILE_H - #include <libguile.h> - typedef struct client_control_smob { dhcp_server_control_t *sc; } server_control_smob_t; /* prototypes. */ extern void dhcp_guile_init(dhcp_server_control_t *sc); extern int dhcp_guile_initialize_leases(void); ! extern lease_definition_t *dhcp_guile_lease_available(const char *hostname, eth_addr_t mac_addr, ! ip_addr_t giaddr, dhcp_opt_t *client_id); ! extern lease_definition_t *dhcp_guile_lookup_lease(ip_addr_t ip_addr, const char *hostname, eth_addr_t mac_addr, ! ip_addr_t giaddr, dhcp_opt_t *client_id); ! extern lease_definition_t *dhcp_guile_acquire_lease(lease_definition_t *definition); ! extern lease_definition_t *dhcp_guile_release_lease(lease_definition_t *definition); extern void dhcp_guile_lease_expire(void); --- 26,47 ---- #define DHCP_SERVER_GUILE_H typedef struct client_control_smob { dhcp_server_control_t *sc; } server_control_smob_t; + typedef struct lease_smob { + lease_t *lease; + } lease_smob_t; + /* prototypes. */ extern void dhcp_guile_init(dhcp_server_control_t *sc); extern int dhcp_guile_initialize_leases(void); ! extern lease_t *dhcp_guile_lease_available(const char *hostname, eth_addr_t mac_addr, ! ip_addr_t giaddr, dhcp_opt_t *client_id); ! extern lease_t *dhcp_guile_lookup_lease(ip_addr_t ip_addr, const char *hostname, eth_addr_t mac_addr, ! ip_addr_t giaddr, dhcp_opt_t *client_id); ! extern int dhcp_guile_acquire_lease(lease_t *definition); ! extern int dhcp_guile_release_lease(lease_t *definition); extern void dhcp_guile_lease_expire(void); |