OpenCoverage

who.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/who.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* GNU's who.-
2 Copyright (C) 1992-2018 Free Software Foundation, Inc.-
3-
4 This program is free software: you can redistribute it and/or modify-
5 it under the terms of the GNU General Public License as published by-
6 the Free Software Foundation, either version 3 of the License, or-
7 (at your option) any later version.-
8-
9 This program is distributed in the hope that it will be useful,-
10 but WITHOUT ANY WARRANTY; without even the implied warranty of-
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
12 GNU General Public License for more details.-
13-
14 You should have received a copy of the GNU General Public License-
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
16-
17/* Written by jla; revised by djm; revised again by mstone */-
18-
19/* Output format:-
20 name [state] line time [activity] [pid] [comment] [exit]-
21 state: -T-
22 name, line, time: not -q-
23 idle: -u-
24*/-
25-
26#include <config.h>-
27#include <getopt.h>-
28#include <stdio.h>-
29#include <assert.h>-
30-
31#include <sys/types.h>-
32#include "system.h"-
33-
34#include "c-ctype.h"-
35#include "canon-host.h"-
36#include "readutmp.h"-
37#include "die.h"-
38#include "error.h"-
39#include "hard-locale.h"-
40#include "quote.h"-
41-
42#ifdef TTY_GROUP_NAME-
43# include <grp.h>-
44#endif-
45-
46/* The official name of this program (e.g., no 'g' prefix). */-
47#define PROGRAM_NAME "who"-
48-
49#define AUTHORS \-
50 proper_name ("Joseph Arceneaux"), \-
51 proper_name ("David MacKenzie"), \-
52 proper_name ("Michael Stone")-
53-
54#ifdef RUN_LVL-
55# define UT_TYPE_RUN_LVL(U) UT_TYPE_EQ (U, RUN_LVL)-
56#else-
57# define UT_TYPE_RUN_LVL(U) false-
58#endif-
59-
60#ifdef INIT_PROCESS-
61# define UT_TYPE_INIT_PROCESS(U) UT_TYPE_EQ (U, INIT_PROCESS)-
62#else-
63# define UT_TYPE_INIT_PROCESS(U) false-
64#endif-
65-
66#ifdef LOGIN_PROCESS-
67# define UT_TYPE_LOGIN_PROCESS(U) UT_TYPE_EQ (U, LOGIN_PROCESS)-
68#else-
69# define UT_TYPE_LOGIN_PROCESS(U) false-
70#endif-
71-
72#ifdef DEAD_PROCESS-
73# define UT_TYPE_DEAD_PROCESS(U) UT_TYPE_EQ (U, DEAD_PROCESS)-
74#else-
75# define UT_TYPE_DEAD_PROCESS(U) false-
76#endif-
77-
78#ifdef NEW_TIME-
79# define UT_TYPE_NEW_TIME(U) UT_TYPE_EQ (U, NEW_TIME)-
80#else-
81# define UT_TYPE_NEW_TIME(U) false-
82#endif-
83-
84#define IDLESTR_LEN 6-
85-
86#if HAVE_STRUCT_XTMP_UT_PID-
87# define PIDSTR_DECL_AND_INIT(Var, Utmp_ent) \-
88 char Var[INT_STRLEN_BOUND (Utmp_ent->ut_pid) + 1]; \-
89 sprintf (Var, "%ld", (long int) (Utmp_ent->ut_pid))-
90#else-
91# define PIDSTR_DECL_AND_INIT(Var, Utmp_ent) \-
92 const char *Var = ""-
93#endif-
94-
95#if HAVE_STRUCT_XTMP_UT_ID-
96# define UT_ID(U) ((U)->ut_id)-
97#else-
98# define UT_ID(U) "??"-
99#endif-
100-
101/* If true, attempt to canonicalize hostnames via a DNS lookup. */-
102static bool do_lookup;-
103-
104/* If true, display only a list of usernames and count of-
105 the users logged on.-
106 Ignored for 'who am i'. */-
107static bool short_list;-
108-
109/* If true, display only name, line, and time fields. */-
110static bool short_output;-
111-
112/* If true, display the hours:minutes since each user has touched-
113 the keyboard, or "." if within the last minute, or "old" if-
114 not within the last day. */-
115static bool include_idle;-
116-
117/* If true, display a line at the top describing each field. */-
118static bool include_heading;-
119-
120/* If true, display a '+' for each user if mesg y, a '-' if mesg n,-
121 or a '?' if their tty cannot be statted. */-
122static bool include_mesg;-
123-
124/* If true, display process termination & exit status. */-
125static bool include_exit;-
126-
127/* If true, display the last boot time. */-
128static bool need_boottime;-
129-
130/* If true, display dead processes. */-
131static bool need_deadprocs;-
132-
133/* If true, display processes waiting for user login. */-
134static bool need_login;-
135-
136/* If true, display processes started by init. */-
137static bool need_initspawn;-
138-
139/* If true, display the last clock change. */-
140static bool need_clockchange;-
141-
142/* If true, display the current runlevel. */-
143static bool need_runlevel;-
144-
145/* If true, display user processes. */-
146static bool need_users;-
147-
148/* If true, display info only for the controlling tty. */-
149static bool my_line_only;-
150-
151/* The strftime format to use for login times, and its expected-
152 output width. */-
153static char const *time_format;-
154static int time_format_width;-
155-
156/* for long options with no corresponding short option, use enum */-
157enum-
158{-
159 LOOKUP_OPTION = CHAR_MAX + 1-
160};-
161-
162static struct option const longopts[] =-
163{-
164 {"all", no_argument, NULL, 'a'},-
165 {"boot", no_argument, NULL, 'b'},-
166 {"count", no_argument, NULL, 'q'},-
167 {"dead", no_argument, NULL, 'd'},-
168 {"heading", no_argument, NULL, 'H'},-
169 {"login", no_argument, NULL, 'l'},-
170 {"lookup", no_argument, NULL, LOOKUP_OPTION},-
171 {"message", no_argument, NULL, 'T'},-
172 {"mesg", no_argument, NULL, 'T'},-
173 {"process", no_argument, NULL, 'p'},-
174 {"runlevel", no_argument, NULL, 'r'},-
175 {"short", no_argument, NULL, 's'},-
176 {"time", no_argument, NULL, 't'},-
177 {"users", no_argument, NULL, 'u'},-
178 {"writable", no_argument, NULL, 'T'},-
179 {GETOPT_HELP_OPTION_DECL},-
180 {GETOPT_VERSION_OPTION_DECL},-
181 {NULL, 0, NULL, 0}-
182};-
183-
184/* Return a string representing the time between WHEN and now.-
185 BOOTTIME is the time of last reboot.-
186 FIXME: locale? */-
187static const char *-
188idle_string (time_t when, time_t boottime)-
189{-
190 static time_t now = TYPE_MINIMUM (time_t);-
191-
192 if (now == TYPE_MINIMUM (time_t))
now == ((time_...1) * 2 + 1))))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
193 time (&now);
executed 1 time by 1 test: time (&now);
Executed by:
  • who
