/* **++ ** FACILITY: NETLIB ** ** ABSTRACT: Miscellaneous routines. ** ** MODULE DESCRIPTION: ** ** tbs ** ** AUTHOR: M. Madison ** ** Copyright (c) 2008, Matthew Madison. ** ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions ** are met: ** ** * Redistributions of source code must retain the above ** copyright notice, this list of conditions and the following ** disclaimer. ** * 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. ** * Neither the name of the copyright owner nor the names of any ** other contributors may be used to endorse or promote products ** derived from this software without specific prior written ** permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ** CREATION DATE: 22-OCT-1994 ** ** MODIFICATION HISTORY: ** ** 22-OCT-1994 V1.0 Madison Initial coding. ** 27-NOV-1997 V1.1 Madison Added version info. ** 10-JAN-2002 V1.2 Madison Don't allow extra dot after dotted-quad. ** 04-FEB-2002 V1.2-1 Madison Last change was not correctly checking ** final length. **-- */ #include "netlib.h" #include "etc_dir:netlib_version.h" #ifdef __DECC #pragma extern_model save #pragma extern_model common_block shr #endif char $$$Copyright[] = "Copyright (c) 2008, Matthew Madison. All Rights Reserved."; #ifdef __DECC #pragma extern_model restore #endif /* ** Forward declarations */ unsigned int netlib_strtoaddr(struct dsc$descriptor *dsc, struct INADDRDEF *a); unsigned int netlib_addrtostr(struct INADDRDEF *, struct dsc$descriptor *, unsigned short *); unsigned int netlib___find_symbol(char *imgnam, char *symnam, void *symptr); static unsigned int find_image_symbol(struct dsc$descriptor *imgdsc, struct dsc$descriptor *symdsc, void *symptr); unsigned int netlib_hton_long(unsigned int *); unsigned int netlib_ntoh_long(unsigned int *); unsigned short netlib_hton_word(unsigned short *); unsigned short netlib_ntoh_short(unsigned short *); unsigned int netlib_version(struct dsc$descriptor *ver, unsigned short *retlen); /* **++ ** ROUTINE: netlib_strtoaddr ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned int netlib_strtoaddr (struct dsc$descriptor *dsc, struct INADDRDEF *a) { unsigned short len; char *cp, *anchor; unsigned int status, parts[4], val; int i; status = lib$analyze_sdesc(dsc, &len, &cp); if (!OK(status)) return status; for (i = 0; len > 0 && i < 4; i++) { val = 0; while (*cp != '.' && len > 0) { if (!isdigit(*cp)) return SS$_IVADDR; val = val * 10 + (*cp - '0'); cp++; len--; } parts[i] = val; if (len > 0) { cp++; len--; } } switch (i) { case 0: return SS$_IVADDR; case 1: val = parts[0]; break; case 2: val = (parts[0] << 24) | (parts[1] & 0xffffff); break; case 3: val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) | (parts[2] & 0xffff); break; case 4: if (len > 0) return SS$_IVADDR; val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) | ((parts[2] & 0xff) << 8) | (parts[3] & 0xff); break; } a->inaddr_l_addr = netlib_long_swap(val); return SS$_NORMAL; } /* netlib_strtoaddr */ /* **++ ** ROUTINE: netlib_addrtostr ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned int netlib_addrtostr (struct INADDRDEF *addr, struct dsc$descriptor *dsc, unsigned short *len) { int argc; static $DESCRIPTOR(faodsc, "!UB.!UB.!UB.!UB"); SETARGCOUNT(argc); return lib$sys_fao(&faodsc, (argc > 2) ? len : 0, dsc, (addr->inaddr_l_addr) & 0xff, (addr->inaddr_l_addr >> 8) & 0xff, (addr->inaddr_l_addr >> 16) & 0xff, (addr->inaddr_l_addr >> 24) & 0xff); } /* netlib_addrtostr */ /* **++ ** ROUTINE: netlib___find_symbol ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned int netlib___find_symbol (char *imgnam, char *symnam, void *symptr) { struct dsc$descriptor imgdsc, symdsc; lib$establish(lib$sig_to_ret); INIT_SDESC(imgdsc, strlen(imgnam), imgnam); INIT_SDESC(symdsc, strlen(symnam), symnam); return find_image_symbol(&imgdsc, &symdsc, symptr); } /* netlib___find_symbol */ /* **++ ** ROUTINE: find_image_symbol ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ static unsigned int find_image_symbol (struct dsc$descriptor *imgdsc, struct dsc$descriptor *symdsc, void *symptr) { return lib$find_image_symbol(imgdsc, symdsc, symptr); } /* find_image_symbol */ /* **++ ** ROUTINE: netlib_hton_long ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned int netlib_hton_long (unsigned int *value) { return netlib_long_swap(*value); } /* netlib_hton_long */ /* **++ ** ROUTINE: netlib_ntoh_long ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned int netlib_ntoh_long (unsigned int *value) { return netlib_long_swap(*value); } /* netlib_ntoh_long */ /* **++ ** ROUTINE: netlib_hton_word ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, wordword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned short netlib_hton_word (unsigned short *value) { return netlib_word_swap(*value); } /* netlib_hton_word */ /* **++ ** ROUTINE: netlib_ntoh_word ** ** FUNCTIONAL DESCRIPTION: ** ** tbs ** ** RETURNS: cond_value, wordword (unsigned), write only, by value ** ** PROTOTYPE: ** ** tbs ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ unsigned short netlib_ntoh_word (unsigned short *value) { return netlib_word_swap(*value); } /* netlib_ntoh_word */ /* **++ ** ROUTINE: netlib_version ** ** FUNCTIONAL DESCRIPTION: ** ** Returns the NETLIB version string. ** ** RETURNS: cond_value, condition value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** NETLIB_VERSION ver [,retlen] ** ** ver: char_string, character string, write only, by descriptor ** retlen: word_unsigned, word (unsigned), write only, by reference ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: None. ** ** SIDE EFFECTS: None. ** **-- */ unsigned int netlib_version (struct dsc$descriptor *ver, unsigned short *retlen) { int argc; unsigned int status; static char version_string[] = NETLIB_T_VERSION; static $DESCRIPTOR(faodsc, "!AD"); SETARGCOUNT(argc); if (argc < 1) return SS$_INSFARG; if (ver == 0) return SS$_BADPARAM; return lib$sys_fao(&faodsc, (argc > 1 ? retlen : 0), ver, sizeof(version_string)-1, version_string); } /* netlib_version */