xref: /petsc/src/sys/time/fdate.c (revision ceaaa4989964adb3f5eb130cb04b8f49c83e49c9)
1 
2 #include <petscsys.h>
3 #if defined(PETSC_HAVE_SYS_TIME_H)
4   #include <sys/time.h>
5 #endif
6 #include <time.h>
7 #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO)
8 PETSC_EXTERN int gettimeofday(struct timeval *, struct timezone *);
9 #endif
10 
11 /*@C
12   PetscGetDate - Gets the current date.
13 
14   Not Collective
15 
16   Input Parameter:
17 . len - length of string to hold date
18 
19   Output Parameter:
20 . date - the date
21 
22   Level: beginner
23 
24   Note:
25   This function makes a system call and thus SHOULD NOT be called from an error handler.
26 
27   Developer Notes:
28   This function is called once during `PetscInitialize()`.
29   It stashes the timestamp, and uses it when needed. This is so that
30   error handlers may report the date without generating possible
31   additional system errors during the call to get the date.
32 
33 .seealso: `PetscGetHostName()`
34 @*/
35 PetscErrorCode PetscGetDate(char date[], size_t len)
36 {
37   char *str = NULL;
38 #if defined(PETSC_HAVE_TIME)
39   time_t aclock;
40 #else
41   struct timeval tp;
42 #endif
43 
44   PetscFunctionBegin;
45 #if defined(PETSC_HAVE_TIME)
46   time(&aclock);
47   PetscCall(PetscStrncpy(date, asctime(localtime(&aclock)), len));
48 #else
49   gettimeofday(&tp, (struct timezone *)0);
50   PetscCall(PetscStrncpy(date, asctime(localtime((time_t *)&tp.tv_sec)), len));
51 #endif
52   /* now strip out the new-line chars at the end of the string */
53   PetscCall(PetscStrstr(date, "\n", &str));
54   if (str) str[0] = 0;
55   PetscFunctionReturn(PETSC_SUCCESS);
56 }
57