plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

dirfwstat.c (1011B)


      1 #define NOPLAN9DEFINES
      2 #include <u.h>
      3 #include <libc.h>
      4 #include <sys/time.h>
      5 #include <sys/stat.h>
      6 
      7 #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__linux__)
      8 /* do nothing -- futimes exists and is fine */
      9 
     10 #elif defined(__SunOS5_9__)
     11 /* use futimesat */
     12 static int
     13 futimes(int fd, struct timeval *tv)
     14 {
     15 	return futimesat(fd, 0, tv);
     16 }
     17 
     18 #else
     19 /* provide dummy */
     20 /* rename just in case -- linux provides an unusable one */
     21 #undef futimes
     22 #define futimes myfutimes
     23 static int
     24 futimes(int fd, struct timeval *tv)
     25 {
     26 	werrstr("futimes not available");
     27 	return -1;
     28 }
     29 
     30 #endif
     31 
     32 int
     33 dirfwstat(int fd, Dir *dir)
     34 {
     35 	int ret;
     36 	struct timeval tv[2];
     37 
     38 	ret = 0;
     39 	if(~dir->mode != 0){
     40 		if(fchmod(fd, dir->mode) < 0)
     41 			ret = -1;
     42 	}
     43 	if(~dir->mtime != 0){
     44 		tv[0].tv_sec = dir->mtime;
     45 		tv[0].tv_usec = 0;
     46 		tv[1].tv_sec = dir->mtime;
     47 		tv[1].tv_usec = 0;
     48 		if(futimes(fd, tv) < 0)
     49 			ret = -1;
     50 	}
     51 	if(~dir->length != 0){
     52 		if(ftruncate(fd, dir->length) < 0)
     53 			ret = -1;
     54 	}
     55 	return ret;
     56 }