blob: 3499824630d8f152838a589ae2e88ad31c2a1cfb [file] [log] [blame]
Alistair Delvabeaee832021-02-24 11:27:23 -08001/* Copyright 1994,1996-2002,2005-2007,2009 Alain Knaff.
2 * This file is part of mtools.
3 *
4 * Mtools is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * Mtools is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with Mtools. If not, see <http://www.gnu.org/licenses/>.
16 *
17 * Mount an MSDOS disk
18 *
19 * written by:
20 *
Yi Kong39bbd962022-01-09 19:41:38 +080021 * Alain L. Knaff
Alistair Delvabeaee832021-02-24 11:27:23 -080022 * alain@knaff.lu
23 *
24 */
25
26#include "sysincludes.h"
27#include "msdos.h"
28#include "mtools.h"
29
30#ifdef OS_linux
31#include <sys/wait.h>
32#include "mainloop.h"
33#include "fs.h"
34
35void mmount(int argc, char **argv, int type UNUSEDP) NORETURN;
36void mmount(int argc, char **argv, int type UNUSEDP)
37{
38 char drive;
39 int pid;
40 int status;
41 struct device dev;
42 char name[EXPAND_BUF];
43 int media;
44 union bootsector boot;
45 Stream_t *Stream;
Yi Kong39bbd962022-01-09 19:41:38 +080046
Alistair Delvabeaee832021-02-24 11:27:23 -080047 if (argc<2 || !argv[1][0] || argv[1][1] != ':' || argv[1][2]){
48 fprintf(stderr,"Usage: %s -V drive:\n", argv[0]);
49 exit(1);
50 }
51 drive = ch_toupper(argv[1][0]);
52 Stream= find_device(drive, O_RDONLY, &dev, &boot, name, &media, 0, NULL);
53 if(!Stream)
54 exit(1);
55 FREE(&Stream);
56
57 destroy_privs();
58
59 if ( dev.partition ) {
60 char part_name[4];
61 sprintf(part_name, "%d", dev.partition %1000);
Yi Kong39bbd962022-01-09 19:41:38 +080062 strcat(name, part_name);
Alistair Delvabeaee832021-02-24 11:27:23 -080063 }
64
65 /* and finally mount it */
66 switch((pid=fork())){
67 case -1:
68 fprintf(stderr,"fork failed\n");
69 exit(1);
70 case 0:
71 close(2);
72 open("/dev/null", O_RDWR | O_BINARY | O_LARGEFILE);
73 argv[1] = strdup("mount");
74 if ( argc > 2 )
75 execvp("mount", argv + 1 );
76 else
77 execlp("mount", "mount", name, NULL);
78 perror("exec mount");
79 exit(1);
80 default:
81 while ( wait(&status) != pid );
Yi Kong39bbd962022-01-09 19:41:38 +080082 }
Alistair Delvabeaee832021-02-24 11:27:23 -080083 if ( WEXITSTATUS(status) == 0 )
84 exit(0);
85 argv[0] = strdup("mount");
86 argv[1] = strdup("-r");
87 if(!argv[0] || !argv[1]){
88 printOom();
89 exit(1);
90 }
91 if ( argc > 2 )
92 execvp("mount", argv);
93 else
94 execlp("mount", "mount","-r", name, NULL);
95 exit(1);
96}
97
98#else /* linux */
99
100#include "msdos.h"
101
Yi Kong39bbd962022-01-09 19:41:38 +0800102void mmount(int argc UNUSEDP, char **argv UNUSEDP, int type UNUSEDP)
Alistair Delvabeaee832021-02-24 11:27:23 -0800103{
104 fprintf(stderr,"This command is only available for LINUX \n");
105 exit(1);
106}
107#endif /* linux */
108