rem: ret=t_uac(&sm,&sd,&sh,&sb, 0 ,
add: ret=t_uac(&sm,&sd, PROTO_UDP,&sh,&sb, 0 ,
context: int fifo_uac( FILE *stream, char *response_file ) {	str sm, sh, sb, sd; /* method, header, body, dst(outbound) */	char method[MAX_METHOD]; /* read buffers for these ... */	char header[MAX_HEADER];	char body[MAX_BODY];	char dst[MAX_DST];	char *shmem_file;	int fn_len;	int ret;	int sip_error;	char err_buf[MAX_REASON_LEN];	sm.s=method; sh.s=header; sb.s=body; sd.s=dst;	if (!read_line(method, MAX_METHOD, stream,&sm.len)||sm.len==0) {		/* line breaking must have failed -- consume the rest		   and proceed to a new request		*/		LOG(L_ERR, "ERROR: fifo_uac: method expected\n");		fifo_reply(response_file, 			"400 fifo_uac: method expected");		return 1;	}	DBG("DEBUG: fifo_uac: method: %.*s\n", sm.len, method );	if (!read_line(dst, MAX_DST, stream, &sd.len)||sd.len==0) {		fifo_reply(response_file, 			"400 fifo_uac: destination expected\n");		LOG(L_ERR, "ERROR: fifo_uac: destination expected\n");		return 1;	}	DBG("DEBUG: fifo_uac:  dst: %.*s\n", sd.len, dst );	/* now read header fields line by line */	if (!read_line_set(header, MAX_HEADER, stream, &sh.len)) {		fifo_reply(response_file, 			"400 fifo_uac: HFs expected\n");		LOG(L_ERR, "ERROR: fifo_uac: header fields expected\n");		return 1;	}	DBG("DEBUG: fifo_uac: header: %.*s\n", sh.len, header );	/* and eventually body */	if (!read_body(body, MAX_BODY, stream, &sb.len)) {		fifo_reply(response_file, 			"400 fifo_uac: body expected\n");		LOG(L_ERR, "ERROR: fifo_uac: body expected\n");		return 1;	}	DBG("DEBUG: fifo_uac: body: %.*s\n", sb.len, body );	DBG("DEBUG: fifo_uac: EoL -- proceeding to transaction creation\n");	/* we got it all, initiate transaction now! */	if (response_file) {		fn_len=strlen(response_file)+1;		shmem_file=shm_malloc(fn_len);		if (shmem_file==0) {			LOG(L_ERR, "ERROR: fifo_uac: no shmem\n");			fifo_reply(response_file, 				"500 fifo_uac: no shmem for shmem_file\n");			return 1;		}		memcpy(shmem_file, response_file, fn_len );	} else {		shmem_file=0;	}	ret=t_uac(&sm,&sd,&sh,&sb, 0 /* default from */,		fifo_callback,shmem_file,0 /* no dialog */);	if (ret>0) {		if (err2reason_phrase(ret, &sip_error, err_buf,				sizeof(err_buf), "FIFO/UAC" ) > 0 ) 		{			fifo_reply(response_file, "500 FIFO/UAC error: %d\n",				ret );		} else {			fifo_reply(response_file, err_buf );		}	}	return 1;}