diff -r -u asterisk-1.4.22/channels/chan_sip.c asterisk-1.4.22-patched/channels/chan_sip.c --- asterisk-1.4.22/channels/chan_sip.c 2008-09-08 23:10:10.000000000 +0200 +++ asterisk-1.4.22-patched/channels/chan_sip.c 2009-01-07 14:12:03.000000000 +0100 @@ -17702,10 +17711,15 @@ if (ucfg) { struct ast_variable *gen; int genhassip, genregistersip; - const char *hassip, *registersip; + const char *hassip, *registersip, *gentype, *type; genhassip = ast_true(ast_variable_retrieve(ucfg, "general", "hassip")); genregistersip = ast_true(ast_variable_retrieve(ucfg, "general", "registersip")); + gentype = ast_variable_retrieve(ucfg, "general", "siptype"); + if (!gentype) { + gentype = "friend"; + ast_log(LOG_DEBUG, "SIP type not specified in general section, assuming 'friend'\n"); + } gen = ast_variable_browse(ucfg, "general"); cat = ast_category_browse(ucfg, NULL); while (cat) { @@ -17713,18 +17727,31 @@ hassip = ast_variable_retrieve(ucfg, cat, "hassip"); registersip = ast_variable_retrieve(ucfg, cat, "registersip"); if (ast_true(hassip) || (!hassip && genhassip)) { - user = build_user(cat, gen, ast_variable_browse(ucfg, cat), 0); - if (user) { - ASTOBJ_CONTAINER_LINK(&userl,user); - ASTOBJ_UNREF(user, sip_destroy_user); - user_count++; + type = ast_variable_retrieve(ucfg, cat, "siptype"); + if (!type) { + type = gentype; + ast_log(LOG_DEBUG, "user found: SIP type not specified, using general configuration: %s\n", type); + } else { + ast_log(LOG_DEBUG, "user found: SIP type specified:: %s\n", type); } - peer = build_peer(cat, gen, ast_variable_browse(ucfg, cat), 0); - if (peer) { - ast_device_state_changed("SIP/%s", peer->name); - ASTOBJ_CONTAINER_LINK(&peerl,peer); - ASTOBJ_UNREF(peer, sip_destroy_peer); - peer_count++; + if (!strcasecmp(type, "user") || !strcasecmp(type, "friend")) { + ast_log(LOG_DEBUG, "generating SIP user ...\n"); + user = build_user(cat, gen, ast_variable_browse(ucfg, cat), 0); + if (user) { + ASTOBJ_CONTAINER_LINK(&userl,user); + ASTOBJ_UNREF(user, sip_destroy_user); + user_count++; + } + } + if (!strcasecmp(type, "peer") || !strcasecmp(type, "friend")) { + ast_log(LOG_DEBUG, "generating SIP peer ...\n"); + peer = build_peer(cat, gen, ast_variable_browse(ucfg, cat), 0); + if (peer) { + ast_device_state_changed("SIP/%s", peer->name); + ASTOBJ_CONTAINER_LINK(&peerl,peer); + ASTOBJ_UNREF(peer, sip_destroy_peer); + peer_count++; + } } } if (ast_true(registersip) || (!registersip && genregistersip)) { diff -r -u asterisk-1.4.22/configs/users.conf.sample asterisk-1.4.22-patched/configs/users.conf.sample --- asterisk-1.4.22/configs/users.conf.sample 2007-11-28 23:30:46.000000000 +0100 +++ asterisk-1.4.22-patched/configs/users.conf.sample 2009-01-07 13:33:38.000000000 +0100 @@ -30,10 +30,15 @@ ; vmsecret = 1234 ; -; Create SIP Peer +; Create SIP user/peer ; hassip = yes ; +; Specify SIP type, default is 'friend' +; Can be overruled on a per-user basis by using siptype=.... +; +;siptype = peer +; ; Create IAX friend ; hasiax = yes @@ -77,3 +82,5 @@ ;hasmanager = no ;callwaiting = no ;context = international +;siptype = peer +