]> git.ipfire.org Git - people/ms/libloc.git/blob - src/as.c
importer: Drop EDROP as it has been merged into DROP
[people/ms/libloc.git] / src / as.c
1 /*
2 libloc - A library to determine the location of someone on the Internet
3
4 Copyright (C) 2017 IPFire Development Team <info@ipfire.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15 */
16
17 #include <ctype.h>
18 #include <errno.h>
19 #include <stdint.h>
20 #include <stdlib.h>
21 #include <string.h>
22
23 #ifdef HAVE_ENDIAN_H
24 # include <endian.h>
25 #endif
26
27 #include <loc/libloc.h>
28 #include <loc/as.h>
29 #include <loc/compat.h>
30 #include <loc/format.h>
31 #include <loc/private.h>
32 #include <loc/stringpool.h>
33
34 struct loc_as {
35 struct loc_ctx* ctx;
36 int refcount;
37
38 uint32_t number;
39 char* name;
40 };
41
42 LOC_EXPORT int loc_as_new(struct loc_ctx* ctx, struct loc_as** as, uint32_t number) {
43 struct loc_as* a = calloc(1, sizeof(*a));
44 if (!a)
45 return -ENOMEM;
46
47 a->ctx = loc_ref(ctx);
48 a->refcount = 1;
49
50 a->number = number;
51 a->name = NULL;
52
53 DEBUG(a->ctx, "AS%u allocated at %p\n", a->number, a);
54 *as = a;
55
56 return 0;
57 }
58
59 LOC_EXPORT struct loc_as* loc_as_ref(struct loc_as* as) {
60 as->refcount++;
61
62 return as;
63 }
64
65 static void loc_as_free(struct loc_as* as) {
66 DEBUG(as->ctx, "Releasing AS%u %p\n", as->number, as);
67
68 if (as->name)
69 free(as->name);
70
71 loc_unref(as->ctx);
72 free(as);
73 }
74
75 LOC_EXPORT struct loc_as* loc_as_unref(struct loc_as* as) {
76 if (--as->refcount > 0)
77 return NULL;
78
79 loc_as_free(as);
80
81 return NULL;
82 }
83
84 LOC_EXPORT uint32_t loc_as_get_number(struct loc_as* as) {
85 return as->number;
86 }
87
88 LOC_EXPORT const char* loc_as_get_name(struct loc_as* as) {
89 return as->name;
90 }
91
92 LOC_EXPORT int loc_as_set_name(struct loc_as* as, const char* name) {
93 if (as->name)
94 free(as->name);
95
96 if (name)
97 as->name = strdup(name);
98 else
99 as->name = NULL;
100
101 return 0;
102 }
103
104 LOC_EXPORT int loc_as_cmp(struct loc_as* as1, struct loc_as* as2) {
105 if (as1->number > as2->number)
106 return 1;
107
108 if (as1->number < as2->number)
109 return -1;
110
111 return 0;
112 }
113
114 int loc_as_new_from_database_v1(struct loc_ctx* ctx, struct loc_stringpool* pool,
115 struct loc_as** as, const struct loc_database_as_v1* dbobj) {
116 uint32_t number = be32toh(dbobj->number);
117
118 int r = loc_as_new(ctx, as, number);
119 if (r)
120 return r;
121
122 const char* name = loc_stringpool_get(pool, be32toh(dbobj->name));
123 r = loc_as_set_name(*as, name);
124 if (r) {
125 loc_as_unref(*as);
126 return r;
127 }
128
129 return 0;
130 }
131
132 int loc_as_to_database_v1(struct loc_as* as, struct loc_stringpool* pool,
133 struct loc_database_as_v1* dbobj) {
134 dbobj->number = htobe32(as->number);
135
136 // Save the name string in the string pool
137 off_t name = loc_stringpool_add(pool, as->name ? as->name : "");
138 dbobj->name = htobe32(name);
139
140 return 0;
141 }
142
143 int loc_as_match_string(struct loc_as* as, const char* string) {
144 // Match all AS when no search string is set
145 if (!string)
146 return 1;
147
148 // Cannot match anything when name is not set
149 if (!as->name)
150 return 1;
151
152 // Search if string is in name
153 if (strcasestr(as->name, string) != NULL)
154 return 1;
155
156 return 0;
157 }