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 Notes:
 40:   This routine has the format
 41: .vb
 42:        character*(64) name
 43:        call PetscGetHostName(name,ierr)
 44: .ve

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

 55:   PetscFunctionBegin;
 56: #if defined(PETSC_HAVE_GETCOMPUTERNAME)
 57:   {
 58:     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;
 74:     PetscCall(PetscStrlen(name, &l));
 75:     if (l == nlen - 1) PetscFunctionReturn(PETSC_SUCCESS);
 76:     name[l++] = '.';
 77:     name[l]   = 0;
 78: #if defined(PETSC_HAVE_GETDOMAINNAME)
 79:     PetscCheck(!getdomainname(name + l, nlen - l), PETSC_COMM_SELF, PETSC_ERR_SYS, "getdomainname() due to \"%s\"", strerror(errno));
 80: #endif
 81:     /* check if domain name is not a dnsdomainname and nuke it */
 82:     PetscCall(PetscStrlen(name, &ll));
 83:     if (ll > 4) {
 84:       const char *suffixes[] = {".edu", ".com", ".net", ".org", ".mil", NULL};
 85:       PetscInt    index;
 86:       PetscCall(PetscStrendswithwhich(name, suffixes, &index));
 87:       if (!suffixes[index]) {
 88:         PetscCall(PetscInfo(NULL, "Rejecting domainname, likely is NIS %s\n", name));
 89:         name[l - 1] = 0;
 90:       }
 91:     }
 92:   }
 93:   PetscFunctionReturn(PETSC_SUCCESS);
 94: }