1
194-
195 if (boottime < when && now - 24 * 60 * 60 < when && when <= now)
boottime < whenDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
now - 24 * 60 * 60 < whenDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
when <= nowDescription
TRUEnever evaluated
FALSEnever evaluated
0-1
196 {-
197 int seconds_idle = now - when;-
198 if (seconds_idle < 60)
seconds_idle < 60Description
TRUEnever evaluated
FALSEnever evaluated
0
199 return " . ";
never executed: return " . ";
0
200 else-
201 {-
202 static char idle_hhmm[IDLESTR_LEN];-
203 /* FIXME-in-2018: see if this assert is still required in order-
204 to suppress gcc's unwarranted -Wformat-length= warning. */-
205 assert (seconds_idle / (60 * 60) < 24);-
206 sprintf (idle_hhmm, "%02d:%02d",-
207 seconds_idle / (60 * 60),-
208 (seconds_idle % (60 * 60)) / 60);-
209 return idle_hhmm;
never executed: return idle_hhmm;
0
210 }-
211 }-
212-
213 return _(" old ");
executed 1 time by 1 test: return dcgettext (((void *)0), " old " , 5) ;
Executed by:
  • who
1
214}-
215-
216/* Return a time string. */-
217static const char *-
218time_string (const STRUCT_UTMP *utmp_ent)-
219{-
220 static char buf[INT_STRLEN_BOUND (intmax_t) + sizeof "-%m-%d %H:%M"];-
221-
222 /* Don't take the address of UT_TIME_MEMBER directly.-
223 Ulrich Drepper wrote:-
224 "... GNU libc (and perhaps other libcs as well) have extended-
225 utmp file formats which do not use a simple time_t ut_time field.-
226 In glibc, ut_time is a macro which selects for backward compatibility-
227 the tv_sec member of a struct timeval value." */-
228 time_t t = UT_TIME_MEMBER (utmp_ent);-
229 struct tm *tmp = localtime (&t);-
230-
231 if (tmp)
tmpDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
232 {-
233 strftime (buf, sizeof buf, time_format, tmp);-
234 return buf;
executed 1 time by 1 test: return buf;
Executed by:
  • who
1
235 }-
236 else-
237 return timetostr (t, buf);
never executed: return timetostr (t, buf);
0
238}-
239-
240/* Print formatted output line. Uses mostly arbitrary field sizes, probably-
241 will need tweaking if any of the localization stuff is done, or for 64 bit-
242 pids, etc. */-
243static void-
244print_line (int userlen, const char *user, const char state,-
245 int linelen, const char *line,-
246 const char *time_str, const char *idle, const char *pid,-
247 const char *comment, const char *exitstr)-
248{-
249 static char mesg[3] = { ' ', 'x', '\0' };-
250 char *buf;-
251 char x_idle[1 + IDLESTR_LEN + 1];-
252 char x_pid[1 + INT_STRLEN_BOUND (pid_t) + 1];-
253 char *x_exitstr;-
254 int err;-
255-
256 mesg[1] = state;-
257-
258 if (include_idle && !short_output && strlen (idle) < sizeof x_idle - 1)
include_idleDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
!short_outputDescription
TRUEnever evaluated
FALSEnever evaluated
strlen (idle) ...eof x_idle - 1Description
TRUEnever evaluated
FALSEnever evaluated
0-1
259 sprintf (x_idle, " %-6s", idle);
never executed: sprintf (x_idle, " %-6s", idle);
0
260 else-
261 *x_idle = '\0';
executed 1 time by 1 test: *x_idle = '\0';
Executed by:
  • who
1
262-
263 if (!short_output && strlen (pid) < sizeof x_pid - 1)
!short_outputDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
strlen (pid) <...zeof x_pid - 1Description
TRUEnever evaluated
FALSEnever evaluated
0-1
264 sprintf (x_pid, " %10s", pid);
never executed: sprintf (x_pid, " %10s", pid);
0
265 else-
266 *x_pid = '\0';
executed 1 time by 1 test: *x_pid = '\0';
Executed by:
  • who
1
267-
268 x_exitstr = xmalloc (include_exit ? 1 + MAX (12, strlen (exitstr)) + 1 : 1);-
269 if (include_exit)
include_exitDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
270 sprintf (x_exitstr, " %-12s", exitstr);
never executed: sprintf (x_exitstr, " %-12s", exitstr);
0
271 else-
272 *x_exitstr = '\0';
executed 1 time by 1 test: *x_exitstr = '\0';
Executed by:
  • who
1
273-
274 err = asprintf (&buf,-
275 "%-8.*s"-
276 "%s"-
277 " %-12.*s"-
278 " %-*s"-
279 "%s"-
280 "%s"-
281 " %-8s"-
282 "%s"-
283 ,-
284 userlen, user ? user : " .",-
285 include_mesg ? mesg : "",-
286 linelen, line,-
287 time_format_width,-
288 time_str,-
289 x_idle,-
290 x_pid,-
291 /* FIXME: it's not really clear whether the following-
292 field should be in the short_output. A strict reading-
293 of SUSv2 would suggest not, but I haven't seen any-
294 implementations that actually work that way... */-
295 comment,-
296 x_exitstr-
297 );-
298 if (err == -1)
err == -1Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
299 xalloc_die ();
never executed: xalloc_die ();
0
300-
301 {-
302 /* Remove any trailing spaces. */-
303 char *p = buf + strlen (buf);-
304 while (*--p == ' ')
*--p == ' 'Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • who
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
1-4
305 /* empty */;
executed 4 times by 1 test: ;
Executed by:
  • who
4
306 *(p + 1) = '\0';-
307 }-
308-
309 puts (buf);-
310 free (buf);-
311 free (x_exitstr);-
312}
executed 1 time by 1 test: end of block
Executed by:
  • who
