Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Feb 2002 17:24:20 +0100
From:      "Steven Looman" <fsteevie@wish.net>
To:        "ISDN Mailinglist" <freebsd-isdn@FreeBSD.ORG>
Subject:   subaddr implementation
Message-ID:  <000801c1bee2$185c6800$0200a8c0@coyote>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.

------=_NextPart_000_0005_01C1BEEA.6CD8D960
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

Hi,

I finished it, I guess. I don't really know if it works perfectly, 'couse I
haven't tested it fully.

I don't know if you should use the patch (at least not without looking at
it) because it has some drawbacks:
You can specify more dialin or dialout numbers, i did the same with the
subaddrs, but mismatches can be a
result (wrong subaddr with wrong number). (That's why i wanted to use
<number>*<subaddr>)

In the config, you specify if you want to use subaddrs by setting usesubaddr
= on

I know, it isn't pretty... go fix your own code. ;)

Steven

PS. I hope I included all altered files in the patch
PPS. I added a patch to remove some useless comment by an earlier patch by
me.

------=_NextPart_000_0005_01C1BEEA.6CD8D960
Content-Type: application/octet-stream;
	name="subaddr.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="subaddr.patch"

*** /usr/src/usr.sbin/i4b/isdnd.orig/dial.c	Thu Oct 18 13:58:49 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/dial.c	Mon Feb 25 16:36:03 2002=0A=
***************=0A=
*** 55,70 ****=0A=
  =0A=
  	if(cep->remote_numbers_count =3D=3D 1)=0A=
  	{=0A=
! 		strcpy(cep->remote_phone_dialout, cep->remote_numbers[0].number);=0A=
! 		DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: only one no, no =3D =
%s", cep->remote_phone_dialout)));=0A=
  		cep->last_remote_number =3D 0;=0A=
  		return;=0A=
  	}=0A=
  =0A=
  	if(cep->remote_numbers_handling =3D=3D RNH_FIRST)=0A=
  	{=0A=
! 		strcpy(cep->remote_phone_dialout, cep->remote_numbers[0].number);=0A=
! 		DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: use first, no =3D =
%s", cep->remote_phone_dialout)));=0A=
  		cep->last_remote_number =3D 0;=0A=
  		return;=0A=
  	}=0A=
--- 55,72 ----=0A=
  =0A=
  	if(cep->remote_numbers_count =3D=3D 1)=0A=
  	{=0A=
! 		strcpy(cep->remote_phone_dialout.number, =
cep->remote_numbers[0].number);=0A=
! 		strcpy(cep->remote_phone_dialout.subaddr, =
cep->remote_numbers[0].subaddr);=0A=
! 		DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: only one no, no =3D =
%s", cep->remote_phone_dialout.number)));=0A=
  		cep->last_remote_number =3D 0;=0A=
  		return;=0A=
  	}=0A=
  =0A=
  	if(cep->remote_numbers_handling =3D=3D RNH_FIRST)=0A=
  	{=0A=
! 		strcpy(cep->remote_phone_dialout.number, =
cep->remote_numbers[0].number);=0A=
! 		strcpy(cep->remote_phone_dialout.subaddr, =
cep->remote_numbers[0].subaddr);=0A=
! 		DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: use first, no =3D =
%s", cep->remote_phone_dialout.number)));=0A=
  		cep->last_remote_number =3D 0;=0A=
  		return;=0A=
  	}=0A=
***************=0A=
*** 77,84 ****=0A=
  		{=0A=
  			if(cep->remote_numbers_handling =3D=3D RNH_LAST)=0A=
  			{=0A=
! 				strcpy(cep->remote_phone_dialout, cep->remote_numbers[i].number);=0A=
! 				DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: use last, no =3D =
%s", cep->remote_phone_dialout)));=0A=
  				cep->last_remote_number =3D i;=0A=
  				return;=0A=
  			}=0A=
--- 79,87 ----=0A=
  		{=0A=
  			if(cep->remote_numbers_handling =3D=3D RNH_LAST)=0A=
  			{=0A=
! 				strcpy(cep->remote_phone_dialout.number, =
cep->remote_numbers[i].number);=0A=
! 				strcpy(cep->remote_phone_dialout.subaddr, =
cep->remote_numbers[i].subaddr);=0A=
! 				DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: use last, no =3D =
%s", cep->remote_phone_dialout.number)));=0A=
  				cep->last_remote_number =3D i;=0A=
  				return;=0A=
  			}=0A=
***************=0A=
*** 87,94 ****=0A=
  				if(++i >=3D cep->remote_numbers_count)=0A=
  					i =3D 0;=0A=
  =0A=
! 				strcpy(cep->remote_phone_dialout, cep->remote_numbers[i].number);=0A=
! 				DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: use next, no =3D =
%s", cep->remote_phone_dialout)));=0A=
  				cep->last_remote_number =3D i;=0A=
  				return;=0A=
  			}=0A=
--- 90,98 ----=0A=
  				if(++i >=3D cep->remote_numbers_count)=0A=
  					i =3D 0;=0A=
  =0A=
! 				strcpy(cep->remote_phone_dialout.number, =
cep->remote_numbers[i].number);=0A=
! 				strcpy(cep->remote_phone_dialout.subaddr, =
cep->remote_numbers[i].subaddr);=0A=
! 				DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: use next, no =3D =
%s", cep->remote_phone_dialout.number)));=0A=
  				cep->last_remote_number =3D i;=0A=
  				return;=0A=
  			}=0A=
***************=0A=
*** 97,104 ****=0A=
  		if(++i >=3D cep->remote_numbers_count)=0A=
  			i =3D 0;=0A=
  	}=0A=
! 	strcpy(cep->remote_phone_dialout, cep->remote_numbers[0].number);=0A=
! 	DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: no last found (use =
0), no =3D %s", cep->remote_phone_dialout)));=0A=
  	cep->last_remote_number =3D 0;	=0A=
  }									=0A=
  =0A=
--- 101,108 ----=0A=
  		if(++i >=3D cep->remote_numbers_count)=0A=
  			i =3D 0;=0A=
  	}=0A=
