Exemple #1
0
int
nfs_chmod(struct file *filp, mode_t mode) {
  struct nfs_fh *fhandle;
  struct nfs_fattr temp_fattr;
  struct nfs_sattr temp_sattr;

  int status;

  DPRINTF(CLU_LEVEL,("nfs_chmod:\n"));
  demand(filp, bogus filp);

  fhandle = GETFHANDLE(filp);

  k2printf("nfs_chmod: nfs_proc_getattr\n");
  status = nfs_proc_getattr(fhandle,&temp_fattr);

  if (status == 0) {

    /* ALLPERMS is  07777 */
    temp_sattr.mode = ((temp_fattr.mode & ~ALLPERMS) |  (mode & ALLPERMS)); 

    DPRINTF(CLU_LEVEL,("nfs_chmod: nfs_proc_getattr returned %d, "
		       "new mode %08x, old %08x, setmode: %08x\n",
		       status,mode,temp_fattr.mode,temp_sattr.mode));
    /* do only permissions, also should use macro definitions */
    temp_sattr.uid  = -1; 
    temp_sattr.gid  = -1; 
    temp_sattr.size = -1; 
    temp_sattr.atime.seconds  = -1;
    temp_sattr.atime.useconds = -1;
    temp_sattr.mtime.seconds  = -1;
    temp_sattr.mtime.useconds = -1;
    
    status = nfs_proc_setattr(fhandle,
			      &temp_sattr,
			      &temp_fattr);

    DPRINTF(CLU_LEVEL,("nfs_chmod: nfs_proc_setattr returned %d\n",status));
    if (status == 0) {
      filp->f_mode = temp_sattr.mode;
      nfs_fill_stat(&temp_fattr, GETNFSCE(filp));
    }

    return(status);}
  else {
    fprintf(stderr,"warning: nfs_chmod, was not able to do getattr\n"
	   "on a NFS filp\n");
    errno = EACCES;
    return -1;
  }

}
Exemple #2
0
int
nfs_truncate(struct file *filp, off_t length) {
  struct nfs_fh *fhandle;
  struct nfs_fattr temp_fattr;
  struct nfs_sattr temp_sattr;

  int status;
  /* make sure you interact with bc to drop unneeded page */
  DPRINTF(CLU_LEVEL,("nfs_truncate:\n"));
  demand(filp, bogus filp);

  fhandle = GETFHANDLE(filp);
  
  /* HBXX this is OVERKILL, should not flush all things. */
  nfsc_sync(GETNFSCE(filp));	/* just to be sure the size if proper */

  k2printf("nfs_truncate: nfs_proc_getattr\n");
  status = nfs_proc_getattr(fhandle,&temp_fattr);

  if (status == 0) {
    temp_sattr.mode = temp_fattr.mode;
    /* do only permissions, also should use macro definitions */
    temp_sattr.uid  = -1;
    temp_sattr.gid  = -1;
    temp_sattr.size = length;
    temp_sattr.atime.seconds  = -1;
    temp_sattr.atime.useconds = -1;
    temp_sattr.mtime.seconds  = -1;
    temp_sattr.mtime.useconds = -1;
    
    status = nfs_proc_setattr(fhandle,
			      &temp_sattr,
			      &temp_fattr);

    if (status == 0) {
      /* note that the f_pos is not changed */
      nfs_flush_filp(filp);
      nfs_fill_stat(&temp_fattr, GETNFSCE(filp));
      return(0);
    }
    errno = status;
    return(-1);
  } else {
    fprintf(stderr,"warning: nfs_truncate, was not able to do getattr\n"
	   "on a NFS filp\n");
    errno = status;
    return -1;
  }
}
Exemple #3
0
int
nfs_chown(struct file *filp, uid_t owner, gid_t group) {
  struct nfs_fh *fhandle;
  struct nfs_fattr temp_fattr;
  struct nfs_sattr temp_sattr;

  int status;

  kprintf("nfs_chown: bogusly returning success for ease of use.\n");
  return 0; /* XXX */

  DPRINTF(CLU_LEVEL,("nfs_chown:\n"));
  demand(filp, bogus filp);

  fhandle = GETFHANDLE(filp);
#if 0
  k2printf("nfs_chown: nfs_proc_getattr\n");
  status = nfs_proc_getattr(fhandle,&temp_fattr);
#else
  status = 0;
#endif
  if (status == 0) {
    temp_sattr.mode = -1;
    temp_sattr.uid  = (owner == -1) ? -1 : owner;
    temp_sattr.gid  = (group == -1) ? -1 : group;
    temp_sattr.size = -1;
    temp_sattr.atime.seconds  = -1;
    temp_sattr.atime.useconds = -1;
    temp_sattr.mtime.seconds  = -1;
    temp_sattr.mtime.useconds = -1;
    
    status = nfs_proc_setattr(
			      fhandle,
			      &temp_sattr,
			      &temp_fattr);
    if (status == 0) {
      nfs_fill_stat(&temp_fattr, GETNFSCE(filp));
    }
    return(status);}
  else {
    fprintf(stderr,"nfs_chown, was not able to do getattr\n"
	     "on a NFS filp\n");
      errno = EACCES;
      return -1;
  }
  
}
Exemple #4
0
int nfs_notify_change(struct inode *inode, struct iattr *attr)
{
	struct nfs_sattr sattr;
	struct nfs_fattr fattr;
	int error;

	sattr.mode = (unsigned) -1;
	if (attr->ia_valid & ATTR_MODE) 
		sattr.mode = attr->ia_mode;

	sattr.uid = (unsigned) -1;
	if (attr->ia_valid & ATTR_UID)
		sattr.uid = attr->ia_uid;

	sattr.gid = (unsigned) -1;
	if (attr->ia_valid & ATTR_GID)
		sattr.gid = attr->ia_gid;


	sattr.size = (unsigned) -1;
	if (attr->ia_valid & ATTR_SIZE)
		sattr.size = S_ISREG(inode->i_mode) ? attr->ia_size : -1;

	sattr.mtime.seconds = sattr.mtime.useconds = (unsigned) -1;
	if (attr->ia_valid & ATTR_MTIME) {
		sattr.mtime.seconds = attr->ia_mtime;
		sattr.mtime.useconds = 0;
	}

	sattr.atime.seconds = sattr.atime.useconds = (unsigned) -1;
	if (attr->ia_valid & ATTR_ATIME) {
		sattr.atime.seconds = attr->ia_atime;
		sattr.atime.useconds = 0;
	}

	error = nfs_proc_setattr(NFS_SERVER(inode), NFS_FH(inode),
		&sattr, &fattr);
	if (!error)
		nfs_refresh_inode(inode, &fattr);
	inode->i_dirt = 0;
	return error;
}
Exemple #5
0
/* 在网络文件系统当中,如果文件的inode被修改,
 * 则会调用该函数发起一个通知 
 */
