~clint-fewbar/ubuntu/precise/gearmand/drop-unneeded-patches

« back to all changes in this revision

Viewing changes to libhostile/getaddrinfo.c

  • Committer: Bazaar Package Importer
  • Author(s): Monty Taylor
  • Date: 2009-09-28 21:43:31 UTC
  • mto: (1.2.3 upstream) (6.1.1 sid)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20090928214331-9bku0d3v1b1ypgp4
ImportĀ upstreamĀ versionĀ 0.10

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
 
 * 
3
 
 *  libhostile
4
 
 *
5
 
 *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
 
 *
7
 
 *  This library is free software; you can redistribute it and/or
8
 
 *  modify it under the terms of the GNU Lesser General Public
9
 
 *  License as published by the Free Software Foundation; either
10
 
 *  version 3 of the License, or (at your option) any later version.
11
 
 *
12
 
 *  This library is distributed in the hope that it will be useful,
13
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 
 *  Lesser General Public License for more details.
16
 
 *
17
 
 *  You should have received a copy of the GNU Lesser General Public
18
 
 *  License along with this library; if not, write to the Free Software
19
 
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20
 
 */
21
 
 
22
 
#include <config.h>
23
 
 
24
 
/*
25
 
  Random getaddrinfo failing library for testing getaddrinfo() failures.
26
 
  LD_PRELOAD="/usr/lib/libdl.so ./util/libhostile_getaddrinfo.so" ./binary
27
 
*/
28
 
 
29
 
#include <dlfcn.h>
30
 
 
31
 
#include <assert.h>
32
 
#include <errno.h>
33
 
#include <stdbool.h>
34
 
#include <stdio.h>
35
 
#include <stdlib.h>
36
 
#include <time.h>
37
 
#include <unistd.h>
38
 
 
39
 
#include <libhostile/initialize.h>
40
 
 
41
 
__thread bool is_in_getaddrinfo= 0;
42
 
 
43
 
static int not_until= 500;
44
 
 
45
 
static struct function_st __function;
46
 
 
47
 
static pthread_once_t function_lookup_once = PTHREAD_ONCE_INIT;
48
 
static void set_local(void)
49
 
{
50
 
  __function= set_function("getaddrinfo", "HOSTILE_GETADDRINFO");
51
 
}
52
 
 
53
 
bool is_getaddrinfo(void)
54
 
{
55
 
  return is_in_getaddrinfo;
56
 
}
57
 
 
58
 
int getaddrinfo(const char *node, const char *service,
59
 
                const struct addrinfo *hints,
60
 
                struct addrinfo **res)
61
 
{
62
 
 
63
 
  hostile_initialize();
64
 
 
65
 
  (void) pthread_once(&function_lookup_once, set_local);
66
 
 
67
 
  if (__function.frequency)
68
 
  {
69
 
    if (--not_until < 0 && random() % __function.frequency)
70
 
    {
71
 
#if 0
72
 
      perror("HOSTILE CLOSE() of socket during getaddrinfo()");
73
 
#endif
74
 
      return EAI_FAIL;
75
 
    }
76
 
  }
77
 
 
78
 
  is_in_getaddrinfo= true;
79
 
  int ret= __function.function.getaddrinfo(node, service, hints, res);
80
 
  is_in_getaddrinfo= false;
81
 
 
82
 
  return ret;
83
 
}
84
 
 
85