unixODBC的SYSTEM_FILE_PATH

unixODBC中,SYSTEM_FILE_PATH定义了像odbc.iniodbcinst.ini这些系统文件存放的位置。默认情况下,是在“/usr/local/etc”这个文件夹下。我们看一下用到SYSTEM_FILE_PATH的地方。

(1)odbcinst_system_file_path

char *odbcinst_system_file_path( char *buffer )
{
    char *path;
    static char save_path[ 512 ];
    static int saved = 0;

    if ( saved ) {
        return save_path;
    }

    if (( path = getenv( "ODBCSYSINI" ))) {
        strcpy( buffer, path );
    strcpy( save_path, buffer );
    saved = 1;
        return buffer;
    }
#ifdef SYSTEM_FILE_PATH
    else {
    strcpy( save_path, SYSTEM_FILE_PATH );
    saved = 1;
        return SYSTEM_FILE_PATH;
    }
#else
    else {
    strcpy( save_path, "/etc" );
    saved = 1;
        return "/etc";
    }
#endif
}

可以看到在查找系统文件路径时,首先会看ODBCSYSINI这个环境变量有没有赋值,如果有,以这个变量定义的值为准,否则如果SYSTEM_FILE_PATH定义了,则用SYSTEM_FILE_PATH。最后才考虑使用“/etc”。

(2)odbc_configmain函数:

int main( int argc, char **argv )
{
    ......
    else if ( strcmp( argv[ i ], "--odbcini" ) == 0 )
    {
        printf( "%s/odbc.ini\n", SYSTEM_FILE_PATH );
    }
    else if ( strcmp( argv[ i ], "--odbcinstini" ) == 0 )
    {
        printf( "%s/odbcinst.ini\n", SYSTEM_FILE_PATH );
    }
    ......
}

可以看到,在使用odbc_config程序获得odbc.iniodbcinst.ini文件位置时,也要用的SYSTEM_FILE_PATH

unixODBC的代码库

unixODBC的代码目前还托管在sourceforge上,它的项目主页是:http://sourceforge.net/projects/unixodbc/?source=directory。感兴趣的朋友也可以checkout项目的svn代码:

svn checkout svn://svn.code.sf.net/p/unixodbc/code/trunk unixodbc-code

trunk上的代码可以看到,Nick还是会不时更新的。

此外,也可以访问unixODBCftp站点:ftp://ftp.unixodbc.org/pub/unixODBC/。这里包含各个版本的代码包,可以按需下载。

我为unixODBC提过的bug

今天在使用unixODBC 2.3.2时,无意中又发现了一个bug。就是在调用configure程序生成config.h文件时,关于软件包版本字符串是:

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "unixODBC 2.3.2-pre"

/* Define to the version of this package. */
#define PACKAGE_VERSION "2.3.2-pre"

而实际这个已经是正式的release版本了,所以软件包版本字符串应该是:

/* Define to the full name and version of this package. */
#define PACKAGE_STRING "unixODBC 2.3.2"

/* Define to the version of this package. */
#define PACKAGE_VERSION "2.3.2"

Nick发了个邮件,他也承认是个bugA question about config.h )。屈指一算,这已经是我提给unixODBC的第四个bug了。记录一下,做个纪念:-):
Add missing unicode setting when returning a connection to the pool
Wrap lt_dlinit and dlerror in the lib mutex
Change mutex protection around release_env

如何卸载gdb?

前几天安装最新的gdb过程中出了点问题,想卸载一下。结果执行“make uninstall”命令后,出现下面的结果:

bash-3.2# make uninstall
the uninstall target is not supported in this tree

看起来,gdb不支持直接用“make uninstall”命令卸载,那么如何卸载它呢?我在gdb mailing list里问了一下,收到了Doug Evans回信

Yikes.

A clumsy workaround is to cd into each subdir in the build tree and do
make uninstall there.

只能是进入每个子目录,分别执行“make uninstall”命令了。

