MCPcopy Create free account
hub / github.com/F-Stack/f-stack / getutimens

Function getutimens

freebsd/kern/vfs_syscalls.c:3079–3117  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3077#define UTIMENS_NULL 0x1
3078#define UTIMENS_EXIT 0x2
3079static int
3080getutimens(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(),

Callers 2

kern_futimensFunction · 0.85
kern_utimensatFunction · 0.85

Calls 2

vfs_timestampFunction · 0.85
copyinFunction · 0.50

Tested by

no test coverage detected