+/*
+ * make an entry in a directory
+ */
+makeentry(dp, idesc)
+ DINODE *dp;
+ struct inodesc *idesc;
+{
+
+ if ((ckinode(dp, idesc) & ALTERED) != 0)
+ return (1);
+ if (expanddir(dp) == 0)
+ return (0);
+ idesc->id_filesize = dp->di_size;
+ return (ckinode(dp, idesc) & ALTERED);
+}
+
+/*
+ * Attempt to expand the size of a directory
+ */
+expanddir(dp)
+ register DINODE *dp;
+{
+ daddr_t lastbn, newblk;
+ char *cp, firstblk[DIRBLKSIZ];
+
+ lastbn = lblkno(&sblock, dp->di_size);
+ if (lastbn >= NDADDR - 1)
+ return (0);
+ if ((newblk = allocblk(sblock.fs_frag)) == 0)
+ return (0);
+ dp->di_db[lastbn + 1] = dp->di_db[lastbn];
+ dp->di_db[lastbn] = newblk;
+ dp->di_size += sblock.fs_bsize;
+ dp->di_blocks += btodb(sblock.fs_bsize);
+ if (getblk(&fileblk, dp->di_db[lastbn + 1],
+ dblksize(&sblock, dp, lastbn + 1)) == NULL)
+ goto bad;
+ bcopy(dirblk.b_buf, firstblk, DIRBLKSIZ);
+ if (getblk(&fileblk, newblk, sblock.fs_bsize) == NULL)
+ goto bad;
+ bcopy(firstblk, dirblk.b_buf, DIRBLKSIZ);
+ for (cp = &dirblk.b_buf[DIRBLKSIZ];
+ cp < &dirblk.b_buf[sblock.fs_bsize];
+ cp += DIRBLKSIZ)
+ bcopy((char *)&emptydir, cp, sizeof emptydir);
+ dirty(&fileblk);
+ if (getblk(&fileblk, dp->di_db[lastbn + 1],
+ dblksize(&sblock, dp, lastbn + 1)) == NULL)
+ goto bad;
+ bcopy((char *)&emptydir, dirblk.b_buf, sizeof emptydir);
+ pwarn("NO SPACE LEFT IN %s", pathname);
+ if (preen)
+ printf(" (EXPANDED)\n");
+ else if (reply("EXPAND") == 0)
+ goto bad;
+ dirty(&fileblk);
+ inodirty();
+ return (1);
+bad:
+ dp->di_db[lastbn] = dp->di_db[lastbn + 1];
+ dp->di_db[lastbn + 1] = 0;
+ dp->di_size -= sblock.fs_bsize;
+ dp->di_blocks -= btodb(sblock.fs_bsize);
+ freeblk(newblk, sblock.fs_frag);
+ return (0);
+}
+