int file_ntimes(connection_struct *conn, const struct smb_filename *smb_fname, struct smb_file_time *ft) { int ret = -1; errno = 0; DEBUG(6, ("file_ntime: actime: %s", time_to_asc(convert_timespec_to_time_t(ft->atime)))); DEBUG(6, ("file_ntime: modtime: %s", time_to_asc(convert_timespec_to_time_t(ft->mtime)))); DEBUG(6, ("file_ntime: ctime: %s", time_to_asc(convert_timespec_to_time_t(ft->ctime)))); DEBUG(6, ("file_ntime: createtime: %s", time_to_asc(convert_timespec_to_time_t(ft->create_time)))); /* Don't update the time on read-only shares */ /* We need this as set_filetime (which can be called on close and other paths) can end up calling this function without the NEED_WRITE protection. Found by : Leo Weppelman <*****@*****.**> */ if (!CAN_WRITE(conn)) { return 0; } if(SMB_VFS_NTIMES(conn, smb_fname, ft) == 0) { return 0; } if((errno != EPERM) && (errno != EACCES)) { return -1; } if(!lp_dos_filetimes(SNUM(conn))) { return -1; } /* We have permission (given by the Samba admin) to break POSIX semantics and allow a user to change the time on a file they don't own but can write to (as DOS does). */ /* Check if we have write access. */ if (can_write_to_file(conn, smb_fname)) { /* We are allowed to become root and change the filetime. */ become_root(); ret = SMB_VFS_NTIMES(conn, smb_fname, ft); unbecome_root(); } return ret; }
int file_ntimes(connection_struct *conn, const char *fname, const struct timespec ts[2]) { SMB_STRUCT_STAT sbuf; int ret = -1; errno = 0; ZERO_STRUCT(sbuf); /* Don't update the time on read-only shares */ /* We need this as set_filetime (which can be called on close and other paths) can end up calling this function without the NEED_WRITE protection. Found by : Leo Weppelman <*****@*****.**> */ if (!CAN_WRITE(conn)) { return 0; } if(SMB_VFS_NTIMES(conn, fname, ts) == 0) { return 0; } if((errno != EPERM) && (errno != EACCES)) { return -1; } if(!lp_dos_filetimes(SNUM(conn))) { return -1; } /* We have permission (given by the Samba admin) to break POSIX semantics and allow a user to change the time on a file they don't own but can write to (as DOS does). */ /* Check if we have write access. */ if (can_write_to_file(conn, fname, &sbuf)) { /* We are allowed to become root and change the filetime. */ become_root(); ret = SMB_VFS_NTIMES(conn, fname, ts); unbecome_root(); } return ret; }
/******************************************************************* Wrapper around dos_utime that possibly allows DOS semantics rather than POSIX. *******************************************************************/ int file_utime(connection_struct *conn, char *fname, struct utimbuf *times) { extern struct current_user current_user; SMB_STRUCT_STAT sb; int ret = -1; errno = 0; if(dos_utime(fname, times) == 0) return 0; if((errno != EPERM) && (errno != EACCES)) return -1; if(!lp_dos_filetimes(SNUM(conn))) return -1; /* We have permission (given by the Samba admin) to break POSIX semantics and allow a user to change the time on a file they don't own but can write to (as DOS does). */ if(dos_stat(fname,&sb) != 0) return -1; /* Check if we have write access. */ if (CAN_WRITE(conn)) { if (((sb.st_mode & S_IWOTH) || conn->admin_user || ((sb.st_mode & S_IWUSR) && current_user.uid==sb.st_uid) || ((sb.st_mode & S_IWGRP) && in_group(sb.st_gid,current_user.gid, current_user.ngroups,current_user.groups)))) { /* We are allowed to become root and change the filetime. */ become_root(False); ret = dos_utime(fname, times); unbecome_root(False); } } return ret; }