Date: 2025-03-29T05:58:46+00:00

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:   PetscCheck(!uname(&utname), PETSC_COMM_SELF, PETSC_ERR_SYS, "uname() due to \"%s\"", strerror(errno));
     63:   PetscCall(PetscStrncpy(name, utname.nodename, nlen));
     64: #elif defined(PETSC_HAVE_GETHOSTNAME)
     65:   PetscCheck(!gethostname(name, nlen), PETSC_COMM_SELF, PETSC_ERR_SYS, "gethostname() due to \"%s\"", strerror(errno));
     66: #endif
     67:   /* if there was not enough room then system call will not null terminate name */
     68:   name[nlen - 1] = 0;

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

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

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