Thanks. I committed the patch. Two notes below.

--
Nadav Har'El
[email protected]

On Mon, Dec 12, 2016 at 9:24 AM, 'rean' via OSv Development <
[email protected]> wrote:

> ---
>  Makefile                |  2 ++
>  libc/unistd/ttyname.c   | 16 ++++++++++++++++
>  libc/unistd/ttyname_r.c | 29 +++++++++++++++++++++++++++++
>  modules/tests/Makefile  |  3 ++-
>  tests/tst-ttyname.c     | 49 ++++++++++++++++++++++++++++++
> +++++++++++++++++++
>  5 files changed, 98 insertions(+), 1 deletion(-)
>  create mode 100644 libc/unistd/ttyname.c
>  create mode 100644 libc/unistd/ttyname_r.c
>  create mode 100644 tests/tst-ttyname.c
>
> diff --git a/Makefile b/Makefile
> index 9182618..3ef3b54 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1652,6 +1652,8 @@ libc += unistd/getpgrp.o
>  libc += unistd/getppid.o
>  libc += unistd/getsid.o
>  libc += unistd/setsid.o
> +libc += unistd/ttyname_r.o
> +libc += unistd/ttyname.o
>
>  musl += regex/fnmatch.o
>  musl += regex/glob.o
> diff --git a/libc/unistd/ttyname.c b/libc/unistd/ttyname.c
> new file mode 100644
> index 0000000..3fa71b2
> --- /dev/null
> +++ b/libc/unistd/ttyname.c
> @@ -0,0 +1,16 @@
> +#include <unistd.h>
> +#include <errno.h>
> +#include <limits.h>
> +#include <memory.h>
> +
> +char* ttyname(int fd)
> +{
> +   static char buf[TTY_NAME_MAX];
> +   memset(buf, 0, sizeof(buf));
> +   int result;
> +   if ((result = ttyname_r(fd, buf, sizeof(buf)))) {
> +      errno = result;
> +      return NULL;
> +   }
> +   return buf;
> +}
> diff --git a/libc/unistd/ttyname_r.c b/libc/unistd/ttyname_r.c
> new file mode 100644
> index 0000000..0bdba2b
> --- /dev/null
> +++ b/libc/unistd/ttyname_r.c
> @@ -0,0 +1,29 @@
> +#include <unistd.h>
> +#include <errno.h>
> +#include <stdio.h>
> +#include <string.h>
> +
> +int ttyname_r(int fd, char *buf, size_t buflen)
> +{
> +   if (fd < 0) {
> +      return EBADF;
> +   }
> +   // OSv doesn't support any virtual terminals or ptys so return
> +   // the fixed pathname of /dev/console
> +   char* ttyname = "/dev/console\0";
>

The null here is unnecessary - in C, string constants are always terminated
by a null.


> +   size_t len = strlen(ttyname);
> +   if (!isatty(fd)) {
> +      return ENOTTY;
> +   } else {
> +      // Size must be large enough to hold the pathname + NULL char. buf
> must
> +      // also not be NULL
> +      if (buflen < len + 1 || !buf) {
> +         return ERANGE;
> +      } else {
> +         memcpy(buf, ttyname, len);
> +         buf[len] = 0;
> +         return 0;
> +      }
> +   }
> +   return 0;
>

As far as I can tell, there is no way to reach this return 0?
I wonder the compiler doesn't complain.


> +}
> diff --git a/modules/tests/Makefile b/modules/tests/Makefile
> index 6e3aea7..3f9cb59 100644
> --- a/modules/tests/Makefile
> +++ b/modules/tests/Makefile
> @@ -84,7 +84,8 @@ tests := tst-pthread.so misc-ramdisk.so tst-vblk.so
> tst-bsd-evh.so \
>         tst-namespace.so tst-without-namespace.so payload-env.so \
>         payload-merge-env.so misc-execve.so misc-execve-payload.so
> misc-mutex2.so \
>         tst-pthread-setcancelstate.so tst-syscall.so tst-pin.so tst-run.so
> \
> -       tst-ifaddrs.so tst-pthread-affinity-inherit.so
> tst-sem-timed-wait.so
> +       tst-ifaddrs.so tst-pthread-affinity-inherit.so
> tst-sem-timed-wait.so \
> +       tst-ttyname.so
>
>  #      libstatic-thread-variable.so tst-static-thread-variable.so \
>
> diff --git a/tests/tst-ttyname.c b/tests/tst-ttyname.c
> new file mode 100644
> index 0000000..ee2efca
> --- /dev/null
> +++ b/tests/tst-ttyname.c
> @@ -0,0 +1,49 @@
> +#include <stdio.h>
> +#include <unistd.h>
> +#include <memory.h>
> +#include <errno.h>
> +#include <stdbool.h>
> +
> +unsigned int tests_total = 0, tests_failed = 0;
> +
> +void report(const char* name, bool passed)
> +{
> +   static const char* status[] = {"FAIL", "PASS"};
> +   printf("%s: %s\n", status[passed], name);
> +   tests_total += 1;
> +   tests_failed += !passed;
> +}
> +
> +int main(void)
> +{
> +   printf("Starting ttyname_r/ttyname test\n");
> +   // Basic flow for test
> +   // 1) Take fds for stdin, stdout and stderr and call ttyname_r and
> ttyname
> +   // 2) Use an invalid fd (-1) and call ttyname_r and ttyname
> +
> +   char buf[256];
> +   memset(buf, 0, sizeof(buf));
> +   int fds[4] = {-1, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO};
> +
> +   for (int i = 0; i < 4; i++) {
> +      int retval = ttyname_r(fds[i], buf, sizeof(buf));
> +      printf("fd: %d ttyname_r retval: %d, buf: %s\n", fds[i], retval,
> buf);
> +      if (fds[i] < 0) {
> +         report("[ttyname_r] bad fds\0", retval == EBADF);
> +      } else {
> +         report("[ttyname_r] std* fd\0",
> +                retval == 0 && strcmp(buf, "/dev/console\0") == 0);
> +      }
> +      char* tty = ttyname(fds[i]);
> +      printf("fd: %d ttyname retval: %s\n", fds[i], tty);
> +      if (fds[i] < 0) {
> +         report("[ttyname] bad fds\0", tty == NULL);
> +      } else {
> +         report("[ttyname] std* fds\0", strcmp(buf, "/dev/console\0") ==
> 0);
> +      }
> +      memset(buf, 0, sizeof(buf));
> +   }
> +
> +   printf("SUMMARY: %u tests / %u failures\n", tests_total, tests_failed);
> +   return 0;
> +}
> --
> 2.7.4
>
> --
> You received this message because you are subscribed to the Google Groups
> "OSv Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to