読者です 読者をやめる 読者になる 読者になる

ソースコードリーディング: ipcs -m で 「対象」と翻訳されているソースを追う

CentOS7 で ipcs-m を実行すると下記のような出力になる

$ ipcs -m

------ 共有メモリセグメント --------
キー     shmid      所有者  権限     バイト  nattch     状態      
0x00000000 113934337  root       600        40         9          対象   🍣   

🍣 部分の 対象 って訳されているのが何なのだろうと気になってしょうがない

$ LANG=C ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 113934337  root       600        40         9          dest         

デフォルトロケールでみてみると dest となっている

dest は何ですと?

dest が付いた SysV 共有メモリセグメントは、 shmct(2) + IPC_RMID で 破棄済み のマークをつけたものである。つまり destroyed の短縮系として dest と考えるのが妥当そうなのだが、翻訳では destination として扱われている感じがする

翻訳のソースを追う

どのファイルを見ればよいのか分からないので、strace を使って絞り込んでいった

$ strace -eopen ipcs -m >/dev/null
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/ja_JP.utf-8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja_JP.utf8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja_JP/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja.utf-8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja.utf8/LC_MESSAGES/util-linux.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ja/LC_MESSAGES/util-linux.mo", O_RDONLY) = 3 🍣
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
open("/proc/sysvipc/shm", O_RDONLY)     = 3
+++ exited with 0 +++

ロケール名を変えて util-linux.mo を探し 🍣で open(2) に成功している。util-linux.mo が翻訳ファイルと推測する

RPM を探す

次に どの RPM で提供されているのかを特定する

$ rpm -qf /usr/share/locale/ja/LC_MESSAGES/util-linux.mo
util-linux-2.23.2-16.el7.x86_64

次に SRPM をダウンロードして ~/rpmbuild/BUILD 以下に展開する

#  yumdownloader --source を使ってもいいよ
$ wget http://vault.centos.org/7.2.1511/updates/Source/SPackages/util-linux-2.23.2-26.el7_2.3.src.rpm
$ rpm -ivh util-linux-2.23.2-26.el7_2.3.src.rpm 
$ rpmbuild -bp ~/rpmbuild/SPECS/util-linux.spec 

grep と find であれこれして、po/ja.po にソースを見つけた

$ grep -C2 対象 ~/rpmbuild/BUILD/util-linux-2.23.2/po/ja.po 
#, fuzzy, c-format
msgid "%s: adding partition #%d failed"
msgstr "ディレクトリの追加が失敗しました: %s (対象: %s) (%d)"

#: disk-utils/partx.c:409
--
#: sys-utils/ipcs.c:327
msgid "dest" 🍣
msgstr "対象" 🍣

#: sys-utils/ipcs.c:328

ディストリビューションSRPM で確認できたので、次に upstream のソースを探して更に確認をとってみる

upstream を探す

util-linux でググっていって util-linux - Wikipedia を読んだ所、下記が upstream ということだ

git://git.kernel.org/pub/scm/utils/util-linux/util-linux.git

util-linux-ng の関連のサイトも出てくるので混乱していたのだが、現在の util-linux と util-linux-ng の関係は下記の通りらしい

util-linux is a standard package of the Linux operating system. A fork, util-linux-ng—with ng meaning "next generation"—was created when development stalled,[3] but as of January 2011 has been renamed back to util-linux, and is the official version of the package.[4]

master では更新済み

リポジトリの master を確認すると、 対象 から 削除 に更新済みだった!

# diff が大きいので、該当部分のみを抜き出す
@@ -12584,18 +12717,18 @@ msgstr "状態"
 msgid "Not set"
 msgstr "未セット"
 
-#: sys-utils/ipcs.c:336 sys-utils/lsipc.c:976 sys-utils/lsipc.c:982
+#: sys-utils/ipcs.c:336 sys-utils/lsipc.c:992 sys-utils/lsipc.c:998
 msgid "dest"
-msgstr "対象"
+msgstr "削除"

コミット

 $ git log 91420f055a68bb8237ddf5d79bd2f393c65a94e1
commit 91420f055a68bb8237ddf5d79bd2f393c65a94e1
Author: Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>
Date:   Fri Sep 30 10:34:15 2016 +0200

    po: update ja.po (from translationproject.org)

翻訳は translationproject.org から提供されているのかな?


当所の疑問点は解決してだいたい満足した。upstream での変更が どのようにしてディストリビューションに降りてくるのかが気になる。