[svn-commits] branch kpfleming/stringfields - r7758 in /team/kpfleming/stringfields: channe...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Tue Jan 3 19:07:09 CST 2006


Author: kpfleming
Date: Tue Jan  3 19:07:08 2006
New Revision: 7758

URL: http://svn.digium.com/view/asterisk?rev=7758&view=rev
Log:
convert more fields
add index-based field access

Modified:
    team/kpfleming/stringfields/channels/chan_sip.c
    team/kpfleming/stringfields/include/asterisk/stringfields.h

Modified: team/kpfleming/stringfields/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/kpfleming/stringfields/channels/chan_sip.c?rev=7758&r1=7757&r2=7758&view=diff
==============================================================================
--- team/kpfleming/stringfields/channels/chan_sip.c (original)
+++ team/kpfleming/stringfields/channels/chan_sip.c Tue Jan  3 19:07:08 2006
@@ -598,9 +598,15 @@
 	ast_mutex_t lock;			/*!< Channel private lock */
 	int method;				/*!< SIP method of this packet */
 	AST_DECLARE_STRING_FIELDS(
-		AST_STRING_FIELD(callid);
+		AST_STRING_FIELD(callid);	/*!< Global CallID */
+		AST_STRING_FIELD(randdata);	/*!< Random data */
+		AST_STRING_FIELD(accountcode);	/*!< Account code */
+		AST_STRING_FIELD(realm);	/*!< Authorization realm */
+		AST_STRING_FIELD(nonce);	/*!< Authorization nonce */
+		AST_STRING_FIELD(opaque);	/*!< Opaque nonsense */
+		AST_STRING_FIELD(qop);		/*!< Quality of Protection, since SIP wasn't complicated enough yet. */
+		AST_STRING_FIELD(domain);	/*!< Authorization domain */
 	);
-	char randdata[80];			/*!< Random data */
 	struct ast_codec_pref prefs;		/*!< codec prefs */
 	unsigned int ocseq;			/*!< Current outgoing seqno */
 	unsigned int icseq;			/*!< Current incoming seqno */
@@ -660,16 +666,10 @@
 	char cid_name[256];			/*!< Caller*ID */
 	char via[256];				/*!< Via: header */
 	char fullcontact[128];			/*!< The Contact: that the UA registers with us */
-	char accountcode[AST_MAX_ACCOUNT_CODE];	/*!< Account code */
 	char our_contact[256];			/*!< Our contact header */
 	char *rpid;				/*!< Our RPID header */
 	char *rpid_from;			/*!< Our RPID From header */
-	char realm[MAXHOSTNAMELEN];		/*!< Authorization realm */
-	char nonce[256];			/*!< Authorization nonce */
 	int noncecount;				/*!< Nonce-count */
-	char opaque[256];			/*!< Opaque nonsense */
-	char qop[80];				/*!< Quality of Protection, since SIP wasn't complicated enough yet. */
-	char domain[MAXHOSTNAMELEN];		/*!< Authorization domain */
 	char lastmsg[256];			/*!< Last Message sent/received */
 	int amaflags;				/*!< AMA Flags */
 	int pendinginvite;			/*!< Any pending invite */
@@ -827,7 +827,12 @@
 struct sip_registry {
 	ASTOBJ_COMPONENTS_FULL(struct sip_registry,1,1);
 	AST_DECLARE_STRING_FIELDS(
-		AST_STRING_FIELD(callid);
+		AST_STRING_FIELD(callid);	/*!< Global Call-ID */
+		AST_STRING_FIELD(realm);	/*!< Authorization realm */
+		AST_STRING_FIELD(nonce);	/*!< Authorization nonce */
+		AST_STRING_FIELD(opaque);	/*!< Opaque nonsense */
+		AST_STRING_FIELD(qop);		/*!< Quality of Protection, since SIP wasn't complicated enough yet. */
+		AST_STRING_FIELD(domain);	/*!< Authorization domain */
 	);
 	int portno;			/*!<  Optional port override */
 	char username[80];		/*!<  Who we are registering as */
@@ -848,11 +853,6 @@
 	struct sockaddr_in us;		/*!< Who the server thinks we are */
  	
  					/* Saved headers */
- 	char realm[MAXHOSTNAMELEN];	/*!< Authorization realm */
- 	char nonce[256];		/*!< Authorization nonce */
- 	char domain[MAXHOSTNAMELEN];	/*!< Authorization domain */
- 	char opaque[256];		/*!< Opaque nonsense */
- 	char qop[80];			/*!< Quality of Protection. */
 	int noncecount;			/*!< Nonce-count */
  
  	char lastmsg[256];		/*!< Last Message sent/received */
@@ -896,7 +896,7 @@
 static int transmit_response(struct sip_pvt *p, char *msg, struct sip_request *req);
 static int transmit_response_with_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
 static int transmit_response_with_unsupported(struct sip_pvt *p, char *msg, struct sip_request *req, char *unsupported);
-static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *rand, int reliable, char *header, int stale);
+static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, const char *rand, int reliable, char *header, int stale);
 static int transmit_request(struct sip_pvt *p, int sipmethod, int inc, int reliable, int newbranch);
 static int transmit_request_with_auth(struct sip_pvt *p, int sipmethod, int inc, int reliable, int newbranch);
 static int transmit_invite(struct sip_pvt *p, int sipmethod, int sendsdp, int init);
