Example #1
0
WSLUA_FUNCTION wslua_format_time(lua_State* LS) { /* Formats a relative timestamp in a human readable form */
#define WSLUA_ARG_format_time_TIMESTAMP 1 /* A timestamp value to convert */
	lua_Number timestamp = luaL_checknumber(LS,WSLUA_ARG_format_time_TIMESTAMP);
	nstime_t then;
	gchar* str;

	then.secs = (guint32)floor(timestamp);
	then.nsecs = (guint32) ( (timestamp-(double)(then.secs))*1000000000);
	str = rel_time_to_str(&then);
	lua_pushstring(LS,str);

	WSLUA_RETURN(1); /* A string with the formated time */
}
/* Function:	build_suppressed_msg_value
 * Description:	Pack info of a syslog message into a xmlrpc array of structs:
 *                  Key:  "msg name"
 *                  Value: Array of N items:
 *                         Index 0 Struct of 1 members:
 *                         Index 0 Key:   String "para name"
 *                         Index 0 Value: Struct "para value"
 *
 *                         Index 1 Struct of 1 members:
 *                         Index 1 Key:   String "para name"
 *                         Index 1 Value: Struct "para value"
 *                  
 * Parameters:	env[in]:   xmlrpc env struct
 *              p_msg[in]: ptr to a msg struct
 * Returns:	xml formatted data
 */
static xmlrpc_value *build_suppressed_msg_value (xmlrpc_env *const env,
                                                 syslog_msg_def_t *p_msg)
{
    xmlrpc_value *retval;
    xmlrpc_value *msg_value = NULL;

    msg_value = xmlrpc_array_new(env);

    if (!msg_value) {
        goto done;
    }

    if ((build_xml_struct(env, msg_value, 
                          "Name", 
                          p_msg->msg_name,
                          XMLRPC_CHAR) == NULL) || 
        (build_xml_struct(env, msg_value,
                          "Facility",
                          p_msg->facility->fac_name,
                          XMLRPC_CHAR) == NULL) || 
        (build_xml_struct(env, msg_value,
                          "Format",
                          p_msg->output_format,
                          XMLRPC_CHAR) == NULL)) {
        return NULL;
    }
    
    if (p_msg->limiter) {
        char ts_buf[BUFFER_SIZE], string_buffer[BUFFER_SIZE];
        snprintf(string_buffer, BUFFER_SIZE, "%llu", 
                 p_msg->limiter->suppressed);

        abs_time_t now = get_sys_time();
        rel_time_t last_sup_time = TIME_SUB_A_A(now, 
                                                p_msg->limiter->last_time);

        if ((build_xml_struct(env, msg_value,
                              "Limit rate",
                              &(p_msg->limiter->rate_limit),
                              XMLRPC_UINT) == NULL) || 
            (build_xml_struct(env, msg_value,
                              "Suppressed last time (sec ago)",
                              (char *)rel_time_to_str(
                                  last_sup_time, ts_buf, BUFFER_SIZE),
                              XMLRPC_CHAR) == NULL) || 
            (build_xml_struct(env, msg_value,
                              "Suppressed message count",
                              string_buffer,
                              XMLRPC_CHAR) == NULL)) {
            return NULL;
        }
    }

done:
    retval = xmlrpc_build_value(env, "{s:A}",
                                p_msg->msg_name,
                                msg_value);
    xmlrpc_DECREF(msg_value);

    return retval;
}