! 	strcpy(cep->remote_phone_dialout.number, =
cep->remote_numbers[0].number);=0A=
! 	DBGL(DL_DIAL, (log(LL_DBG, "select_first_dialno: no last found (use =
0), no =3D %s", cep->remote_phone_dialout.number)));=0A=
  	cep->last_remote_number =3D 0;	=0A=
  }									=0A=
  =0A=
***************=0A=
*** 116,123 ****=0A=
  =0A=
  	if(cep->remote_numbers_count =3D=3D 1)=0A=
  	{=0A=
! 		strcpy(cep->remote_phone_dialout, cep->remote_numbers[0].number);=0A=
! 		DBGL(DL_DIAL, (log(LL_DBG, "select_next_dialno: only one no, no =3D =
%s", cep->remote_phone_dialout)));=0A=
  		cep->last_remote_number =3D 0;=0A=
  		return;=0A=
  	}=0A=
--- 120,128 ----=0A=
  =0A=
  	if(cep->remote_numbers_count =3D=3D 1)=0A=
  	{=0A=
! 		strcpy(cep->remote_phone_dialout.number, =
cep->remote_numbers[0].number);=0A=
! 		strcpy(cep->remote_phone_dialout.subaddr, =
cep->remote_numbers[0].subaddr);=0A=
! 		DBGL(DL_DIAL, (log(LL_DBG, "select_next_dialno: only one no, no =3D =
%s", cep->remote_phone_dialout.number)));=0A=
  		cep->last_remote_number =3D 0;=0A=
  		return;=0A=
  	}=0A=
***************=0A=
*** 133,139 ****=0A=
  	if(cep->last_remote_number >=3D cep->remote_numbers_count)=0A=
  		cep->last_remote_number =3D 0;=0A=
  =0A=
! 	strcpy(cep->remote_phone_dialout, =
cep->remote_numbers[cep->last_remote_number].number);=0A=
  	=0A=
  	DBGL(DL_DIAL, (log(LL_DBG, "select_next_dialno: index=3D%d, no=3D%s",=0A=
  		cep->last_remote_number,=0A=
--- 138,144 ----=0A=
  	if(cep->last_remote_number >=3D cep->remote_numbers_count)=0A=
  		cep->last_remote_number =3D 0;=0A=
  =0A=
! 	strcpy(cep->remote_phone_dialout.number, =
cep->remote_numbers[cep->last_remote_number].number);=0A=
  	=0A=
  	DBGL(DL_DIAL, (log(LL_DBG, "select_next_dialno: index=3D%d, no=3D%s",=0A=
  		cep->last_remote_number,=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/isdnd.h	Mon Dec 31 10:32:32 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/isdnd.h	Mon Feb 25 17:00:54 2002=0A=
***************=0A=
*** 208,214 ****=0A=
--- 208,223 ----=0A=
   *	this struct describes the numbers to try to dial out=0A=
   =
*------------------------------------------------------------------------=
---*/=0A=
  typedef struct {=0A=
+ 	char number[TELNO_MAX];		/* number	*/=0A=
+ 	char subaddr[SUBADDR_MAX];	/* subaddr	*/=0A=
+ } number_t;=0A=
+ =0A=
+ =
/*-----------------------------------------------------------------------=
----*=0A=
+  *	this struct describes the numbers to try to dial out=0A=
+  =
*------------------------------------------------------------------------=
---*/=0A=
+ typedef struct {=0A=
  	char number[TELNO_MAX];	/* remote number to dial	*/=0A=
+ 	char subaddr[SUBADDR_MAX];	/* remote subaddr	*/=0A=
  	int  flag;		/* usage flag			*/=0A=
  #define RNF_IDLE	0=0A=
  #define RNF_SUCC	1	/* last dial was ok */=0A=
***************=0A=
*** 219,224 ****=0A=
--- 228,234 ----=0A=
   =
*------------------------------------------------------------------------=
---*/=0A=
  typedef struct {=0A=
  	char number[TELNO_MAX];	/* calling party number		*/=0A=
+ 	char subaddr[SUBADDR_MAX];/* calling party subaddr	*/=0A=
  } incoming_number_t;=0A=
  =0A=
  =
/*-----------------------------------------------------------------------=
----*=0A=
***************=0A=
*** 250,269 ****=0A=
  	int usrdeviceunit;		/* userland unit to use */=0A=
  =0A=
  	int remote_numbers_count;	/* number of remote numbers	*/=0A=
  #define MAXRNUMBERS 8			/* max remote numbers		*/=0A=
  =0A=
  	remote_number_t remote_numbers[MAXRNUMBERS];	/* remote numbers to =
dial */=0A=
  =0A=
  	int remote_numbers_handling;	/* how to handle the remote dialing */=0A=
  #define RNH_NEXT	0	/* use next number after last successfull   */=0A=
  #define RNH_LAST	1	/* use last successfull for next call	    */=0A=
  #define RNH_FIRST	2	/* always use first number for next call    */=0A=
  =0A=
! 	char local_phone_dialout[TELNO_MAX];	/* our number to tell remote*/=0A=
! 	char local_phone_incoming[TELNO_MAX];	/* answer calls for this local =
number */=0A=
  =0A=
  #define	MAX_INCOMING	8=0A=
  	int incoming_numbers_count;	/* number of incoming allowed numbers */=0A=
  	incoming_number_t remote_phone_incoming[MAX_INCOMING];	/* answer =
calls from this remote machine */=0A=
  =0A=
  	int dialin_reaction;		/* what to do with incoming calls */=0A=
--- 260,282 ----=0A=
  	int usrdeviceunit;		/* userland unit to use */=0A=
  =0A=
  	int remote_numbers_count;	/* number of remote numbers	*/=0A=
+ 	int remote_subaddr_count;	/* number of remote subaddr	*/=0A=
  #define MAXRNUMBERS 8			/* max remote numbers		*/=0A=
  =0A=
  	remote_number_t remote_numbers[MAXRNUMBERS];	/* remote numbers to =
dial */=0A=
+ 	=0A=
  =0A=
  	int remote_numbers_handling;	/* how to handle the remote dialing */=0A=
  #define RNH_NEXT	0	/* use next number after last successfull   */=0A=
  #define RNH_LAST	1	/* use last successfull for next call	    */=0A=
  #define RNH_FIRST	2	/* always use first number for next call    */=0A=
  =0A=
! 	number_t local_phone_dialout;	/* our number to tell remote*/=0A=
! 	number_t local_phone_incoming;	/* answer calls for this local number =
*/=0A=
  =0A=
  #define	MAX_INCOMING	8=0A=
  	int incoming_numbers_count;	/* number of incoming allowed numbers */=0A=
+ 	int incoming_subaddr_count;	/* number of incoming allowed subaddr */=0A=
  	incoming_number_t remote_phone_incoming[MAX_INCOMING];	/* answer =
calls from this remote machine */=0A=
  =0A=
  	int dialin_reaction;		/* what to do with incoming calls */=0A=
***************=0A=
*** 340,345 ****=0A=
--- 353,360 ----=0A=
  #define DIR_INONLY	1=0A=
  #define DIR_OUTONLY	2=0A=
  =0A=
+ 	int	usesubaddr;		/* use subaddresses		*/=0A=
+ =0A=
  	int	budget_callbackperiod;	/* length of a budget period (s)*/=0A=
  	int	budget_callbackncalls;	/* call budget for a period	*/=0A=
  	char	*budget_callbacks_file;	/* filename to store callback stats */=0A=
***************=0A=
*** 438,448 ****=0A=
  =0A=
  	int hangup;			/* flag, hangup connection asap */=0A=
  =0A=
! 	char real_phone_incoming[TELNO_MAX]; /* real remote telno in case of =
wildcard */=0A=
  =0A=
  	int last_remote_number;		/* index of last used dialout number*/=0A=
  =0A=
! 	char remote_phone_dialout[TELNO_MAX]; /* used remote number to dial */=0A=
  	=0A=
  	int direction;			/* incoming or outgoing */=0A=
  #define DIR_IN  0=0A=
--- 453,463 ----=0A=
  =0A=
  	int hangup;			/* flag, hangup connection asap */=0A=
  =0A=
! 	number_t real_phone_incoming;	/* real remote telno in case of =
wildcard */=0A=
  =0A=
  	int last_remote_number;		/* index of last used dialout number*/=0A=
  =0A=
! 	number_t remote_phone_dialout;	/* used remote number to dial */=0A=
  	=0A=
  	int direction;			/* incoming or outgoing */=0A=
  #define DIR_IN  0=0A=
***************=0A=
*** 752,758 ****=0A=
  int exec_connect_prog ( cfg_entry_t *cep, const char *prog, int =
link_down );=0A=
  pid_t exec_prog ( char *prog, char **arglist );=0A=
  cfg_entry_t * find_by_device_for_dialout ( int drivertype, int =
driverunit );=0A=
! cfg_entry_t *find_by_device_for_dialoutnumber(int drivertype, int =
driverunit, int cmdlen, char *cmd);=0A=
  cfg_entry_t *find_by_device_for_keypad(int drivertype, int driverunit, =
int cmdlen, char *cmd);=0A=
  cfg_entry_t * find_matching_entry_incoming ( msg_connect_ind_t *mp );=0A=
  cfg_entry_t * find_active_entry_by_driver ( int drivertype, int =
driverunit );=0A=
--- 767,773 ----=0A=
  int exec_connect_prog ( cfg_entry_t *cep, const char *prog, int =
link_down );=0A=
  pid_t exec_prog ( char *prog, char **arglist );=0A=
  cfg_entry_t * find_by_device_for_dialout ( int drivertype, int =
driverunit );=0A=
! cfg_entry_t *find_by_device_for_dialoutnumber(msg_dialoutnumber_ind_t =
*mp);=0A=
  cfg_entry_t *find_by_device_for_keypad(int drivertype, int driverunit, =
int cmdlen, char *cmd);=0A=
  cfg_entry_t * find_matching_entry_incoming ( msg_connect_ind_t *mp );=0A=
  cfg_entry_t * find_active_entry_by_driver ( int drivertype, int =
driverunit );=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/exec.c	Mon Nov 19 15:19:21 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/exec.c	Sun Feb 24 16:46:30 2002=0A=
***************=0A=
*** 228,240 ****=0A=
  =0A=
  	/* if destination telephone number avail, add it as argument */=0A=
  	=0A=
! 	if(*cep->local_phone_incoming)=0A=
! 		argv[4] =3D cep->local_phone_incoming;=0A=
  =0A=
  	/* if source telephone number avail, add it as argument */=0A=
  	=0A=
! 	if(*cep->real_phone_incoming)=0A=
! 		argv[6] =3D cep->real_phone_incoming;=0A=
  =0A=
  	if(*cep->display)=0A=
  	{=0A=
--- 228,240 ----=0A=
  =0A=
  	/* if destination telephone number avail, add it as argument */=0A=
  	=0A=
! 	if(*cep->local_phone_incoming.number)=0A=
! 		argv[4] =3D cep->local_phone_incoming.number;=0A=
  =0A=
  	/* if source telephone number avail, add it as argument */=0A=
  	=0A=
! 	if(*cep->real_phone_incoming.number)=0A=
! 		argv[6] =3D cep->real_phone_incoming.number;=0A=
  =0A=
  	if(*cep->display)=0A=
  	{=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/monitor.c	Fri May 25 10:36:44 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/monitor.c	Sun Feb 24 16:46:31 2002=0A=
***************=0A=
*** 1071,1083 ****=0A=
  =0A=
  	if(cep->direction =3D=3D DIR_OUT)=0A=
  	{=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_REMPHONE, =
cep->remote_phone_dialout);=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_LOCPHONE, =
cep->local_phone_dialout);=0A=
  	}=0A=
  	else=0A=
  	{=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_REMPHONE, =
cep->real_phone_incoming);=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_LOCPHONE, =
cep->local_phone_incoming);=0A=
  	}=0A=
  	monitor_broadcast(mask, evnt, sizeof evnt);=0A=
  }=0A=
--- 1071,1083 ----=0A=
  =0A=
  	if(cep->direction =3D=3D DIR_OUT)=0A=
  	{=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_REMPHONE, =
cep->remote_phone_dialout.number);=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_LOCPHONE, =
cep->local_phone_dialout.number);=0A=
  	}=0A=
  	else=0A=
  	{=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_REMPHONE, =
cep->real_phone_incoming.number);=0A=
! 		I4B_PUT_STR(evnt, I4B_MON_CONNECT_LOCPHONE, =
cep->local_phone_incoming.number);=0A=
  	}=0A=
  	monitor_broadcast(mask, evnt, sizeof evnt);=0A=
  }=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/curses.c	Mon Oct  9 16:22:38 2000=0A=
--- /usr/src/usr.sbin/i4b/isdnd/curses.c	Sun Feb 24 16:46:29 2002=0A=
***************=0A=
*** 408,423 ****=0A=
  	if(aliasing)=0A=
  	{=0A=
  		if(cep->direction =3D=3D DIR_IN)=0A=
! 			snprintf(buffer, sizeof(buffer), "%s", =
get_alias(cep->real_phone_incoming));=0A=
  		else=0A=
! 			snprintf(buffer, sizeof(buffer), "%s", =
get_alias(cep->remote_phone_dialout));=0A=
  	}=0A=
  	else=0A=
  	{=0A=
  		if(cep->direction =3D=3D DIR_IN)=0A=
! 			snprintf(buffer, sizeof(buffer), "%s/%s", cep->name, =
cep->real_phone_incoming);=0A=
  		else=0A=
! 			snprintf(buffer, sizeof(buffer), "%s/%s", cep->name, =
cep->remote_phone_dialout);	=0A=
  	}=0A=
  		=0A=
  	buffer[H_IFN - H_TELN - 1] =3D '\0';=0A=
--- 408,423 ----=0A=
  	if(aliasing)=0A=
  	{=0A=
  		if(cep->direction =3D=3D DIR_IN)=0A=
! 			snprintf(buffer, sizeof(buffer), "%s", =
get_alias(cep->real_phone_incoming.number));=0A=
  		else=0A=
! 			snprintf(buffer, sizeof(buffer), "%s", =
get_alias(cep->remote_phone_dialout.number));=0A=
  	}=0A=
  	else=0A=
  	{=0A=
  		if(cep->direction =3D=3D DIR_IN)=0A=
! 			snprintf(buffer, sizeof(buffer), "%s/%s", cep->name, =
cep->real_phone_incoming.number);=0A=
  		else=0A=
! 			snprintf(buffer, sizeof(buffer), "%s/%s", cep->name, =
cep->remote_phone_dialout.number);	=0A=
  	}=0A=
  		=0A=
  	buffer[H_IFN - H_TELN - 1] =3D '\0';=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/msghdl.c	Thu Oct 18 13:58:49 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/msghdl.c	Tue Feb 26 16:55:45 2002=0A=
***************=0A=
*** 831,837 ****=0A=
  	=0A=
  	DBGL(DL_DRVR, (log(LL_DBG, "msg_dialoutnumber: dial req from %s, unit =
%d", bdrivername(mp->driver), mp->driver_unit)));=0A=
  =0A=
! 	if((cep =3D find_by_device_for_dialoutnumber(mp->driver, =
mp->driver_unit, mp->cmdlen, mp->cmd)) =3D=3D NULL)=0A=
  	{=0A=
  		DBGL(DL_DRVR, (log(LL_DBG, "msg_dialoutnumber: config entry reserved =
or no match")));=0A=
  		return;=0A=
--- 831,837 ----=0A=
  	=0A=
  	DBGL(DL_DRVR, (log(LL_DBG, "msg_dialoutnumber: dial req from %s, unit =
%d", bdrivername(mp->driver), mp->driver_unit)));=0A=
  =0A=
! 	if((cep =3D find_by_device_for_dialoutnumber(mp)) =3D=3D NULL)=0A=
  	{=0A=
  		DBGL(DL_DRVR, (log(LL_DBG, "msg_dialoutnumber: config entry reserved =
or no match")));=0A=
  		return;=0A=
***************=0A=
*** 1216,1223 ****=0A=
  	else=0A=
  		mcr.unitlen_method =3D ULEN_METHOD_STATIC;=0A=
  	=0A=
! 	strcpy(mcr.dst_telno, cep->remote_phone_dialout);=0A=
! 	strcpy(mcr.src_telno, cep->local_phone_dialout);=0A=
  	strcpy(mcr.keypad, cep->keypad);	=0A=
  =0A=
  	cep->last_dial_time =3D time(NULL);=0A=
--- 1216,1227 ----=0A=
  	else=0A=
  		mcr.unitlen_method =3D ULEN_METHOD_STATIC;=0A=
  	=0A=
! 	strcpy(mcr.dst_telno, cep->remote_phone_dialout.number);=0A=
! 	if(cep->usesubaddr)=0A=
! 		strcpy(mcr.dst_subaddr, cep->remote_phone_dialout.subaddr);=0A=
! 	strcpy(mcr.src_telno, cep->local_phone_dialout.number);=0A=
! 	if(cep->usesubaddr)=0A=
! 		strcpy(mcr.src_subaddr, cep->local_phone_dialout.subaddr);=0A=
  	strcpy(mcr.keypad, cep->keypad);	=0A=
  =0A=
  	cep->last_dial_time =3D time(NULL);=0A=
***************=0A=
*** 1236,1243 ****=0A=
  	log(LL_CHD, "%05d %s dialing out from %s to %s",=0A=
  		cep->cdid,=0A=
  	        cep->name,=0A=
! 		aliasing ? get_alias(cep->local_phone_dialout) : =
cep->local_phone_dialout,=0A=
! 		aliasing ? get_alias(cep->remote_phone_dialout) : =
cep->remote_phone_dialout);=0A=
  =0A=
  	return(ret);=0A=
  }=0A=
--- 1240,1247 ----=0A=
  	log(LL_CHD, "%05d %s dialing out from %s to %s",=0A=
  		cep->cdid,=0A=
  	        cep->name,=0A=
! 		aliasing ? get_alias(cep->local_phone_dialout.number) : =
cep->local_phone_dialout.number,=0A=
! 		aliasing ? get_alias(cep->remote_phone_dialout.number) : =
cep->remote_phone_dialout.number);=0A=
  =0A=
  	return(ret);=0A=
  }=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/rc_config.c	Mon Dec 31 10:32:32 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/rc_config.c	Mon Feb 25 17:27:35 2002=0A=
***************=0A=
*** 219,224 ****=0A=
--- 219,226 ----=0A=
  		cep->state =3D ST_IDLE;=0A=
  =0A=
  		cep->aoc_valid =3D AOC_INVALID;=0A=
+ =0A=
+ 		cep->usesubaddr =3D 0;=0A=
   	}=0A=
  }=0A=
  =0A=
***************=0A=
*** 769,780 ****=0A=
  =0A=
  		case LOCAL_PHONE_DIALOUT:=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: local_phone_dialout =3D %s", =
entrycount, yylval.str)));=0A=
! 			strcpy(cfg_entry_tab[entrycount].local_phone_dialout, yylval.str);=0A=
  			break;=0A=
  =0A=
  		case LOCAL_PHONE_INCOMING:=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: local_phone_incoming =3D %s", =
entrycount, yylval.str)));=0A=
! 			strcpy(cfg_entry_tab[entrycount].local_phone_incoming, yylval.str);=0A=
  			break;=0A=
  =0A=
  		case MAILER:=0A=
--- 771,792 ----=0A=
  =0A=
  		case LOCAL_PHONE_DIALOUT:=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: local_phone_dialout =3D %s", =
entrycount, yylval.str)));=0A=
! 			strcpy(cfg_entry_tab[entrycount].local_phone_dialout.number, =
yylval.str);=0A=
! 			break;=0A=
! =0A=
! 		case LOCAL_SUBADDR_DIALOUT:=0A=
! 			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: local_subaddr_dialout =3D =
%s", entrycount, yylval.str)));=0A=
! 			strcpy(cfg_entry_tab[entrycount].local_phone_dialout.subaddr, =
yylval.str);=0A=
  			break;=0A=
  =0A=
  		case LOCAL_PHONE_INCOMING:=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: local_phone_incoming =3D %s", =
entrycount, yylval.str)));=0A=
! 			strcpy(cfg_entry_tab[entrycount].local_phone_incoming.number, =
yylval.str);=0A=
! 			break;=0A=
! =0A=
! 		case LOCAL_SUBADDR_INCOMING:=0A=
! 			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: local_subaddr_incoming =3D =
%s", entrycount, yylval.str)));=0A=
! 			strcpy(cfg_entry_tab[entrycount].local_phone_incoming.subaddr, =
yylval.str);=0A=
  			break;=0A=
  =0A=
  		case MAILER:=0A=
***************=0A=
*** 941,946 ****=0A=
--- 953,973 ----=0A=
  			=0A=
  			break;=0A=
  =0A=
+ 		case REMOTE_SUBADDR_DIALOUT:=0A=
+ 			if(cfg_entry_tab[entrycount].remote_subaddr_count >=3D MAXRNUMBERS)=0A=
+ 			{=0A=
+ 				log(LL_ERR, "ERROR parsing config file: too many remote =
subaddresses at line %d!", lineno);=0A=
+ 				config_error_flag++;=0A=
+ 				break;=0A=
+ 			}				=0A=
+ 			=0A=
+ 			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: remote_subaddr_dialout #%d =
=3D %s",=0A=
+ 				entrycount, cfg_entry_tab[entrycount].remote_numbers_count, =
yylval.str)));=0A=
+ =0A=
+ 			=
strcpy(cfg_entry_tab[entrycount].remote_numbers[cfg_entry_tab[entrycount]=
.remote_numbers_count].subaddr, yylval.str);=0A=
+ =0A=
+ 			break;=0A=
+ =0A=
  		case REMOTE_NUMBERS_HANDLING:			=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: remdial_handling =3D %s", =
entrycount, yylval.str)));=0A=
  			if(!(strcmp(yylval.str, "next")))=0A=
