|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|