Przeglądaj źródła

lib/srutils: add sruid_next_safe() function

- checks to see if the sruid was initialized by same process and if not,
  triggers a reinit
- pid is stored inside the sruid struct
Daniel-Constantin Mierla 11 lat temu
rodzic
commit
d2e6918acc
2 zmienionych plików z 12 dodań i 0 usunięć
  1. 10 0
      lib/srutils/sruid.c
  2. 2 0
      lib/srutils/sruid.h

+ 10 - 0
lib/srutils/sruid.c

@@ -96,6 +96,7 @@ int sruid_init(sruid_t *sid, char sep, char *cid, int mode)
 	sid->out = sid->buf + i + 5;
 	sid->uid.s = sid->buf;
 	sid->mode = (sruid_mode_t)mode;
+	sid->pid = my_pid();
 	LM_DBG("root for sruid is [%.*s] (%u / %d)\n", i+5, sid->uid.s,
 			sid->counter, i+5);
 	return 0;
@@ -131,6 +132,7 @@ int sruid_reinit(sruid_t *sid, int mode)
 	sid->out = sid->buf + i + 5;
 	sid->uid.s = sid->buf;
 	sid->mode = (sruid_mode_t)mode;
+	sid->pid = my_pid();
 	LM_DBG("re-init root for sruid is [%.*s] (%u / %d)\n", i+5, sid->uid.s,
 			sid->counter, i+5);
 	return 0;
@@ -177,3 +179,11 @@ int sruid_next(sruid_t *sid)
 	return 0;
 }
 
+/**
+ *
+ */
+int sruid_next_safe(sruid_t *sid)
+{
+	if(unlikely(sid->pid!=my_pid())) sruid_reinit(sid, sid->mode);
+	return sruid_next(sid);
+}

+ 2 - 0
lib/srutils/sruid.h

@@ -36,10 +36,12 @@ typedef struct sruid {
 	char *out;
 	str uid;
 	unsigned int counter;
+	int pid;
 	sruid_mode_t mode;
 } sruid_t;
 
 int sruid_init(sruid_t *sid, char sep, char *cid, int mode);
 int sruid_next(sruid_t *sid);
+int sruid_next_safe(sruid_t *sid);
 
 #endif