Coverage Report

Created: 2025-10-13 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tmux/osdep-linux.c
Line
Count
Source
1
/* $OpenBSD$ */
2
3
/*
4
 * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
#include <sys/types.h>
20
#include <sys/stat.h>
21
#include <sys/param.h>
22
23
#include <stdio.h>
24
#include <stdlib.h>
25
#include <unistd.h>
26
27
#include "tmux.h"
28
29
char *
30
osdep_get_name(int fd, __unused char *tty)
31
0
{
32
0
  FILE  *f;
33
0
  char  *path, *buf;
34
0
  size_t   len;
35
0
  int  ch;
36
0
  pid_t  pgrp;
37
38
0
  if ((pgrp = tcgetpgrp(fd)) == -1)
39
0
    return (NULL);
40
41
0
  xasprintf(&path, "/proc/%lld/cmdline", (long long) pgrp);
42
0
  if ((f = fopen(path, "r")) == NULL) {
43
0
    free(path);
44
0
    return (NULL);
45
0
  }
46
0
  free(path);
47
48
0
  len = 0;
49
0
  buf = NULL;
50
0
  while ((ch = fgetc(f)) != EOF) {
51
0
    if (ch == '\0')
52
0
      break;
53
0
    buf = xrealloc(buf, len + 2);
54
0
    buf[len++] = ch;
55
0
  }
56
0
  if (buf != NULL)
57
0
    buf[len] = '\0';
58
59
0
  fclose(f);
60
0
  return (buf);
61
0
}
62
63
char *
64
osdep_get_cwd(int fd)
65
0
{
66
0
  static char  target[MAXPATHLEN + 1];
67
0
  char    *path;
68
0
  pid_t    pgrp, sid;
69
0
  ssize_t    n;
70
71
0
  if ((pgrp = tcgetpgrp(fd)) == -1)
72
0
    return (NULL);
73
74
0
  xasprintf(&path, "/proc/%lld/cwd", (long long) pgrp);
75
0
  n = readlink(path, target, MAXPATHLEN);
76
0
  free(path);
77
78
0
  if (n == -1 && ioctl(fd, TIOCGSID, &sid) != -1) {
79
0
    xasprintf(&path, "/proc/%lld/cwd", (long long) sid);
80
0
    n = readlink(path, target, MAXPATHLEN);
81
0
    free(path);
82
0
  }
83
84
0
  if (n > 0) {
85
0
    target[n] = '\0';
86
0
    return (target);
87
0
  }
88
0
  return (NULL);
89
0
}
90
91
struct event_base *
92
osdep_event_init(void)
93
2
{
94
2
  struct event_base *base;
95
96
  /* On Linux, epoll doesn't work on /dev/null (yes, really). */
97
2
  setenv("EVENT_NOEPOLL", "1", 1);
98
99
2
  base = event_init();
100
2
  unsetenv("EVENT_NOEPOLL");
101
2
  return (base);
102
2
}