strexpandformat.c (2652B)
1 /************************************************************************* 2 * This file is part of Crosroads 1.23, a load balancer and fail over 3 * utility for TCP. Copyright (c) Karel Kubat, distributed under GPL. 4 * Visit http://crossroads.e-tunity.com for information. 5 *************************************************************************/ 6 #include "crossroads.h" 7 8 char *fmt_expand (char const *s, int *skip, int target_backend) { 9 static char buf[80]; 10 char *ret; 11 12 /* Expansion table: 13 * %a - availability of current back end (if any), 0 not available, 14 * %1a = first back end etc. 15 * %b - name of current back end (if any), %1b = first back end etc 16 * %e - seconds since epoch 17 * %n - nr of clients of current back end, %1n = first back end etc. 18 * %r - client IP 19 * %s - name of service 20 * %t, %T - timestamp of local or GMT time 21 * %v - Crossroads version 22 * %w - weight of current back end, %1w = first back end etc. 23 */ 24 25 *skip = 1; 26 switch (*s) { 27 28 case 'a': 29 if (backend_available (target_backend)) 30 return ("1"); 31 return ("0"); 32 33 case 'b': 34 if (target_backend >= 0 && target_backend < activeservice->nbackend) 35 return (activeservice->backend[target_backend].name); 36 return ("noname"); 37 38 case 'e': 39 snprintf (buf, sizeof(buf) - 1, "%u", (unsigned) time(0)); 40 return (buf); 41 42 case 'n': 43 if (target_backend >= 0 && target_backend < activeservice->nbackend) { 44 snprintf (buf, sizeof(buf) - 1, "%u", 45 (unsigned) 46 servicereport->backendstate[target_backend].nclients); 47 return (buf); 48 } 49 return ("0"); 50 51 case 'r': 52 if (client_ip && *client_ip) 53 return (client_ip); 54 return ("0.0.0.0"); 55 56 case 's': 57 return (activeservice->name); 58 59 case 't': 60 return (ansistamp (tm_localtime)); 61 62 case 'T': 63 return (ansistamp (tm_gmtime)); 64 65 case 'v': 66 return (VER); 67 68 case 'w': 69 if (target_backend >= 0 && target_backend < activeservice->nbackend) { 70 snprintf (buf, sizeof(buf) - 1, "%u", 71 (unsigned) 72 activeservice->backend[target_backend].weight); 73 return (buf); 74 } 75 return ("0"); 76 77 default: 78 if (isdigit (*s)) { 79 ret = fmt_expand (s + 1, skip, *s - '0' - 1); 80 *skip += 1; 81 return (ret); 82 } else { 83 *buf = *(s + 1); 84 *(buf + 1) = 0; 85 return (buf); 86 } 87 } 88 } 89 90 char *str_expand_format (char const *h) { 91 char *ret = 0; 92 char const *cp; 93 int skip; 94 95 for (cp = h; cp && *cp; cp++) { 96 if (*cp == '%') { 97 ret = xstrcat (ret, fmt_expand (cp + 1, &skip, current_backend)); 98 cp += skip; 99 } else { 100 ret = xstrcatch (ret, *cp); 101 } 102 } 103 104 return (ret); 105 }