Anticipating NetBSD mount option -s

This commit is contained in:
2014-05-28 12:57:48 +00:00
parent 8016bce6ae
commit a601358c1c
9 changed files with 130 additions and 79 deletions

View File

@ -1823,6 +1823,7 @@ int Xorriso_afile_fopen(struct XorrisO *xorriso,
@param flag bit0= make absolute command paths with known systems
bit1= do not allow prefixes with cmd
bit2= interpret unprefixed cmd as shell:
bit3= do not care for device filetype
*/
int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
int lba, int track, int session, char *volid,
@ -1831,18 +1832,21 @@ int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
int ret, reg_file= 0, is_safe= 0, sys_code= 0;
char *form= NULL, session_text[12], track_text[12], lba_text[12];
char *vars[5][2], *sfe= NULL, *volid_sfe= NULL, *cpt, *sysname;
char *cooked_dev= NULL, *eff_dev;
struct stat stbuf;
Xorriso_alloc_meM(form, char, 6 * SfileadrL);
Xorriso_alloc_meM(sfe, char, 5 * SfileadrL);
Xorriso_alloc_meM(volid_sfe, char, 5 * 80 + 1);
Xorriso_alloc_meM(cooked_dev, char, SfileadrL);
if(strlen(cmd) > SfileadrL) {
Xorriso_msgs_submit(xorriso, 0, "Argument much too long", 0, "FAILURE", 0);
{ret= 0; goto ex;}
}
eff_dev= devadr;
ret= stat(devadr, &stbuf);
if(ret != -1)
if(ret != -1 && !(flag & 8))
if(S_ISREG(stbuf.st_mode))
reg_file= 1;
if(strncmp(cmd, "linux:", 6) == 0 && !(flag & 2)) {
@ -1851,6 +1855,9 @@ int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
} else if(strncmp(cmd, "freebsd:", 8) == 0 && !(flag & 2)) {
cpt= cmd + 8;
sys_code= 2;
} else if(strncmp(cmd, "netbsd:", 7) == 0 && !(flag & 2)) {
cpt= cmd + 7;
sys_code= 3;
} else if(strncmp(cmd, "string:", 7) == 0 && !(flag & 2)) {
cpt= cmd + 7;
strcpy(form, cpt);
@ -1869,6 +1876,8 @@ int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
strcmp(sysname, "GNU/kFreeBSD") == 0) {
/* "GNU/kFreeBSD" = Debian kfreebsd */
sys_code= 2;
} else if(strcmp(sysname, "NetBSD") == 0) {
sys_code= 3;
} else if(strcmp(sysname, "Linux") == 0) {
sys_code= 1;
} else {
@ -1886,7 +1895,7 @@ int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
(reg_file || (xorriso->mount_opts_flag & 1) ? "loop," : ""),
Text_shellsafe(cpt, sfe, 0));
is_safe= 1;
} else if(sys_code == 2) { /* FreeBSD */
} else if(sys_code == 2 || sys_code == 3) { /* FreeBSD , NetBSD */
if(reg_file) {
/* <<< Considered to create vnode as of
@ -1900,20 +1909,26 @@ int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
*/
Xorriso_msgs_submit(xorriso, 0,
"Detected regular file as mount device with FreeBSD style command.",
"Detected regular file as mount device with BSD style command.",
0, "FAILURE", 0);
Xorriso_msgs_submit(xorriso, 0,
if(sys_code == 2) {
Xorriso_msgs_submit(xorriso, 0,
"Command mdconfig -a -t vnode -f can create a device node which uses the file",
0, "HINT", 0);
} else {
Xorriso_msgs_submit(xorriso, 0,
"Command vnconfig -c vndX can create a device node which uses the file",
0, "HINT", 0);
}
{ret= 0; goto ex;}
} else {
if(sys_code == 3 && strncmp(devadr, "/dev/rcd", 8) == 0) {
sprintf(cooked_dev, "/dev/cd%s", devadr + 8);
eff_dev= cooked_dev;
}
sprintf(form,
"%smount_cd9660 -o noexec,nosuid -s %%sbsector%% %%device%% %s",
(flag & 1 ? "/sbin/" : ""), Text_shellsafe(cmd+8, sfe, 0));
/*
Not working on FreeBSD 7.2 according to Zsolt Kuti, 11 Oct 2009:
"%smount -t cd9660 -o noexec,nosuid -o -s %%sbsector%% %%device%% %s",
*/
(flag & 1 ? "/sbin/" : ""), Text_shellsafe(cpt, sfe, 0));
}
is_safe= 1;
}
@ -1929,15 +1944,16 @@ int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
vars[3][0]= "volid";
vars[3][1]= Text_shellsafe(volid, volid_sfe, 0);
vars[4][0]= "device";
vars[4][1]= Text_shellsafe(devadr, sfe, 0);
vars[4][1]= Text_shellsafe(eff_dev, sfe, 0);
ret= Sregex_resolve_var(form, vars, 5, "%", "%", "%", result, SfileadrL, 0);
if(ret <= 0)
goto ex;
ret= 1 + is_safe;
ex:;
Xorriso_free_meM(form);
Xorriso_free_meM(sfe);
Xorriso_free_meM(cooked_dev);
Xorriso_free_meM(volid_sfe);
Xorriso_free_meM(sfe);
Xorriso_free_meM(form);
return(ret);
}