***************=0A=
*** 972,977 ****=0A=
--- 999,1019 ----=0A=
  			}=0A=
  			break;=0A=
  =0A=
+ 		case REMOTE_SUBADDR_INCOMING:=0A=
+ 			{=0A=
+ 				int n;=0A=
+ 				n =3D cfg_entry_tab[entrycount].incoming_numbers_count;=0A=
+ 				if (n >=3D MAX_INCOMING)=0A=
+ 				{=0A=
+ 					log(LL_ERR, "ERROR parsing config file: too many =
\"remote_subaddr_incoming\" entries at line %d!", lineno);=0A=
+ 					config_error_flag++;=0A=
+ 					break;=0A=
+ 				}=0A=
+ 				DBGL(DL_RCCF, (log(LL_DBG, "entry %d: remote_subaddr_incoming #%d =
=3D %s", entrycount, n, yylval.str)));=0A=
+ 				strcpy(cfg_entry_tab[entrycount].remote_phone_incoming[n].subaddr, =
yylval.str);=0A=
+ 			}=0A=
+ 			break;=0A=
+ =0A=
  		case RATESFILE:=0A=
  			strcpy(ratesfile, yylval.str);=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "system: ratesfile =3D %s", =
yylval.str)));=0A=
***************=0A=
*** 1136,1141 ****=0A=
--- 1178,1188 ----=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "system: useacctfile =3D %d", =
yylval.booln)));=0A=
  			break;=0A=
  =0A=
