News for hackers. Stuff that matters.
Re:The Unix `Who` Command by chard_slicks_ on Thursday September 03, 2020 @09:27AM (#24363814)
His "who" implementation is 73 lines (21 if you remove blank lines and comments). Compare that to 836 in GNU Coreutils[0].

[0] https://github.com/coreutils/coreutils/blob/master/src/who.c

Re:The Unix `Who` Command by MisterTea on Thursday September 03, 2020 @10:23AM (#24364342)
plan 9 who is a 3 line shell script that just greps the output of ps and sorts it. You could eliminate ps and just grep through /proc but why reinvent the wheel when an existing tool already does part of the job?

I see some comments here citing a lack of options, most of which appear to have nothing to do with who is logged into the machine.

Re:The Unix `Who` Command by forgotpwd16 on Thursday September 03, 2020 @12:22PM (#24365624)
Source for the mentioned script: https://github.com/0intro/plan9/blob/master/rc/bin/who. Also, other utilities implemented as scripts are fshalt (P9's shutdown), kill, lookman (P9's apropos), uptime and whois.
Re:The Unix `Who` Command by jf on Thursday September 03, 2020 @12:33PM (#24365755)
Does anybody know why there are line breaks in the sed command?
Re:The Unix `Who` Command by forgotpwd16 on Thursday September 03, 2020 @01:40PM (#24366506)
It runs multiple expressions. That is

  sed '/pattern1/d
  pattern2/d'
is the same with

  sed '/pattern1/d; /pattern2/d'
and

  sed -e '/pattern1/d' -e '/pattern2/d'
I believe those are portable across all `sed` implementations, and they at least work with GNU `sed --posix` and plan9port's sed.
Re:The Unix `Who` Command by jf on Thursday September 03, 2020 @09:48PM (#24370968)
Thank you! This is exactly the kind of reply I was hoping for.
Re:The Unix `Who` Command by fizzled on Thursday September 03, 2020 @11:20AM (#24364878)
Is /proc as portable as `ps`?
Re:The Unix `Who` Command by JdeBP on Thursday September 03, 2020 @04:06PM (#24368268)
There's a long explanation when it comes to ps, but the very short answer is twofold:

* Don't parse the output of ps, unless it is my ps command (or plan 9's one, as here). See https://unix.stackexchange.com/a/593198/5132 and https://unix.stackexchange.com/a/578816/5132 , and their further reading, especially Greg Wooledge's article.

* /proc is as portable as ps, but that doesn't really amount to much because neither is really portable at all. Pretty much every operating system's /proc is different; and no implementation of the ps command fully conforms to even the limited subset laid out in the Single Unix Specification.

Re:The Unix `Who` Command by hibbelig on Thursday September 03, 2020 @03:56PM (#24368144)
I guess that Linux `/proc` is different from Plan 9 `/proc`, and Linux `ps` is different from Plan 9 `ps`.

So maybe yes.

Re:The Unix `Who` Command by alpb on Thursday September 03, 2020 @01:03PM (#24366116)
Re:The Unix `Who` Command by cat199 on Thursday September 03, 2020 @09:38AM (#24363903)
openbsd 'who' is in the 300 range:

http://cvsweb.openbsd.org/src/usr.bin/who/who.c?rev=1.29&con...

this version appears to derive from rewriting unix who in the 4.4BSD era to replace AT&T code (copyright 1989 / no AT&T in header notes as basis for assumption)

Re:The Unix `Who` Command by drewg123 on Thursday September 03, 2020 @10:04AM (#24364147)
Its interesting. FreeBSD's is about the same size, but was again re-written in 2002 to "to add some features required by SUSv3" : https://github.com/freebsd/freebsd/commit/1894db5ac7af64acc7...
Re:The Unix `Who` Command by kps on Thursday September 03, 2020 @10:36AM (#24364480)
V7 `who` was 62 lines; by V10 it was bloated up to 93.
Re:The Unix `Who` Command by BuildTheRobots on Thursday September 03, 2020 @09:35AM (#24363873)
> Of course, this only mocks the most basic features of the who command and doesn’t handle any option, like the famous `who am i` or `who mom hates`.

it's not quite an apples to apples comparison as his rewrite doesn't handle any options or cleverness, but it's still a massive jump in LOC.

Re:The Unix `Who` Command by chard_slicks_ on Thursday September 03, 2020 @10:02AM (#24364127)
I know that it isn't a full implementation and my comment wasn't meant as a real comparison.
Re:The Unix `Who` Command by eesmith on Thursday September 03, 2020 @09:43AM (#24363948)
Nor is it anywhere near as portability. Though that's not a big issue these days.
Re:The Unix `Who` Command by eesmith on Saturday September 05, 2020 @03:56PM (#24386431)
Wow, I touched a nerve I don't understand, to get a -1, so I'll explain myself. The GNU code looks like it's portable to a bunch of OSes, some with and some without a given feature. That sort of portability leads to having a lot of #ifdefs. If you're only going to support a handful of OSes - because that's all most people care about - then of course your code is going to be smaller.

As a concrete example, the linked-to "who" uses:

    if (entry.ut_type != USER_PROCESS)
      continue;
The GNU one uses:

      if (IS_USER_PROCESS (utmp_buf))
The IS_USER_PROCESS() macro is in gnulib's readutmp.h (which would need to be included in the overall line cound):

   # define IS_USER_PROCESS(U)                                     \
      (UT_USER (U)[0]                                              \
       && (UT_TYPE_USER_PROCESS (U)                                \
           || (UT_TYPE_NOT_DEFINED && UT_TIME_MEMBER (U) != 0)))
The UT_USER maps to ut_user on some systems, and ut_name on others:

   /* Accessor macro for the member named ut_user or ut_name.  */
   # if HAVE_UTMPX_H
   
   #  if HAVE_STRUCT_UTMPX_UT_USER
   #   define UT_USER(Utmp) ((Utmp)->ut_user)
   #  endif
   #  if HAVE_STRUCT_UTMPX_UT_NAME
   #   undef UT_USER
   #   define UT_USER(Utmp) ((Utmp)->ut_name)
   #  endif
This is because, as https://www.gnu.org/software/libc/manual/html_node/Logging-I... points out, "Note that the ut_user member of struct utmp is called ut_name in BSD. Therefore, ut_name is defined as an alias for ut_user in utmp.h"

Each of those other macros supports cases where the machine supports a given test, and when it doesn't. Including for machines which don't implement ut_type! (That's what the UT_TYPE_NOT_DEFINED case is for, which falls back to using the time field ... which has its own set of variants!)

Portability is neither options nor cleverness, so I added it to the list of considerations. But then again, most people now don't need to support decades of history and scores of Unix variants.

Re:The Unix `Who` Command by chard_slicks_ on Thursday September 03, 2020 @10:08AM (#24364176)
If you don't care about all the features then Busybox's implementation will work fine at 170 lines inclusive of comments.