1
313-
314/* Return true if a terminal device given as PSTAT allows other users-
315 to send messages to; false otherwise */-
316static bool-
317is_tty_writable (struct stat const *pstat)-
318{-
319#ifdef TTY_GROUP_NAME-
320 /* Ensure the group of the TTY device matches TTY_GROUP_NAME, more info at-
321 https://bugzilla.redhat.com/454261 */-
322 struct group *ttygr = getgrnam (TTY_GROUP_NAME);-
323 if (!ttygr || (pstat->st_gid != ttygr->gr_gid))-
324 return false;-
325#endif-
326-
327 return pstat->st_mode & S_IWGRP;
executed 1 time by 1 test: return pstat->st_mode & (0200 >> 3) ;
Executed by:
  • who
1
328}-
329-
330/* Send properly parsed USER_PROCESS info to print_line. The most-
331 recent boot time is BOOTTIME. */-
332static void-
333print_user (const STRUCT_UTMP *utmp_ent, time_t boottime)-
334{-
335 struct stat stats;-
336 time_t last_change;-
337 char mesg;-
338 char idlestr[IDLESTR_LEN + 1];-
339 static char *hoststr;-
340#if HAVE_UT_HOST-
341 static size_t hostlen;-
342#endif-
343-
344#define DEV_DIR_WITH_TRAILING_SLASH "/dev/"-
345#define DEV_DIR_LEN (sizeof (DEV_DIR_WITH_TRAILING_SLASH) - 1)-
346-
347 char line[sizeof (utmp_ent->ut_line) + DEV_DIR_LEN + 1];-
348 char *p = line;-
349 PIDSTR_DECL_AND_INIT (pidstr, utmp_ent);-
350-
351 /* Copy ut_line into LINE, prepending '/dev/' if ut_line is not-
352 already an absolute file name. Some systems may put the full,-
353 absolute file name in ut_line. */-
354 if ( ! IS_ABSOLUTE_FILE_NAME (utmp_ent->ut_line))
(((utmp_ent->u...e)[0]) == '/')Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0 != 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
355 p = stpcpy (p, DEV_DIR_WITH_TRAILING_SLASH);
executed 1 time by 1 test: p = stpcpy (p, "/dev/");
Executed by:
  • who
1
356 stzncpy (p, utmp_ent->ut_line, sizeof (utmp_ent->ut_line));-
357-
358 if (stat (line, &stats) == 0)
stat (line, &stats) == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
359 {-
360 mesg = is_tty_writable (&stats) ? '+' : '-';
is_tty_writable (&stats)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
361 last_change = stats.st_atime;-
362 }
executed 1 time by 1 test: end of block
Executed by:
  • who
1
363 else-
364 {-
365 mesg = '?';-
366 last_change = 0;-
367 }
never executed: end of block
0
368-
369 if (last_change)
last_changeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
370 sprintf (idlestr, "%.*s", IDLESTR_LEN, idle_string (last_change, boottime));
executed 1 time by 1 test: sprintf (idlestr, "%.*s", 6, idle_string (last_change, boottime));
Executed by:
  • who
1
371 else-
372 sprintf (idlestr, " ?");
never executed: sprintf (idlestr, " ?");
0
373-
374#if HAVE_UT_HOST-
375 if (utmp_ent->ut_host[0])
utmp_ent->ut_host[0]Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
376 {-
377 char ut_host[sizeof (utmp_ent->ut_host) + 1];-
378 char *host = NULL;-
379 char *display = NULL;-
380-
381 /* Copy the host name into UT_HOST, and ensure it's nul terminated. */-
382 stzncpy (ut_host, utmp_ent->ut_host, sizeof (utmp_ent->ut_host));-
383-
384 /* Look for an X display. */-
385 display = strchr (ut_host, ':');
__builtin_constant_p ( ':' )Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
!__builtin_con..._p ( ut_host )Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
( ':' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
386 if (display)
displayDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
387 *display++ = '\0';
executed 1 time by 1 test: *display++ = '\0';
Executed by:
  • who
1
388-
389 if (*ut_host && do_lookup)
*ut_hostDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
do_lookupDescription
TRUEnever evaluated
FALSEnever evaluated
0-1
390 {-
391 /* See if we can canonicalize it. */-
392 host = canon_host (ut_host);-
393 }
never executed: end of block
0
394-
395 if (! host)
! hostDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
396 host = ut_host;
executed 1 time by 1 test: host = ut_host;
Executed by:
  • who
1
397-
398 if (display)
displayDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
399 {-
400 if (hostlen < strlen (host) + strlen (display) + 4)
hostlen < strl... (display) + 4Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
401 {-
402 hostlen = strlen (host) + strlen (display) + 4;-
403 free (hoststr);-
404 hoststr = xmalloc (hostlen);-
405 }
executed 1 time by 1 test: end of block
Executed by:
  • who
1
406 sprintf (hoststr, "(%s:%s)", host, display);-
407 }
executed 1 time by 1 test: end of block
Executed by:
  • who
1
408 else-
409 {-
410 if (hostlen < strlen (host) + 3)
hostlen < strlen (host) + 3Description
TRUEnever evaluated
FALSEnever evaluated
0
411 {-
412 hostlen = strlen (host) + 3;-
413 free (hoststr);-
414 hoststr = xmalloc (hostlen);-
415 }
never executed: end of block
0
416 sprintf (hoststr, "(%s)", host);-
417 }
never executed: end of block
0
418-
419 if (host != ut_host)
host != ut_hostDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
420 free (host);
never executed: free (host);
0
421 }
executed 1 time by 1 test: end of block
Executed by:
  • who
1
422 else-
423 {-
424 if (hostlen < 1)
hostlen < 1Description
TRUEnever evaluated
FALSEnever evaluated
0
425 {-
426 hostlen = 1;-
427 free (hoststr);-
428 hoststr = xmalloc (hostlen);-
429 }
never executed: end of block
0
430 *hoststr = '\0';-
431 }
never executed: end of block
0
432#endif-
433-
434 print_line (sizeof UT_USER (utmp_ent), UT_USER (utmp_ent), mesg,-
435 sizeof utmp_ent->ut_line, utmp_ent->ut_line,-
436 time_string (utmp_ent), idlestr, pidstr,-
437 hoststr ? hoststr : "", "");-
438}
executed 1 time by 1 test: end of block
Executed by:
  • who
1
439-
440static void-
441print_boottime (const STRUCT_UTMP *utmp_ent)-
442{-
443 print_line (-1, "", ' ', -1, _("system boot"),-
444 time_string (utmp_ent), "", "", "", "");-
445}
never executed: end of block
0
446-
447static char *-
448make_id_equals_comment (STRUCT_UTMP const *utmp_ent)-
449{-
450 char *comment = xmalloc (strlen (_("id=")) + sizeof UT_ID (utmp_ent) + 1);-
451-
452 strcpy (comment, _("id="));-
453 strncat (comment, UT_ID (utmp_ent), sizeof UT_ID (utmp_ent));-
454 return comment;
never executed: return comment;
0
455}-
456-
457static void-
458print_deadprocs (const STRUCT_UTMP *utmp_ent)-
459{-
460 static char *exitstr;-
461 char *comment = make_id_equals_comment (utmp_ent);-
462 PIDSTR_DECL_AND_INIT (pidstr, utmp_ent);-
463-
464 if (!exitstr)
!exitstrDescription
TRUEnever evaluated
FALSEnever evaluated
0
465 exitstr = xmalloc (strlen (_("term="))
never executed: exitstr = xmalloc (strlen ( dcgettext (((void *)0), "term=" , 5) ) + (((((sizeof (((utmp_ent)->ut_exit.e_termination)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_termination))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_termination))) -1))) * 146 + 484) ...ut_exit.e_exit)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) * 146 + 484) / 485) + (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) + 1);
0
466 + INT_STRLEN_BOUND (UT_EXIT_E_TERMINATION (utmp_ent)) + 1
never executed: exitstr = xmalloc (strlen ( dcgettext (((void *)0), "term=" , 5) ) + (((((sizeof (((utmp_ent)->ut_exit.e_termination)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_termination))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_termination))) -1))) * 146 + 484) ...ut_exit.e_exit)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) * 146 + 484) / 485) + (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) + 1);
0
467 + strlen (_("exit="))
never executed: exitstr = xmalloc (strlen ( dcgettext (((void *)0), "term=" , 5) ) + (((((sizeof (((utmp_ent)->ut_exit.e_termination)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_termination))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_termination))) -1))) * 146 + 484) ...ut_exit.e_exit)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) * 146 + 484) / 485) + (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) + 1);
0
468 + INT_STRLEN_BOUND (UT_EXIT_E_EXIT (utmp_ent))
never executed: exitstr = xmalloc (strlen ( dcgettext (((void *)0), "term=" , 5) ) + (((((sizeof (((utmp_ent)->ut_exit.e_termination)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_termination))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_termination))) -1))) * 146 + 484) ...ut_exit.e_exit)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) * 146 + 484) / 485) + (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) + 1);
0
469 + 1);
never executed: exitstr = xmalloc (strlen ( dcgettext (((void *)0), "term=" , 5) ) + (((((sizeof (((utmp_ent)->ut_exit.e_termination)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_termination))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_termination))) -1))) * 146 + 484) ...ut_exit.e_exit)) * 8) - (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) * 146 + 484) / 485) + (! ((__typeof__ (((utmp_ent)->ut_exit.e_exit))) 0 < (__typeof__ (((utmp_ent)->ut_exit.e_exit))) -1))) + 1);
0
470 sprintf (exitstr, "%s%d %s%d", _("term="), UT_EXIT_E_TERMINATION (utmp_ent),-
471 _("exit="), UT_EXIT_E_EXIT (utmp_ent));-
472-
473 /* FIXME: add idle time? */-
474-
475 print_line (-1, "", ' ', sizeof utmp_ent->ut_line, utmp_ent->ut_line,-
476 time_string (utmp_ent), "", pidstr, comment, exitstr);-
477 free (comment);-
478}
never executed: end of block
0
479-
480static void-
481print_login (const STRUCT_UTMP *utmp_ent)-
482{-
483 char *comment = make_id_equals_comment (utmp_ent);-
484 PIDSTR_DECL_AND_INIT (pidstr, utmp_ent);-
485-
486 /* FIXME: add idle time? */-
487-
488 print_line (-1, _("LOGIN"), ' ', sizeof utmp_ent->ut_line, utmp_ent->ut_line,-
489 time_string (utmp_ent), "", pidstr, comment, "");-
490 free (comment);-
491}
never executed: end of block
0
492-
493static void-
494print_initspawn (const STRUCT_UTMP *utmp_ent)-
495{-
496 char *comment = make_id_equals_comment (utmp_ent);-
497 PIDSTR_DECL_AND_INIT (pidstr, utmp_ent);-
498-
499 print_line (-1, "", ' ', sizeof utmp_ent->ut_line, utmp_ent->ut_line,-
500 time_string (utmp_ent), "", pidstr, comment, "");-
501 free (comment);-
502}
never executed: end of block
0
503-
504static void-
505print_clockchange (const STRUCT_UTMP *utmp_ent)-
506{-
507 /* FIXME: handle NEW_TIME & OLD_TIME both */-
508 print_line (-1, "", ' ', -1, _("clock change"),-
509 time_string (utmp_ent), "", "", "", "");-
510}
never executed: end of block
0
511-
512static void-
513print_runlevel (const STRUCT_UTMP *utmp_ent)-
514{-
515 static char *runlevline, *comment;-
516 unsigned char last = UT_PID (utmp_ent) / 256;-
517 unsigned char curr = UT_PID (utmp_ent) % 256;-
518-
519 if (!runlevline)
!runlevlineDescription
TRUEnever evaluated
FALSEnever evaluated
0
520 runlevline = xmalloc (strlen (_("run-level")) + 3);
never executed: runlevline = xmalloc (strlen ( dcgettext (((void *)0), "run-level" , 5) ) + 3);
0
521 sprintf (runlevline, "%s %c", _("run-level"), curr);-
522-
523 if (!comment)
!commentDescription
TRUEnever evaluated
FALSEnever evaluated
0
524 comment = xmalloc (strlen (_("last=")) + 2);
never executed: comment = xmalloc (strlen ( dcgettext (((void *)0), "last=" , 5) ) + 2);
0
525 sprintf (comment, "%s%c", _("last="), (last == 'N') ? 'S' : last);-
526-
527 print_line (-1, "", ' ', -1, runlevline, time_string (utmp_ent),-
528 "", "", c_isprint (last) ? comment : "", "");-
529-
530 return;
never executed: return;
0
531}-
532-
533/* Print the username of each valid entry and the number of valid entries-
534 in UTMP_BUF, which should have N elements. */-
535static void-
536list_entries_who (size_t n, const STRUCT_UTMP *utmp_buf)-
537{-
538 unsigned long int entries = 0;-
539 char const *separator = "";-
540-
541 while (n--)
n--Description
TRUEnever evaluated
FALSEnever evaluated
0
542 {-
543 if (IS_USER_PROCESS (utmp_buf))
dead code: ((utmp_buf)->ut_tv.tv_sec) != 0
((utmp_buf)-> ut_user )[0]Description
TRUEnever evaluated
FALSEnever evaluated
((utmp_buf)->ut_type == ( 7 ))Description
TRUEnever evaluated
FALSEnever evaluated
-
544 {-
545 char *trimmed_name;-
546-
547 trimmed_name = extract_trimmed_name (utmp_buf);-
548-
549 printf ("%s%s", separator, trimmed_name);-
550 free (trimmed_name);-
551 separator = " ";-
552 entries++;-
553 }
never executed: end of block
0
554 utmp_buf++;-
555 }
never executed: end of block
0
556 printf (_("\n# users=%lu\n"), entries);-
557}
never executed: end of block
0
558-
559static void-
560print_heading (void)-
561{-
562 print_line (-1, _("NAME"), ' ', -1, _("LINE"), _("TIME"), _("IDLE"),-
563 _("PID"), _("COMMENT"), _("EXIT"));-
564}
never executed: end of block
0
565-
566/* Display UTMP_BUF, which should have N entries. */-
567static void-
568scan_entries (size_t n, const STRUCT_UTMP *utmp_buf)-
569{-
570 char *ttyname_b IF_LINT ( = NULL);-
571 time_t boottime = TYPE_MINIMUM (time_t);-
572-
573 if (include_heading)
include_headingDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
574 print_heading ();
never executed: print_heading ();
0
575-
576 if (my_line_only)
my_line_onlyDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
577 {-
578 ttyname_b = ttyname (STDIN_FILENO);-
579 if (!ttyname_b)
!ttyname_bDescription
TRUEnever evaluated
FALSEnever evaluated
0
580 return;
never executed: return;
0
581 if (STRNCMP_LIT (ttyname_b, DEV_DIR_WITH_TRAILING_SLASH) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( ttyname_b ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "" "/dev/" "" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__...) - 1 ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons..."/dev/") - 1 )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons... ( ttyname_b )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( ttyna.../dev/") - 1 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons..." "/dev/" "" )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( "" "/.../dev/") - 1 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
582 ttyname_b += DEV_DIR_LEN; /* Discard /dev/ prefix. */
never executed: ttyname_b += (sizeof ("/dev/") - 1);
0
583 }
never executed: end of block
0
584-
585 while (n--)
n--Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • who
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
1-4
586 {-
587 if (!my_line_only
!my_line_onlyDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-4
588 || STREQ_LEN (ttyname_b, utmp_buf->ut_line,
never executed: __result = (((const unsigned char *) (const char *) ( ttyname_b ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( utmp_buf->ut_line ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
( (__extension...ine) ))) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...uf->ut_line) )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons... ( ttyname_b )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( ttyna...f->ut_line) ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...buf->ut_line )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( utmp_...f->ut_line) ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
589 sizeof (utmp_buf->ut_line)))-
590 {-
591 if (need_users && IS_USER_PROCESS (utmp_buf))
dead code: ((utmp_buf)->ut_tv.tv_sec) != 0
need_usersDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • who
FALSEnever evaluated
((utmp_buf)-> ut_user )[0]Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • who
FALSEnever evaluated
((utmp_buf)->ut_type == ( 7 ))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
-
592 print_user (utmp_buf, boottime);
executed 1 time by 1 test: print_user (utmp_buf, boottime);
Executed by:
  • who
1
593 else if (need_runlevel && UT_TYPE_RUN_LVL (utmp_buf))
need_runlevelDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
((utmp_buf)->ut_type == ( 1 ))Description
TRUEnever evaluated
FALSEnever evaluated
0-3
594 print_runlevel (utmp_buf);
never executed: print_runlevel (utmp_buf);
0
595 else if (need_boottime && UT_TYPE_BOOT_TIME (utmp_buf))
need_boottimeDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
((utmp_buf)->ut_type == ( 2 ))Description
TRUEnever evaluated
FALSEnever evaluated
0-3
596 print_boottime (utmp_buf);
never executed: print_boottime (utmp_buf);
0
597 /* I've never seen one of these, so I don't know what it should-
598 look like :^)-
599 FIXME: handle OLD_TIME also, perhaps show the delta? */-
600 else if (need_clockchange && UT_TYPE_NEW_TIME (utmp_buf))
need_clockchangeDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
((utmp_buf)->ut_type == ( 3 ))Description
TRUEnever evaluated
FALSEnever evaluated
0-3
601 print_clockchange (utmp_buf);
never executed: print_clockchange (utmp_buf);
0
602 else if (need_initspawn && UT_TYPE_INIT_PROCESS (utmp_buf))
need_initspawnDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
((utmp_buf)->ut_type == ( 5 ))Description
TRUEnever evaluated
FALSEnever evaluated
0-3
603 print_initspawn (utmp_buf);
never executed: print_initspawn (utmp_buf);
0
604 else if (need_login && UT_TYPE_LOGIN_PROCESS (utmp_buf))
need_loginDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
((utmp_buf)->ut_type == ( 6 ))Description
TRUEnever evaluated
FALSEnever evaluated
0-3
605 print_login (utmp_buf);
never executed: print_login (utmp_buf);
0
606 else if (need_deadprocs && UT_TYPE_DEAD_PROCESS (utmp_buf))
need_deadprocsDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
((utmp_buf)->ut_type == ( 8 ))Description
TRUEnever evaluated
FALSEnever evaluated
0-3
607 print_deadprocs (utmp_buf);
never executed: print_deadprocs (utmp_buf);
0
608 }
executed 4 times by 1 test: end of block
Executed by:
  • who
