]>
git.proxmox.com Git - mirror_frr.git/blob - lib/xref.c
2 * Copyright (c) 2017-20 David Lamparter, for NetDEF, Inc.
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
35 struct xref_block
*xref_blocks
;
36 static struct xref_block
**xref_block_last
= &xref_blocks
;
38 static void base32(uint8_t **inpos
, int *bitpos
,
39 char *out
, size_t n_chars
)
41 static const char base32ch
[] = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
47 while (opos
< out
+ n_chars
) {
48 uint32_t bits
= in
[0] | (in
[1] << 8);
55 *opos
++ = base32ch
[bits
& 0x1f];
66 void xref_block_add(struct xref_block
*block
)
68 const struct xref
* const *xrefp
;
71 *xref_block_last
= block
;
72 xref_block_last
= &block
->next
;
74 for (xrefp
= block
->start
; xrefp
< block
->stop
; xrefp
++) {
75 const struct xref
*xref
= *xrefp
;
76 struct xrefdata
*xrefdata
;
78 const char *filename
, *p
, *q
;
79 uint8_t hash
[32], *h
= hash
;
83 if (!xref
|| !xref
->xrefdata
)
86 xrefdata
= xref
->xrefdata
;
87 xrefdata
->xref
= xref
;
89 if (!xrefdata
->hashstr
)
92 /* as far as the unique ID is concerned, only use the last
93 * directory name + filename, e.g. "bgpd/bgp_route.c". This
94 * gives a little leeway in moving things and avoids IDs being
95 * screwed up by out of tree builds or absolute pathnames.
97 filename
= xref
->file
;
98 p
= strrchr(filename
, '/');
100 q
= memrchr(filename
, '/', p
- filename
);
108 SHA256_Update(&sha
, filename
, strlen(filename
));
109 SHA256_Update(&sha
, xrefdata
->hashstr
,
110 strlen(xrefdata
->hashstr
));
111 be_val
= htonl(xrefdata
->hashu32
[0]);
112 SHA256_Update(&sha
, &be_val
, sizeof(be_val
));
113 be_val
= htonl(xrefdata
->hashu32
[1]);
114 SHA256_Update(&sha
, &be_val
, sizeof(be_val
));
115 SHA256_Final(hash
, &sha
);
118 base32(&h
, &bitpos
, &xrefdata
->uid
[0], 5);
119 xrefdata
->uid
[5] = '-';
120 base32(&h
, &bitpos
, &xrefdata
->uid
[6], 5);