system.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* Nessuslib -- the Nessus Library
  2.  * Copyright (C) 1998 Renaud Deraison
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Library General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Library General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Library General Public
  15.  * License along with this library; if not, write to the Free
  16.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  *
  18.  */
  19. #define EXPORTING
  20. #include <includes.h>
  21. #include "system.h"
  22. #ifdef HAVE_MALLOC_H
  23. #include <malloc.h>
  24. #endif
  25. ExtFunc
  26. void * emalloc(size)
  27.  size_t size;
  28. {
  29.     void * ptr;
  30.    
  31.     /*
  32.      * Just for our personal safety, we increase the 
  33.      * size by one
  34.      */
  35.     if((int)size < 0)
  36.     {
  37.  fprintf(stderr, "[%d] Won't allocate a pointer of size %ld !n", getpid(), size);
  38.  exit(1);
  39.     }
  40.     size++;
  41.    
  42.    
  43.     /*
  44.      * If no memory can be allocated, then wait a little.
  45.      * It's very likely that another nessusd child will free
  46.      * the size of memory we need. So we make 10 attempts,
  47.      * and if nothing happens, then we exit
  48.      */
  49.     ptr = malloc(size);
  50.     if(!ptr){
  51.      int i;
  52. for(i=0; (i<5) && ptr == NULL ;i++)
  53. {
  54.  waitpid(0, NULL, WNOHANG);
  55.    usleep(5000);
  56.  ptr = malloc(size);
  57. }
  58. if( ptr == NULL )
  59. {
  60.  fprintf(stderr, "[%d] Could not allocate a pointer of size %ld !n", getpid(), size);
  61.  exit(1);
  62. }
  63.       }
  64.     bzero(ptr, size);
  65.     return(ptr);
  66. }
  67. ExtFunc char * 
  68. estrdup(str)
  69.  const char * str; 
  70. {
  71.     char * buf;
  72.     int len;
  73.     
  74.     if (!str) return NULL;
  75.     len = strlen(str);
  76.     buf = emalloc(len + 1);
  77.     memcpy(buf, str, len);
  78.     buf[len] = '';
  79.     return buf;
  80. }
  81. ExtFunc void 
  82. efree(ptr)
  83.  void * ptr;
  84. {
  85.     char ** p = ptr;
  86.     if(p && *p){
  87.      free(*p);
  88.      *p=NULL;
  89. }
  90. }
  91. ExtFunc void *
  92. erealloc(ptr, size)
  93.  void * ptr;
  94.  size_t size;
  95. {
  96.   void * ret;
  97.   if ( (int)size < 0 )
  98.   {
  99.    fprintf(stderr, "Won't realloc() a pointer of size %ld !n", size);
  100.    exit (1); 
  101.   }
  102.   ret = realloc(ptr, size);
  103.   if(!ret)
  104.   {
  105.     fprintf(stderr, "Could not realloc() a pointer of size %ld !n",
  106. size);
  107.     exit (1);
  108.   }
  109.  return ret;
  110. }
  111. ExtFunc size_t 
  112. estrlen(s,n)
  113.  const char * s; 
  114.  size_t n;
  115. {
  116.     size_t i;
  117.     for(i = 0; (*(s+i) != '' && i < n); i++);
  118.     return i;
  119. }
  120. #ifndef HAVE_INET_ATON
  121. /*
  122.  * Coming straight from Fyodor's Nmap
  123.  */
  124. int
  125. inet_aton(cp, addr)
  126. register const char *cp;
  127. struct in_addr *addr;
  128. {
  129. register unsigned int val; /* changed from u_long --david */
  130. register int base, n;
  131. register char c;
  132. u_int parts[4];
  133. register u_int *pp = parts;
  134. c = *cp;
  135. for (;;) {
  136. /*
  137.  * Collect number up to ``.''.
  138.  * Values are specified as for C:
  139.  * 0x=hex, 0=octal, isdigit=decimal.
  140.  */
  141. if (!isdigit((int)c))
  142. return (0);
  143. val = 0; base = 10;
  144. if (c == '0') {
  145. c = *++cp;
  146. if (c == 'x' || c == 'X')
  147. base = 16, c = *++cp;
  148. else
  149. base = 8;
  150. }
  151. for (;;) {
  152. if (isascii((int)c) && isdigit((int)c)) {
  153. val = (val * base) + (c - '0');
  154. c = *++cp;
  155. } else if (base == 16 && isascii((int)c) && isxdigit((int)c)) {
  156. val = (val << 4) |
  157. (c + 10 - (islower((int)c) ? 'a' : 'A'));
  158. c = *++cp;
  159. } else
  160. break;
  161. }
  162. if (c == '.') {
  163. /*
  164.  * Internet format:
  165.  * a.b.c.d
  166.  * a.b.c (with c treated as 16 bits)
  167.  * a.b (with b treated as 24 bits)
  168.  */
  169. if (pp >= parts + 3)
  170. return (0);
  171. *pp++ = val;
  172. c = *++cp;
  173. } else
  174. break;
  175. }
  176. /*
  177.  * Check for trailing characters.
  178.  */
  179. if (c != '' && (!isascii((int)c) || !isspace((int)c)))
  180. return (0);
  181. /*
  182.  * Concoct the address according to
  183.  * the number of parts specified.
  184.  */
  185. n = pp - parts + 1;
  186. switch (n) {
  187. case 0:
  188. return (0); /* initial nondigit */
  189. case 1: /* a -- 32 bits */
  190. break;
  191. case 2: /* a.b -- 8.24 bits */
  192. if (val > 0xffffff)
  193. return (0);
  194. val |= parts[0] << 24;
  195. break;
  196. case 3: /* a.b.c -- 8.8.16 bits */
  197. if (val > 0xffff)
  198. return (0);
  199. val |= (parts[0] << 24) | (parts[1] << 16);
  200. break;
  201. case 4: /* a.b.c.d -- 8.8.8.8 bits */
  202. if (val > 0xff)
  203. return (0);
  204. val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
  205. break;
  206. }
  207. if (addr)
  208. addr->s_addr = htonl(val);
  209. return (1);
  210. }
  211. #endif