{"id":4111,"date":"2014-02-14T14:06:55","date_gmt":"2014-02-14T12:06:55","guid":{"rendered":"http:\/\/skeletor.org.ua\/?p=4111"},"modified":"2014-02-14T14:13:17","modified_gmt":"2014-02-14T12:13:17","slug":"%d1%81%d0%b1%d0%be%d1%80%d0%ba%d0%b0-tmuxa-%d0%bf%d0%be%d0%b4-solaris","status":"publish","type":"post","link":"https:\/\/skeletor.org.ua\/?p=4111","title":{"rendered":"\u0421\u0431\u043e\u0440\u043a\u0430 tmux&#8217;a \u043f\u043e\u0434 Solaris"},"content":{"rendered":"<p><em><strong><span style=\"color: #008000;\">\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434<\/span><\/strong><\/em>: <strong>tmux-1.8,\u00a0libevent-2.0.21<\/strong><\/p>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 <strong>tmux&#8217;a<\/strong> \u043f\u043e\u0434 <strong>Solaris<\/strong> \u0435\u0449\u0451 \u0442\u043e\u0442 \u043a\u0432\u0435\u0441\u0442 \u0441 \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432. \u0418 \u0442\u0430\u043a, \u043a\u0430\u0447\u0430\u0435\u043c \u0441\u0432\u0435\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e <strong>tmux&#8217;a<\/strong>, \u0430 \u0442\u0430\u043a \u0436\u0435 <strong>libevent<\/strong> (\u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c).\u00a0<strong>libevent<\/strong> \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c:<\/p>\n<p><code>root@skeletor:\/export\/home\/skeletor\/libevent-2.0.21-stable# CFLAGS=\"-m64 -O2\" CPPFLAGS=\"-m64 -O2\" CCASFLAGS=\"-m64 -O2\" CXXFLAGS=\"-m64 -O2\" LDFLAGS=\"-m64 -O2\" .\/configure --prefix=\/usr --libdir=\/lib\/64 &amp;&amp; gmake &amp;&amp; gmake install &amp;&amp; gmake clean<\/code><\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0435\u0440\u0451\u043c <strong>tmux<\/strong>:<\/p>\n<p><!--more--><\/p>\n<p><code>root@skeletor:\/export\/home\/skeletor\/tmux-1.8# CFLAGS=\"-m64 -O2\" CPPFLAGS=\"-m64 -O2\" CCASFLAGS=\"-m64 -O2\" CXXFLAGS=\"-m64 -O2\" LDFLAGS=\"-m64 -O2\" .\/configure --prefix=\/usr --libdir=\/lib\/64\u00a0&amp;&amp; gmake &amp;&amp; gmake install &amp;&amp; gmake clean<\/code><\/p>\n<p>\u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p><code>In file included from \/usr\/include\/sys\/types.h:12:0,<br \/>\nfrom arguments.c:19:<br \/>\n\/usr\/include\/sys\/feature_tests.h:354:2: error: #error \"Compiler or options invalid for pre-UNIX 03 X\/Open applications and pre-2001 POSIX applications\"<br \/>\ngmake: *** [arguments.o] Error 1<\/code><\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435: \u0432 <strong>Makefile<\/strong> \u043c\u0435\u043d\u044f\u0435\u043c<\/p>\n<p><code>am__append_2 = -std=gnu99<\/code> (\u0438\u043b\u0438 \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <strong>-std=\u044199<\/strong>)<\/p>\n<p>\u043d\u0430<\/p>\n<p><code>am__append_2 = -std=gnu89<\/code><\/p>\n<p>\u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u0451\u043b \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0431\u0430\u0432\u043d\u043e\u0435<\/p>\n<blockquote><p><span style=\"color: #993366;\">This is a bit of a hack, and I probably don&#8217;t understand the nuances of what I&#8217;m doing here, but I edited the Makefile, and changed<\/span><\/p><\/blockquote>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0449\u0451 \u0440\u0430\u0437 \u0441\u0431\u043e\u0440\u043a\u0443 \u0438 \u043d\u0430\u0442\u044b\u043a\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p><code>client.c: In function \u2018client_get_lock\u2019:<br \/>\nclient.c:81:20: error: \u2018LOCK_EX\u2019 undeclared (first use in this function)<br \/>\nclient.c:81:20: note: each undeclared identifier is reported only once for each function it appears in<br \/>\nclient.c:81:28: error: \u2018LOCK_NB\u2019 undeclared (first use in this function)<br \/>\ngmake: *** [client.o] Error 1<\/code><\/p>\n<p>\u042d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0443\u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438 \u0447\u0430\u0441\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>client_get_lock<\/strong>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 <strong>Solaris<\/strong>-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u041e\u0421\u044f\u0445 (<strong>Solaris, illumos, SmartOS<\/strong>, &#8230;) \u0432\u043c\u0435\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>flock()<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <strong>fcntl()<\/strong>. \u0418 \u0442\u0430\u043a, \u043f\u0440\u0438\u0432\u043e\u0436\u0443 <strong>diff<\/strong> \u0444\u0430\u0439\u043b (\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0430\u0442\u0447\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u043b\u043e <a rel=\"nofollow\" href=\"http:\/\/www.perkin.org.uk\/posts\/solaris-portability-flock.html\" target=\"_blank\">\u044d\u0442\u043e<\/a> \u043f\u043e\u0441\u043e\u0431\u0438\u0435):<\/p>\n<pre># diff -u client.c client.c_diff\r\n--- client.c    Sun Mar 17 14:03:37 2013\r\n+++ client.c_diff       Fri Feb 14 11:40:38 2014\r\n@@ -33,6 +33,15 @@\r\n\r\n #include \"tmux.h\"\r\n\r\n+#define   LOCK_SH   1    \/* shared lock *\/\r\n+#define   LOCK_EX   2    \/* exclusive lock *\/\r\n+#define   LOCK_NB   4    \/* don't block when locking *\/\r\n+#define   LOCK_UN   8    \/* unlock *\/\r\n+\r\n+#define F_GETLK         7               \/* get record locking information *\/\r\n+#define F_SETLK         8               \/* set record locking information *\/\r\n+#define F_SETLKW        9               \/* F_SETLK; wait if blocked *\/\r\n+\r\n struct imsgbuf client_ibuf;\r\n struct event   client_event;\r\n struct event   client_stdin;\r\n@@ -75,11 +84,20 @@\r\n {\r\n        int lockfd;\r\n\r\n+       struct flock lock;\r\n+\r\n+       lock.l_start = 0;\r\n+       lock.l_len = 0;\r\n+       lock.l_type = F_WRLCK;\r\n+       lock.l_whence = SEEK_SET;\r\n+\r\n        if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1)\r\n                fatal(\"open failed\");\r\n\r\n-       if (flock(lockfd, LOCK_EX|LOCK_NB) == -1 &amp;&amp; errno == EWOULDBLOCK) {\r\n-               while (flock(lockfd, LOCK_EX) == -1 &amp;&amp; errno == EINTR)\r\n+\/\/     if (flock(lockfd, LOCK_EX|LOCK_NB) == -1 &amp;&amp; errno == EWOULDBLOCK) {\r\n+\/\/             while (flock(lockfd, LOCK_EX) == -1 &amp;&amp; errno == EINTR)\r\n+       if (fcntl(lockfd, F_SETLK, &amp;lock) == -1 &amp;&amp; errno == EAGAIN) {\r\n+               while (fcntl(lockfd, F_SETLKW, &amp;lock) == -1 &amp;&amp; errno == EINTR)\r\n                        \/* nothing *\/;\r\n                close(lockfd);\r\n                return (-1);<\/pre>\n<p>\u041f\u0430\u0442\u0447\u0438\u043c \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p><code>server-client.c: In function \u2018server_client_check_resize\u2019:<br \/>\nserver-client.c:544:7: error: \u2018errno\u2019 undeclared (first use in this function)<br \/>\nserver-client.c:544:7: note: each undeclared identifier is reported only once for each function it appears in<br \/>\nserver-client.c:544:16: error: \u2018EINVAL\u2019 undeclared (first use in this function)<br \/>\ngmake: *** [server-client.o] Error 1<\/code><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c<\/p>\n<p><code>#include &lt;errno.h&gt;<\/code><\/p>\n<p>\u0432 \u0444\u0430\u0439\u043b <strong>server-client.c<\/strong> \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u0438 \u043e\u043f\u044f\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre>Undefined                       first referenced\r\n symbol                             in file\r\ncfmakeraw                           client.o\r\nld: fatal: symbol referencing errors. No output written to tmux\r\ncollect2: ld returned 1 exit status\r\ngmake: *** [tmux] Error 1<\/pre>\n<p>\u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <strong>cfmakeraw()<\/strong>. \u0412\u043e\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435:<\/p>\n<blockquote><p><span style=\"color: #993366;\">cfmakeraw() sets the terminal to something like the &#8220;raw&#8221; mode of the old Version 7 terminal driver: input is available character by character, echoing is disabled, and all special processing of terminal input and output characters is disabled.<\/span><\/p><\/blockquote>\n<p>\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 (\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0432\u0435\u0442\u0430 <a rel=\"nofollow\" href=\"http:\/\/www.perkin.org.uk\/posts\/solaris-portability-cfmakeraw.html\" target=\"_blank\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>), \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0437\u043e\u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>client.c<\/strong>:<\/p>\n<pre>                            strerror(errno)); \r\n                        return (1);\r\n                }   \r\n\/\/              cfmakeraw(&amp;tio);\r\n                tio.c_iflag = ICRNL|IXANY;\r\n                tio.c_oflag = OPOST|ONLCR;<\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e:<\/p>\n<p><code># gmake clean &amp;&amp; gmake<\/code><\/p>\n<p>\u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u043e\u043a. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0441\u0435 \u043b\u0438 \u043b\u0438\u0431\u044b \u043d\u0430 \u043c\u0435\u0441\u0442\u0435:<\/p>\n<pre># ldd .\/tmux\r\n        libxnet.so.1 =&gt;  \/lib\/64\/libxnet.so.1\r\n        libsocket.so.1 =&gt;        \/lib\/64\/libsocket.so.1\r\n        libnsl.so.1 =&gt;   \/lib\/64\/libnsl.so.1\r\n        libcurses.so.1 =&gt;        \/lib\/64\/libcurses.so.1\r\n        libevent-2.0.so.5 =&gt;     \/lib\/64\/libevent-2.0.so.5\r\n        libresolv.so.2 =&gt;        \/lib\/64\/libresolv.so.2\r\n        libc.so.1 =&gt;     \/lib\/64\/libc.so.1\r\n        libmp.so.2 =&gt;    \/lib\/64\/libmp.so.2\r\n        libmd.so.1 =&gt;    \/lib\/64\/libmd.so.1\r\n        libsendfile.so.1 =&gt;      \/lib\/64\/libsendfile.so.1\r\n        libgcc_s.so.1 =&gt;         \/usr\/lib\/64\/libgcc_s.so.1\r\n        libsoftcrypto.so.1 =&gt;    \/lib\/64\/libsoftcrypto.so.1\r\n        libelf.so.1 =&gt;   \/lib\/64\/libelf.so.1\r\n        libcryptoutil.so.1 =&gt;    \/lib\/64\/libcryptoutil.so.1\r\n        libm.so.2 =&gt;     \/lib\/64\/libm.so.2<\/pre>\n<p>\u041a\u0432\u0435\u0441\u0442 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d ))<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0432\u0435\u0441\u0442 \u043f\u0440\u043e\u0448\u043b\u0438 \u0440\u0435\u0431\u044f\u0442\u0430 <a rel=\"nofollow\" href=\"http:\/\/sourceforge.net\/mailarchive\/forum.php?thread_name=4E316441.1020902%40googlemail.com&amp;forum_name=tmux-users\" target=\"_blank\">\u0437\u0434\u0435\u0441\u044c<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434: tmux-1.8,\u00a0libevent-2.0.21 \u0421\u0431\u043e\u0440\u043a\u0430 tmux&#8217;a \u043f\u043e\u0434 Solaris \u0435\u0449\u0451 \u0442\u043e\u0442 \u043a\u0432\u0435\u0441\u0442 \u0441 \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432. \u0418 \u0442\u0430\u043a, \u043a\u0430\u0447\u0430\u0435\u043c \u0441\u0432\u0435\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e tmux&#8217;a, \u0430 \u0442\u0430\u043a \u0436\u0435 libevent (\u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c).\u00a0libevent \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c: root@skeletor:\/export\/home\/skeletor\/libevent-2.0.21-stable# CFLAGS=&#8221;-m64 -O2&#8243; CPPFLAGS=&#8221;-m64 -O2&#8243; CCASFLAGS=&#8221;-m64 -O2&#8243; CXXFLAGS=&#8221;-m64 -O2&#8243; LDFLAGS=&#8221;-m64 -O2&#8243; .\/configure &#8211;prefix=\/usr &#8211;libdir=\/lib\/64 &amp;&amp; gmake &amp;&amp; gmake install &amp;&amp; gmake clean \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0435\u0440\u0451\u043c tmux:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,24],"tags":[],"class_list":["post-4111","post","type-post","status-publish","format-standard","hentry","category-programming","category-solaris"],"_links":{"self":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/4111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4111"}],"version-history":[{"count":4,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/4111\/revisions"}],"predecessor-version":[{"id":4119,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/4111\/revisions\/4119"}],"wp:attachment":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}