func: static void *skinny_ss(void *data) struct ast_channel * c = data ; struct skinny_subchannel * sub = c -> tech_pvt ; struct skinny_line * l = sub -> line ; int timeout = firstdigittimeout ; int loop_pause = 100 ; len = strlen ( sub -> exten ); while ( len < AST_MAX_EXTENSION - 1 )  res = 1; while ( strlen ( sub -> exten ) == len )  timeout -= loop_pause; if ( ( timeout -= loop_pause ) <= 0 )  res = 0; res = 1; if ( sub != l -> activesub )  timeout = 0; len = strlen ( sub -> exten ); if ( ast_exists_extension ( c , c -> context , sub -> exten , 1 , l -> cid_num ) )  if ( ! res || ! ast_matchmore_extension ( c , c -> context , sub -> exten , 1 , l -> cid_num ) )  if ( l -> getforward )  set_callforwards ( l , sub -> exten , l -> getforward ); timeout = matchdigittimeout; if ( res == 0 )  if ( ! ast_canmatch_extension ( c , c -> context , sub -> exten , 1 , S_COR ( c -> caller . id . number . valid , c -> caller . id . number . str , NULL ) ) && ( ( sub -> exten [ 0 ] != '*' ) || ( ! ast_strlen_zero ( sub -> exten ) > 2 ) ) )  if ( ! timeout )  timeout = gendigittimeout; static int set_callforwards(struct skinny_line *l, const char *cfwd, int cfwdtype) if ( ! l )  if ( ! ast_strlen_zero ( cfwd ) )  if ( cfwdtype & SKINNY_CFWD_ALL )  l -> cfwdtype &= ~SKINNY_CFWD_ALL; memset ( l -> call_forward_all , 0 , sizeof ( l -> call_forward_all ) ); if ( cfwdtype & SKINNY_CFWD_BUSY )  l -> cfwdtype &= ~SKINNY_CFWD_BUSY; memset ( l -> call_forward_busy , 0 , sizeof ( l -> call_forward_busy ) ); if ( cfwdtype & SKINNY_CFWD_NOANSWER )  l -> cfwdtype &= ~SKINNY_CFWD_NOANSWER; memset ( l -> call_forward_noanswer , 0 , sizeof ( l -> call_forward_noanswer ) ); return l -> cfwdtype ; 