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

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

 27:     Not Collective

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

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

 36:     Level: developer

 38:    Fortran Note:
 39:    This routine has the format
 40: .vb
 41:        character*(64) 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;
 58:     GetComputerName((LPTSTR)name, (LPDWORD)(&nnlen));
 59:   }
 60: #elif defined(PETSC_HAVE_UNAME)
 61:   uname(&utname);
 62:   PetscCall(PetscStrncpy(name, utname.nodename, nlen));
 63: #elif defined(PETSC_HAVE_GETHOSTNAME)
 64:   gethostname(name, nlen);
 65: #endif
 66:   /* if there was not enough room then system call will not null terminate name */
 67:   name[nlen - 1] = 0;

 69:   /* See if this name includes the domain */
 70:   PetscCall(PetscStrchr(name, '.', &domain));
 71:   if (!domain) {
 72:     size_t l, ll;
 73:     PetscCall(PetscStrlen(name, &l));
 74:     if (l == nlen - 1) PetscFunctionReturn(PETSC_SUCCESS);
 75:     name[l++] = '.';
 76:     name[l]   = 0;
 77: #if defined(PETSC_HAVE_GETDOMAINNAME)
 78:     PetscCheck(!getdomainname(name + l, nlen - l), PETSC_COMM_SELF, PETSC_ERR_SYS, "getdomainname()");
 79: #endif
 80:     /* check if domain name is not a dnsdomainname and nuke it */
 81:     PetscCall(PetscStrlen(name, &ll));
 82:     if (ll > 4) {
 83:       const char *suffixes[] = {".edu", ".com", ".net", ".org", ".mil", NULL};
 84:       PetscInt    index;
 85:       PetscCall(PetscStrendswithwhich(name, suffixes, &index));
 86:       if (!suffixes[index]) {
 87:         PetscCall(PetscInfo(NULL, "Rejecting domainname, likely is NIS %s\n", name));
 88:         name[l - 1] = 0;
 89:       }
 90:     }
 91:   }
 92:   PetscFunctionReturn(PETSC_SUCCESS);
 93: }