+ /* no entries left on segment, trying adding new segment */
+ if (rt_dir[0].rd_numseg > rt_dir[0].rd_lstseg) {
+ short newseg;
+ register int i;
+ int maxseg;
+ short size;
+
+ newseg = rt_dir[0].rd_lstseg++;
+ rt_dir[newseg] = rt_nulldir;
+ rt_dir[newseg].rd_nxtseg = rt_dir[segnum].rd_nxtseg;
+ rt_dir[segnum].rd_nxtseg = newseg + 1;
+ rt_dir[newseg].rd_entpad = rt_dir[0].rd_entpad;
+ rt_dir[newseg].rd_numseg = rt_dir[0].rd_numseg;
+ size = 0;
+ maxseg = 0;
+ for(i = newseg - 1; i >= 0; i--) {
+ workp = rt_curend[i] - 1;
+ if (workp->rt_stat != RT_NULL)
+ continue;
+ if (workp->rt_len < size)
+ continue;
+ size = workp->rt_len;
+ maxseg = i;
+ }
+ size = 0;
+ for (workp = &rt_dir[maxseg].rt_ents[0];
+ workp->rt_stat != RT_ESEG; workp++) {
+ size += workp->rt_len;
+ }
+ workp--;
+ rt_dir[newseg].rt_ents[0].rt_len = workp->rt_len;
+ rt_dir[newseg].rd_stfile =
+ rt_dir[maxseg].rd_stfile + size - workp->rt_len;
+ workp->rt_len = 0;
+ rt_curend[newseg] = &rt_dir[newseg].rt_ents[1];
+ lwrite(6*RT_BLOCK, 2*RT_BLOCK, (char *)&rt_dir[0]);
+ if (segnum != 0)
+ lwrite((6+segnum*2)*RT_BLOCK, 2*RT_BLOCK,
+ (char *)&rt_dir[segnum]);
+ lwrite((6+newseg*2)*RT_BLOCK, 2*RT_BLOCK,
+ (char *)&rt_dir[newseg]);
+ segnum = newseg;
+ de = &rt_dir[newseg].rt_ents[0];
+ } else {
+ fprintf(stderr, "All directory segments full on %s\n",
+ defdev);
+ exit(1);
+ }