4
609-
610 if (UT_TYPE_BOOT_TIME (utmp_buf))
((utmp_buf)->ut_type == ( 2 ))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEevaluated 3 times by 1 test
Evaluated by:
  • who
1-3
611 boottime = UT_TIME_MEMBER (utmp_buf);
executed 1 time by 1 test: boottime = ((utmp_buf)->ut_tv.tv_sec);
Executed by:
  • who
1
612-
613 utmp_buf++;-
614 }
executed 4 times by 1 test: end of block
Executed by:
  • who
4
615}
executed 1 time by 1 test: end of block
Executed by:
  • who
1
616-
617/* Display a list of who is on the system, according to utmp file FILENAME.-
618 Use read_utmp OPTIONS to read the file. */-
619static void-
620who (const char *filename, int options)-
621{-
622 size_t n_users;-
623 STRUCT_UTMP *utmp_buf;-
624-
625 if (read_utmp (filename, &n_users, &utmp_buf, options) != 0)
read_utmp (fil... options) != 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
626 die (EXIT_FAILURE, errno, "%s", quotef (filename));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), \"%s\", quotearg_n_style_colon (0, shell_escape_quoting_style, filename)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errno_location ...(0, shell_escape_quoting_style, filename)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , "%s", quotearg_n_style_colon (0, shell_escape_quoting_style, filename)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
0
627-
628 if (short_list)
short_listDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
629 list_entries_who (n_users, utmp_buf);
never executed: list_entries_who (n_users, utmp_buf);
0
630 else-
631 scan_entries (n_users, utmp_buf);
executed 1 time by 1 test: scan_entries (n_users, utmp_buf);
Executed by:
  • who
