6000: #
6001: #include "../param.h"
6002: #include "../systm.h"
6003: #include "../reg.h"
6004: #include "../buf.h"
6005: #include "../filsys.h"
6006: #include "../user.h"
6007: #include "../inode.h"
6008: #include "../file.h"
6009: #include "../conf.h"
6010:
6011: /*
6012: * the fstat system call.
6013: */
6014: fstat()
6015: {
6016: register *fp;
6017:
6018: fp = getf(u.u_ar0[R0]);
6019: if(fp == NULL)
6020: return;
6021: stat1(fp->f_inode, u.u_arg[0]);
6022: }
6023: /* --------------------------- */
6024:
6025: /*
6026: * the stat system call.
6027: */
6028: stat()
6029: {
6030: register ip;
6031: extern uchar;
6032:
6033: ip = namei(&uchar, 0);
6034: if(ip == NULL)
6035: return;
6036: stat1(ip, u.u_arg[1]);
6037: iput(ip);
6038: }
6039: /* --------------------------- */
6040:
6041: /*
6042: * The basic routine for fstat and stat:
6043: * get the inode and pass appropriate parts back.
6044: */
6045: stat1(ip, ub)
6046: int *ip;
6047: {
6048: register i, *bp, *cp;
6049:
6050: iupdat(ip, time);
6051: bp = bread(ip->i_dev, ldiv(ip->i_number+31, 16));
6052: cp = bp->b_addr + 32*lrem(ip->i_number+31, 16) + 24;
6053: ip = &(ip->i_dev);
6054: for(i=0; i<14; i++) {
6055: suword(ub, *ip++);
6056: ub =+ 2;
6057: }
6058: for(i=0; i<4; i++) {
6059: suword(ub, *cp++);
6060: ub =+ 2;
6061: }
6062: brelse(bp);
6063: }
6064: /* --------------------------- */
6065:
6066: /*
6067: * the dup system call.
6068: */
6069: dup()
6070: {
6071: register i, *fp;
6072:
6073: fp = getf(u.u_ar0[R0]);
6074: if(fp == NULL)
6075: return;
6076: if ((i = ufalloc()) < 0)
6077: return;
6078: u.u_ofile[i] = fp;
6079: fp->f_count++;
6080: }
6081: /* --------------------------- */
6082:
6083: /*
6084: * the mount system call.
6085: */
6086: smount()
6087: {
6088: int d;
6089: register *ip;
6090: register struct mount *mp, *smp;
6091: extern uchar;
6092:
6093: d = getmdev();
6094: if(u.u_error)
6095: return;
6096: u.u_dirp = u.u_arg[1];
6097: ip = namei(&uchar, 0);
6098: if(ip == NULL)
6099: return;
6100: if(ip->i_count!=1 || (ip->i_mode&(IFBLK&IFCHR))!=0)
6101: goto out;
6102: smp = NULL;
6103: for(mp = &mount[0]; mp < &mount[NMOUNT]; mp++) {
6104: if(mp->m_bufp != NULL) {
6105: if(d == mp->m_dev)
6106: goto out;
6107: } else
6108: if(smp == NULL)
6109: smp = mp;
6110: }
6111: if(smp == NULL)
6112: goto out;
6113: (*bdevsw[d.d_major].d_open)(d, !u.u_arg[2]);
6114: if(u.u_error)
6115: goto out;
6116: mp = bread(d, 1);
6117: if(u.u_error) {
6118: brelse(mp);
6119: goto out1;
6120: }
6121: smp->m_inodp = ip;
6122: smp->m_dev = d;
6123: smp->m_bufp = getblk(NODEV);
6124: bcopy(mp->b_addr, smp->m_bufp->b_addr, 256);
6125: smp = smp->m_bufp->b_addr;
6126: smp->s_ilock = 0;
6127: smp->s_flock = 0;
6128: smp->s_ronly = u.u_arg[2] & 1;
6129: brelse(mp);
6130: ip->i_flag =| IMOUNT;
6131: prele(ip);
6132: return;
6133:
6134: out:
6135: u.u_error = EBUSY;
6136: out1:
6137: iput(ip);
6138: }
6139: /* --------------------------- */
6140:
6141: /*
6142: * the umount system call.
6143: */
6144: sumount()
6145: {
6146: int d;
6147: register struct inode *ip;
6148: register struct mount *mp;
6149:
6150: update();
6151: d = getmdev();
6152: if(u.u_error)
6153: return;
6154: for(mp = &mount[0]; mp < &mount[NMOUNT]; mp++)
6155: if(mp->m_bufp!=NULL && d==mp->m_dev)
6156: goto found;
6157: u.u_error = EINVAL;
6158: return;
6159:
6160: found:
6161: for(ip = &inode[0]; ip < &inode[NINODE]; ip++)
6162: if(ip->i_number!=0 && d==ip->i_dev) {
6163: u.u_error = EBUSY;
6164: return;
6165: }
6166: (*bdevsw[d.d_major].d_close)(d, 0);
6167: ip = mp->m_inodp;
6168: ip->i_flag =& ~IMOUNT;
6169: iput(ip);
6170: ip = mp->m_bufp;
6171: mp->m_bufp = NULL;
6172: brelse(ip);
6173: }
6174: /* --------------------------- */
6175:
6176: /*
6177: * Common code for mount and umount.
6178: * Check that the user's argument is a reasonable
6179: * thing on which to mount, and return the device number if so.
6180: */
6181: getmdev()
6182: {
6183: register d, *ip;
6184: extern uchar;
6185:
6186: ip = namei(&uchar, 0);
6187: if(ip == NULL)
6188: return;
6189: if((ip->i_mode&IFMT) != IFBLK)
6190: u.u_error = ENOTBLK;
6191: d = ip->i_addr[0];
6192: if(ip->i_addr[0].d_major >= nblkdev)
6193: u.u_error = ENXIO;
6194: iput(ip);
6195: return(d);
6196: }
6197: /* --------------------------- */