Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Jun 2012 03:40:32 GMT
From:      Shinji KOBAYASHI <skoba@moss.gr.jp>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/169282: utimes does not update st_mtim.tv_nsec when utimes(file, NULL)
Message-ID:  <201206210340.q5L3eWPn081664@red.freebsd.org>
Resent-Message-ID: <201206210350.q5L3o9Dg088106@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         169282
>Category:       kern
>Synopsis:       utimes does not update st_mtim.tv_nsec when utimes(file, NULL)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jun 21 03:50:09 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     Shinji KOBAYASHI
>Release:        FreeBSD 9.0-STABLE
>Organization:
Ehime University
>Environment:
FreeBSD shuttle 9.0-STABLE FreeBSD 9.0-STABLE #28: Sat Jun 16 15:11:09 JST 2012     skoba@shuttle:/usr/obj/usr/src/sys/shuttle  amd64

>Description:
man utimes 2 shows that utimes(file, NULL) updates file modified time to current time. But the sample code shows tv_mtim.tv_nsec equals 0, after utimes(file, NULL).

filetest.c
----
include <sys/time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
  char *name;
  struct stat filestatus;
  int fd;
  int second;
  int nanosecond;
  name = "t.log";
  
  fd = creat(name, 0666);
  fstat(fd, &filestatus);
  second = filestatus.st_mtim.tv_sec;
  nanosecond = filestatus.st_mtim.tv_nsec;
  printf("File created time %d sec,%d nsec\n", second, nanosecond);
  usleep(1000100);
  utimes(name, NULL);
  fstat(fd, &filestatus);
  printf("File modified time %d sec, %dnsec\n", filestatus.st_mtim.tv_sec, filestatus.st_mtim.tv_nsec);
  usleep(1000100);
  creat(name);
  fstat(fd, &filestatus);
  printf("File modified time %d sec, %dnsec\n", filestatus.st_mtim.tv_sec, filestatus.st_mtim.tv_nsec);
  return 0;
}
---
The result:
shuttle% ./filetest                                                       ~/src
File created time 1340243920 sec,662186384 nsec
File modified time 1340243921 sec, 0nsec
File modified time 1340243922 sec, 666190831nsec

>How-To-Repeat:
filetest.c
----
include <sys/time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
  char *name;
  struct stat filestatus;
  int fd;
  int second;
  int nanosecond;
  name = "t.log";
  
  fd = creat(name, 0666);
  fstat(fd, &filestatus);
  second = filestatus.st_mtim.tv_sec;
  nanosecond = filestatus.st_mtim.tv_nsec;
  printf("File created time %d sec,%d nsec\n", second, nanosecond);
  usleep(1000100);
  utimes(name, NULL);
  fstat(fd, &filestatus);
  printf("File modified time %d sec, %dnsec\n", filestatus.st_mtim.tv_sec, filestatus.st_mtim.tv_nsec);
  usleep(1000100);
  creat(name);
  fstat(fd, &filestatus);
  printf("File modified time %d sec, %dnsec\n", filestatus.st_mtim.tv_sec, filestatus.st_mtim.tv_nsec);
  return 0;
}
---
The result:
shuttle% cc -o filetest filetest.c
shuttle% ./filetest                                                       ~/src
File created time 1340243920 sec,662186384 nsec
File modified time 1340243921 sec, 0nsec
File modified time 1340243922 sec, 666190831nsec

>Fix:


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206210340.q5L3eWPn081664>