2 * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/usr.sbin/nscd/agent.c,v 1.3 2008/10/12 00:44:27 delphij Exp $
36 agent_cmp_func(const void *a1
, const void *a2
)
38 struct agent
const *ap1
= *((struct agent
const **)a1
);
39 struct agent
const *ap2
= *((struct agent
const **)a2
);
42 res
= strcmp(ap1
->name
, ap2
->name
);
44 if (ap1
->type
== ap2
->type
)
46 else if (ap1
->type
< ap2
->type
)
56 init_agent_table(void)
58 struct agent_table
*retval
;
60 TRACE_IN(init_agent_table
);
61 retval
= (struct agent_table
*)calloc(1, sizeof(struct agent_table
));
62 assert(retval
!= NULL
);
64 TRACE_OUT(init_agent_table
);
69 register_agent(struct agent_table
*at
, struct agent
*a
)
71 struct agent
**new_agents
;
72 size_t new_agents_num
;
74 TRACE_IN(register_agent
);
77 new_agents_num
= at
->agents_num
+ 1;
78 new_agents
= (struct agent
**)malloc(sizeof(struct agent
*) *
80 assert(new_agents
!= NULL
);
81 memcpy(new_agents
, at
->agents
, at
->agents_num
* sizeof(struct agent
*));
82 new_agents
[new_agents_num
- 1] = a
;
83 qsort(new_agents
, new_agents_num
, sizeof(struct agent
*),
87 at
->agents
= new_agents
;
88 at
->agents_num
= new_agents_num
;
89 TRACE_OUT(register_agent
);
93 find_agent(struct agent_table
*at
, const char *name
, enum agent_type type
)
96 struct agent model
, *model_p
;
99 model
.name
= (char *)name
;
102 res
= bsearch(&model_p
, at
->agents
, at
->agents_num
,
103 sizeof(struct agent
*), agent_cmp_func
);
105 TRACE_OUT(find_agent
);
106 return ( res
== NULL
? NULL
: *res
);
110 destroy_agent_table(struct agent_table
*at
)
114 TRACE_IN(destroy_agent_table
);
116 for (i
= 0; i
< at
->agents_num
; ++i
) {
117 free(at
->agents
[i
]->name
);
123 TRACE_OUT(destroy_agent_table
);