2006-10-25 15:40:36 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
#include <lib.h>
|
|
|
|
#define mount _mount
|
2007-01-22 16:25:41 +01:00
|
|
|
#define umount _umount
|
2005-04-21 16:53:53 +02:00
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
2007-01-22 16:25:41 +01:00
|
|
|
#include <stdlib.h>
|
2006-10-25 15:40:36 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <minix/syslib.h>
|
2007-01-22 16:25:41 +01:00
|
|
|
#include <minix/rs.h>
|
|
|
|
#include <minix/paths.h>
|
2006-10-25 15:40:36 +02:00
|
|
|
#define OK 0
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2007-01-22 16:25:41 +01:00
|
|
|
#define MFSNAME "mfs"
|
|
|
|
#define MFSPATH "/sbin/"
|
|
|
|
|
|
|
|
PRIVATE int rs_down(char *label)
|
|
|
|
{
|
|
|
|
char cmd[200];
|
|
|
|
message m;
|
|
|
|
if(strlen(_PATH_SERVICE)+strlen(label)+50 >= sizeof(cmd))
|
|
|
|
return -1;
|
|
|
|
sprintf(cmd, _PATH_SERVICE " down %s", label);
|
|
|
|
return system(cmd);
|
|
|
|
}
|
|
|
|
|
|
|
|
PRIVATE char *makelabel(_CONST char *special)
|
|
|
|
{
|
|
|
|
static char label[40];
|
|
|
|
_CONST char *dev;
|
|
|
|
|
|
|
|
/* Make label name. */
|
|
|
|
dev = strrchr(special, '/');
|
|
|
|
if(dev) dev++;
|
|
|
|
else dev = special;
|
|
|
|
if(strlen(dev)+strlen(MFSNAME)+3 >= sizeof(label))
|
|
|
|
return NULL;
|
|
|
|
sprintf(label, MFSNAME "_%s", dev);
|
|
|
|
return label;
|
|
|
|
}
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
PUBLIC int mount(special, name, rwflag)
|
|
|
|
char *name, *special;
|
|
|
|
int rwflag;
|
|
|
|
{
|
2006-11-24 15:01:14 +01:00
|
|
|
int r;
|
2005-04-21 16:53:53 +02:00
|
|
|
message m;
|
2007-01-22 16:25:41 +01:00
|
|
|
struct rs_start rs_start;
|
|
|
|
char *label;
|
|
|
|
char cmd[200];
|
|
|
|
FILE *pipe;
|
|
|
|
int ep;
|
|
|
|
|
|
|
|
/* Make MFS process label for RS from special name. */
|
|
|
|
if(!(label=makelabel(special))) {
|
|
|
|
errno = E2BIG;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(strlen(_PATH_SERVICE)+strlen(MFSPATH)+strlen(MFSNAME)+
|
|
|
|
strlen(label)+50 >= sizeof(cmd)) {
|
|
|
|
errno = E2BIG;
|
|
|
|
return -1;
|
2006-10-25 15:40:36 +02:00
|
|
|
}
|
2007-01-22 16:25:41 +01:00
|
|
|
|
|
|
|
sprintf(cmd, _PATH_SERVICE " up " MFSPATH MFSNAME
|
|
|
|
" -label \"%s\" -config " _PATH_DRIVERS_CONF " -printep yes",
|
|
|
|
label);
|
|
|
|
|
|
|
|
if(!(pipe = popen(cmd, "r"))) {
|
|
|
|
fprintf(stderr, "mount: couldn't run %s\n", cmd);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if(fscanf(pipe, "%d", &ep) != 1 || ep <= 0) {
|
|
|
|
fprintf(stderr, "mount: couldn't parse endpoint from %s\n", cmd);
|
|
|
|
errno = EINVAL;
|
|
|
|
pclose(pipe);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
pclose(pipe);
|
2006-10-25 15:40:36 +02:00
|
|
|
|
2007-01-22 16:25:41 +01:00
|
|
|
/* Now perform mount(). */
|
2005-04-21 16:53:53 +02:00
|
|
|
m.m1_i1 = strlen(special) + 1;
|
|
|
|
m.m1_i2 = strlen(name) + 1;
|
|
|
|
m.m1_i3 = rwflag;
|
|
|
|
m.m1_p1 = special;
|
|
|
|
m.m1_p2 = name;
|
2007-01-22 16:25:41 +01:00
|
|
|
m.m1_p3 = (char*) ep;
|
|
|
|
r = _syscall(FS, MOUNT, &m);
|
|
|
|
|
|
|
|
if(r != OK) {
|
|
|
|
/* If mount() failed, tell RS to shutdown MFS process.
|
|
|
|
* No error check - won't do anything with this error anyway.
|
|
|
|
*/
|
|
|
|
rs_down(label);
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
PUBLIC int umount(name)
|
|
|
|
_CONST char *name;
|
|
|
|
{
|
|
|
|
message m;
|
|
|
|
char *label;
|
|
|
|
int r;
|
|
|
|
|
|
|
|
/* Make MFS process label for RS from special name. */
|
|
|
|
if(!(label=makelabel(name))) {
|
|
|
|
errno = E2BIG;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
_loadname(name, &m);
|
|
|
|
r = _syscall(FS, UMOUNT, &m);
|
|
|
|
|
|
|
|
if(r == OK) {
|
|
|
|
rs_down(label);
|
|
|
|
}
|
|
|
|
|
|
|
|
return r;
|
2005-04-21 16:53:53 +02:00
|
|
|
}
|