int nfs_notify_change(int flags, struct inode *inode)
{
	struct nfs_sattr sattr;
	struct nfs_fattr fattr;
	int error;

	if (flags & NOTIFY_MODE)
		sattr.mode = inode->i_mode;
	else
		sattr.mode = (unsigned) -1;
	if (flags & NOTIFY_UIDGID) {
		sattr.uid = inode->i_uid;
		sattr.gid = inode->i_gid;
	}
	else
		sattr.uid = sattr.gid = (unsigned) -1;
	if (flags & NOTIFY_SIZE)
		sattr.size = S_ISREG(inode->i_mode) ? inode->i_size : -1;
	else
		sattr.size = (unsigned) -1;
	if (flags & NOTIFY_TIME) {
		sattr.mtime.seconds = inode->i_mtime;
		sattr.mtime.useconds = 0;
		sattr.atime.seconds = inode->i_atime;
		sattr.atime.useconds = 0;
	}
	else {
		sattr.mtime.seconds = sattr.mtime.useconds = (unsigned) -1;
		sattr.atime.seconds = sattr.atime.useconds = (unsigned) -1;
	}
	error = nfs_proc_setattr(NFS_SERVER(inode), NFS_FH(inode),
		&sattr, &fattr);
	if (!error)
		nfs_refresh_inode(inode, &fattr);
	inode->i_dirt = 0;
	return error;
}
Exemple #6
0
int
nfs_utimes(struct file *filp, const struct timeval *times) {
  struct nfs_fh *fhandle;
  struct nfs_fattr temp_fattr;
  struct nfs_sattr temp_sattr;

  int status;

  DPRINTF(CLU_LEVEL,("nfs_utimes:\n"));
  demand(filp, bogus filp);

  fhandle = GETFHANDLE(filp);
#if 0
  fprintf(stderr,"nfs_utimes: nfs_proc_getattr\n");
  status = nfs_proc_getattr(fhandle,&temp_fattr);
#else
  status = 0;
#endif
  if (status == 0) {
    temp_sattr.mode = -1;
    temp_sattr.uid  = -1;
    temp_sattr.gid  = -1;
    temp_sattr.size = -1;

    if (times) {
      //fprintf(stderr,"time passed in\n");
      temp_sattr.atime.seconds  = times[0].tv_sec;
      temp_sattr.atime.useconds = times[0].tv_usec;
      temp_sattr.mtime.seconds  = times[1].tv_sec;
      temp_sattr.mtime.useconds = times[1].tv_usec;
    } else {
      struct timeval times2;
      gettimeofday(&times2,(struct timezone *)0);
      //fprintf(stderr,"times2.tv_sec = %ld\n",times2.tv_sec);
      temp_sattr.atime.seconds  = times2.tv_sec;
      temp_sattr.atime.useconds = times2.tv_usec;
      temp_sattr.mtime.seconds  = times2.tv_sec;
      temp_sattr.mtime.useconds = times2.tv_usec;
    }
    /* the owner will be the only one allowed to change the file */
    status = nfs_proc_setattr(fhandle,
			      &temp_sattr,
			      &temp_fattr);

    //fprintf(stderr,"status: %d errno %d\n",status,errno);
    if (status == 0) {
      nfsc_p e = GETNFSCE(filp);
      nfs_fill_stat(&temp_fattr,e);
      nfs_flush_filp(filp);
    }

    
    return(status);
  } else {
    fprintf(stderr,"warning: nfs_utimes, was not able to do getattr\n"
	   "on a NFS filp\n");
    errno = EACCES;
    return -1;
  }

}