Added '-F file' option of mount_mfs. This allows me to make floppy images
without waiting for my floppy-drive all the time :-) Might have other interesting uses too.
This commit is contained in:
parent
2a460312c8
commit
72ab19aeb7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=3550
@ -44,6 +44,8 @@ static char sccsid[] = "@(#)mkfs.c 8.3 (Berkeley) 2/3/94";
|
||||
#include <ufs/ufs/dir.h>
|
||||
#include <ufs/ffs/fs.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#ifndef STANDALONE
|
||||
#include <a.out.h>
|
||||
@ -100,6 +102,7 @@ extern int sbsize; /* superblock size */
|
||||
extern u_long memleft; /* virtual memory available */
|
||||
extern caddr_t membase; /* start address of memory based filesystem */
|
||||
extern caddr_t malloc(), calloc();
|
||||
extern char * filename;
|
||||
|
||||
union {
|
||||
struct fs fs;
|
||||
@ -129,7 +132,7 @@ mkfs(pp, fsys, fi, fo)
|
||||
long used, mincpgcnt, bpcg;
|
||||
long mapcramped, inodecramped;
|
||||
long postblsize, rotblsize, totalsbsize;
|
||||
int ppid, status;
|
||||
int ppid, status, fd;
|
||||
time_t utime;
|
||||
quad_t sizepb;
|
||||
void started();
|
||||
@ -151,10 +154,41 @@ mkfs(pp, fsys, fi, fo)
|
||||
/* NOTREACHED */
|
||||
}
|
||||
(void)malloc(0);
|
||||
if (fssize * sectorsize > memleft)
|
||||
fssize = (memleft - 16384) / sectorsize;
|
||||
if ((membase = malloc(fssize * sectorsize)) == 0)
|
||||
exit(12);
|
||||
if(filename) {
|
||||
unsigned char buf[BUFSIZ];
|
||||
unsigned long l,l1;
|
||||
fd = open(filename,O_RDWR|O_TRUNC|O_CREAT,0644);
|
||||
if(fd < 0) {
|
||||
perror(filename);
|
||||
exit(12);
|
||||
}
|
||||
for(l=0;l< fssize * sectorsize;l += l1) {
|
||||
l1 = fssize * sectorsize;
|
||||
if (BUFSIZ < l1)
|
||||
l1 = BUFSIZ;
|
||||
if (l1 != write(fd,buf,l1)) {
|
||||
perror(filename);
|
||||
exit(12);
|
||||
}
|
||||
}
|
||||
membase = mmap(
|
||||
0,
|
||||
fssize * sectorsize,
|
||||
PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED,
|
||||
fd,
|
||||
0);
|
||||
if((int)membase == -1) {
|
||||
perror("mmap");
|
||||
exit(12);
|
||||
}
|
||||
close(fd);
|
||||
} else {
|
||||
if (fssize * sectorsize > memleft)
|
||||
fssize = (memleft - 16384) / sectorsize;
|
||||
if ((membase = malloc(fssize * sectorsize)) == 0)
|
||||
exit(12);
|
||||
}
|
||||
}
|
||||
fsi = fi;
|
||||
fso = fo;
|
||||
|
@ -42,7 +42,7 @@
|
||||
.Nm newfs
|
||||
.Op Fl NO
|
||||
.Op Fl S Ar sector-size
|
||||
.Op Fl a maxcontig
|
||||
.Op Fl a Ar maxcontig
|
||||
.Op Fl b Ar block-size
|
||||
.Op Fl c Ar cylinders
|
||||
.Op Fl d Ar rotdelay
|
||||
@ -62,7 +62,9 @@
|
||||
.Ar special
|
||||
.Nm mount_mfs
|
||||
.Op Fl N
|
||||
.Op Fl a maxcontig
|
||||
.Op Fl F Ar file
|
||||
.Op Fl T Ar disktype
|
||||
.Op Fl a Ar maxcontig
|
||||
.Op Fl b Ar block-size
|
||||
.Op Fl c Ar cylinders
|
||||
.Op Fl d Ar rotdelay
|
||||
@ -116,6 +118,14 @@ the file system has to be paged.
|
||||
.Pp
|
||||
The following options define the general layout policies.
|
||||
.Bl -tag -width Fl
|
||||
.It Fl T Ar disktype
|
||||
For backward compatibility and for
|
||||
.Nm mount_mfs .
|
||||
.It Fl F Ar file
|
||||
.Nm mount_mfs
|
||||
will use this file for the image of the filesystem. When
|
||||
.Nm mount_mfs
|
||||
exits, this file will be left behind.
|
||||
.It Fl N
|
||||
Causes the file system parameters to be printed out
|
||||
without really creating the file system.
|
||||
|
@ -180,6 +180,7 @@ int sbsize = SBSIZE; /* superblock size */
|
||||
int mntflags = MNT_ASYNC; /* flags to be passed to mount */
|
||||
u_long memleft; /* virtual memory available */
|
||||
caddr_t membase; /* start address of memory based filesystem */
|
||||
char *filename;
|
||||
#ifdef COMPAT
|
||||
char *disktype;
|
||||
int unlabeled;
|
||||
@ -216,7 +217,7 @@ main(argc, argv)
|
||||
}
|
||||
|
||||
opstring = mfs ?
|
||||
"NT:a:b:c:d:e:f:i:m:o:s:" :
|
||||
"NF:T:a:b:c:d:e:f:i:m:o:s:"
|
||||
"NOS:T:a:b:c:d:e:f:i:k:l:m:n:o:p:r:s:t:u:x:";
|
||||
while ((ch = getopt(argc, argv, opstring)) != EOF)
|
||||
switch (ch) {
|
||||
@ -235,6 +236,9 @@ main(argc, argv)
|
||||
disktype = optarg;
|
||||
break;
|
||||
#endif
|
||||
case 'F':
|
||||
filename = optarg;
|
||||
break;
|
||||
case 'a':
|
||||
if ((maxcontig = atoi(optarg)) <= 0)
|
||||
fatal("%s: bad maximum contiguous blocks\n",
|
||||
@ -530,6 +534,9 @@ main(argc, argv)
|
||||
args.size = fssize * sectorsize;
|
||||
if (mount(MOUNT_MFS, argv[1], mntflags, &args) < 0)
|
||||
fatal("%s: %s", argv[1], strerror(errno));
|
||||
if(filename) {
|
||||
munmap(membase,fssize * sectorsize);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
exit(0);
|
||||
|
Loading…
Reference in New Issue
Block a user