1
632-
633 free (utmp_buf);-
634}
executed 1 time by 1 test: end of block
Executed by:
  • who
1
635-
636void-
637usage (int status)-
638{-
639 if (status != EXIT_SUCCESS)
status != 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • who
FALSEevaluated 32 times by 1 test
Evaluated by:
  • who
3-32
640 emit_try_help ();
executed 3 times by 1 test: end of block
Executed by:
  • who
3
641 else-
642 {-
643 printf (_("Usage: %s [OPTION]... [ FILE | ARG1 ARG2 ]\n"), program_name);-
644 fputs (_("\-
645Print information about users who are currently logged in.\n\-
646"), stdout);-
647 fputs (_("\-
648\n\-
649 -a, --all same as -b -d --login -p -r -t -T -u\n\-
650 -b, --boot time of last system boot\n\-
651 -d, --dead print dead processes\n\-
652 -H, --heading print line of column headings\n\-
653"), stdout);-
654 fputs (_("\-
655 -l, --login print system login processes\n\-
656"), stdout);-
657 fputs (_("\-
658 --lookup attempt to canonicalize hostnames via DNS\n\-
659 -m only hostname and user associated with stdin\n\-
660 -p, --process print active processes spawned by init\n\-
661"), stdout);-
662 fputs (_("\-
663 -q, --count all login names and number of users logged on\n\-
664 -r, --runlevel print current runlevel\n\-
665 -s, --short print only name, line, and time (default)\n\-
666 -t, --time print last system clock change\n\-
667"), stdout);-
668 fputs (_("\-
669 -T, -w, --mesg add user's message status as +, - or ?\n\-
670 -u, --users list users logged in\n\-
671 --message same as -T\n\-
672 --writable same as -T\n\-
673"), stdout);-
674 fputs (HELP_OPTION_DESCRIPTION, stdout);-
675 fputs (VERSION_OPTION_DESCRIPTION, stdout);-
676 printf (_("\-
677\n\-
678If FILE is not specified, use %s. %s as FILE is common.\n\-
679If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.\n\-
680"), UTMP_FILE, WTMP_FILE);-
681 emit_ancillary_info (PROGRAM_NAME);-
682 }
executed 32 times by 1 test: end of block
Executed by:
  • who
32
683 exit (status);
executed 35 times by 1 test: exit (status);
Executed by:
  • who
35
684}-
685-
686int-
687main (int argc, char **argv)-
688{-
689 int optc;-
690 bool assumptions = true;-
691-
692 initialize_main (&argc, &argv);-
693 set_program_name (argv[0]);-
694 setlocale (LC_ALL, "");-
695 bindtextdomain (PACKAGE, LOCALEDIR);-
696 textdomain (PACKAGE);-
697-
698 atexit (close_stdout);-
699-
700 while ((optc = getopt_long (argc, argv, "abdlmpqrstuwHT", longopts, NULL))
(optc = getopt... *)0) )) != -1Description
TRUEevaluated 67 times by 1 test
Evaluated by:
  • who
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
1-67
701 != -1)
(optc = getopt... *)0) )) != -1Description
TRUEevaluated 67 times by 1 test
Evaluated by:
  • who
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
1-67
702 {-
703 switch (optc)-
704 {-
705 case 'a':
executed 2 times by 1 test: case 'a':
Executed by:
  • who
2
706 need_boottime = true;-
707 need_deadprocs = true;-
708 need_login = true;-
709 need_initspawn = true;-
710 need_runlevel = true;-
711 need_clockchange = true;-
712 need_users = true;-
713 include_mesg = true;-
714 include_idle = true;-
715 include_exit = true;-
716 assumptions = false;-
717 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
718-
719 case 'b':
executed 2 times by 1 test: case 'b':
Executed by:
  • who
2
720 need_boottime = true;-
721 assumptions = false;-
722 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
723-
724 case 'd':
executed 2 times by 1 test: case 'd':
Executed by:
  • who
2
725 need_deadprocs = true;-
726 include_idle = true;-
727 include_exit = true;-
728 assumptions = false;-
729 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
730-
731 case 'H':
executed 2 times by 1 test: case 'H':
Executed by:
  • who
2
732 include_heading = true;-
733 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
734-
735 case 'l':
executed 2 times by 1 test: case 'l':
Executed by:
  • who
2
736 need_login = true;-
737 include_idle = true;-
738 assumptions = false;-
739 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
740-
741 case 'm':
executed 1 time by 1 test: case 'm':
Executed by:
  • who
1
742 my_line_only = true;-
743 break;
executed 1 time by 1 test: break;
Executed by:
  • who
1
744-
745 case 'p':
executed 2 times by 1 test: case 'p':
Executed by:
  • who
2
746 need_initspawn = true;-
747 assumptions = false;-
748 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
749-
750 case 'q':
executed 2 times by 1 test: case 'q':
Executed by:
  • who
2
751 short_list = true;-
752 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
753-
754 case 'r':
executed 2 times by 1 test: case 'r':
Executed by:
  • who
2
755 need_runlevel = true;-
756 include_idle = true;-
757 assumptions = false;-
758 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
759-
760 case 's':
executed 2 times by 1 test: case 's':
Executed by:
  • who
2
761 short_output = true;-
762 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
763-
764 case 't':
executed 2 times by 1 test: case 't':
Executed by:
  • who
2
765 need_clockchange = true;-
766 assumptions = false;-
767 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
768-
769 case 'T':
executed 4 times by 1 test: case 'T':
Executed by:
  • who
4
770 case 'w':
executed 1 time by 1 test: case 'w':
Executed by:
  • who
1
771 include_mesg = true;-
772 break;
executed 5 times by 1 test: break;
Executed by:
  • who
5
773-
774 case 'u':
executed 2 times by 1 test: case 'u':
Executed by:
  • who
2
775 need_users = true;-
776 include_idle = true;-
777 assumptions = false;-
778 break;
executed 2 times by 1 test: break;
Executed by:
  • who
2
779-
780 case LOOKUP_OPTION:
executed 1 time by 1 test: case LOOKUP_OPTION:
Executed by:
  • who
1
781 do_lookup = true;-
782 break;
executed 1 time by 1 test: break;
Executed by:
  • who
1
783-
784 case_GETOPT_HELP_CHAR;
never executed: break;
executed 32 times by 1 test: case GETOPT_HELP_CHAR:
Executed by:
  • who
0-32
785-
786 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
executed 3 times by 1 test: exit ( 0 );
Executed by:
  • who
never executed: break;
executed 3 times by 1 test: case GETOPT_VERSION_CHAR:
Executed by:
  • who
0-3
787-
788 default:
executed 3 times by 1 test: default:
Executed by:
  • who
3
789 usage (EXIT_FAILURE);-
790 }
never executed: end of block
0
791 }-
792-
793 if (assumptions)
assumptionsDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • who
FALSEnever evaluated
0-1
794 {-
795 need_users = true;-
796 short_output = true;-
797 }
executed 1 time by 1 test: end of block
Executed by:
  • who
1
798-
799 if (include_exit)
include_exitDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
800 {-
801 short_output = false;-
802 }
never executed: end of block
0
803-
804 if (hard_locale (LC_TIME))
hard_locale ( 2 )Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • who
0-1
805 {-
806 time_format = "%Y-%m-%d %H:%M";-
807 time_format_width = 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2;-
808 }
never executed: end of block
0
809 else-
810 {-
811 time_format = "%b %e %H:%M";-
812 time_format_width = 3 + 1 + 2 + 1 + 2 + 1 + 2;-
813 }
executed 1 time by 1 test: end of block
Executed by:
  • who
1
814-
815 switch (argc - optind)-
816 {-
817 case 2: /* who <blurf> <glop> */
never executed: case 2:
0
818 my_line_only = true;-
819 FALLTHROUGH;-
820 case -1:
code before this statement never executed: case -1:
never executed: case -1:
0
821 case 0: /* who */
executed 1 time by 1 test: case 0:
Executed by:
  • who
1
822 who (UTMP_FILE, READ_UTMP_CHECK_PIDS);-
823 break;
executed 1 time by 1 test: break;
Executed by:
  • who
1
824-
825 case 1: /* who <utmp file> */
never executed: case 1:
0
826 who (argv[optind], 0);-
827 break;
never executed: break;
0
828-
829 default: /* lose */
never executed: default:
0
830 error (0, 0, _("extra operand %s"), quote (argv[optind + 2]));-
831 usage (EXIT_FAILURE);-
832 }
never executed: end of block
0
833-
834 return EXIT_SUCCESS;
executed 1 time by 1 test: return 0 ;
Executed by:
  • who
1
835}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2