1c0b746e5SOllivier Robert /* machines.c - provide special support for peculiar architectures 2c0b746e5SOllivier Robert * 3c0b746e5SOllivier Robert * Real bummers unite ! 4c0b746e5SOllivier Robert * 5c0b746e5SOllivier Robert */ 6c0b746e5SOllivier Robert 7c0b746e5SOllivier Robert #ifdef HAVE_CONFIG_H 8c0b746e5SOllivier Robert #include "config.h" 9c0b746e5SOllivier Robert #endif 10c0b746e5SOllivier Robert 11c0b746e5SOllivier Robert #include "ntp_machine.h" 12c0b746e5SOllivier Robert #include "ntp_syslog.h" 13c0b746e5SOllivier Robert #include "ntp_stdlib.h" 14c0b746e5SOllivier Robert #include "ntp_unixtime.h" 15c0b746e5SOllivier Robert 16c0b746e5SOllivier Robert #ifdef HAVE_SYS_TIME_H 17c0b746e5SOllivier Robert #include <sys/time.h> 18c0b746e5SOllivier Robert #endif 19c0b746e5SOllivier Robert 20c0b746e5SOllivier Robert #ifdef HAVE_UNISTD_H 21c0b746e5SOllivier Robert #include <unistd.h> 22c0b746e5SOllivier Robert #endif 23c0b746e5SOllivier Robert 24c0b746e5SOllivier Robert #ifdef SYS_WINNT 25c0b746e5SOllivier Robert # include <conio.h> 26c0b746e5SOllivier Robert #else 27c0b746e5SOllivier Robert 28c0b746e5SOllivier Robert #ifdef SYS_VXWORKS 29c0b746e5SOllivier Robert #include "taskLib.h" 30c0b746e5SOllivier Robert #include "sysLib.h" 31c0b746e5SOllivier Robert #include "time.h" 32c0b746e5SOllivier Robert #include "ntp_syslog.h" 33c0b746e5SOllivier Robert 34c0b746e5SOllivier Robert /* some translations to the world of vxWorkings -casey */ 35c0b746e5SOllivier Robert /* first some netdb type things */ 36c0b746e5SOllivier Robert #include "ioLib.h" 37c0b746e5SOllivier Robert #include <socket.h> 38c0b746e5SOllivier Robert int h_errno; 39c0b746e5SOllivier Robert 40c0b746e5SOllivier Robert struct hostent *gethostbyname(char *name) 41c0b746e5SOllivier Robert { 42c0b746e5SOllivier Robert struct hostent *host1; 43c0b746e5SOllivier Robert h_errno = 0; /* we are always successful!!! */ 44c0b746e5SOllivier Robert host1 = (struct hostent *) malloc (sizeof(struct hostent)); 45c0b746e5SOllivier Robert host1->h_name = name; 46c0b746e5SOllivier Robert host1->h_addrtype = AF_INET; 47c0b746e5SOllivier Robert host1->h_aliases = name; 48c0b746e5SOllivier Robert host1->h_length = 4; 49c0b746e5SOllivier Robert host1->h_addr_list[0] = (char *)hostGetByName (name); 50c0b746e5SOllivier Robert host1->h_addr_list[1] = NULL; 51c0b746e5SOllivier Robert return host1; 52c0b746e5SOllivier Robert } 53c0b746e5SOllivier Robert 54c0b746e5SOllivier Robert struct hostent *gethostbyaddr(char *name, int size, int addr_type) 55c0b746e5SOllivier Robert { 56c0b746e5SOllivier Robert struct hostent *host1; 57c0b746e5SOllivier Robert h_errno = 0; /* we are always successful!!! */ 58c0b746e5SOllivier Robert host1 = (struct hostent *) malloc (sizeof(struct hostent)); 59c0b746e5SOllivier Robert host1->h_name = name; 60c0b746e5SOllivier Robert host1->h_addrtype = AF_INET; 61c0b746e5SOllivier Robert host1->h_aliases = name; 62c0b746e5SOllivier Robert host1->h_length = 4; 63c0b746e5SOllivier Robert host1->h_addr_list = NULL; 64c0b746e5SOllivier Robert return host1; 65c0b746e5SOllivier Robert } 66c0b746e5SOllivier Robert 67c0b746e5SOllivier Robert struct servent *getservbyname (char *name, char *type) 68c0b746e5SOllivier Robert { 69c0b746e5SOllivier Robert struct servent *serv1; 70c0b746e5SOllivier Robert serv1 = (struct servent *) malloc (sizeof(struct servent)); 71c0b746e5SOllivier Robert serv1->s_name = "ntp"; /* official service name */ 72c0b746e5SOllivier Robert serv1->s_aliases = NULL; /* alias list */ 73c0b746e5SOllivier Robert serv1->s_port = 123; /* port # */ 74c0b746e5SOllivier Robert serv1->s_proto = "udp"; /* protocol to use */ 75c0b746e5SOllivier Robert return serv1; 76c0b746e5SOllivier Robert } 77c0b746e5SOllivier Robert 78c0b746e5SOllivier Robert /* second 79c0b746e5SOllivier Robert * vxworks thinks it has insomnia 80c0b746e5SOllivier Robert * we have to sleep for number of seconds 81c0b746e5SOllivier Robert */ 82c0b746e5SOllivier Robert 83c0b746e5SOllivier Robert #define CLKRATE sysClkRateGet() 84c0b746e5SOllivier Robert 85c0b746e5SOllivier Robert /* I am not sure how valid the granularity is - it is from G. Eger's port */ 86c0b746e5SOllivier Robert #define CLK_GRANULARITY 1 /* Granularity of system clock in usec */ 87c0b746e5SOllivier Robert /* Used to round down # usecs/tick */ 88c0b746e5SOllivier Robert /* On a VCOM-100, PIT gets 8 MHz clk, */ 89c0b746e5SOllivier Robert /* & it prescales by 32, thus 4 usec */ 90c0b746e5SOllivier Robert /* on mv167, granularity is 1usec anyway*/ 91c0b746e5SOllivier Robert /* To defeat rounding, set to 1 */ 92c0b746e5SOllivier Robert #define USECS_PER_SEC MILLION /* Microseconds per second */ 93c0b746e5SOllivier Robert #define TICK (((USECS_PER_SEC / CLKRATE) / CLK_GRANULARITY) * CLK_GRANULARITY) 94c0b746e5SOllivier Robert 95c0b746e5SOllivier Robert /* emulate unix sleep 96c0b746e5SOllivier Robert * casey 97c0b746e5SOllivier Robert */ 98c0b746e5SOllivier Robert void sleep(int seconds) 99c0b746e5SOllivier Robert { 100c0b746e5SOllivier Robert taskDelay(seconds*TICK); 101c0b746e5SOllivier Robert } 102c0b746e5SOllivier Robert /* emulate unix alarm 103c0b746e5SOllivier Robert * that pauses and calls SIGALRM after the seconds are up... 104c0b746e5SOllivier Robert * so ... taskDelay() fudged for seconds should amount to the same thing. 105c0b746e5SOllivier Robert * casey 106c0b746e5SOllivier Robert */ 107c0b746e5SOllivier Robert void alarm (int seconds) 108c0b746e5SOllivier Robert { 109c0b746e5SOllivier Robert sleep(seconds); 110c0b746e5SOllivier Robert } 111c0b746e5SOllivier Robert 112c0b746e5SOllivier Robert #endif /* SYS_VXWORKS */ 113c0b746e5SOllivier Robert 114c0b746e5SOllivier Robert #ifdef SYS_PTX /* Does PTX still need this? */ 115c0b746e5SOllivier Robert /*#include <sys/types.h> */ 116c0b746e5SOllivier Robert #include <sys/procstats.h> 117c0b746e5SOllivier Robert 118c0b746e5SOllivier Robert int 119c0b746e5SOllivier Robert gettimeofday( 120c0b746e5SOllivier Robert struct timeval *tvp 121c0b746e5SOllivier Robert ) 122c0b746e5SOllivier Robert { 123c0b746e5SOllivier Robert /* 124c0b746e5SOllivier Robert * hi, this is Sequents sneak path to get to a clock 125c0b746e5SOllivier Robert * this is also the most logical syscall for such a function 126c0b746e5SOllivier Robert */ 127c0b746e5SOllivier Robert return (get_process_stats(tvp, PS_SELF, (struct procstats *) 0, 128c0b746e5SOllivier Robert (struct procstats *) 0)); 129c0b746e5SOllivier Robert } 130c0b746e5SOllivier Robert #endif /* SYS_PTX */ 131c0b746e5SOllivier Robert 132c0b746e5SOllivier Robert const char *set_tod_using = "UNKNOWN"; 133c0b746e5SOllivier Robert 134c0b746e5SOllivier Robert int 135c0b746e5SOllivier Robert ntp_set_tod( 136c0b746e5SOllivier Robert struct timeval *tvp, 137c0b746e5SOllivier Robert void *tzp 138c0b746e5SOllivier Robert ) 139c0b746e5SOllivier Robert { 140c0b746e5SOllivier Robert int rc; 141c0b746e5SOllivier Robert 142c0b746e5SOllivier Robert #ifdef HAVE_CLOCK_SETTIME 143c0b746e5SOllivier Robert { 144c0b746e5SOllivier Robert struct timespec ts; 145c0b746e5SOllivier Robert 146c0b746e5SOllivier Robert /* Convert timeval to timespec */ 147c0b746e5SOllivier Robert ts.tv_sec = tvp->tv_sec; 148c0b746e5SOllivier Robert ts.tv_nsec = 1000 * tvp->tv_usec; 149c0b746e5SOllivier Robert 150c0b746e5SOllivier Robert rc = clock_settime(CLOCK_REALTIME, &ts); 151c0b746e5SOllivier Robert if (!rc) 152c0b746e5SOllivier Robert { 153c0b746e5SOllivier Robert set_tod_using = "clock_settime"; 154c0b746e5SOllivier Robert return rc; 155c0b746e5SOllivier Robert } 156c0b746e5SOllivier Robert } 157c0b746e5SOllivier Robert #endif /* HAVE_CLOCK_SETTIME */ 158c0b746e5SOllivier Robert #ifdef HAVE_SETTIMEOFDAY 159c0b746e5SOllivier Robert { 160c0b746e5SOllivier Robert rc = SETTIMEOFDAY(tvp, tzp); 161c0b746e5SOllivier Robert if (!rc) 162c0b746e5SOllivier Robert { 163c0b746e5SOllivier Robert set_tod_using = "settimeofday"; 164c0b746e5SOllivier Robert return rc; 165c0b746e5SOllivier Robert } 166c0b746e5SOllivier Robert } 167c0b746e5SOllivier Robert #endif /* HAVE_SETTIMEOFDAY */ 168c0b746e5SOllivier Robert #ifdef HAVE_STIME 169c0b746e5SOllivier Robert { 170c0b746e5SOllivier Robert long tp = tvp->tv_sec; 171c0b746e5SOllivier Robert 172c0b746e5SOllivier Robert rc = stime(&tp); /* lie as bad as SysVR4 */ 173c0b746e5SOllivier Robert if (!rc) 174c0b746e5SOllivier Robert { 175c0b746e5SOllivier Robert set_tod_using = "stime"; 176c0b746e5SOllivier Robert return rc; 177c0b746e5SOllivier Robert } 178c0b746e5SOllivier Robert } 179c0b746e5SOllivier Robert #endif /* HAVE_STIME */ 180c0b746e5SOllivier Robert set_tod_using = "Failed!"; 181c0b746e5SOllivier Robert return -1; 182c0b746e5SOllivier Robert } 183c0b746e5SOllivier Robert 184c0b746e5SOllivier Robert #endif /* not SYS_WINNT */ 185c0b746e5SOllivier Robert 186c0b746e5SOllivier Robert #if defined (SYS_WINNT) || defined (SYS_VXWORKS) 187c0b746e5SOllivier Robert /* getpass is used in ntpq.c and ntpdc.c */ 188c0b746e5SOllivier Robert 189c0b746e5SOllivier Robert char * 190c0b746e5SOllivier Robert getpass(const char * prompt) 191c0b746e5SOllivier Robert { 192c0b746e5SOllivier Robert int c, i; 193c0b746e5SOllivier Robert static char password[32]; 194c0b746e5SOllivier Robert #ifdef DEBUG 195c0b746e5SOllivier Robert fprintf(stderr, "%s", prompt); 196c0b746e5SOllivier Robert fflush(stderr); 197c0b746e5SOllivier Robert #endif 198c0b746e5SOllivier Robert for (i=0; i<sizeof(password)-1 && ((c=_getch())!='\n'); i++) { 199c0b746e5SOllivier Robert password[i] = (char) c; 200c0b746e5SOllivier Robert } 201c0b746e5SOllivier Robert password[i] = '\0'; 202c0b746e5SOllivier Robert 203c0b746e5SOllivier Robert return password; 204c0b746e5SOllivier Robert } 205c0b746e5SOllivier Robert #endif /* SYS_WINNT */ 206c0b746e5SOllivier Robert 207c0b746e5SOllivier Robert #if !defined(HAVE_MEMSET) 208c0b746e5SOllivier Robert void 209c0b746e5SOllivier Robert ntp_memset( 210c0b746e5SOllivier Robert char *a, 211c0b746e5SOllivier Robert int x, 212c0b746e5SOllivier Robert int c 213c0b746e5SOllivier Robert ) 214c0b746e5SOllivier Robert { 215c0b746e5SOllivier Robert while (c-- > 0) 216c0b746e5SOllivier Robert *a++ = (char) x; 217c0b746e5SOllivier Robert } 218c0b746e5SOllivier Robert #endif /*POSIX*/ 219