2015年4月26日 星期日

Kamailio script select variables (@)

select 變數格式是 @name,方便取得 SIP 訊息的某個部份或其它,可視為一個回傳唯讀字串的函數,例如 @via[1].host 回傳第一個 Via header 的 IP。

模組可以到選擇表 (register_select_table()) 登記來擴充 select 變數。

select 變數也可以透過 pv 模組的虛擬變數 $sel(name) 取得。(有 @name 了,為何還需要 $sel(name)?)

參考來源:
  1. http://www.kamailio.org/wiki/cookbooks/4.2.x/selectshttp://sip-router.org/wiki/cookbooks/selects/devel
延伸閱讀

Kamailio pseudo variables ($)

虛擬變數 (pseudo variable, pvar,對應到內部的實際變數?) 以「$」開頭,如果需要字元「$」,寫成「$$」。有預先定義的虛擬變數及對應到 AVP (Attribute Value Pair) 或 Headers 的特殊虛擬變數,大部分由 pv 模組提供。詳細虛擬變數列表可見 Kamailio SIP Server v4.2.x (stable): Pseudo-Variables

$rc, $retcode:return code
$ru, $rd, $rU, $rp (來自 pv 模組):分別是 Request URI 及其 domain, user, port
$du (來自 pv 模組):destination URI,rewritehost() 等會設定 $du
$fd (來自 pv 模組):From domain
$td (來自 pv 模組):To domain
$sel(name):來自 pv 模組,相當於 @name
$branch(name): 取得額外分支的 name 屬性。可用 index 取得特定分支,沒有 index 代表第一個分支,-1 代表最後分支。
$var(name):自訂名為 name 的記憶體變數,值可為整數或字串,使用上比 AVP 快。

虛擬變數可以轉換成另一個值,例如字串長度、md5 值等,格式是 $(pv{transformation}),轉換用「{」、「}」包起來緊接在虛擬變數名稱後面,整個再用「(」、「)」包起來。大部分的虛擬變數轉換仍由 pv 模組提供。詳情見:http://www.kamailio.org/wiki/cookbooks/4.2.x/transformations

2015年4月21日 星期二

assert()

#include <assert.h>

void assert(scalar expression);

assert(表示式) 是個標準的 macro,用來方便程式除錯。當表示式結果為 0 (邏輯判斷為假) 時,會印包含檔名、行數、函數名及表示式的訊息到 stderr,然後呼叫 abort() 結束程式。如果在 <assert.h> 之前有定義 NDEBUG 的話,就會關閉 assert() 功能,整個 assert() 會省略掉,不會產生任何程式碼。所以 assert() 不能含有有作用的程式。

簡略的 assert.h 如下:
#ifdef  NDEBUG
#define assert(expr)        ((void) (0))
#else /* Not NDEBUG.  */
#define assert(expr)       ((void) ((expr) ? 0 :                                                             \
                       (__assert (__STRING(expr), __FILE__, __LINE__, __func__), 0)))
#endif /* NDEBUG.  */
而 __assert() 函數如下:
static smallint in_assert;                      /* bss inits to 0. */

void __assert(const char *assertion, const char * filename,
              unsigned int linenumber, register const char * function)
{
        if (!in_assert) {
                in_assert = 1;

                fprintf(stderr,
                                "%s: %d: %s: Assertion `%s' failed.\n",
                                filename,
                                linenumber,
                                /* Function name isn't available with some compilers. */
                                ((function == NULL) ? "?function?" : function),
                                assertion
                                );
        }
        abort();
}

參考來源:man assert, assert.h, __assert.c

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...