dpkg -S 调用 querycmd.c 中的 searchfiles()
根据参数格式不同进入两个分支:
代码: 全选
if (!strpbrk(thisarg, "*[?\\")) {
/* Trim trailing ‘/’ and ‘/.’ from the argument if it is not
* a pattern, just a pathname. */
varbuf_reset(&path);
varbuf_add_str(&path, thisarg);
varbuf_end_str(&path);
varbuf_trunc(&path, path_trim_slash_slashdot(path.buf));
namenode = findnamenode(path.buf, 0);
found += searchoutput(namenode);
} else {
iter = files_db_iter_new();
while ((namenode = files_db_iter_next(iter)) != NULL) {
if (fnmatch(thisarg,namenode->name,0)) continue;
printf("namenode->name: %s\n",namenode->name);
found+= searchoutput(namenode);
}
files_db_iter_free(iter);
}
若参数开头有撇,则为完整路径,进入第一分支 (精确匹配)
$ dpkg -S /usr/bin/firefox
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
若参数开头没有撇,则为搜索字样,进入 else 分支 (模糊匹配)
$ dpkg -S usr/bin/firefox
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
firefox-esr: /usr/bin/firefox-esr
其中第一组 diversion by ... from ... to ... 匹配的是 /var/lib/dpkg/diversions 中的字样 usr/bin/firefox
第二组 diversion by ... from ... to ... 匹配的是 /var/lib/dpkg/diversions 中的字样 usr/bin/firefox.real
其中 "firefox-esr: /usr/bin/firefox-esr" 一项也因是否精确匹配而有是否可见的区别。
通过在 querycmd.c 的 searchfiles() 中添加调试输出 printf("Matched namenode.name... 可验证
代码: 全选
while ((namenode = files_db_iter_next(iter)) != NULL) {
if (fnmatch(thisarg,namenode->name,0)) continue;
printf("Matched namenode.name: %s\n",namenode->name);
found+= searchoutput(namenode);
}
files_db_iter_free(iter);
$ dpkg -S usr/bin/firefox
Matched namenode.name: /usr/bin/firefox.real
searchoutput() is called
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
Matched namenode.name: /usr/bin/firefox
searchoutput() is called
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
Matched namenode.name: /usr/bin/firefox-esr
searchoutput() is called
firefox-esr: /usr/bin/firefox-esr