- startinum = (inum / INOPB(&sblock)) * INOPB(&sblock);
- }
- return (&inoblk.b_un.b_dinode[inum % INOPB(&sblock)]);
-}
-
-ftypeok(dp)
- DINODE *dp;
-{
- switch (dp->di_mode & IFMT) {
-
- case IFDIR:
- case IFREG:
- case IFBLK:
- case IFCHR:
- case IFLNK:
- return (1);
-
- default:
- return (0);
- }
-}
-
-reply(s)
- char *s;
-{
- char line[80];
-
- if (preen)
- pfatal("INTERNAL ERROR: GOT TO reply()");
- rplyflag = 1;
- printf("\n%s? ", s);
- if (nflag || dfile.wfdes < 0) {
- printf(" no\n\n");
- return (0);
- }
- if (yflag) {
- printf(" yes\n\n");
- return (1);
- }
- if (getline(stdin, line, sizeof(line)) == EOF)
- errexit("\n");
- printf("\n");
- if (line[0] == 'y' || line[0] == 'Y')
- return (1);
- else
- return (0);
-}
-
-getline(fp, loc, maxlen)
- FILE *fp;
- char *loc;
-{
- register n;
- register char *p, *lastloc;
-
- p = loc;
- lastloc = &p[maxlen-1];
- while ((n = getc(fp)) != '\n') {
- if (n == EOF)
- return (EOF);
- if (!isspace(n) && p < lastloc)
- *p++ = n;
- }
- *p = 0;
- return (p - loc);
-}
-
-BUFAREA *
-getblk(bp, blk, size)
- daddr_t blk;
- register BUFAREA *bp;
- int size;
-{
- register struct filecntl *fcp;
- daddr_t dblk;
-
- fcp = &dfile;
- dblk = fsbtodb(&sblock, blk);
- if (bp->b_bno == dblk)
- return (bp);
- flush(fcp, bp);
- if (bread(fcp, bp->b_un.b_buf, dblk, size) != 0) {
- bp->b_bno = dblk;
- bp->b_size = size;
- return (bp);
- }
- bp->b_bno = (daddr_t)-1;
- return (NULL);
-}
-
-flush(fcp, bp)
- struct filecntl *fcp;
- register BUFAREA *bp;
-{
-
- if (bp->b_dirty)
- bwrite(fcp, bp->b_un.b_buf, bp->b_bno, bp->b_size);
- bp->b_dirty = 0;
-}
-
-rwerr(s, blk)
- char *s;
- daddr_t blk;
-{
-
- if (preen == 0)
- printf("\n");
- pfatal("CANNOT %s: BLK %ld", s, blk);
- if (reply("CONTINUE") == 0)
- errexit("Program terminated\n");
-}
-
-ckfini()
-{
-
- flush(&dfile, &fileblk);
- flush(&dfile, &sblk);
- if (sblk.b_bno != SBLOCK) {
- sblk.b_bno = SBLOCK;
- sbdirty();
- flush(&dfile, &sblk);
- }
- flush(&dfile, &inoblk);
- close(dfile.rfdes);
- close(dfile.wfdes);
-}
-
-pinode()
-{
- register DINODE *dp;
- register char *p;
- char uidbuf[BUFSIZ];
- char *ctime();
-
- printf(" I=%u ", inum);
- if ((dp = ginode()) == NULL)
- return;
- printf(" OWNER=");
- if (getpw((int)dp->di_uid, uidbuf) == 0) {
- for (p = uidbuf; *p != ':'; p++);
- *p = 0;
- printf("%s ", uidbuf);
- }
- else {
- printf("%d ", dp->di_uid);
- }
- printf("MODE=%o\n", dp->di_mode);
- if (preen)
- printf("%s: ", devname);
- printf("SIZE=%ld ", dp->di_size);
- p = ctime(&dp->di_mtime);
- printf("MTIME=%12.12s %4.4s ", p+4, p+20);
-}
-
-copy(fp, tp, size)
- register char *tp, *fp;
- unsigned size;
-{
-
- while (size--)
- *tp++ = *fp++;
-}
-
-makecg()
-{
- int c, blk;
- daddr_t dbase, d, dmin, dmax;
- long i, j, s;
- register struct csum *cs;
- register DINODE *dp;
-
- sblock.fs_cstotal.cs_nbfree = 0;
- sblock.fs_cstotal.cs_nffree = 0;
- sblock.fs_cstotal.cs_nifree = 0;
- sblock.fs_cstotal.cs_ndir = 0;
- for (i = 0; i < howmany(sblock.fs_cssize, sblock.fs_bsize); i++) {
- sblock.fs_csp[i] = (struct csum *)calloc(1, sblock.fs_bsize);
- getblk((char *)sblock.fs_csp[i],
- sblock.fs_csaddr + (i * sblock.fs_frag), sblock.fs_bsize);
- }
- for (c = 0; c < sblock.fs_ncg; c++) {
- dbase = cgbase(&sblock, c);
- dmax = dbase + sblock.fs_fpg;
- if (dmax > sblock.fs_size) {
- for ( ; dmax >= sblock.fs_size; dmax--)
- clrbit(cgrp.cg_free, dmax - dbase);
- dmax++;
- }
- dmin = sblock.fs_dblkno;
- cs = &sblock.fs_cs(&sblock, c);
- cgrp.cg_time = time(0);
- cgrp.cg_magic = CG_MAGIC;
- cgrp.cg_cgx = c;
- cgrp.cg_ncyl = sblock.fs_cpg;
- cgrp.cg_niblk = sblock.fs_ipg;
- cgrp.cg_ndblk = dmax - dbase;
- cgrp.cg_cs.cs_ndir = 0;
- cgrp.cg_cs.cs_nffree = 0;
- cgrp.cg_cs.cs_nbfree = 0;
- cgrp.cg_cs.cs_nifree = 0;
- cgrp.cg_rotor = dmin;
- cgrp.cg_frotor = dmin;
- cgrp.cg_irotor = 0;
- for (i = 0; i < sblock.fs_frag; i++)
- cgrp.cg_frsum[i] = 0;
- inum = sblock.fs_ipg * c;
- for (i = 0; i < sblock.fs_ipg; inum++, i++) {
- cgrp.cg_cs.cs_nifree++;
- clrbit(cgrp.cg_iused, i);
- dp = ginode();
- if (dp == NULL)
- continue;
- if (ALLOC) {
- if (DIRCT)
- cgrp.cg_cs.cs_ndir++;
- cgrp.cg_cs.cs_nifree--;
- setbit(cgrp.cg_iused, i);
- continue;
- }
- }
- while (i < MAXIPG) {
- clrbit(cgrp.cg_iused, i);
- i++;
- }
- if (c == 0)
- for (i = 0; i < ROOTINO; i++) {
- setbit(cgrp.cg_iused, i);
- cgrp.cg_cs.cs_nifree--;
- }
- for (s = 0; s < MAXCPG; s++) {
- cgrp.cg_btot[s] = 0;
- for (i = 0; i < NRPOS; i++)
- cgrp.cg_b[s][i] = 0;
- }
- if (c == 0) {
- dmin += howmany(sblock.fs_cssize, sblock.fs_bsize) *
- sblock.fs_frag;
- }
- for (d = 0; d < dmin; d++)
- clrbit(cgrp.cg_free, d);
- for (; (d + sblock.fs_frag) <= dmax - dbase; d += sblock.fs_frag) {
- j = 0;
- for (i = 0; i < sblock.fs_frag; i++) {
- if (!getbmap(dbase+d+i)) {
- setbit(cgrp.cg_free, d+i);
- j++;
- } else
- clrbit(cgrp.cg_free, d+i);
- }
- if (j == sblock.fs_frag) {
- cgrp.cg_cs.cs_nbfree++;
- cgrp.cg_btot[cbtocylno(&sblock, d)]++;
- cgrp.cg_b[cbtocylno(&sblock, d)]
- [cbtorpos(&sblock, d)]++;
- } else if (j > 0) {
- cgrp.cg_cs.cs_nffree += j;
- blk = ((cgrp.cg_free[d / NBBY] >> (d % NBBY)) &
- (0xff >> (NBBY - sblock.fs_frag)));
- fragacct(&sblock, blk, cgrp.cg_frsum, 1);
- }
- }
- for (j = d; d < dmax - dbase; d++) {
- if (!getbmap(dbase+d)) {
- setbit(cgrp.cg_free, d);
- cgrp.cg_cs.cs_nffree++;
- } else
- clrbit(cgrp.cg_free, d);
- }
- if (j != d) {
- blk = ((cgrp.cg_free[j / NBBY] >> (j % NBBY)) &
- (0xff >> (NBBY - sblock.fs_frag)));
- fragacct(&sblock, blk, cgrp.cg_frsum, 1);
- }
- for (; d < MAXBPG(&sblock); d++)
- clrbit(cgrp.cg_free, d);
- sblock.fs_cstotal.cs_nffree += cgrp.cg_cs.cs_nffree;
- sblock.fs_cstotal.cs_nbfree += cgrp.cg_cs.cs_nbfree;
- sblock.fs_cstotal.cs_nifree += cgrp.cg_cs.cs_nifree;
- sblock.fs_cstotal.cs_ndir += cgrp.cg_cs.cs_ndir;
- *cs = cgrp.cg_cs;
- bwrite(&dfile, &cgrp, fsbtodb(&sblock, cgtod(&sblock, c)),
- sblock.fs_cgsize);
- }
- for (i = 0; i < howmany(sblock.fs_cssize, sblock.fs_bsize); i++) {
- bwrite(&dfile, (char *)sblock.fs_csp[i],
- fsbtodb(&sblock, sblock.fs_csaddr + (i * sblock.fs_frag)),
- sblock.fs_bsize);
- }
- sblock.fs_ronly = 0;
- sblock.fs_fmod = 0;
- sbdirty();
-}
-
-/*
- * update the frsum fields to reflect addition or deletion
- * of some frags
- */
-fragacct(fs, fragmap, fraglist, cnt)
- struct fs *fs;
- int fragmap;
- long fraglist[];
- int cnt;
-{
- int inblk;
- register int field, subfield;
- register int siz, pos;
-
- inblk = (int)(fragtbl[fs->fs_frag][fragmap] << 1);
- fragmap <<= 1;
- for (siz = 1; siz < fs->fs_frag; siz++) {
- if (((1 << siz) & inblk) == 0)
- continue;
- field = around[siz];
- subfield = inside[siz];
- for (pos = siz; pos <= fs->fs_frag; pos++) {
- if ((fragmap & field) == subfield) {
- fraglist[siz] += cnt;
- pos += siz;
- field <<= siz;
- subfield <<= siz;
- }
- field <<= 1;
- subfield <<= 1;