后来,他又在一封单独的信中提到,他已经提交了bug,看看会不会有人做一下改进了。

本文转载自我在hellogcc上文章:http://www.hellogcc.org/?p=34112

gdb 7.8.1 release了,7.9还会远吗?

今天早晨收到邮件,gdb 7.8.1版本release了。看了一下release note,应该就是修改了一些bug。在另一封邮件里,Joel Brobecker提到了gdb 7.9 release的时间表:如果一切顺利的话,会在明年的1月26日。Looking forward to it!

参考邮件:
[ANNOUNCEMENT] GDB 7.8.1 released!
next GDB release schedule (GDB 7.9?)

学习Bash shell编程资料推荐

我一直觉得写好Bash shell脚本是一件很cool的事,短短几行代码,就能完成其它编程语言几十行甚至上百行代码才能完成的功能,可惜我自己写Bash shell脚本能力实在不敢恭维。在这篇文章,我把自己认为一些比较好的Bash shell编程资料分享出来,希望可以给大家一点帮助。

我个人看过的最好的Bash shell编程入门资料是《Linux程序设计》的第二章:shell程序设计,看这一章的同时自己动手实践,我觉得入门基本没问题了。

入门之后,我建议大家一定要看CU论坛上shell大牛网中人经典的《shell十三问》系列文章,这些文章把很多shell编程tricky的东西讲的很细,很明白。我每次读都有新的收获。

关于如何调试shell程序,推荐coolshell上的文章:如何调试bash脚本,在我这篇文章结尾提到的bashdb调试器,我这几天还用了一下。虽然比起gdb还差了很远(比如没有命令自动补全功能,等等),但总体感觉还可以,可以提高调试效率。

最后推荐两个网站:
http://www.shellcheck.net/:用来检测shell脚本,帮你发现问题。
http://explainshell.com/:用来帮你理解shell脚本。

好了,动手实践吧。Happy bashing! Happy hacking!

在Solaris上使用LD_OPTIONS环境变量诊断编译链接问题

最近在Solaris上编译一款开源软件,在最后链接阶段出了问题,导致ld程序core dump。由于没有ld程序源代码,导致完全没思路,没办法,只好在stackoverflow上求教:http://stackoverflow.com/questions/26009192/why-the-ld-crash-in-building-libgd。从回复中我才知道可以通过设置LD_OPTIONS环境变量,来了解整个链接过程。举个例子:

LD_OPTIONS=-Dfiles,detail

指定files会输出ld当前处理的文件,detail会提供更多的信息。

可以用“ld -Dhelp”命令打印每个选项的详细帮助信息。

如果想详细了解Solaris下程序的链接过程,可以参考这篇文档:Linker and Libraries Guide

 

tcpreplay(3.4版本)程序显示统计结果的一个问题

最近,我在Solaris系统上用tcpreplay程序(sunfreeware网站提供的3.4.4版本的安装包,目前sunfreeware已经不再提供免费的Solaris系统安装包下载了,但还是可以通过其它ftp下载到)辅助测试。发现tcpreplay输出是这样的:

Actual: 400000 packets (78200000 bytes) sent in 18.03 seconds.          Rated: 4337216.0 bps, 33.09 Mbps, 22185.25 pps

如果Rated显示的bpsMbps里的b都指的是byte的话,那么它们应该相差(1000*1000)倍才对,但是很明显4337216.033.09没有相差那么多。

github上找了一下tcpreplay 3.4版本的源代码,发现了这个patch(https://github.com/appneta/tcpreplay/commit/42722b8945209dcbb850eef39e0dbbd582eccc3d)。可以看到第一个bps里的b指的是byte,而第二个Mbps里的b指的是bit。这个tcpreplay安装包很显然没有包含这个patch,所以会让人产生误解。

P.S.打完patch后的tcpreplay输出是这样的:

Actual: 2 packets (1532 bytes) sent in 0.015702 seconds.
Rated: 97567.1 Bps, 0.780 Mbps, 127.37 pps

看着很清晰。