2012年8月26日 星期日

Linux get ipv6 default route

在ipv6情況下可以從/proc/net/ipv6_route印出當前default route資訊。試了一下發現內容順序以及值會跟隨目前routing作改變。在參考了route_linux.c以及how to get ipv6 default gateway from proc in linux之後,改寫出以下範例。

int getIpv6DefaultGatway(char *ifname, char *dgw, int dgw_size){
struct in6_addr src_addr;
int src_prefix;
struct in6_addr dst_addr;
int dst_prefix;
struct in6_addr gw_addr;
struct in6_addr any_addr;
unsigned int metrix;
unsigned int ref_cnt;
unsigned int usr_cnt;
unsigned int flag;
char devname[32];
FILE *fp;
int ret;
char dst[64];
char src[64];
char gw[64];

if(ifname == NULL){
return 0;
}

strcpy(dgw, "");

fp = fopen("/proc/net/ipv6_route", "r");
if(fp!=NULL){
memset(&any_addr, 0, sizeof(any_addr));
while((ret=fscanf(fp, "%s %x %s %x %s %x %x %x %x %s",
dst, &dst_prefix, src, &src_prefix, gw,
&metrix, &ref_cnt, &usr_cnt, &flag, devname)) != EOF){


/*return value must be parameter's number*/
if(ret != 10){
continue;
}

/*default route?*/
if(!strncmp(gw, "fe80", 4)
&& !strcmp(dst, "00000000000000000000000000000000") && dst_prefix == 0
&& !strcmp(ifname, devname)){


sprintf(gw, "%c%c%c%c:%c%c%c%c:%c%c%c%c:%c%c%c%c:%c%c%c%c:%c%c%c%c:%c%c%c%c:%c%c%c%c",
gw[0], gw[1], gw[2], gw[3], gw[4], gw[5], gw[6], gw[7], gw[8], gw[9],
gw[10], gw[11], gw[12], gw[13], gw[14], gw[15], gw[16], gw[17], gw[18], gw[19],
gw[20], gw[21], gw[22], gw[23], gw[24], gw[25], gw[26], gw[27], gw[28], gw[29],
gw[30], gw[31]);

inet_pton(PF_INET6, gw, &gw_addr);
inet_ntop(PF_INET6, &gw_addr, gw, sizeof(gw));

snprintf(dgw, dgw_size, "%s", gw);

//DO NOT BREAK to get last gateway
}
}
}
fclose(fp);

if(!strcmp(dgw, "")){
return 0;
}

return 1;
}

2012年8月21日 星期二

exec, spawn, system不同點

根據stackoverflow中Difference b/w exec( ) and system( ) in unix這篇文章中討論到的

exec: 覆蓋原本的程式,執行完即結束。

spawn: 啟動一個新的子程式(fork效用相當),並且和原本的程式同時進行。

system: 啟動一個新的子程式(fork效用相當),並且原本程式會等待該子程式執行完後才結束。