Actual source code: fhost.c

      1: #define PETSC_DESIRE_FEATURE_TEST_MACROS /* for getdomainname() */
      2: /*
      3:       Code for manipulating files.
      4: */
      5: #include <petscsys.h>
      6: #if defined(PETSC_HAVE_SYS_UTSNAME_H)
      7:   #include <sys/utsname.h>
      8: #endif
      9: #if defined(PETSC_HAVE_WINDOWS_H)
     10:   #include <windows.h>
     11: #endif
     12: #if defined(PETSC_HAVE_SYS_SYSTEMINFO_H)
     13:   #include <sys/systeminfo.h>
     14: #endif
     15: #if defined(PETSC_HAVE_UNISTD_H)
     16:   #include <unistd.h>
     17: #endif
     18: #if defined(PETSC_HAVE_NETDB_H)
     19:   #include <netdb.h>
     20: #endif
     21: #include <errno.h>

     23: /*@C
     24:   PetscGetHostName - Returns the name of the host. This attempts to
     25:   return the entire Internet name. It may not return the same name
     26:   as `MPI_Get_processor_name()`.

     28:   Not Collective

     30:   Input Parameter:
     31: . nlen - length of name

     33:   Output Parameter:
     34: . name - contains host name.  Must be long enough to hold the name
     35:            This is the fully qualified name, including the domain.

     37:   Level: developer

     39:   Fortran Note:
     40: .vb
     41:   character*(128) name
     42:   call PetscGetHostName(name,ierr)
     43: .ve

     45: .seealso: `PetscGetUserName()`, `PetscGetArchType()`
     46: @*/
     47: PetscErrorCode PetscGetHostName(char name[], size_t nlen)
     48: {
     49:   char *domain = NULL;
     50: #if defined(PETSC_HAVE_UNAME) && !defined(PETSC_HAVE_GETCOMPUTERNAME)
     51:   struct utsname utname;
     52: #endif

     54:   PetscFunctionBegin;
     55: #if defined(PETSC_HAVE_GETCOMPUTERNAME)
     56:   {
     57:     size_t nnlen = nlen;

     59:     GetComputerName((LPTSTR)name, (LPDWORD)(&nnlen));
     60:   }
     61: #elif defined(PETSC_HAVE_UNAME)
     62:   // According to IEEE Std 1003.1-1988 ("POSIX.1") and 1003.1-2024, upon successful completion, uname returns
     63:   // a non-negative value. Otherwise, -1 shall be returned and errno set to indicate the error.
     64:   PetscCheck(uname(&utname) != -1, PETSC_COMM_SELF, PETSC_ERR_SYS, "uname() due to \"%s\"", strerror(errno));
     65:   PetscCall(PetscStrncpy(name, utname.nodename, nlen));
     66: #elif defined(PETSC_HAVE_GETHOSTNAME)
     67:   PetscCheck(!gethostname(name, nlen), PETSC_COMM_SELF, PETSC_ERR_SYS, "gethostname() due to \"%s\"", strerror(errno));
     68: #endif
     69:   /* if there was not enough room then system call will not null terminate name */
     70:   name[nlen - 1] = 0;

     72:   /* See if this name includes the domain */
     73:   PetscCall(PetscStrchr(name, '.', &domain));
     74:   if (!domain) {
     75:     size_t l, ll;

     77:     PetscCall(PetscStrlen(name, &l));
     78:     if (l == nlen - 1) PetscFunctionReturn(PETSC_SUCCESS);
     79:     name[l++] = '.';
     80:     name[l]   = 0;
     81: #if defined(PETSC_HAVE_GETDOMAINNAME)
     82:     PetscCheck(!getdomainname(name + l, (int)(nlen - l)), PETSC_COMM_SELF, PETSC_ERR_SYS, "getdomainname() due to \"%s\"", strerror(errno));
     83: #endif
     84:     /* check if domain name is not a dnsdomainname and nuke it */
     85:     PetscCall(PetscStrlen(name, &ll));
     86:     if (ll > 4) {
     87:       const char *suffixes[] = {".edu", ".com", ".net", ".org", ".mil", NULL};
     88:       PetscInt    index;

     90:       PetscCall(PetscStrendswithwhich(name, suffixes, &index));
     91:       if (!suffixes[index]) {
     92:         PetscCall(PetscInfo(NULL, "Rejecting domainname, likely is NIS %s\n", name));
     93:         name[l - 1] = 0;
     94:       }
     95:     }
     96:   }
     97:   PetscFunctionReturn(PETSC_SUCCESS);
     98: }