Prechádzať zdrojové kódy

pv: new PV $timef(format)

- print strftime() formatted time
- e.g.,: $timef(%Y%m%d%H%M) => 201010121920
- max internal buf for printed value is 64
- it uses a static buffer, so clone the value if you use the PV many
  times with different formats
Daniel-Constantin Mierla 15 rokov pred
rodič
commit
a2dfe0b9ed
3 zmenil súbory, kde vykonal 60 pridanie a 0 odobranie
  1. 2 0
      modules_k/pv/pv.c
  2. 55 0
      modules_k/pv/pv_time.c
  3. 3 0
      modules_k/pv/pv_time.h

+ 2 - 0
modules_k/pv/pv.c

@@ -374,6 +374,8 @@ static pv_export_t mod_pvs[] = {
 		pv_set_shvar, pv_parse_shvar_name, 0, 0, 0},
 		pv_set_shvar, pv_parse_shvar_name, 0, 0, 0},
 	{ {"time", (sizeof("time")-1)}, PVT_CONTEXT, pv_get_time,
 	{ {"time", (sizeof("time")-1)}, PVT_CONTEXT, pv_get_time,
 		0, pv_parse_time_name, 0, 0, 0},
 		0, pv_parse_time_name, 0, 0, 0},
+	{ {"timef", (sizeof("timef")-1)}, PVT_CONTEXT, pv_get_strftime,
+		0, pv_parse_strftime_name, 0, 0, 0},
 	{ {"TV", (sizeof("TV")-1)}, PVT_OTHER, pv_get_timeval,
 	{ {"TV", (sizeof("TV")-1)}, PVT_OTHER, pv_get_timeval,
 		0, pv_parse_timeval_name, 0, 0, 0},
 		0, pv_parse_timeval_name, 0, 0, 0},
 	{ {"nh", (sizeof("nh")-1)}, PVT_OTHER, pv_get_nh,
 	{ {"nh", (sizeof("nh")-1)}, PVT_OTHER, pv_get_nh,

+ 55 - 0
modules_k/pv/pv_time.c

@@ -100,9 +100,31 @@ error:
 	return -1;
 	return -1;
 }
 }
 
 
+int pv_parse_strftime_name(pv_spec_p sp, str *in)
+{
+	if(sp==NULL || in==NULL || in->len<=0)
+		return -1;
+
+	sp->pvp.pvn.u.isname.name.s.s = as_asciiz(in);
+	if(sp->pvp.pvn.u.isname.name.s.s==NULL)
+	{
+		LM_ERR("no more pkg\n");
+		return -1;
+	}
+	sp->pvp.pvn.u.isname.name.s.len = in->len;
+#if 0
+	/* to-do: free function for pv name structure */
+	sp->pvp.pvn.nfree = pkg_free;
+#endif
+	return 0;
+}
+
 static struct tm _cfgutils_ts;
 static struct tm _cfgutils_ts;
 static unsigned int _cfgutils_msg_id = 0;
 static unsigned int _cfgutils_msg_id = 0;
 
 
+/**
+ * return broken-down time attributes
+ */
 int pv_get_time(struct sip_msg *msg, pv_param_t *param,
 int pv_get_time(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res)
 		pv_value_t *res)
 {
 {
@@ -149,6 +171,39 @@ int pv_get_time(struct sip_msg *msg, pv_param_t *param,
 	}
 	}
 }
 }
 
 
+/**
+ * return strftime() formatted time
+ */
+int pv_get_strftime(struct sip_msg *msg, pv_param_t *param,
+		pv_value_t *res)
+{
+	time_t t;
+	str s;
+#define PV_STRFTIME_BUF_SIZE	64
+	static char _pv_strftime_buf[PV_STRFTIME_BUF_SIZE];
+
+	if(msg==NULL || param==NULL)
+		return -1;
+
+	if(_cfgutils_msg_id != msg->id)
+	{
+		pv_update_time(msg, &t);
+		_cfgutils_msg_id = msg->id;
+		if(localtime_r(&t, &_cfgutils_ts) == NULL)
+		{
+			LM_ERR("unable to break time to attributes\n");
+			return -1;
+		}
+	}
+	s.len = strftime(_pv_strftime_buf, PV_STRFTIME_BUF_SIZE,
+			param->pvn.u.isname.name.s.s,  &_cfgutils_ts);
+	if(s.len<=0)
+		return pv_get_null(msg, param, res);
+	s.s = _pv_strftime_buf;
+	return pv_get_strval(msg, param, res, &s);
+}
+
+
 int pv_get_timenows(struct sip_msg *msg, pv_param_t *param,
 int pv_get_timenows(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res)
 		pv_value_t *res)
 {
 {

+ 3 - 0
modules_k/pv/pv_time.h

@@ -29,6 +29,9 @@
 int pv_parse_time_name(pv_spec_p sp, str *in);
 int pv_parse_time_name(pv_spec_p sp, str *in);
 int pv_get_time(struct sip_msg *msg, pv_param_t *param,
 int pv_get_time(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res);
 		pv_value_t *res);
+int pv_parse_strftime_name(pv_spec_p sp, str *in);
+int pv_get_strftime(struct sip_msg *msg, pv_param_t *param,
+		pv_value_t *res);
 int pv_get_timenows(struct sip_msg *msg, pv_param_t *param,
 int pv_get_timenows(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res);
 		pv_value_t *res);
 int pv_get_timenowf(struct sip_msg *msg, pv_param_t *param,
 int pv_get_timenowf(struct sip_msg *msg, pv_param_t *param,