mirror of
				https://git.haproxy.org/git/haproxy.git/
				synced 2025-10-31 00:21:00 +01:00 
			
		
		
		
	This solves setting XXH_INLINE_ALL in a cleaner way, because the imported header is not modified, easing future updates. see 6f7cc11e6dd0f01b437fba893da2edd2362660a2
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Dynamic server cookie calculator
 | |
|  *
 | |
|  * Copyright 2021 Willy Tarreau <w@1wt.eu>
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * as published by the Free Software Foundation; either version
 | |
|  * 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <stdarg.h>
 | |
| #include <arpa/inet.h>
 | |
| 
 | |
| #include <haproxy/xxhash.h>
 | |
| 
 | |
| __attribute__((noreturn)) void die(int code, const char *format, ...)
 | |
| {
 | |
| 	va_list args;
 | |
| 
 | |
| 	va_start(args, format);
 | |
| 	vfprintf(stderr, format, args);
 | |
| 	va_end(args);
 | |
| 	exit(code);
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
| 	size_t key_len;
 | |
| 	int addr_len;
 | |
| 	char *buf;
 | |
| 	int port;
 | |
| 
 | |
| 	if (argc < 4)
 | |
| 		die(1, "Usage: %s <key> <ip> <port>\n", argv[0]);
 | |
| 
 | |
| 	key_len = strlen(argv[1]);
 | |
| 	buf = realloc(strdup(argv[1]), key_len + 16 + 4);
 | |
| 	if (!buf)
 | |
| 		die(2, "Not enough memory\n");
 | |
| 
 | |
| 	if (inet_pton(AF_INET, argv[2], buf + key_len) > 0)
 | |
| 		addr_len = 4;
 | |
| 	else if (inet_pton(AF_INET6, argv[2], buf + key_len) > 0)
 | |
| 		addr_len = 16;
 | |
| 	else
 | |
| 		die(3, "Cannot parse address <%s> as IPv4/IPv6\n", argv[2]);
 | |
| 
 | |
| 	port = htonl(atoi(argv[3]));
 | |
| 	memcpy(buf + key_len + addr_len, &port, 4);
 | |
| 	printf("%016llx\n", (long long)XXH64(buf, key_len + addr_len + 4, 0));
 | |
| 	return 0;
 | |
| }
 |