[9] | 1 | /*
|
---|
| 2 | * Mount an MSDOS disk
|
---|
| 3 | *
|
---|
| 4 | * written by:
|
---|
| 5 | *
|
---|
| 6 | * Alain L. Knaff
|
---|
| 7 | * alain@linux.lu
|
---|
| 8 | *
|
---|
| 9 | */
|
---|
| 10 |
|
---|
| 11 | #include "sysincludes.h"
|
---|
| 12 | #include "msdos.h"
|
---|
| 13 | #include "mtools.h"
|
---|
| 14 |
|
---|
| 15 | #ifdef OS_linux
|
---|
| 16 | #include <sys/wait.h>
|
---|
| 17 | #include "mainloop.h"
|
---|
| 18 | #include "fs.h"
|
---|
| 19 |
|
---|
| 20 | extern int errno;
|
---|
| 21 |
|
---|
| 22 | void mmount(int argc, char **argv, int type)
|
---|
| 23 | {
|
---|
| 24 | char drive;
|
---|
| 25 | int pid;
|
---|
| 26 | int status;
|
---|
| 27 | struct device dev;
|
---|
| 28 | char name[EXPAND_BUF];
|
---|
| 29 | int media;
|
---|
| 30 | struct bootsector boot;
|
---|
| 31 | Stream_t *Stream;
|
---|
| 32 |
|
---|
| 33 | if (argc<2 || !argv[1][0] || argv[1][1] != ':' || argv[1][2]){
|
---|
| 34 | fprintf(stderr,"Usage: %s -V drive:\n", argv[0]);
|
---|
| 35 | exit(1);
|
---|
| 36 | }
|
---|
| 37 | drive = toupper(argv[1][0]);
|
---|
| 38 | Stream = find_device(drive, O_RDONLY, &dev, &boot, name, &media, 0);
|
---|
| 39 | if(!Stream)
|
---|
| 40 | exit(1);
|
---|
| 41 | FREE(&Stream);
|
---|
| 42 |
|
---|
| 43 | destroy_privs();
|
---|
| 44 |
|
---|
| 45 | if ( dev.partition ) {
|
---|
| 46 | char part_name[4];
|
---|
| 47 | sprintf(part_name, "%d", dev.partition %1000);
|
---|
| 48 | strcat(name, part_name);
|
---|
| 49 | }
|
---|
| 50 |
|
---|
| 51 | /* and finally mount it */
|
---|
| 52 | switch((pid=fork())){
|
---|
| 53 | case -1:
|
---|
| 54 | fprintf(stderr,"fork failed\n");
|
---|
| 55 | exit(1);
|
---|
| 56 | case 0:
|
---|
| 57 | close(2);
|
---|
| 58 | open("/dev/null", O_RDWR);
|
---|
| 59 | argv[1] = strdup("mount");
|
---|
| 60 | if ( argc > 2 )
|
---|
| 61 | execvp("mount", argv + 1 );
|
---|
| 62 | else
|
---|
| 63 | execlp("mount", "mount", name, 0);
|
---|
| 64 | perror("exec mount");
|
---|
| 65 | exit(1);
|
---|
| 66 | default:
|
---|
| 67 | while ( wait(&status) != pid );
|
---|
| 68 | }
|
---|
| 69 | if ( WEXITSTATUS(status) == 0 )
|
---|
| 70 | exit(0);
|
---|
| 71 | argv[0] = strdup("mount");
|
---|
| 72 | argv[1] = strdup("-r");
|
---|
| 73 | if(!argv[0] || !argv[1]){
|
---|
| 74 | printOom();
|
---|
| 75 | exit(1);
|
---|
| 76 | }
|
---|
| 77 | if ( argc > 2 )
|
---|
| 78 | execvp("mount", argv);
|
---|
| 79 | else
|
---|
| 80 | execlp("mount", "mount","-r", name, 0);
|
---|
| 81 | exit(1);
|
---|
| 82 | }
|
---|
| 83 |
|
---|
| 84 | #endif /* linux */
|
---|
| 85 |
|
---|