cmds.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 690 行 · 第 1/2 页
C
690 行
bytehostorder(&msg); if (msg.tsp_type == TSP_ACK) if (onflag) printf("timed tracing enabled\n"); else printf("timed tracing disabled\n"); else printf("wrong ack received: %s\n", tsptype[msg.tsp_type]); } else printf("communication error\n");}priv_resources(){ int port; struct sockaddr_in sin; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("opening socket"); return(-1); } sin.sin_family = AF_INET; sin.sin_addr.s_addr = 0; for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) { sin.sin_port = htons((u_short)port); if (bind(sock, (struct sockaddr *)&sin, sizeof (sin)) >= 0) break; if (errno != EADDRINUSE && errno != EADDRNOTAVAIL) { perror("bind"); (void) close(sock); return(-1); } } if (port == IPPORT_RESERVED / 2) { fprintf(stderr, "all reserved ports in use\n"); (void) close(sock); return(-1); } sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sock_raw < 0) { perror("opening raw socket"); (void) close(sock_raw); return(-1); } return(1);}#define INCR 1#define DECR 0incr(argc, argv)int argc;char *argv[];{ adjusttime(argc, argv, INCR);}decr(argc, argv)int argc;char *argv[];{ adjusttime(argc, argv, DECR);}adjusttime(argc, argv, inc)int argc;char *argv[];int inc;{ int dflag = 1, cflag = 0, gflag = 0; struct timeval tv; struct timezone tz; struct timeval timeskew; argv++; argc--; if(argc > 0 && argv[0][0] == '-') { switch ((int)argv[0][1]) { case 'd': break; case 'c': cflag++; dflag--; break; case 'g': gflag++; dflag--; break; default: printf("Usage: incr/decr [-dc] [minutes:][seconds][.micro_seconds]\n"); return; } argc--; argv++; } if(!parse_adj(argv[0], ×kew)) { printf("Usage: incr/decr [-dc] [minutes:][seconds][.micro_seconds]\n"); return; } else { argc--; argv++; } if(argc > 0) { printf("Usage: incr/decr [-dc] [minutes:][seconds][.micro_seconds]\n"); return; } if(!inc) { timeskew.tv_sec = -timeskew.tv_sec; timeskew.tv_usec = -timeskew.tv_usec; } if (dflag) { (void) gettimeofday(&tv, (struct timezone *)0); tv.tv_sec += timeskew.tv_sec; tv.tv_usec += timeskew.tv_usec; if (settimeofday(&tv, (struct timezone *)0) < 0) { perror("settimeofday"); } } else if(gflag) { settime(timeskew); } else { if(adjtime(×kew, (struct timeval *)0) < 0) { perror("adjtime:"); } }}parse_adj(adj_str, time_skew) char *adj_str; struct timeval *time_skew;{ char minstr[20]; char secstr[20]; char usecstr[20]; int min_sec = 0; int num_args = 0; if(adj_str == NULL) return(0); usecstr[0] = '\0'; if((num_args = sscanf(adj_str, "%[0-9]:%[0-9].%[0-9]", minstr, secstr, usecstr)) < 3) { minstr[0] = '\0'; secstr[0] = '\0'; if((num_args = sscanf(adj_str, "%[0-9]:%[0-9]", minstr, secstr)) < 2) { minstr[0] = '\0'; if((num_args = sscanf(adj_str, "%[0-9].%[0-9]", secstr, usecstr)) < 2) { secstr[0] = '\0'; if(sscanf(adj_str, "%[0-9]", usecstr) == 0) { return(0); } } } else min_sec = 1; } if(num_args == 1) if(strlen(usecstr) != strlen(adj_str)) return(0); else if(num_args == 2) if(min_sec == 1 && (strlen(minstr) + strlen(secstr)) != strlen(adj_str)) return(0); else if(min_sec == 0 && (strlen(secstr) + strlen(usecstr)) != strlen(adj_str)) return(0); else if(num_args == 3 && (strlen(minstr) + strlen(secstr) + strlen(usecstr)) != strlen(adj_str)) return(0);/* if( (strlen(minstr) + strlen(secstr) + strlen(usecstr)) != strlen(adj_str)) { return(0); }*/ time_skew->tv_usec = atol(usecstr); time_skew->tv_sec = (60 * atol(minstr)) + atol(secstr); return(1);}#define WAITACK 2 /* seconds */#define WAITDATEACK 5 /* seconds *//* * Set the date in the machines controlled by timedaemons * by communicating the new date to the local timedaemon. * If the timedaemon is in the master state, it performs the * correction on all slaves. If it is in the slave state, it * notifies the master that a correction is needed. * Returns 1 on success, 0 on failure. */settime(timeskew) struct timeval timeskew;{ struct timeval tv; int s, length, port, timed_ack, found, err; long waittime; fd_set ready; char hostname[MAXHOSTNAMELEN]; struct timeval tout; struct servent *sp; struct tsp msg; struct sockaddr_in sin, dest, from; sp = getservbyname("timed", "udp"); if (sp == 0) { fprintf(stderr, "udp/timed: unknown service\n"); return (0); } dest.sin_port = sp->s_port; dest.sin_family = AF_INET; dest.sin_addr.s_addr = htonl((u_long)INADDR_ANY); s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { if (errno != EPROTONOSUPPORT) perror("date: socket"); goto bad; } bzero((char *)&sin, sizeof (sin)); sin.sin_family = AF_INET; for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) { sin.sin_port = htons((u_short)port); if (bind(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0) break; if (errno != EADDRINUSE) { if (errno != EADDRNOTAVAIL) perror("date: bind"); goto bad; } } if (port == IPPORT_RESERVED / 2) { fprintf(stderr, "date: All ports in use\n"); goto bad; } msg.tsp_type = TSP_SETDATE; msg.tsp_vers = TSPVERSION; (void) gethostname(hostname, sizeof (hostname)); (void) strncpy(msg.tsp_name, hostname, sizeof (hostname)); msg.tsp_seq = htons((u_short)0);/* msg.tsp_time.tv_sec = htonl((u_long)tv.tv_sec); msg.tsp_time.tv_usec = htonl((u_long)tv.tv_usec);*/ length = sizeof (struct sockaddr_in); if (connect(s, &dest, length) < 0) { perror("date: connect"); goto bad; } (void) gettimeofday(&tv, (struct timezone *)0); tv.tv_sec += timeskew.tv_sec; tv.tv_usec += timeskew.tv_usec; msg.tsp_time.tv_sec = htonl((u_long)tv.tv_sec); msg.tsp_time.tv_usec = htonl((u_long)tv.tv_usec); if (send(s, (char *)&msg, sizeof (struct tsp), 0) < 0) { if (errno != ECONNREFUSED) perror("date: send"); goto bad; } timed_ack = -1; waittime = WAITACK;loop: tout.tv_sec = waittime; tout.tv_usec = 0; FD_ZERO(&ready); FD_SET(s, &ready); found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout); length = sizeof(err); if (getsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&err, &length) == 0 && err) { errno = err; if (errno != ECONNREFUSED) perror("date: send (delayed error)"); goto bad; } if (found > 0 && FD_ISSET(s, &ready)) { length = sizeof (struct sockaddr_in); if (recvfrom(s, (char *)&msg, sizeof (struct tsp), 0, &from, &length) < 0) { if (errno != ECONNREFUSED) perror("date: recvfrom"); goto bad; } msg.tsp_seq = ntohs(msg.tsp_seq); msg.tsp_time.tv_sec = ntohl(msg.tsp_time.tv_sec); msg.tsp_time.tv_usec = ntohl(msg.tsp_time.tv_usec); switch (msg.tsp_type) { case TSP_ACK: timed_ack = TSP_ACK; waittime = WAITDATEACK; goto loop; case TSP_DATEACK: (void)close(s); return (1); default: fprintf(stderr, "date: Wrong ack received from timed: %s\n", tsptype[msg.tsp_type]); timed_ack = -1; break; } } if (timed_ack == -1) fprintf(stderr, "date: Can't reach time daemon, time set locally.\n");bad: (void)close(s); return (0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?