| 828 | } |
| 829 | |
| 830 | static void |
| 831 | set_metric(char *value, int key) |
| 832 | { |
| 833 | int flag = 0; |
| 834 | char *endptr; |
| 835 | u_long noval, *valp = &noval; |
| 836 | |
| 837 | switch (key) { |
| 838 | #define caseof(x, y, z) case x: valp = &rt_metrics.z; flag = y; break |
| 839 | caseof(K_MTU, RTV_MTU, rmx_mtu); |
| 840 | caseof(K_HOPCOUNT, RTV_HOPCOUNT, rmx_hopcount); |
| 841 | caseof(K_EXPIRE, RTV_EXPIRE, rmx_expire); |
| 842 | caseof(K_RECVPIPE, RTV_RPIPE, rmx_recvpipe); |
| 843 | caseof(K_SENDPIPE, RTV_SPIPE, rmx_sendpipe); |
| 844 | caseof(K_SSTHRESH, RTV_SSTHRESH, rmx_ssthresh); |
| 845 | caseof(K_RTT, RTV_RTT, rmx_rtt); |
| 846 | caseof(K_RTTVAR, RTV_RTTVAR, rmx_rttvar); |
| 847 | caseof(K_WEIGHT, RTV_WEIGHT, rmx_weight); |
| 848 | } |
| 849 | rtm_inits |= flag; |
| 850 | if (lockrest || locking) |
| 851 | rt_metrics.rmx_locks |= flag; |
| 852 | if (locking) |
| 853 | locking = 0; |
| 854 | errno = 0; |
| 855 | *valp = strtol(value, &endptr, 0); |
| 856 | if (errno == 0 && *endptr != '\0') |
| 857 | errno = EINVAL; |
| 858 | if (errno) |
| 859 | err(EX_USAGE, "%s", value); |
| 860 | if (flag & RTV_EXPIRE && (value[0] == '+' || value[0] == '-')) { |
| 861 | struct timespec ts; |
| 862 | |
| 863 | clock_gettime(CLOCK_REALTIME_FAST, &ts); |
| 864 | *valp += ts.tv_sec; |
| 865 | } |
| 866 | } |
| 867 | |
| 868 | #define F_ISHOST 0x01 |
| 869 | #define F_FORCENET 0x02 |