@@ -931,7 +931,7 @@
 static int sip_senddigit(struct ast_channel *ast, char digit);
 static int clear_realm_authentication(struct sip_auth *authlist);                            /* Clear realm authentication list (at reload) */
 static struct sip_auth *add_realm_authentication(struct sip_auth *authlist, char *configuration, int lineno);   /* Add realm authentication in list */
-static struct sip_auth *find_realm_authentication(struct sip_auth *authlist, char *realm);         /* Find authentication for a specific realm */
+static struct sip_auth *find_realm_authentication(struct sip_auth *authlist, const char *realm);         /* Find authentication for a specific realm */
 static int check_sip_domain(const char *domain, char *context, size_t len); /* Check if domain is one of our local domains */
 static void append_date(struct sip_request *req);	/* Append date to SIP packet */
 static int determine_firstline_parts(struct sip_request *req);
@@ -4216,7 +4216,7 @@
 }
 
 /* transmit_response_with_auth: Respond with authorization request */
-static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, char *randdata, int reliable, char *header, int stale)
+static int transmit_response_with_auth(struct sip_pvt *p, char *msg, struct sip_request *req, const char *randdata, int reliable, char *header, int stale)
 {
 	struct sip_request resp;
 	char tmp[256];
@@ -5465,11 +5465,11 @@
 		/* We have auth data to reuse, build a digest header! */
 		if (sipdebug)
 			ast_log(LOG_DEBUG, "   >>> Re-using Auth data for %s@%s\n", r->username, r->hostname);
-		ast_copy_string(p->realm, r->realm, sizeof(p->realm));
-		ast_copy_string(p->nonce, r->nonce, sizeof(p->nonce));
-		ast_copy_string(p->domain, r->domain, sizeof(p->domain));
-		ast_copy_string(p->opaque, r->opaque, sizeof(p->opaque));
-		ast_copy_string(p->qop, r->qop, sizeof(p->qop));
+		ast_string_field_set(p, realm, r->realm);
+		ast_string_field_set(p, nonce, r->nonce);
+		ast_string_field_set(p, domain, r->domain);
+		ast_string_field_set(p, opaque, r->opaque);
+		ast_string_field_set(p, qop, r->qop);
 		p->noncecount = r->noncecount++;
 
 		memset(digest,0,sizeof(digest));
@@ -6092,7 +6092,7 @@
 /*! \brief  check_auth: Check user authorization from peer definition ---*/
 /*      Some actions, like REGISTER and INVITEs from peers require
         authentication (if peer have secret set) */
-static int check_auth(struct sip_pvt *p, struct sip_request *req, char *randdata, int randlen, char *username, char *secret, char *md5secret, int sipmethod, char *uri, int reliable, int ignore)
+static int check_auth(struct sip_pvt *p, struct sip_request *req, char *username, char *secret, char *md5secret, int sipmethod, char *uri, int reliable, int ignore)
 {
 	int res = -1;
 	char *response = "407 Proxy Authentication Required";
@@ -6157,22 +6157,22 @@
  	}
 #endif	
 	authtoken =  get_header(req, reqheader);	
-	if (ignore && !ast_strlen_zero(randdata) && ast_strlen_zero(authtoken)) {
+	if (ignore && !ast_strlen_zero(p->randdata) && ast_strlen_zero(authtoken)) {
 		/* This is a retransmitted invite/register/etc, don't reconstruct authentication
 		   information */
-		if (!ast_strlen_zero(randdata)) {
+		if (!ast_strlen_zero(p->randdata)) {
 			if (!reliable) {
 				/* Resend message if this was NOT a reliable delivery.   Otherwise the
 				   retransmission should get it */
-				transmit_response_with_auth(p, response, req, randdata, reliable, respheader, 0);
+				transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, 0);
 				/* Schedule auto destroy in 15 seconds */
 				sip_scheddestroy(p, 15000);
 			}
 			res = 1;
 		}
-	} else if (ast_strlen_zero(randdata) || ast_strlen_zero(authtoken)) {
-		snprintf(randdata, randlen, "%08x", thread_safe_rand());
-		transmit_response_with_auth(p, response, req, randdata, reliable, respheader, 0);
+	} else if (ast_strlen_zero(p->randdata) || ast_strlen_zero(authtoken)) {
+		ast_string_field_build(p, randdata, "%08x", thread_safe_rand());
+		transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, 0);
 		/* Schedule auto destroy in 15 seconds */
 		sip_scheddestroy(p, 15000);
 		res = 1;
@@ -6193,7 +6193,7 @@
 		char *nonce = "";
 		char *digestusername = "";
 		int  wrongnonce = 0;
-		char *usednonce = randdata;
+		const char *usednonce = p->randdata;
 
 		/* Find their response among the mess that we'r sent for comparison */
 		ast_copy_string(tmp, authtoken, sizeof(tmp));
@@ -6263,7 +6263,7 @@
 		}
 
 		/* Verify nonce from request matches our nonce.  If not, send 401 with new nonce */
-		if (strncasecmp(randdata, nonce, randlen)) {
+		if (strcasecmp(p->randdata, nonce)) {
 			wrongnonce = 1;
 			usednonce = nonce;
 		}
@@ -6286,18 +6286,17 @@
 		ast_md5_hash(resp_hash, resp);
 
 		if (wrongnonce) {
-
-			snprintf(randdata, randlen, "%08x", thread_safe_rand());
+			ast_string_field_build(p, randdata, "%08x", thread_safe_rand());
 			if (ua_hash && !strncasecmp(ua_hash, resp_hash, strlen(resp_hash))) {
 				if (sipdebug)
 					ast_log(LOG_NOTICE, "stale nonce received from '%s'\n", get_header(req, "To"));
 				/* We got working auth token, based on stale nonce . */
-				transmit_response_with_auth(p, response, req, randdata, reliable, respheader, 1);
+				transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, 1);
 			} else {
 				/* Everything was wrong, so give the device one more try with a new challenge */
 				if (sipdebug)
 					ast_log(LOG_NOTICE, "Bad authentication received from '%s'\n", get_header(req, "To"));
-				transmit_response_with_auth(p, response, req, randdata, reliable, respheader, 0);
+				transmit_response_with_auth(p, response, req, p->randdata, reliable, respheader, 0);
 			}
 
 			/* Schedule auto destroy in 15 seconds */
@@ -6404,7 +6403,7 @@
 		} else {
 			ast_copy_flags(p, peer, SIP_NAT);
 			transmit_response(p, "100 Trying", req);
-			if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), peer->name, peer->secret, peer->md5secret, SIP_REGISTER, uri, 0, ignore))) {
+			if (!(res = check_auth(p, req, peer->name, peer->secret, peer->md5secret, SIP_REGISTER, uri, 0, ignore))) {
 				sip_cancel_destroy(p);
 				switch (parse_register_contact(p, peer, req)) {
 				case PARSE_REGISTER_FAILED:
@@ -6560,7 +6559,7 @@
 		colon = strchr(a, ':'); /* Remove :port */
 		if (colon)
 			*colon = '\0';
-		ast_copy_string(p->domain, a, sizeof(p->domain));
+		ast_string_field_set(p, domain, a);
 	}
 	/* Skip any options */
 	if ((a = strchr(uri, ';'))) {
@@ -7039,7 +7038,7 @@
 				ast_log(LOG_DEBUG, "Setting NAT on VRTP to %d\n", (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
 			ast_rtp_setnat(p->vrtp, (ast_test_flag(p, SIP_NAT) & SIP_NAT_ROUTE));
 		}
-		if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), user->name, user->secret, user->md5secret, sipmethod, uri, reliable, ignore))) {
+		if (!(res = check_auth(p, req, user->name, user->secret, user->md5secret, sipmethod, uri, reliable, ignore))) {
 			sip_cancel_destroy(p);
 			ast_copy_flags(p, user, SIP_FLAGS_TO_COPY);
 			/* Copy SIP extensions profile from INVITE */
@@ -7061,7 +7060,7 @@
 			ast_copy_string(p->peersecret, user->secret, sizeof(p->peersecret));
 			ast_copy_string(p->subscribecontext, user->subscribecontext, sizeof(p->subscribecontext));
 			ast_copy_string(p->peermd5secret, user->md5secret, sizeof(p->peermd5secret));
-			ast_copy_string(p->accountcode, user->accountcode, sizeof(p->accountcode));
+			ast_string_field_set(p, accountcode, user->accountcode);
 			ast_copy_string(p->language, user->language, sizeof(p->language));
 			ast_copy_string(p->musicclass, user->musicclass, sizeof(p->musicclass));
 			p->amaflags = user->amaflags;
@@ -7138,7 +7137,7 @@
 				p->peersecret[0] = '\0';
 				p->peermd5secret[0] = '\0';
 			}
-			if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), peer->name, p->peersecret, p->peermd5secret, sipmethod, uri, reliable, ignore))) {
+			if (!(res = check_auth(p, req, peer->name, p->peersecret, p->peermd5secret, sipmethod, uri, reliable, ignore))) {
 				ast_copy_flags(p, peer, SIP_FLAGS_TO_COPY);
 				/* If we have a call limit, set flag */
 				if (peer->call_limit)
@@ -7171,7 +7170,7 @@
 				ast_copy_string(p->peersecret, peer->secret, sizeof(p->peersecret));
 				ast_copy_string(p->peermd5secret, peer->md5secret, sizeof(p->peermd5secret));
 				ast_copy_string(p->language, peer->language, sizeof(p->language));
-				ast_copy_string(p->accountcode, peer->accountcode, sizeof(p->accountcode));
+				ast_string_field_set(p, accountcode, peer->accountcode);
 				p->amaflags = peer->amaflags;
 				p->callgroup = peer->callgroup;
 				p->pickupgroup = peer->pickupgroup;
@@ -7196,7 +7195,7 @@
 #ifdef OSP_SUPPORT			
 			else if (global_allowguest == 2) {
 				ast_copy_flags(p, &global_flags, SIP_OSPAUTH);
-				res = check_auth(p, req, p->randdata, sizeof(p->randdata), "", "", "", sipmethod, uri, reliable, ignore); 
+				res = check_auth(p, req, "", "", "", sipmethod, uri, reliable, ignore); 
 			}
 #endif
 		}
@@ -8908,15 +8907,14 @@
 	/* table of recognised keywords, and places where they should be copied */
 	const struct x {
 		const char *key;
-		char *dst;
-		int dstlen;
+		int field_index;
 	} *i, keys[] = {
-		{ "realm=", p->realm, sizeof(p->realm) },
-		{ "nonce=", p->nonce, sizeof(p->nonce) },
-		{ "opaque=", p->opaque, sizeof(p->opaque) },
-		{ "qop=", p->qop, sizeof(p->qop) },
-		{ "domain=", p->domain, sizeof(p->domain) },
-		{ NULL, NULL, 0 },
+		{ "realm=", ast_string_field_index(p, realm) },
+		{ "nonce=", ast_string_field_index(p, nonce) },
+		{ "opaque=", ast_string_field_index(p, opaque) },
+		{ "qop=", ast_string_field_index(p, qop) },
+		{ "domain=", ast_string_field_index(p, domain) },
+		{ NULL, 0 },
 	};
 
 	ast_copy_string(tmp, get_header(req, header), sizeof(tmp));
@@ -8927,8 +8925,6 @@
 		return -1;
 	}
 	c = tmp + strlen("Digest ");
