54 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "fs.h"
 | 
						|
#include <sys/stat.h>
 | 
						|
#include "buf.h"
 | 
						|
#include "inode.h"
 | 
						|
#include <minix/vfsif.h>
 | 
						|
 | 
						|
 | 
						|
/*===========================================================================*
 | 
						|
 *				fs_newnode				     *
 | 
						|
 *===========================================================================*/
 | 
						|
PUBLIC int fs_newnode()
 | 
						|
{
 | 
						|
  register int r = OK;
 | 
						|
  mode_t bits;
 | 
						|
  struct inode *rip;
 | 
						|
  dev_t dev;
 | 
						|
 | 
						|
  caller_uid = (uid_t) fs_m_in.REQ_UID;
 | 
						|
  caller_gid = (gid_t) fs_m_in.REQ_GID;
 | 
						|
  bits = (mode_t) fs_m_in.REQ_MODE;
 | 
						|
  dev = (dev_t) fs_m_in.REQ_DEV;
 | 
						|
 | 
						|
  /* Try to allocate the inode */
 | 
						|
  if( (rip = alloc_inode(dev, bits) ) == NULL) return(err_code);
 | 
						|
 | 
						|
  switch (bits & S_IFMT) {
 | 
						|
  	case S_IFBLK:
 | 
						|
  	case S_IFCHR:
 | 
						|
		rip->i_rdev = dev;		/* Major/minor dev numbers */
 | 
						|
		break;
 | 
						|
	case S_IFIFO:
 | 
						|
		if ((get_block(dev, rip->i_num)) == NULL)
 | 
						|
			r = EIO;
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		r = EIO; /* Unsupported file type */
 | 
						|
  }
 | 
						|
 | 
						|
  if (r != OK) {
 | 
						|
	free_inode(rip);
 | 
						|
  } else {
 | 
						|
	/* Fill in the fields of the response message */
 | 
						|
	fs_m_out.RES_INODE_NR = rip->i_num;
 | 
						|
	fs_m_out.RES_MODE = rip->i_mode;
 | 
						|
	fs_m_out.RES_FILE_SIZE_LO = rip->i_size;
 | 
						|
	fs_m_out.RES_UID = rip->i_uid;
 | 
						|
	fs_m_out.RES_GID = rip->i_gid;
 | 
						|
	fs_m_out.RES_DEV = dev;
 | 
						|
  }
 | 
						|
 | 
						|
  return(r);
 | 
						|
}
 | 
						|
 |