C Portable

Documentation
Login

Documentation

#include <stdio.h>
#include <stdlib.h> /* exit() */
#include <string.h> /* memset() */
#include <errno.h>

#include "x-uname.h"

int main(void) {

  struct utsname buffer;
  memset(&buffer, 0, sizeof(buffer));

  errno = 0;
  if (x_uname(&buffer) != 0)
  {
    perror("uname");
    exit(EXIT_FAILURE);
  }

  printf("system name = %s\n", buffer.sysname);
  printf("node name   = %s\n", buffer.nodename);
  printf("release     = %s\n", buffer.release);
  printf("version     = %s\n", buffer.version);
  printf("machine     = %s\n", buffer.machine);

#ifdef _GNU_SOURCE
  printf("domain name = %s\n", buffer.domainname);
#endif

  /* 'utsname' does not distinguish Android from other Linux platforms. */
  /* On Android, 'uname -o' returns 'Android' because it is hardcoded (#define HOST_OPERATING_SYSTEM) at build time. */
  /* https://stackoverflow.com/questions/61711186/where-does-host-operating-system-in-uname-c-comes-from */
  /* https://github.com/coreutils/gnulib/blob/master/m4/host-os.m4 */
  /* https://www.maizure.org/projects/decoded-gnu-coreutils/uname.html */
  /* The following will NOT work: */
#ifdef HOST_OPERATING_SYSTEM
  printf("operating system = %s\n", HOST_OPERATING_SYSTEM);
#endif
  /* The following should work: */
#if (MYOS == MYOS_ANDROID)
  {
    /* TODO: check system() syntax by running 'uname -o'. */
    const char *HOST_OPERATING_SYSTEM = system("uname -o");
    printf("operating system = %s\n", HOST_OPERATING_SYSTEM);
  }
#endif

  return EXIT_SUCCESS;
}