-	for (i = keys; i->key != NULL; i++)
-		i->dst[0] = '\0';	/* init all to empty strings */
 	ast_copy_string(oldnonce, p->nonce, sizeof(oldnonce));
 	while (c && *(c = ast_skip_blanks(c))) {	/* lookup for keys */
 		for (i = keys; i->key != NULL; i++) {
@@ -8945,7 +8941,7 @@
 				separator = ",";
 			}
 			strsep(&c, separator); /* clear separator and move ptr */
-			ast_copy_string(i->dst, src, i->dstlen);
+			ast_string_field_index_set(p, i->field_index, src);
 			break;
 		}
 		if (i->key == NULL) /* not found, try ',' */
@@ -8960,11 +8956,11 @@
 		struct sip_registry *r = p->registry;
 
 		if (strcmp(r->nonce, p->nonce)) {
-			ast_copy_string(r->realm, p->realm, sizeof(r->realm));
-			ast_copy_string(r->nonce, p->nonce, sizeof(r->nonce));
-			ast_copy_string(r->domain, p->domain, sizeof(r->domain));
-			ast_copy_string(r->opaque, p->opaque, sizeof(r->opaque));
-			ast_copy_string(r->qop, p->qop, sizeof(r->qop));
+			ast_string_field_set(r, realm, p->realm);
+			ast_string_field_set(r, nonce, p->nonce);
+			ast_string_field_set(r, domain, p->domain);
+			ast_string_field_set(r, opaque, p->opaque);
+			ast_string_field_set(r, qop, p->qop);
 			r->noncecount = 0;
 		}
 	}
