1 In-House Patch. Submitted to upstream, but not accepted yet. |
|
2 Check for flock(), which is available on BSD and not on Solaris. |
|
3 Instead use fnctl() on Solaris. Also check if cfmakeraw(), which |
|
4 is not available on Solaris, so manually change the termios |
|
5 structure, the same way cfmakeraw does. |
|
6 |
|
7 --- tmux-1.8/client.c.orig 2013-08-13 12:42:26.447337127 -0700 |
|
8 +++ tmux-1.8/client.c 2013-08-13 12:44:09.044164126 -0700 |
|
9 @@ -74,16 +74,30 @@ |
|
10 client_get_lock(char *lockfile) |
|
11 { |
|
12 int lockfd; |
|
13 +#ifdef F_SETLK |
|
14 + struct flock lock; |
|
15 +#endif |
|
16 |
|
17 if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1) |
|
18 fatal("open failed"); |
|
19 |
|
20 +#ifdef F_SETLK |
|
21 + if (fcntl(lockfd, F_SETLK, &lock) == -1 && errno == EAGAIN) { |
|
22 + while (fcntl(lockfd, F_SETLKW, &lock) == -1 && errno == EINTR) |
|
23 + /* nothing */; |
|
24 + close(lockfd); |
|
25 + return(-1); |
|
26 + } |
|
27 +#elif LOCK_EX |
|
28 if (flock(lockfd, LOCK_EX|LOCK_NB) == -1 && errno == EWOULDBLOCK) { |
|
29 while (flock(lockfd, LOCK_EX) == -1 && errno == EINTR) |
|
30 /* nothing */; |
|
31 close(lockfd); |
|
32 return (-1); |
|
33 } |
|
34 +#else |
|
35 +#error "You need locking support." |
|
36 +#endif |
|
37 |
|
38 return (lockfd); |
|
39 } |
|
40 @@ -244,7 +258,15 @@ |
|
41 strerror(errno)); |
|
42 return (1); |
|
43 } |
|
44 - cfmakeraw(&tio); |
|
45 +#ifdef HAVE_CFMAKERAW |
|
46 + cfmakeraw(&tio); |
|
47 +#else |
|
48 + tio.c_iflag &= ~(IMAXBEL|IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); |
|
49 + tio.c_oflag &= ~OPOST; |
|
50 + tio.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); |
|
51 + tio.c_cflag &= ~(CSIZE|PARENB); |
|
52 + tio.c_cflag |= CS8; |
|
53 +#endif |
|
54 tio.c_iflag = ICRNL|IXANY; |
|
55 tio.c_oflag = OPOST|ONLCR; |
|
56 #ifdef NOKERNINFO |
|