| 3077 | #define UTIMENS_NULL 0x1 |
| 3078 | #define UTIMENS_EXIT 0x2 |
| 3079 | static int |
| 3080 | getutimens(const struct timespec *usrtsp, enum uio_seg tspseg, |
| 3081 | struct timespec *tsp, int *retflags) |
| 3082 | { |
| 3083 | struct timespec tsnow; |
| 3084 | int error; |
| 3085 | |
| 3086 | vfs_timestamp(&tsnow); |
| 3087 | *retflags = 0; |
| 3088 | if (usrtsp == NULL) { |
| 3089 | tsp[0] = tsnow; |
| 3090 | tsp[1] = tsnow; |
| 3091 | *retflags |= UTIMENS_NULL; |
| 3092 | return (0); |
| 3093 | } |
| 3094 | if (tspseg == UIO_SYSSPACE) { |
| 3095 | tsp[0] = usrtsp[0]; |
| 3096 | tsp[1] = usrtsp[1]; |
| 3097 | } else if ((error = copyin(usrtsp, tsp, sizeof(*tsp) * 2)) != 0) |
| 3098 | return (error); |
| 3099 | if (tsp[0].tv_nsec == UTIME_OMIT && tsp[1].tv_nsec == UTIME_OMIT) |
| 3100 | *retflags |= UTIMENS_EXIT; |
| 3101 | if (tsp[0].tv_nsec == UTIME_NOW && tsp[1].tv_nsec == UTIME_NOW) |
| 3102 | *retflags |= UTIMENS_NULL; |
| 3103 | if (tsp[0].tv_nsec == UTIME_OMIT) |
| 3104 | tsp[0].tv_sec = VNOVAL; |
| 3105 | else if (tsp[0].tv_nsec == UTIME_NOW) |
| 3106 | tsp[0] = tsnow; |
| 3107 | else if (tsp[0].tv_nsec < 0 || tsp[0].tv_nsec >= 1000000000L) |
| 3108 | return (EINVAL); |
| 3109 | if (tsp[1].tv_nsec == UTIME_OMIT) |
| 3110 | tsp[1].tv_sec = VNOVAL; |
| 3111 | else if (tsp[1].tv_nsec == UTIME_NOW) |
| 3112 | tsp[1] = tsnow; |
| 3113 | else if (tsp[1].tv_nsec < 0 || tsp[1].tv_nsec >= 1000000000L) |
| 3114 | return (EINVAL); |
| 3115 | |
| 3116 | return (0); |
| 3117 | } |
| 3118 | |
| 3119 | /* |
| 3120 | * Common implementation code for utimes(), lutimes(), futimes(), futimens(), |
no test coverage detected