@@ -11841,7 +11837,7 @@
 }
 
 /*! \brief  find_realm_authentication: Find authentication for a specific realm ---*/
-static struct sip_auth *find_realm_authentication(struct sip_auth *authlist, char *realm)
+static struct sip_auth *find_realm_authentication(struct sip_auth *authlist, const char *realm)
 {
 	struct sip_auth *a;
 

Modified: team/kpfleming/stringfields/include/asterisk/stringfields.h
URL: http://svn.digium.com/view/asterisk/team/kpfleming/stringfields/include/asterisk/stringfields.h?rev=7758&r1=7757&r2=7758&view=diff
==============================================================================
--- team/kpfleming/stringfields/include/asterisk/stringfields.h (original)
+++ team/kpfleming/stringfields/include/asterisk/stringfields.h Tue Jan  3 19:07:08 2006
@@ -36,17 +36,26 @@
 #define AST_STRING_FIELD(name) ast_string_field name;
 
 #define AST_DECLARE_STRING_FIELDS(field_list) \
-	char *__begin_field[0]; \
+	ast_string_field __begin_field[0]; \
 	field_list \
-	char *__end_field[0];
+	ast_string_field __end_field[0];
 
 #define ast_string_field_count(x) \
 	(offsetof(typeof(*x), __end_field) - offsetof(typeof(*x), __begin_field)) / sizeof(ast_string_field)
 
+#define ast_string_field_index(x, field) \
+	(offsetof(typeof(*x), field) - offsetof(typeof(*x), __begin_field)) / sizeof(ast_string_field)
+
 #define ast_string_field_set(x, field, data) do { \
 	if (x->field) \
 		free((char *) x->field); \
-	x->field = strdup(data); \
+	x->field = (ast_string_field) strdup(data); \
+	} while (0)
+
+#define ast_string_field_index_set(x, index, data) do { \
+	if (x->__begin_field[index]) \
+		free((char *) x->__begin_field[index]); \
+	x->__begin_field[index] = (ast_string_field) strdup(data); \
 	} while (0)
 
 #define ast_string_field_build(x, field, fmt, args...) do { \
@@ -55,16 +64,26 @@
 	asprintf((char **) &x->field, fmt, args); \
 	} while (0)
 
+#define ast_string_field_index_build(x, index, fmt, args...) do { \
+	if (x->__begin_field[index]) \
+		free((char *) x->__begin_field[index]); \
+	asprintf((char **) &x->__begin_field[index], fmt, args); \
+	} while (0)
+
 #define ast_string_field_free(x, field) do { \
 	if (x->field) \
-		free((char *) x->field) \
+		free((char *) x->field); \
+	} while(0)
+
+#define ast_string_field_index_free(x, index) do { \
+	if (x->__begin_field[index]) \
+		free((char *) x->__begin_field[index]); \
 	} while(0)
 
 #define ast_string_field_free_all(x) do { \
 	int index; \
 	for (index = 0; index < ast_string_field_count(x); index ++) \
-		if (x->__begin_field[index]) \
-			free(x->__begin_field[index]); \
+		ast_string_field_index_free(x, index); \
 	} while(0)
 
 #endif /* _ASTERISK_STRINGFIELDS_H */



More information about the svn-commits mailing list