2014年4月10日 星期四

設定 Debian 預設啟動服務

自動啟動服務的土砲方式是自己寫在 /etc/rc.local 或 /sbin/setup.sh 之類的地方,

或者自己手動去做 symlink(從 /etc/init.d/* 至 /etc/rc?.d/ ),以前我都手動這樣做。

不過,這樣太辛苦了,應該都會有正規方法,所以下列是參考資料使用系統內建指令處理的方式,

利用 update-rc.d 或 insserv 加入需要開機自動啟動的程式、反之移除之,

即為將 init.d 的 script 做 S 開頭加上號碼的 soft link 到 rc*.d 中 (* = runlevel),

Debian 6.0 之前是使用 update-rc.d,而 6.0 以後則是使用 insserv,至於 Ubuntu 是使用 update-rc.d。

啟動服務
insserv service 或
update-rc.d servic defaults

例如,啟動 bind9, insserv bind9

關閉服務
insserv -r service 或
update-rc.d service remove

參考資料
Peter Dave Hello's Blog, Debian / Ubuntu 系列 GNU/Linux 服務開機自動啟動調整

在 Linux 系統呈現 dd 的進度

範例:定時呈現 dd 進度

撰寫一個名為 show_all_dd.sh 的 shell script, 針對全部的 dd 指令:
#!/bin/bash
while 
  killall -USR1 dd;
  do sleep 5; 
done
或者用 pid 指定特定的 dd process,假設將 shell 存為 show_dd.sh 檔名,

可用 ./show_dd.sh pid 來執行[pid 是 dd 的 process ID]
#!/bin/bash
# 這邊要依據自己系統上的 dd process ID 
pid=$1

while 
  kill -USR1 $pid;
  do sleep 5; 
done

參考資料
晟誼科技,http://www.datasos.tw/jiuyuanjishu/20130805/2300.html

2014年4月5日 星期六

製作 patch 檔

例如:

old.c 是舊的程式原始碼,new.c是修改過的新程式碼,

只要使用 diff 就能夠製作出patch檔

# diff old.c new.c -Naur > patch.sample

拿到 patch 檔的人只要下這行指令,便可以將他手中的old.c 更新為與 new.c 一樣的程式碼。

# patch -p0 < patch.sample 如果目錄中有多個原始檔,也可以整個目錄 diff # diff DirA DirB -Naur > patch.sample

C struct 的使用

vsftpd-2.0.3

333 static void
334 copy_string_settings(void)
335 {
338   const struct parseconf_str_setting* p_str_setting = parseconf_str_array;
339   while (p_str_setting->p_setting_name != 0)
340   {
341     if (*p_str_setting->p_variable != 0)
342     {
343       *p_str_setting->p_variable =
344       vsf_sysutil_strdup(*p_str_setting->p_variable);
345     }
346     p_str_setting++;
347    }
348 }

定義 struct 時也接著定義該 struct 的 variable

99
100 static struct parseconf_uint_setting
101 {
102   const char* p_setting_name;
103   unsigned int* p_variable;
104 }
105 parseconf_uint_array[] =
106 { const char* p_setting_name, unsigned int* p_variable;
107 { "accept_timeout", &tunable_accept_timeout },
108 { "connect_timeout", &tunable_connect_timeout },
109 { "local_umask", &tunable_local_umask },
110 { "anon_umask", &tunable_anon_umask },
111 { "ftp_data_port", &tunable_ftp_data_port },
112 { "idle_session_timeout", &tunable_idle_session_timeout },
113 { "data_connection_timeout", &tunable_data_connection_timeout },
114 { "pasv_min_port", &tunable_pasv_min_port },
115 { "pasv_max_port", &tunable_pasv_max_port },
116 { "anon_max_rate", &tunable_anon_max_rate },
117 { "local_max_rate", &tunable_local_max_rate },
118 { "listen_port", &tunable_listen_port },
119 { "max_clients", &tunable_max_clients },
120 { "file_open_mode", &tunable_file_open_mode },
121 { "max_per_ip", &tunable_max_per_ip },
122 { "trans_chunk_size", &tunable_trans_chunk_size },
123 { 0, 0 }
124 };
125

下面這段是參考 C++ primer Plus, 4/E 寫的範例:

可在宣告 struct 時,順道給定義兩個變數:John and Mary

struct student
{
  char class;
  int num;
} John, Mary;

可以在宣告 struct 的時候,一起定義變數,且給定初值:

struct student
{
  char class;
  int num;
} John =
{
  'A',     
  10
};

下列為宣告為陣列,並給定初值:

struct student stu[2] =          
{
  {'A', 1},  
  {'B', 2} 
};

取得程式當前目錄的 C 函式


#include <unistd.h>

char *getcwd(char *buf, size_t size);
char *get_current_dir_name(void);
char *getwd(char *buf);

取得硬碟序號的範例程式


#include <stdio.h>
#include <linux/hdreg.h>
#include <fcntl.h>

int main(int argc,char **argv)
{
  int fd;
  struct hd_driveid id;
  fd = open (argv[1], O_RDONLYO_NONBLOCK);

  if ( ioctl(fd, HDIO_GET_IDENTITY, &id)) {

    printf("ERROR!!\n");
    exit(1);
  }

  printf("%s serial-> %s\n", argv[1], id.serial_no);
  close( fd );
}

dos2unix 程式碼

格式 DOS(windows) 與 UNIX 的差異是,

DOS 以 '\r' 作為換行符號,而 UNIX 系統以 '\n' 作為換行符號,

一般 Linux 系統都會有 dos2unix 與 unix2dos 的指令,

如果要自行安裝的話,該指令是位於 sysutils 套件中。

因為只有更換 '\r' -> '\n' 或 '\n' -> '\r' 而已,

以前就練習一下,寫一個 dos2unix 的 sample.

/* Author : AppleZu Lab (http://applezu.netdpi.net)
 * Only translate '\r'(ASCII code: 13) to '\n'.
 * License: GNU
 */

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdio.h>

int main(int argc, char *argv[])
{
  FILE *fp;
  int i;
  char buf[1024];
  char buf2[65535];

  if (argc <2) {
    printf("%s filename\n", argv[0]);
    return -2;
  }

  memset(buf, '\0', sizeof(buf));
  memset(buf2, '\0', sizeof(buf2));

  fp=fopen(argv[1], "r");

  if(fp == NULL){
    printf("Can't open %s\n", argv[1]);
      return -1;
  }

  while( fgets( buf, sizeof(buf), fp) != NULL ) {

    for(i=0; i < sizeof (buf); i++) {
      if(buf[i] == 13)
        buf[i] = '\n';
    }

    strncat(buf2, buf, strlen(buf));
  }

  fclose(fp);

  fp=fopen(argv[1], "w+");
  fputs(buf2, fp);
  fclose(fp);
  return 0;
}

與 HTTP 協定有關的 RFC

RFC 1521, MIME (Multipurpose Internet Mail Extensions): http://www.rfc-editor.org/rfc/rfc1521.txt
RFC 1808, Relative Uniform Resource Locators: http://www.rfc-editor.org/rfc/rfc1808.txt
RFC 1945, HTTP/1.0: http://www.rfc-editor.org/rfc/rfc1945.txt
RFC 2109, HTTP State Management Mechanism: http://www.rfc-editor.org/rfc/rfc2145.txt
RFC 2246, The TLS Protocol: http://www.rfc-editor.org/rfc/rfc2246.txt
RFC 2396, Uniform Resource Identifiers (URI): Generic Syntax: http://www.rfc-editor.org/rfc/rfc2396.txt
RFC 2518, HTTP Extensions for Distributed Authoring: http://www.rfc-editor.org/rfc/rfc2518.txt
RFC 2585, Internet X.509 Public Key Infrastructure: http://www.rfc-editor.org/rfc/rfc2585.txt
RFC 2616, HTTP/1.1: http://www.rfc-editor.org/rfc/rfc2616.txt
RFC 2617, Basic and Digest Access Authentication: http://www.rfc-editor.org/rfc/rfc2617.txt
RFC 2774, HTTP Extension Framework: http://www.rfc-editor.org/rfc/rfc2774.txt
RFC 2817, Upgrading to TLS Within HTTP/1.1: http://www.rfc-editor.org/rfc/rfc2817.txt
RFC 2818, HTTP Over TLS: http://www.rfc-editor.org/rfc/rfc2818.txt
RFC 2964, Use of HTTP State Management: http://www.rfc-editor.org/rfc/rfc2964.txt
RFC 2965, HTTP State Management Mechanism: http://www.rfc-editor.org/rfc/rfc2965.txt
RFC 3253, Versioning Extensions to WebDAV: http://www.rfc-editor.org/rfc/rfc3253.txt

參考文獻: Chris Shiflett, HTTP Developer's Handbook.

Linkers and Loaders

如同書名般,Linkers and Loaders [1] 說明了程式 Linking 與 loading 的過程,

同時也能在網路 [2][3] 下載作者書中的範例,以及線上閱讀 Linkers and Loaders。

參考資料
[1] John R. Levine, Linkers and Loaders, Morgan-Kauffman Inc., 1999.
[2] Linkers and Loaders, http://linker.iecc.com/.
[3] Linkers and Loaders (Beta), http://www.iecc.com/linker/.

GCC header limits.h

在 trace vsftpd 時,看到裡面有個變數 INT_MAX,

但是 vim + tags 或 grep 完全找不到 INT_MAX 的定義,

因此發現 limits.h 裡頭有定義了,而且也有之前談過的 CHAR_BIT。

細節請參考 GCC /usr/include/limits.h 的內容。