+ 		case USESUBADDR:=0A=
+ 			cfg_entry_tab[entrycount].usesubaddr =3D yylval.booln;=0A=
+ 			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: usesubaddr =3D %d", =
entrycount, yylval.booln)));=0A=
+ 			break;=0A=
+ =0A=
  		case USEDOWN:=0A=
  			DBGL(DL_RCCF, (log(LL_DBG, "entry %d: usedown =3D %d", entrycount, =
yylval.booln)));=0A=
  			cfg_entry_tab[entrycount].usedown =3D yylval.booln;=0A=
***************=0A=
*** 1280,1286 ****=0A=
  				log(LL_ERR, "check_config: remote-phone-dialout not set in entry =
%d!", i);=0A=
  				error++;=0A=
  			}=0A=
! 			if(strlen(cep->local_phone_dialout) =3D=3D 0)=0A=
  			{=0A=
  				log(LL_ERR, "check_config: local-phone-dialout not set in entry =
%d!", i);=0A=
  				error++;=0A=
--- 1327,1333 ----=0A=
  				log(LL_ERR, "check_config: remote-phone-dialout not set in entry =
%d!", i);=0A=
  				error++;=0A=
  			}=0A=
! 			if(strlen(cep->local_phone_dialout.number) =3D=3D 0)=0A=
  			{=0A=
  				log(LL_ERR, "check_config: local-phone-dialout not set in entry =
%d!", i);=0A=
  				error++;=0A=
***************=0A=
*** 1291,1297 ****=0A=
  		=0A=
  		if(cep->inout !=3D DIR_OUTONLY)=0A=
  		{=0A=
! 			if(strlen(cep->local_phone_incoming) =3D=3D 0)=0A=
  			{=0A=
  				log(LL_ERR, "check_config: local-phone-incoming not set in entry =
%d!", i);=0A=
  				error++;=0A=
--- 1338,1344 ----=0A=
  		=0A=
  		if(cep->inout !=3D DIR_OUTONLY)=0A=
  		{=0A=
! 			if(strlen(cep->local_phone_incoming.number) =3D=3D 0)=0A=
  			{=0A=
  				log(LL_ERR, "check_config: local-phone-incoming not set in entry =
%d!", i);=0A=
  				error++;=0A=
***************=0A=
*** 1616,1622 ****=0A=
  				fprintf(PFILE, "remote-phone-dialout  =3D %s\t\t# telephone number =
for dialing out to remote\n", cep->remote_numbers[0].number);=0A=
  			}=0A=
  =0A=
! 			fprintf(PFILE, "local-phone-dialout   =3D %s\t\t# show this number =
to remote when dialling out\n", cep->local_phone_dialout);=0A=
  			fprintf(PFILE, "dialout-type          =3D %s\n", cep->dialouttype ? =
"calledback\t\t# i am called back by remote" : "normal\t\t# i am not =
called back by remote");=0A=
  		}=0A=
  =0A=
--- 1663,1669 ----=0A=
  				fprintf(PFILE, "remote-phone-dialout  =3D %s\t\t# telephone number =
for dialing out to remote\n", cep->remote_numbers[0].number);=0A=
  			}=0A=
  =0A=
! 			fprintf(PFILE, "local-phone-dialout   =3D %s\t\t# show this number =
to remote when dialling out\n", cep->local_phone_dialout.number);=0A=
  			fprintf(PFILE, "dialout-type          =3D %s\n", cep->dialouttype ? =
"calledback\t\t# i am called back by remote" : "normal\t\t# i am not =
called back by remote");=0A=
  		}=0A=
  =0A=
***************=0A=
*** 1624,1630 ****=0A=
  		{=0A=
  			int n;=0A=
  			=0A=
! 			fprintf(PFILE, "local-phone-incoming  =3D %s\t\t# incoming calls =
must match this (mine) telephone number\n", cep->local_phone_incoming);=0A=
  			for (n =3D 0; n < cep->incoming_numbers_count; n++)=0A=
  				fprintf(PFILE, "remote-phone-incoming =3D %s\t\t# this is a valid =
remote number to call me\n",=0A=
  					cep->remote_phone_incoming[n].number);=0A=
--- 1671,1677 ----=0A=
  		{=0A=
  			int n;=0A=
  			=0A=
! 			fprintf(PFILE, "local-phone-incoming  =3D %s\t\t# incoming calls =
must match this (mine) telephone number\n", =
cep->local_phone_incoming.number);=0A=
  			for (n =3D 0; n < cep->incoming_numbers_count; n++)=0A=
  				fprintf(PFILE, "remote-phone-incoming =3D %s\t\t# this is a valid =
remote number to call me\n",=0A=
  					cep->remote_phone_incoming[n].number);=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/support.c	Thu Oct 18 13:58:49 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/support.c	Mon Feb 25 17:29:04 2002=0A=
***************=0A=
*** 150,156 ****=0A=
   *	find entry by drivertype and driverunit and setup for dialing out=0A=
   =
*------------------------------------------------------------------------=
---*/=0A=
  cfg_entry_t *=0A=
! find_by_device_for_dialoutnumber(int drivertype, int driverunit, int =
cmdlen, char *cmd)=0A=
  {=0A=
  	cfg_entry_t *cep =3D NULL;=0A=
  	int i, j;=0A=
--- 150,156 ----=0A=
   *	find entry by drivertype and driverunit and setup for dialing out=0A=
   =
*------------------------------------------------------------------------=
---*/=0A=
  cfg_entry_t *=0A=
! find_by_device_for_dialoutnumber(msg_dialoutnumber_ind_t *mp)=0A=
  {=0A=
  	cfg_entry_t *cep =3D NULL;=0A=
  	int i, j;=0A=
***************=0A=
*** 161,168 ****=0A=
  =0A=
  		/* compare driver type and unit */=0A=
  =0A=
! 		if(!((cep->usrdevicename =3D=3D drivertype) &&=0A=
! 		     (cep->usrdeviceunit =3D=3D driverunit)))=0A=
  		{=0A=
  			continue;=0A=
  		}=0A=
--- 161,168 ----=0A=
  =0A=
  		/* compare driver type and unit */=0A=
  =0A=
! 		if(!((cep->usrdevicename =3D=3D mp->driver) &&=0A=
! 		     (cep->usrdeviceunit =3D=3D mp->driver_unit)))=0A=
  		{=0A=
  			continue;=0A=
  		}=0A=
***************=0A=
*** 195,211 ****=0A=
  		=0A=
  		/* check number and copy to cep->remote_numbers[] */=0A=
  		=0A=
! 		for(j =3D 0; j < cmdlen; j++)=0A=
  		{=0A=
! 			if(!(isdigit(*(cmd+j))))=0A=
  			{=0A=
  				DBGL(DL_MSG, (log(LL_DBG, "find_by_device_for_dialoutnumber: entry =
%d, dial string contains non-digit at pos %d", i, j)));=0A=
  				return(NULL);=0A=
  			}=0A=
  			/* fill in number to dial */=0A=
! 			cep->remote_numbers[0].number[j] =3D *(cmd+j);=0A=
  		}				=0A=
  		cep->remote_numbers[0].number[j] =3D '\0';=0A=
  		cep->remote_numbers_count =3D 1;=0A=
  =0A=
  		if((setup_dialout(cep)) =3D=3D GOOD)=0A=
--- 195,225 ----=0A=
  		=0A=
  		/* check number and copy to cep->remote_numbers[] */=0A=
  		=0A=
! 		for(j =3D 0; j < mp->cmdlen; j++)=0A=
  		{=0A=
! 			if(!(isdigit(*(mp->cmd+j))))=0A=
  			{=0A=
  				DBGL(DL_MSG, (log(LL_DBG, "find_by_device_for_dialoutnumber: entry =
%d, dial string contains non-digit at pos %d", i, j)));=0A=
  				return(NULL);=0A=
  			}=0A=
  			/* fill in number to dial */=0A=
! 			cep->remote_numbers[0].number[j] =3D *(mp->cmd+j);=0A=
  		}				=0A=
  		cep->remote_numbers[0].number[j] =3D '\0';=0A=
+ =0A=
+ /* XXX subaddr does not have to be a digit! isgraph() would be a =
better idea */=0A=
+ 		for(j =3D 0; j < mp->subaddrlen; j++)=0A=
+ 		{=0A=
+ 			if(!(isdigit(*(mp->subaddr+j))))=0A=
+ 			{=0A=
+ 				DBGL(DL_MSG, (log(LL_DBG, "find_by_device_for_dialoutnumber: entry =
%d, subaddr string contains non-digit at pos %d", i, j)));=0A=
+ 				return(NULL);=0A=
+ 			}=0A=
+ 			/* fill in number to dial */=0A=
+ 			cep->remote_numbers[0].subaddr[j] =3D *(mp->subaddr+j);=0A=
+ 		}				=0A=
+ 		cep->remote_numbers[0].subaddr[j] =3D '\0';=0A=
+ =0A=
  		cep->remote_numbers_count =3D 1;=0A=
  =0A=
  		if((setup_dialout(cep)) =3D=3D GOOD)=0A=
***************=0A=
*** 273,279 ****=0A=
  =0A=
  		cep->remote_numbers[0].number[0] =3D '\0';=0A=
  		cep->remote_numbers_count =3D 0;=0A=
! 		cep->remote_phone_dialout[0] =3D '\0';=0A=
  		=0A=
  		bzero(cep->keypad, KEYPAD_MAX);=0A=
  		strncpy(cep->keypad, cmd, cmdlen);=0A=
--- 287,293 ----=0A=
  =0A=
  		cep->remote_numbers[0].number[0] =3D '\0';=0A=
  		cep->remote_numbers_count =3D 0;=0A=
! 		cep->remote_phone_dialout.number[0] =3D '\0';=0A=
  		=0A=
  		bzero(cep->keypad, KEYPAD_MAX);=0A=
  		strncpy(cep->keypad, cmd, cmdlen);=0A=
***************=0A=
*** 430,439 ****=0A=
  =0A=
  		/* check my number */=0A=
  =0A=
! 		if(strncmp(cep->local_phone_incoming, mp->dst_telno, =
strlen(cep->local_phone_incoming)))=0A=
  		{=0A=
  			DBGL(DL_MSG, (log(LL_DBG, "find_matching_entry_incoming: entry %d, =
myno %s !=3D incomingno %s", i,=0A=
! 				cep->local_phone_incoming, mp->dst_telno)));=0A=
  			continue;=0A=
  		}=0A=
  =0A=
--- 444,460 ----=0A=
  =0A=
  		/* check my number */=0A=
  =0A=
! 		if(strncmp(cep->local_phone_incoming.number, mp->dst_telno, =
strlen(cep->local_phone_incoming.number)))=0A=
  		{=0A=
  			DBGL(DL_MSG, (log(LL_DBG, "find_matching_entry_incoming: entry %d, =
myno %s !=3D incomingno %s", i,=0A=
! 				cep->local_phone_incoming.number, mp->dst_telno)));=0A=
! 			continue;=0A=
! 		}=0A=
! =0A=
! 		if (cep->usesubaddr && strncmp(cep->local_phone_incoming.subaddr, =
mp->dst_subaddr, strlen(cep->local_phone_incoming.subaddr)))=0A=
! 		{=0A=
! 			DBGL(DL_MSG, (log(LL_DBG, "find_matching_entry_incoming: entry %d, =
myno %s !=3D incomingsub %s", i,=0A=
! 				cep->local_phone_incoming.subaddr, mp->dst_subaddr)));=0A=
  			continue;=0A=
  		}=0A=
  =0A=
***************=0A=
*** 442,456 ****=0A=
  		for (n =3D 0; n < cep->incoming_numbers_count; n++)=0A=
  		{=0A=
  			incoming_number_t *in =3D &cep->remote_phone_incoming[n];=0A=
! 			if(in->number[0] =3D=3D '*')=0A=
  				break;=0A=
! 			if(strncmp(in->number, mp->src_telno, strlen(in->number)))=0A=
  			{=0A=
  				DBGL(DL_MSG, (log(LL_DBG, "find_matching_entry_incoming: entry %d, =
remno %s !=3D incomingfromno %s", i,=0A=
  					in->number, mp->src_telno)));=0A=
  			}=0A=
! 			else=0A=
! 				break;=0A=
  		}=0A=
  		if (n >=3D cep->incoming_numbers_count)=0A=
  			continue;=0A=
--- 463,496 ----=0A=
  		for (n =3D 0; n < cep->incoming_numbers_count; n++)=0A=
  		{=0A=
  			incoming_number_t *in =3D &cep->remote_phone_incoming[n];=0A=
! 			if(in->number[0] =3D=3D '*' && cep->usesubaddr && in->subaddr[0] =
=3D=3D '*')=0A=
! 				break;=0A=
! =0A=
! 			if(in->number[0] =3D=3D '*' && !cep->usesubaddr)=0A=
  				break;=0A=
! =0A=
! 			if(in->number[0] =3D=3D '*' && cep->usesubaddr && =
!strncmp(in->subaddr, mp->src_subaddr, strlen(in->subaddr)))=0A=
! 				break;=0A=
! =0A=
! 			if(strncmp(in->number, mp->src_telno, strlen(in->number)) && =
!cep->usesubaddr)=0A=
  			{=0A=
  				DBGL(DL_MSG, (log(LL_DBG, "find_matching_entry_incoming: entry %d, =
remno %s !=3D incomingfromno %s", i,=0A=
  					in->number, mp->src_telno)));=0A=
  			}=0A=
! =0A=
! 			if(strncmp(in->number, mp->src_telno, strlen(in->number)) && =
cep->usesubaddr && in->subaddr[0] =3D=3D '*')=0A=
! 			{=0A=
! 				DBGL(DL_MSG, (log(LL_DBG, "find_matching_entry_incoming: entry %d, =
remno %s !=3D incomingfromno %s", i,=0A=
! 					in->number, mp->src_telno)));=0A=
! 			}=0A=
! =0A=
! 			if(strncmp(in->number, mp->src_telno, strlen(in->number)) && =
cep->usesubaddr && strncmp(in->subaddr, mp->src_subaddr, =
strlen(in->subaddr)))=0A=
! 			{=0A=
! 				DBGL(DL_MSG, (log(LL_DBG, "find_matching_entry_incoming: entry %d, =
remno %s !=3D incomingfromno %s", i,=0A=
! 					in->number, mp->src_telno)));=0A=
! 			}=0A=
! =0A=
! 			break;=0A=
  		}=0A=
  		if (n >=3D cep->incoming_numbers_count)=0A=
  			continue;=0A=
***************=0A=
*** 583,589 ****=0A=
  		=0A=
  		/* cp number to real one used */=0A=
  		=0A=
! 		strcpy(cep->real_phone_incoming, mp->src_telno);=0A=
  =0A=
  		/* copy display string */=0A=
  		=0A=
--- 623,629 ----=0A=
  		=0A=
  		/* cp number to real one used */=0A=
  		=0A=
! 		strcpy(cep->real_phone_incoming.number, mp->src_telno);=0A=
  =0A=
  		/* copy display string */=0A=
  		=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/timer.c	Sat Jul 21 13:29:40 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/timer.c	Sun Feb 24 16:46:33 2002=0A=
***************=0A=
*** 205,212 ****=0A=
  			{=0A=
  				log(LL_CHD, "%05d %s answering: incoming call from %s to %s",=0A=
  					cep->cdid, cep->name, =0A=
! 					cep->real_phone_incoming,=0A=
! 					cep->local_phone_incoming);=0A=
  				next_state(cep, EV_MCI);=0A=
  			}=0A=
  			break;=0A=
--- 205,212 ----=0A=
  			{=0A=
  				log(LL_CHD, "%05d %s answering: incoming call from %s to %s",=0A=
  					cep->cdid, cep->name, =0A=
! 					cep->real_phone_incoming.number,=0A=
! 					cep->local_phone_incoming.number);=0A=
  				next_state(cep, EV_MCI);=0A=
  			}=0A=
  			break;=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/rc_parse.y	Sat Jul 21 13:29:40 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/rc_parse.y	Mon Feb 25 16:53:35 2002=0A=
***************=0A=
*** 117,123 ****=0A=
--- 117,125 ----=0A=
  %token		ISDNTXDELIN=0A=
  %token		ISDNTXDELOUT=0A=
  %token		LOCAL_PHONE_DIALOUT=0A=
+ %token		LOCAL_SUBADDR_DIALOUT=0A=
  %token		LOCAL_PHONE_INCOMING=0A=
+ %token		LOCAL_SUBADDR_INCOMING=0A=
  %token		LOGEVENTS=0A=
  %token		MAILER=0A=
  %token		MAILTO=0A=
***************=0A=
*** 147,153 ****=0A=
--- 149,157 ----=0A=
  %token		REGPROG=0A=
  %token		REMOTE_NUMBERS_HANDLING=0A=
  %token		REMOTE_PHONE_DIALOUT=0A=
+ %token		REMOTE_SUBADDR_DIALOUT=0A=
  %token		REMOTE_PHONE_INCOMING=0A=
+ %token		REMOTE_SUBADDR_INCOMING=0A=
  %token		RESTRICTEDCMD=0A=
  %token		ROTATESUFFIX=0A=
  %token		RTPRIO=0A=
***************=0A=
*** 156,161 ****=0A=
--- 160,166 ----=0A=
  %token		UNITLENGTH=0A=
  %token		UNITLENGTHSRC=0A=
  %token		USEACCTFILE=0A=
+ %token		USESUBADDR=0A=
  %token		USEDOWN=0A=
  %token		USRDEVICENAME=0A=
  %token		USRDEVICEUNIT=0A=
***************=0A=
*** 427,433 ****=0A=
--- 432,440 ----=0A=
  		| DISCONNECTPROG	{ $$ =3D DISCONNECTPROG; }=0A=
  		| IDLE_ALG_OUT		{ $$ =3D IDLE_ALG_OUT; }=0A=
  		| LOCAL_PHONE_INCOMING	{ $$ =3D LOCAL_PHONE_INCOMING; }=0A=
+ 		| LOCAL_SUBADDR_INCOMING	{ $$ =3D LOCAL_SUBADDR_INCOMING; }=0A=
  		| LOCAL_PHONE_DIALOUT	{ $$ =3D LOCAL_PHONE_DIALOUT; }=0A=
+ 		| LOCAL_SUBADDR_DIALOUT	{ $$ =3D LOCAL_SUBADDR_DIALOUT; }=0A=
  		| NAME			{ $$ =3D NAME; }		=0A=
  		| PPP_EXPECT_AUTH	{ $$ =3D PPP_EXPECT_AUTH; }=0A=
  		| PPP_EXPECT_NAME	{ $$ =3D PPP_EXPECT_NAME; }=0A=
***************=0A=
*** 438,444 ****=0A=
--- 445,453 ----=0A=
  		| REACTION		{ $$ =3D REACTION; }=0A=
  		| REMOTE_NUMBERS_HANDLING { $$ =3D REMOTE_NUMBERS_HANDLING; }=0A=
  		| REMOTE_PHONE_INCOMING	{ $$ =3D REMOTE_PHONE_INCOMING; }=0A=
+ 		| REMOTE_SUBADDR_INCOMING	{ $$ =3D REMOTE_SUBADDR_INCOMING; }=0A=
  		| REMOTE_PHONE_DIALOUT	{ $$ =3D REMOTE_PHONE_DIALOUT; }=0A=
+ 		| REMOTE_SUBADDR_DIALOUT	{ $$ =3D REMOTE_SUBADDR_DIALOUT; }=0A=
  		| UNITLENGTHSRC		{ $$ =3D UNITLENGTHSRC; }		=0A=
  		| USRDEVICENAME		{ $$ =3D USRDEVICENAME; }=0A=
  		| VALID			{ $$ =3D VALID; }=0A=
***************=0A=
*** 475,480 ****=0A=
--- 484,490 ----=0A=
  		| PPP_AUTH_RECHALLENGE	{ $$ =3D PPP_AUTH_RECHALLENGE; }=0A=
  		| PPP_AUTH_PARANOID	{ $$ =3D PPP_AUTH_PARANOID; }=0A=
  		| USEDOWN		{ $$ =3D USEDOWN; }=0A=
+ 		| USESUBADDR		{ $$ =3D USESUBADDR; }=0A=
  		;=0A=
  =0A=
  /* =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D */=0A=
*** /usr/src/usr.sbin/i4b/isdnd.orig/rc_scan.l	Sat Jul 21 13:29:40 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnd/rc_scan.l	Mon Feb 25 16:52:02 2002=0A=
***************=0A=
*** 128,134 ****=0A=
--- 128,136 ----=0A=
  isdntxdel-incoming		{ return ISDNTXDELIN; }=0A=
  isdntxdel-outgoing		{ return ISDNTXDELOUT; }=0A=
  local-phone-dialout		{ return LOCAL_PHONE_DIALOUT; }=0A=
+ local-subaddr-dialout		{ return LOCAL_SUBADDR_DIALOUT; }=0A=
  local-phone-incoming		{ return LOCAL_PHONE_INCOMING; }=0A=
+ local-subaddr-incoming		{ return LOCAL_SUBADDR_INCOMING; }=0A=
  mailer				{ return MAILER; }=0A=
  mailto				{ return MAILTO; }=0A=
  maxconnecttime			{ return MAXCONNECTTIME; }=0A=
***************=0A=
*** 162,168 ****=0A=
--- 164,172 ----=0A=
  regprog				{ return REGPROG; }=0A=
  remdial-handling		{ return REMOTE_NUMBERS_HANDLING; }=0A=
  remote-phone-dialout		{ return REMOTE_PHONE_DIALOUT; }=0A=
+ remote-subaddr-dialout		{ return REMOTE_SUBADDR_DIALOUT; }=0A=
  remote-phone-incoming		{ return REMOTE_PHONE_INCOMING; }=0A=
+ remote-subaddr-incoming		{ return REMOTE_SUBADDR_INCOMING; }=0A=
  rotatesuffix			{ return ROTATESUFFIX; }=0A=
  rtprio				{ return RTPRIO; }=0A=
  system				{ return SYSTEM; }=0A=
***************=0A=
*** 170,175 ****=0A=
--- 174,180 ----=0A=
  unitlength			{ return UNITLENGTH; }=0A=
  unitlengthsrc			{ return UNITLENGTHSRC; }=0A=
  useacctfile			{ return USEACCTFILE; }=0A=
+ usesubaddr			{ return USESUBADDR; }=0A=
  usrdevicename			{ return USRDEVICENAME; }=0A=
  usrdeviceunit			{ return USRDEVICEUNIT; }=0A=
  usedown				{ return USEDOWN; }=0A=
*** /usr/src/sys/i4b/layer3.orig/i4b_l2if.c	Thu Oct 18 13:53:49 2001=0A=
--- /usr/src/sys/i4b/layer3/i4b_l2if.c	Mon Feb 25 17:34:16 2002=0A=
***************=0A=
*** 422,428 ****=0A=
--- 422,430 ----=0A=
  	u_char *ptr;=0A=
  	int len;=0A=
  	int slen =3D strlen(cd->src_telno);=0A=
+ 	int sslen =3D strlen(cd->src_subaddr);=0A=
  	int dlen =3D strlen(cd->dst_telno);=0A=
+ 	int dslen =3D strlen(cd->dst_subaddr);=0A=
  	int klen =3D strlen(cd->keypad);	=0A=
  =0A=
  	/*=0A=
***************=0A=
*** 437,443 ****=0A=
--- 439,447 ----=0A=
  	len =3D 	I_FRAME_HDRLEN		+=0A=
  		MSG_SETUP_LEN		+=0A=
  		(slen ? (3+slen) : 0)	+=0A=
+ 		(sslen ? (3+sslen) : 0)	+=0A=
  		(dlen ? (3+dlen) : 0)	+=0A=
+ 		(dslen ? (3+dslen) : 0)	+=0A=
  		(klen ? (2+klen) : 0)	+=0A=
  		(cd->bprot =3D=3D BPROT_NONE ? 1 : 0);=0A=
  =0A=
***************=0A=
*** 521,526 ****=0A=
--- 525,539 ----=0A=
  		ptr +=3D slen;=0A=
  	}=0A=
  =0A=
+ 	if(sslen)=0A=
+ 	{=0A=
+ 		*ptr++ =3D IEI_CALLINGPS;		/* calling subaddr */=0A=
+ 		*ptr++ =3D 1+sslen;		/* calling subaddr len */=0A=
+ 		*ptr++ =3D 0x80;			/* XXX */=0A=
+ 		strncpy(ptr, cd->src_subaddr, sslen);=0A=
+ 		ptr +=3D sslen;=0A=
+ 	}=0A=
+ =0A=
  	if(dlen)=0A=
  	{=0A=
  		*ptr++ =3D IEI_CALLEDPN;		/* called party no */=0A=
***************=0A=
*** 528,533 ****=0A=
--- 541,555 ----=0A=
  		*ptr++ =3D NUMBER_TYPEPLAN;	/* type of number, number plan id */=0A=
  		strncpy(ptr, cd->dst_telno, dlen);=0A=
  		ptr +=3D dlen;=0A=
+ 	}=0A=
+ =0A=
+ 	if(dslen)=0A=
+ 	{	=0A=
+ 		*ptr++ =3D IEI_CALLEDPS;		/* calling party subaddr */=0A=
+ 		*ptr++ =3D 1+dslen;		/* calling party subaddr len */=0A=
+ 		*ptr++ =3D 0x80;			/* XXX */=0A=
+ 		strncpy(ptr, cd->dst_subaddr, dslen);=0A=
+ 		ptr +=3D dslen;=0A=
  	}=0A=
  	=0A=
  	DL_Data_Req(ctrl_desc[cd->controller].unit, m);=0A=
*** /usr/src/sys/i4b/layer4.orig/i4b_i4bdrv.c	Sun Dec 30 10:27:28 2001=0A=
--- /usr/src/sys/i4b/layer4/i4b_i4bdrv.c	Mon Feb 25 17:30:29 2002=0A=
***************=0A=
*** 441,446 ****=0A=
--- 441,449 ----=0A=
  			strcpy(cd->dst_telno, mcr->dst_telno);=0A=
  			strcpy(cd->src_telno, mcr->src_telno);=0A=
  =0A=
+ 			strcpy(cd->dst_subaddr, mcr->dst_subaddr);=0A=
+ 			strcpy(cd->src_subaddr, mcr->src_subaddr);=0A=
+ =0A=
  			if(mcr->keypad[0] !=3D '\0')=0A=
  				strcpy(cd->keypad, mcr->keypad);=0A=
  			else=0A=
*** /usr/src/sys/i4b/layer4.orig/i4b_l4.c	Thu Oct 18 13:53:49 2001=0A=
--- /usr/src/sys/i4b/layer4/i4b_l4.c	Sun Feb 24 16:45:53 2002=0A=
***************=0A=
*** 230,235 ****=0A=
--- 230,236 ----=0A=
  	if((m =3D i4b_Dgetmbuf(sizeof(msg_dialoutnumber_ind_t))) !=3D NULL)=0A=
  	{=0A=
  		msg_dialoutnumber_ind_t *md =3D (msg_dialoutnumber_ind_t *)m->m_data;=0A=
+ 		int i;=0A=
  =0A=
  		md->header.type =3D MSG_DIALOUTNUMBER_IND;=0A=
  		md->header.cdid =3D -1;=0A=
***************=0A=
*** 237,247 ****=0A=
  		md->driver =3D driver;=0A=
  		md->driver_unit =3D driver_unit;=0A=
  =0A=
! 		if(cmdlen > TELNO_MAX)=0A=
! 			cmdlen =3D TELNO_MAX;=0A=
  =0A=
! 		md->cmdlen =3D cmdlen;=0A=
! 		bcopy(cmd, md->cmd, cmdlen);=0A=
  		i4bputqueue(m);=0A=
  	}=0A=
  }=0A=
--- 238,256 ----=0A=
  		md->driver =3D driver;=0A=
  		md->driver_unit =3D driver_unit;=0A=
  =0A=
! 		for (i =3D 0; i < cmdlen; i++)=0A=
! 			if (cmd[i] =3D=3D '*')=0A=
! 				break;=0A=
  =0A=
! 		/* TELNO_MAX is _with_ tailing '\0', so max is actually TELNO_MAX - =
1 */=0A=
! 		md->cmdlen =3D (i < TELNO_MAX  - 1 ? i : TELNO_MAX - 1);=0A=
! 		/* skip the (first) '*' */=0A=
! 		md->subaddrlen =3D (cmdlen - i - 1 < SUBADDR_MAX - 1 ? cmdlen - i - =
1 : SUBADDR_MAX - 1);=0A=
! =0A=
! 		bcopy(cmd, md->cmd, md->cmdlen);=0A=
! 		bcopy(cmd+i+1, md->subaddr, md->subaddrlen); =0A=
! =0A=
! 		NDBGL4(L4_TIMO, "cmd[%d]=3D%s, subaddr[%d]=3D%s", md->cmdlen, =
md->cmd, md->subaddrlen, md->subaddr);=0A=
  		i4bputqueue(m);=0A=
  	}=0A=
  }=0A=
*** /usr/src/usr.sbin/i4b/isdnphone.orig/main.c	Thu Oct 18 13:58:49 2001=0A=
--- /usr/src/usr.sbin/i4b/isdnphone/main.c	Sun Feb 24 16:46:24 2002=0A=
***************=0A=
*** 67,79 ****=0A=
  	int bschar;=0A=
  	int ret;=0A=
  	int opt_n =3D 0;=0A=
  	int opt_h =3D 0;=0A=
  	int opt_k =3D 0;=0A=
  	char *number =3D "";=0A=
  	=0A=
  	numberbuffer[0] =3D '\0';	=0A=
  =0A=
! 	while ((c =3D getopt(argc, argv, "dhk:n:u:")) !=3D -1)=0A=
  	{=0A=
  		switch(c)=0A=
  		{=0A=
--- 67,81 ----=0A=
  	int bschar;=0A=
  	int ret;=0A=
  	int opt_n =3D 0;=0A=
+ 	int opt_s =3D 0;=0A=
  	int opt_h =3D 0;=0A=
  	int opt_k =3D 0;=0A=
  	char *number =3D "";=0A=
+ 	char *subaddr =3D "";=0A=
  	=0A=
  	numberbuffer[0] =3D '\0';	=0A=
  =0A=
! 	while ((c =3D getopt(argc, argv, "dhk:n:s:u:")) !=3D -1)=0A=
  	{=0A=
  		switch(c)=0A=
  		{=0A=
***************=0A=
*** 94,99 ****=0A=
--- 96,106 ----=0A=
  				number =3D optarg;=0A=
  				opt_n =3D 1;=0A=
  				break;=0A=
+ =0A=
+ 			case 's':=0A=
+ 				subaddr =3D optarg;=0A=
+ 				opt_s =3D 1;=0A=
+ 				break;=0A=
  				=0A=
  			case 'u':=0A=
  				opt_unit =3D atoi(optarg);=0A=
***************=0A=
*** 121,127 ****=0A=
  		=0A=
  		if(opt_n)=0A=
  		{=0A=
! 			sprintf(commandbuffer, "D%s", number);=0A=
  	=0A=
  		}=0A=
  		else if(opt_k)=0A=
--- 128,137 ----=0A=
  		=0A=
  		if(opt_n)=0A=
  		{=0A=
! 			if (opt_s)=0A=
! 				sprintf(commandbuffer, "D%s*%s", number, subaddr);=0A=
! 			else=0A=
! 				sprintf(commandbuffer, "D%s", number);=0A=
  	=0A=
  		}=0A=
  		else if(opt_k)=0A=
*** /usr/src/sys/i4b/include.orig/i4b_l3l4.h	Mon Feb 18 21:37:31 2002=0A=
--- /usr/src/sys/i4b/include/i4b_l3l4.h	Mon Feb 25 17:33:22 2002=0A=
***************=0A=
*** 154,160 ****=0A=
--- 154,162 ----=0A=
  	int	call_state;		/* from incoming SETUP	*/=0A=
  	=0A=
  	u_char	dst_telno[TELNO_MAX];	/* destination number	*/=0A=
+ 	u_char	dst_subaddr[SUBADDR_MAX];	/* destination subaddr	*/=0A=
  	u_char	src_telno[TELNO_MAX];	/* source number	*/=0A=
+ 	u_char	src_subaddr[SUBADDR_MAX];	/* source subaddr	*/=0A=
  =0A=
  	int	scr_ind;		/* screening ind for incoming call */=0A=
  	int	prs_ind;		/* presentation ind for incoming call */=0A=

------=_NextPart_000_0005_01C1BEEA.6CD8D960
Content-Type: application/octet-stream;
	name="useless_comment.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="useless_comment.diff"

*** /usr/src/usr.sbin/i4b/isdnd/fsm.c.orig	Tue Jan 29 20:34:56 2002=0A=
--- /usr/src/usr.sbin/i4b/isdnd/fsm.c	Tue Jan 29 20:35:48 2002=0A=
***************=0A=
*** 210,216 ****=0A=
  	{=0A=
  		cep->dial_count++;=0A=
  	=0A=
! 		if(cep->dial_count < cep->dialretries || cep->dialretries =3D=3D -1) =
/* Added by FST <mailto:fsteevie@dds.nl> for unlimited dialing (sorry, =
but I needed it) */=0A=
  		{=0A=
  			/* inside normal retry cycle */=0A=
  		=0A=
--- 210,216 ----=0A=
  	{=0A=
  		cep->dial_count++;=0A=
  	=0A=
! 		if(cep->dial_count < cep->dialretries || cep->dialretries =3D=3D -1)=0A=
  		{=0A=
  			/* inside normal retry cycle */=0A=
  		=0A=
***************=0A=
*** 288,294 ****=0A=
  {	=0A=
  	cep->dial_count++;=0A=
  =0A=
! 	if(cep->dial_count < cep->dialretries || cep->dialretries =3D=3D -1) =
/* Added by FST <mailto:fsteevie@dds.nl> for unlimited dialing (sorry, =
but I needed it) */=0A=
  	{=0A=
  		/* inside normal retry cycle */=0A=
  	=0A=
--- 288,294 ----=0A=
  {	=0A=
  	cep->dial_count++;=0A=
  =0A=
! 	if(cep->dial_count < cep->dialretries || cep->dialretries =3D=3D -1)=0A=
  	{=0A=
  		/* inside normal retry cycle */=0A=
  	=0A=

------=_NextPart_000_0005_01C1BEEA.6CD8D960--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-isdn" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?000801c1bee2$185c6800$0200a8c0>