crossroads

Git mirror of https://crossroads.e-tunity.com/
git clone git://git.finwo.net/app/crossroads
Log | Files | Refs

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 }