[dhcp-agent-commits] dhcp-agent/src dhcp-lease-guile.c,NONE,1.1 dhcp-lease-guile.h,NONE,1.1
Status: Alpha
Brought to you by:
actmodern
From: <act...@us...> - 2003-08-12 12:28:12
|
Update of /cvsroot/dhcp-agent/dhcp-agent/src In directory sc8-pr-cvs1:/tmp/cvs-serv21956 Added Files: dhcp-lease-guile.c dhcp-lease-guile.h Log Message: lease smob moved to seperate source; now more complete --- NEW FILE: dhcp-lease-guile.c --- /* $Header: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-lease-guile.c,v 1.1 2003/08/12 12:05:47 actmodern Exp $ * * Copyright 2002 Thamer Alharbash * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. The names of the authors may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * lease smob */ #include "dhcp-local.h" #include "dhcp-libutil.h" #include "dhcp-librawnet.h" #include "dhcp-option.h" #include "dhcp-guile-util.h" #include "dhcp-lease.h" #include "dhcp-option-guile.h" #include "dhcp-lease-guile.h" static scm_t_bits lease_tag; /* 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 an SCM lease: this is called from the C code: a copy is made so garbage collection doesn't clubber our copy */ SCM scm_lease_c2scm(lease_t *lease) { lease_smob_t *lease_smob; lease_t *new_lease; new_lease = lease_copy(lease); lease_smob = scm_must_malloc(sizeof(lease_smob_t), "lease-make"); lease_smob->lease = new_lease; SCM_RETURN_NEWSMOB(lease_tag, lease_smob); } /* create an SCM lease: this is called from the C code: no copy is made. */ SCM scm_lease_c2scm_x(lease_t *lease) { lease_smob_t *lease_smob; lease_smob = scm_must_malloc(sizeof(lease_smob_t), "lease-make"); lease_smob->lease = lease; SCM_RETURN_NEWSMOB(lease_tag, lease_smob); } /* 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_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_string_to_number(scm_lease_expiry, SCM_MAKINUM(10)), 10, "make-lease"); } else { lease_expiry = scm_num2ulong(scm_lease_expiry, 1, "make-lease"); } if(SCM_STRINGP(scm_renew_time)) { renew_time = scm_num2ulong(scm_string_to_number(scm_renew_time, SCM_MAKINUM(10)), 10, "make-lease"); } else { renew_time = scm_num2ulong(scm_renew_time, 1, "make-lease"); } if(SCM_STRINGP(scm_rebind_time)) { rebind_time = scm_num2ulong(scm_string_to_number(scm_rebind_time, SCM_MAKINUM(10)), 10, "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); return scm_lease_c2scm_x(lease); } /* setters. */ /* set ip address. */ static SCM scm_lease_set_ip_addr(SCM scm_lease, SCM scm_ip_address) { lease_smob_t *lease_smob; ip_addr_t ip_address; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-set-ip-addr"); SCM_ASSERT(SCM_STRINGP(scm_ip_address)|SCM_INUMP(scm_ip_address), scm_ip_address, SCM_ARG2, "lease-set-ip-addr"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); if(SCM_STRINGP(scm_ip_address)) { ip_address = ntohl(scm_num2ulong(scm_inet_aton(scm_ip_address), 1, "lease-set-ip-addr")); } else { ip_address = scm_num2ulong(scm_ip_address, 1, "lease-set-ip-addr"); } lease_set_address(lease_smob->lease, ip_address); return SCM_BOOL_T; } /* set subnet mask. */ static SCM scm_lease_set_subnet_mask(SCM scm_lease, SCM scm_subnet_mask) { lease_smob_t *lease_smob; ip_addr_t subnet_mask; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-set-subnet-mask"); SCM_ASSERT(SCM_STRINGP(scm_subnet_mask)|SCM_INUMP(scm_subnet_mask), scm_subnet_mask, SCM_ARG2, "lease-set-subnet-mask"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); if(SCM_STRINGP(scm_subnet_mask)) { subnet_mask = ntohl(scm_num2ulong(scm_inet_aton(scm_subnet_mask), 1, "lease-set-subnet-mask")); } else { subnet_mask = scm_num2ulong(scm_subnet_mask, 1, "lease-set-subnet-mask"); } lease_set_subnet_mask(lease_smob->lease, subnet_mask); return SCM_BOOL_T; } /* set renew time. */ static SCM scm_lease_set_renew(SCM scm_lease, SCM scm_renew_time) { lease_smob_t *lease_smob; uint32_t renew_time; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-set-renew-time"); SCM_ASSERT(SCM_STRINGP(scm_renew_time)|SCM_INUMP(scm_renew_time), scm_renew_time, SCM_ARG2, "lease-set-renew-time"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); if(SCM_STRINGP(scm_renew_time)) { renew_time = scm_num2ulong(scm_string_to_number(scm_renew_time, SCM_MAKINUM(10)), 10, "lease-set-renew-time"); } else { renew_time = scm_num2ulong(scm_renew_time, 1, "lease-set-renew-time"); } lease_set_renew(lease_smob->lease, renew_time); return SCM_BOOL_T; } /* set rebind time. */ static SCM scm_lease_set_rebind(SCM scm_lease, SCM scm_rebind_time) { lease_smob_t *lease_smob; uint32_t rebind_time; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-set-rebind-time"); SCM_ASSERT(SCM_STRINGP(scm_rebind_time)|SCM_INUMP(scm_rebind_time), scm_rebind_time, SCM_ARG2, "lease-set-rebind-time"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); if(SCM_STRINGP(scm_rebind_time)) { rebind_time = scm_num2ulong(scm_string_to_number(scm_rebind_time, SCM_MAKINUM(10)), 10, "lease-set-rebind-time"); } else { rebind_time = scm_num2ulong(scm_rebind_time, 1, "lease-set-rebind-time"); } lease_set_rebind(lease_smob->lease, rebind_time); return SCM_BOOL_T; } /* set the lease expiry. */ static SCM scm_lease_set_expiry(SCM scm_lease, SCM scm_expiry_time) { lease_smob_t *lease_smob; uint32_t expiry_time; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-set-expiry-time"); SCM_ASSERT(SCM_STRINGP(scm_expiry_time)|SCM_INUMP(scm_expiry_time), scm_expiry_time, SCM_ARG2, "lease-set-expiry-time"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); if(SCM_STRINGP(scm_expiry_time)) { expiry_time = scm_num2ulong(scm_string_to_number(scm_expiry_time, SCM_MAKINUM(10)), 10, "lease-set-expiry-time"); } else { expiry_time = scm_num2ulong(scm_expiry_time, 1, "lease-set-expiry-time"); } lease_set_expiry(lease_smob->lease, expiry_time); return SCM_BOOL_T; } /* set the lease options. */ static SCM scm_lease_set_options(SCM scm_lease, SCM scm_options) { lease_smob_t *lease_smob; list_t *options; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-set-options"); SCM_ASSERT(SCM_CONSP(scm_options), scm_options, SCM_ARG2, "lease-set-options"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); options = scm_dhcp_opt_list_to_c_list(scm_options); lease_set_options(lease_smob->lease, options); return SCM_BOOL_T; } /* accessors. */ /* get the ip address of the lease. */ static SCM scm_lease_get_ip_addr(SCM scm_lease) { lease_smob_t *lease_smob; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-get-ip-addr"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); return SCM_MAKINUM(lease_get_address(lease_smob->lease)); } /* get the address of the lease in string form. */ static SCM scm_lease_get_ip_addr_string(SCM scm_lease) { SCM scm_ip_addr = scm_lease_get_ip_addr(scm_lease); return scm_number_to_string(scm_ip_addr, SCM_MAKINUM(10)); } /* get the subnet of the lease. */ static SCM scm_lease_get_subnet_mask(SCM scm_lease) { lease_smob_t *lease_smob; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-get-subnet"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); return SCM_MAKINUM(lease_get_subnet_mask(lease_smob->lease)); } /* get the subnet of the lease in string format. */ static SCM scm_lease_get_subnet_mask_string(SCM scm_lease) { SCM scm_subnet_mask = scm_lease_get_subnet_mask(scm_lease); return scm_number_to_string(scm_subnet_mask, SCM_MAKINUM(10)); } /* get renew time. */ static SCM scm_lease_get_renew(SCM scm_lease) { lease_smob_t *lease_smob; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-get-renew"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); return SCM_MAKINUM(lease_get_renew(lease_smob->lease)); } /* get rebind time. */ static SCM scm_lease_get_rebind(SCM scm_lease) { lease_smob_t *lease_smob; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-get-rebind"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); return SCM_MAKINUM(lease_get_rebind(lease_smob->lease)); } /* get expiry time. */ static SCM scm_lease_get_expiry(SCM scm_lease) { lease_smob_t *lease_smob; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-get-ip-expiry"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); return SCM_MAKINUM(lease_get_expiry(lease_smob->lease)); } /* return a list of dhcp options from the lease. */ static SCM scm_lease_get_options(SCM scm_lease) { lease_smob_t *lease_smob; SCM_ASSERT(SCM_SMOB_PREDICATE(lease_tag, scm_lease), scm_lease, SCM_ARG1, "lease-get-options"); lease_smob = (lease_smob_t *)SCM_SMOB_DATA(scm_lease); return scm_dhcp_opt_c_list_to_list(lease_smob->lease->options); } /* initialization routines for lease smob. */ 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); scm_c_define_gsubr("lease-make", 5, 0, 0, scm_make_lease); scm_c_define_gsubr("lease-set-ip-addr", 2, 0, 0, scm_lease_set_ip_addr); scm_c_define_gsubr("lease-set-subnet-mask", 2, 0, 0, scm_lease_set_subnet_mask); scm_c_define_gsubr("lease-set-renew-time", 2, 0, 0, scm_lease_set_renew); scm_c_define_gsubr("lease-set-rebind-time", 2, 0, 0, scm_lease_set_rebind); scm_c_define_gsubr("lease-set-expiry-time", 2, 0, 0, scm_lease_set_expiry); scm_c_define_gsubr("lease-set-options", 2, 0, 0, scm_lease_set_options); scm_c_define_gsubr("lease-get-ip-addr", 1, 0, 0, scm_lease_get_ip_addr); scm_c_define_gsubr("lease-get-ip-addr-string", 1, 0, 0, scm_lease_get_ip_addr_string); scm_c_define_gsubr("lease-get-subnet-mask", 1, 0, 0, scm_lease_get_subnet_mask); scm_c_define_gsubr("lease-get-subnet-mask-string", 1, 0, 0, scm_lease_get_subnet_mask_string); scm_c_define_gsubr("lease-get-renew-time", 1, 0, 0, scm_lease_get_renew); scm_c_define_gsubr("lease-get-rebind-time", 1, 0, 0, scm_lease_get_rebind); scm_c_define_gsubr("lease-get-expiry-time", 1, 0, 0, scm_lease_get_expiry); scm_c_define_gsubr("lease-get-options", 1, 0, 0, scm_lease_get_options); return; } /* get a copy of the lease from the scm lease: called from C code. */ 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); } --- NEW FILE: dhcp-lease-guile.h --- /* $Header: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-lease-guile.h,v 1.1 2003/08/12 12:05:47 actmodern Exp $ * * Copyright 2003 Thamer Alharbash * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. The names of the authors may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * client info smob * */ #ifndef DHCP_LEASE_GUILE_H #define DHCP_LEASE_GUILE_H typedef struct { lease_t *lease; } lease_smob_t; extern void init_lease_smob(void); extern lease_t *scm_c_get_lease(SCM scm_lease); extern SCM scm_lease_c2scm(lease_t *lease); extern SCM scm_lease_c2scm_x(lease_t *lease); #endif /* DHCP_LEASE_GUILE_H */ |