incoporate davman into server/rs
This commit is contained in:
parent
c192577b58
commit
77fa5b4116
@ -82,6 +82,7 @@ PRIVATE char *known_requests[] = {
|
|||||||
|
|
||||||
#define ARG_ARGS "-args" /* list of arguments to be passed */
|
#define ARG_ARGS "-args" /* list of arguments to be passed */
|
||||||
#define ARG_DEV "-dev" /* major device number for drivers */
|
#define ARG_DEV "-dev" /* major device number for drivers */
|
||||||
|
#define ARG_MAJOR "-major" /* major number */
|
||||||
#define ARG_DEVSTYLE "-devstyle" /* device style */
|
#define ARG_DEVSTYLE "-devstyle" /* device style */
|
||||||
#define ARG_PERIOD "-period" /* heartbeat period in ticks */
|
#define ARG_PERIOD "-period" /* heartbeat period in ticks */
|
||||||
#define ARG_SCRIPT "-script" /* name of the script to restart a
|
#define ARG_SCRIPT "-script" /* name of the script to restart a
|
||||||
@ -94,6 +95,8 @@ PRIVATE char *known_requests[] = {
|
|||||||
|
|
||||||
#define ARG_LU_STATE "-state" /* the live update state required */
|
#define ARG_LU_STATE "-state" /* the live update state required */
|
||||||
#define ARG_LU_MAXTIME "-maxtime" /* max time to prepare for the update */
|
#define ARG_LU_MAXTIME "-maxtime" /* max time to prepare for the update */
|
||||||
|
#define ARG_DEVMANID "-devid" /* the id of the devman device this
|
||||||
|
driver should be able to access */
|
||||||
|
|
||||||
#define SERVICE_LOGIN "service" /* passwd file entry for services */
|
#define SERVICE_LOGIN "service" /* passwd file entry for services */
|
||||||
|
|
||||||
@ -110,6 +113,7 @@ PRIVATE char *req_path = NULL;
|
|||||||
PRIVATE char *req_path_self = SELF_REQ_PATH;
|
PRIVATE char *req_path_self = SELF_REQ_PATH;
|
||||||
PRIVATE char *req_args = "";
|
PRIVATE char *req_args = "";
|
||||||
PRIVATE int req_major = 0;
|
PRIVATE int req_major = 0;
|
||||||
|
PRIVATE int devman_id = 0;
|
||||||
PRIVATE int req_dev_style = STYLE_NDEV;
|
PRIVATE int req_dev_style = STYLE_NDEV;
|
||||||
PRIVATE long req_period = 0;
|
PRIVATE long req_period = 0;
|
||||||
PRIVATE char *req_script = NULL;
|
PRIVATE char *req_script = NULL;
|
||||||
@ -133,9 +137,9 @@ PRIVATE void print_usage(char *app_name, char *problem)
|
|||||||
fprintf(stderr, "Warning, %s\n", problem);
|
fprintf(stderr, "Warning, %s\n", problem);
|
||||||
fprintf(stderr, "Usage:\n");
|
fprintf(stderr, "Usage:\n");
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
" %s [%s %s %s %s] (up|run|edit|update) <binary|%s> [%s <args>] [%s <special>] [%s <style>] [%s <ticks>] [%s <path>] [%s <name>] [%s <path>] [%s <state>] [%s <time>]\n",
|
" %s [%s %s %s %s] (up|run|edit|update) <binary|%s> [%s <args>] [%s <special>] [%s <style>] [%s <major_nr>] [%s <dev_id>] [%s <ticks>] [%s <path>] [%s <name>] [%s <path>] [%s <state>] [%s <time>]\n",
|
||||||
app_name, OPT_COPY, OPT_REUSE, OPT_NOBLOCK, OPT_REPLICA, SELF_BINARY,
|
app_name, OPT_COPY, OPT_REUSE, OPT_NOBLOCK, OPT_REPLICA, SELF_BINARY,
|
||||||
ARG_ARGS, ARG_DEV, ARG_DEVSTYLE, ARG_PERIOD, ARG_SCRIPT,
|
ARG_ARGS, ARG_DEV, ARG_DEVSTYLE, ARG_MAJOR, ARG_DEVMANID, ARG_PERIOD, ARG_SCRIPT,
|
||||||
ARG_LABELNAME, ARG_CONFIG, ARG_LU_STATE, ARG_LU_MAXTIME);
|
ARG_LABELNAME, ARG_CONFIG, ARG_LU_STATE, ARG_LU_MAXTIME);
|
||||||
fprintf(stderr, " %s down <label>\n", app_name);
|
fprintf(stderr, " %s down <label>\n", app_name);
|
||||||
fprintf(stderr, " %s refresh <label>\n", app_name);
|
fprintf(stderr, " %s refresh <label>\n", app_name);
|
||||||
@ -305,11 +309,29 @@ PRIVATE int parse_arguments(int argc, char **argv)
|
|||||||
print_usage(argv[ARG_NAME], "special file is not a device");
|
print_usage(argv[ARG_NAME], "special file is not a device");
|
||||||
exit(EINVAL);
|
exit(EINVAL);
|
||||||
}
|
}
|
||||||
|
if (req_major != 0) {
|
||||||
|
print_usage(argv[ARG_NAME], "major already set");
|
||||||
|
exit(EINVAL);
|
||||||
|
}
|
||||||
req_major = (stat_buf.st_rdev >> MAJOR) & BYTE;
|
req_major = (stat_buf.st_rdev >> MAJOR) & BYTE;
|
||||||
if(req_dev_style == STYLE_NDEV) {
|
if(req_dev_style == STYLE_NDEV) {
|
||||||
req_dev_style = STYLE_DEV;
|
req_dev_style = STYLE_DEV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (strcmp(argv[i], ARG_MAJOR)==0) {
|
||||||
|
if (req_major != 0) {
|
||||||
|
print_usage(argv[ARG_NAME], "major already set");
|
||||||
|
exit(EINVAL);
|
||||||
|
}
|
||||||
|
if (i+1 < argc) {
|
||||||
|
req_major = atoi(argv[i+1]);
|
||||||
|
} else {
|
||||||
|
exit(EINVAL);
|
||||||
|
}
|
||||||
|
if(req_dev_style == STYLE_NDEV) {
|
||||||
|
req_dev_style = STYLE_DEV;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (strcmp(argv[i], ARG_DEVSTYLE)==0) {
|
else if (strcmp(argv[i], ARG_DEVSTYLE)==0) {
|
||||||
char* dev_style_keys[] = { "STYLE_DEV", "STYLE_DEVA", "STYLE_TTY",
|
char* dev_style_keys[] = { "STYLE_DEV", "STYLE_DEVA", "STYLE_TTY",
|
||||||
"STYLE_CTTY", "STYLE_CLONE", NULL };
|
"STYLE_CTTY", "STYLE_CLONE", NULL };
|
||||||
@ -358,8 +380,13 @@ PRIVATE int parse_arguments(int argc, char **argv)
|
|||||||
exit(EINVAL);
|
exit(EINVAL);
|
||||||
}
|
}
|
||||||
if (strcmp(hz,"HZ")==0) req_lu_maxtime *= system_hz;
|
if (strcmp(hz,"HZ")==0) req_lu_maxtime *= system_hz;
|
||||||
}
|
} else if (strcmp(argv[i], ARG_DEVMANID) == 0) {
|
||||||
else {
|
if (i+1 < argc) {
|
||||||
|
devman_id = atoi(argv[i+1]);
|
||||||
|
} else {
|
||||||
|
exit(EINVAL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
print_usage(argv[ARG_NAME], "unknown optional argument given");
|
print_usage(argv[ARG_NAME], "unknown optional argument given");
|
||||||
exit(EINVAL);
|
exit(EINVAL);
|
||||||
}
|
}
|
||||||
@ -1438,6 +1465,7 @@ PUBLIC int main(int argc, char **argv)
|
|||||||
rs_start.rss_dev_style= req_dev_style;
|
rs_start.rss_dev_style= req_dev_style;
|
||||||
rs_start.rss_period= req_period;
|
rs_start.rss_period= req_period;
|
||||||
rs_start.rss_script= req_script;
|
rs_start.rss_script= req_script;
|
||||||
|
rs_start.devman_id= devman_id;
|
||||||
if(req_label) {
|
if(req_label) {
|
||||||
rs_start.rss_label.l_addr = req_label;
|
rs_start.rss_label.l_addr = req_label;
|
||||||
rs_start.rss_label.l_len = strlen(req_label);
|
rs_start.rss_label.l_len = strlen(req_label);
|
||||||
|
@ -640,6 +640,8 @@ struct rproc *rp; /* pointer to service slot */
|
|||||||
int r;
|
int r;
|
||||||
struct rprocpub *rpub;
|
struct rprocpub *rpub;
|
||||||
struct rs_pci pci_acl;
|
struct rs_pci pci_acl;
|
||||||
|
message m;
|
||||||
|
endpoint_t ep;
|
||||||
|
|
||||||
rpub = rp->r_pub;
|
rpub = rp->r_pub;
|
||||||
|
|
||||||
@ -682,6 +684,21 @@ struct rproc *rp; /* pointer to service slot */
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rpub->devman_id != 0) {
|
||||||
|
r = ds_retrieve_label_endpt("devman",&ep);
|
||||||
|
|
||||||
|
if (r != OK) {
|
||||||
|
return kill_service(rp, "devman not running?", r);
|
||||||
|
}
|
||||||
|
m.m_type = DEVMAN_BIND;
|
||||||
|
m.DEVMAN_ENDPOINT = rpub->endpoint;
|
||||||
|
m.DEVMAN_DEVICE_ID = rpub->devman_id;
|
||||||
|
r = sendrec(ep, &m);
|
||||||
|
if (r != OK || m.DEVMAN_RESULT != OK) {
|
||||||
|
return kill_service(rp, "devman bind device failed", r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(rs_verbose)
|
if(rs_verbose)
|
||||||
printf("RS: %s published\n", srv_to_string(rp));
|
printf("RS: %s published\n", srv_to_string(rp));
|
||||||
|
|
||||||
@ -697,6 +714,9 @@ struct rproc *rp; /* pointer to service slot */
|
|||||||
/* Unpublish a service. */
|
/* Unpublish a service. */
|
||||||
struct rprocpub *rpub;
|
struct rprocpub *rpub;
|
||||||
int r, result;
|
int r, result;
|
||||||
|
message m;
|
||||||
|
endpoint_t ep;
|
||||||
|
|
||||||
|
|
||||||
rpub = rp->r_pub;
|
rpub = rp->r_pub;
|
||||||
result = OK;
|
result = OK;
|
||||||
@ -719,6 +739,23 @@ struct rproc *rp; /* pointer to service slot */
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rpub->devman_id != 0) {
|
||||||
|
r = ds_retrieve_label_endpt("devman",&ep);
|
||||||
|
|
||||||
|
if (r != OK) {
|
||||||
|
printf("RS: devman not running?", r);
|
||||||
|
} else {
|
||||||
|
m.m_type = DEVMAN_UNBIND;
|
||||||
|
m.DEVMAN_ENDPOINT = rpub->endpoint;
|
||||||
|
m.DEVMAN_DEVICE_ID = rpub->devman_id;
|
||||||
|
r = sendrec(ep, &m);
|
||||||
|
|
||||||
|
if (r != OK || m.DEVMAN_RESULT != OK) {
|
||||||
|
printf("RS: devman unbind device failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(rs_verbose)
|
if(rs_verbose)
|
||||||
printf("RS: %s unpublished\n", srv_to_string(rp));
|
printf("RS: %s unpublished\n", srv_to_string(rp));
|
||||||
|
|
||||||
@ -1496,6 +1533,7 @@ endpoint_t source;
|
|||||||
rpub->dev_flags = DSRV_DF;
|
rpub->dev_flags = DSRV_DF;
|
||||||
rpub->dev_nr = rs_start->rss_major;
|
rpub->dev_nr = rs_start->rss_major;
|
||||||
rpub->dev_style = rs_start->rss_dev_style;
|
rpub->dev_style = rs_start->rss_dev_style;
|
||||||
|
rpub->devman_id = rs_start->devman_id;
|
||||||
if(rpub->dev_nr && !IS_DEV_STYLE(rs_start->rss_dev_style)) {
|
if(rpub->dev_nr && !IS_DEV_STYLE(rs_start->rss_dev_style)) {
|
||||||
printf("RS: init_slot: bad device style\n");
|
printf("RS: init_slot: bad device style\n");
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user