gfarm_error_t gfj_server_list(struct peer *peer, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); char *user; int i; gfarm_int32_t n; e = gfj_server_get_request(peer, "list", "s", &user); if (e != GFARM_ERR_NO_ERROR) return (e); if (skip) { free(user); return (GFARM_ERR_NO_ERROR); } if (!from_client) { e = gfj_server_put_reply(peer, "list", GFARM_ERR_OPERATION_NOT_PERMITTED, ""); if (e != GFARM_ERR_NO_ERROR) return (e); } else { /* XXX FIXME too long giant lock */ giant_lock(); n = 0; for (i = 0; i < job_table_size; i++) { if (job_table[i] != NULL && (*user == '\0' || strcmp(user, job_table[i]->info->user) == 0)) n++; } e = gfj_server_put_reply(peer, "register", GFARM_ERR_NO_ERROR, "i", n); if (e != GFARM_ERR_NO_ERROR) { giant_unlock(); return (e); } for (i = 0; i < job_table_size; i++) { if (job_table[i] != NULL && (*user == '\0' || strcmp(user, job_table[i]->info->user) == 0)) { e = gfp_xdr_send(client, "i", (gfarm_int32_t)i); if (e != GFARM_ERR_NO_ERROR) { giant_unlock(); return (e); } } } giant_unlock(); } free(user); return (GFARM_ERR_NO_ERROR); }
gfarm_error_t gfj_server_unregister(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { char *user = peer_get_username(peer); gfarm_error_t e; gfarm_int32_t error; gfarm_int32_t job_id; static const char diag[] = "GFJ_PROTO_UNREGISTER"; e = gfj_server_get_request(peer, sizep, diag, "i", &job_id); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001692, "unregister request failure"); return (e); } if (skip) return (GFARM_ERR_NO_ERROR); if (!from_client) { error = GFARM_ERR_OPERATION_NOT_PERMITTED; gflog_debug(GFARM_MSG_1001693, "operation is not permitted for from_client"); } else { giant_lock(); error = job_table_remove(job_id, user, peer_get_jobs_ref(peer)); giant_unlock(); } return (gfj_server_put_reply(peer, xid, sizep, diag, error, "")); }
char * gfj_server_info(struct xxx_connection *client) { char *e; int i, eof; gfarm_int32_t n, *jobs; e = gfj_server_get_request(client, "info", "i", &n); if (e != NULL) return (e); jobs = malloc(sizeof(gfarm_int32_t) * n); if (jobs == NULL) { return (GFARM_ERR_NO_MEMORY); } for (i = 0; i < n; i++) { e = xxx_proto_recv(client, 0, &eof, "i", &jobs[i]); if (e != NULL || eof) { if (e == NULL) e = GFARM_ERR_PROTOCOL; free(jobs); return (e); } } for (i = 0; i < n; i++) { if (jobs[i] < 0 || jobs[i] >= job_table_size || job_table[jobs[i]] == NULL) { e = gfj_server_put_reply(client, "info", GFJ_ERROR_NO_SUCH_OBJECT, ""); if (e != NULL) return (e); } else { e = gfj_server_put_reply(client, "info", GFJ_ERROR_NOERROR, ""); if (e != NULL) return (e); e = gfj_server_put_info_entry(client, job_table[jobs[i]]->info); if (e != NULL) return (e); } } return (NULL); }
char * gfj_server_unlock_register(struct xxx_connection *client) { /* XXX - NOT IMPLEMENTED */ return (gfj_server_put_reply(client, "unlock_register", GFJ_ERROR_NOERROR, "")); }
char * gfj_server_hostinfo(struct xxx_connection *client) { /* XXX - NOT IMPLEMENTED */ gflog_fatal("host_info", "not implemented"); return (gfj_server_put_reply(client, "host_info", GFJ_ERROR_NOERROR, "")); }
gfarm_error_t gfj_server_register_node(struct peer *peer, int from_client, int skip) { /* XXX - NOT IMPLEMENTED */ gflog_fatal("register_node: not implemented"); return (gfj_server_put_reply(peer, "register_node", GFARM_ERR_NO_ERROR, "")); }
char * gfj_server_register_node(struct xxx_connection *client) { /* XXX - NOT IMPLEMENTED */ gflog_fatal("register_node", "not implemented"); return (gfj_server_put_reply(client, "register_node", GFJ_ERROR_NOERROR, "")); }
gfarm_error_t gfj_server_unlock_register(struct peer *peer, int from_client, int skip) { gfarm_error_t e = GFARM_ERR_NO_ERROR; if (!from_client) e = GFARM_ERR_OPERATION_NOT_PERMITTED; /* XXX - NOT IMPLEMENTED */ return (gfj_server_put_reply(peer, "unlock_register", e, "")); }
gfarm_error_t gfj_server_register_node(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { static const char diag[] = "GFJ_PROTO_REGISTER_NODE"; /* XXX - NOT IMPLEMENTED */ gflog_fatal(GFARM_MSG_1000295, "%s: not implemented", diag); return (gfj_server_put_reply(peer, xid, sizep, diag, GFARM_ERR_NO_ERROR, "")); }
gfarm_error_t gfj_server_hostinfo(struct peer *peer, int from_client, int skip) { gfarm_error_t e = GFARM_ERR_NO_ERROR; if (!from_client) e = GFARM_ERR_OPERATION_NOT_PERMITTED; /* XXX - NOT IMPLEMENTED */ gflog_fatal("host_info: not implemented"); return (gfj_server_put_reply(peer, "host_info", GFARM_ERR_NO_ERROR, "")); }
gfarm_error_t gfj_server_unlock_register(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { gfarm_error_t e = GFARM_ERR_NO_ERROR; static const char diag[] = "GFJ_PROTO_UNLOCK_REGISTER"; if (!from_client) { gflog_debug(GFARM_MSG_1001684, "unlock operation is not permitted for from_client"); e = GFARM_ERR_OPERATION_NOT_PERMITTED; } /* XXX - NOT IMPLEMENTED */ return (gfj_server_put_reply(peer, xid, sizep, diag, e, "")); }
char * gfj_server_unregister(int client_socket) { struct xxx_connection *client = file_table[client_socket].conn; char *user = file_table[client_socket].user; char *e; gfarm_int32_t error; gfarm_int32_t job_id; e = gfj_server_get_request(client, "unregister", "i", &job_id); if (e != NULL) return (e); error = job_table_remove(job_id, user, &file_table[client_socket].jobs); return (gfj_server_put_reply(client, "unregister", error, "")); }
gfarm_error_t gfj_server_unregister(struct peer *peer, int from_client, int skip) { char *user = peer_get_username(peer); gfarm_error_t e; gfarm_int32_t error; gfarm_int32_t job_id; e = gfj_server_get_request(peer, "unregister", "i", &job_id); if (e != GFARM_ERR_NO_ERROR) return (e); if (skip) return (GFARM_ERR_NO_ERROR); if (!from_client) { error = GFARM_ERR_OPERATION_NOT_PERMITTED; } else { giant_lock(); error = job_table_remove(job_id, user, peer_get_jobs_ref(peer)); giant_unlock(); } return (gfj_server_put_reply(peer, "unregister", error, "")); }
char * gfj_server_list(struct xxx_connection *client) { char *e, *user; int i; gfarm_int32_t n; e = gfj_server_get_request(client, "list", "s", &user); if (e != NULL) return (e); n = 0; for (i = 0; i < job_table_size; i++) { if (job_table[i] != NULL && (*user == '\0' || strcmp(user, job_table[i]->info->user) == 0)) n++; } e = gfj_server_put_reply(client, "register", GFJ_ERROR_NOERROR, "i", n); if (e != NULL) return (e); for (i = 0; i < job_table_size; i++) { if (job_table[i] != NULL && (*user == '\0' || strcmp(user, job_table[i]->info->user) == 0)) { e = xxx_proto_send(client, "i", (gfarm_int32_t)i); if (e != NULL) return (e); } } free(user); return (NULL); }
gfarm_error_t gfj_server_info(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); int i, eof; gfarm_int32_t n, *jobs; static const char diag[] = "GFJ_PROTO_INFO"; e = gfj_server_get_request(peer, sizep, diag, "i", &n); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001701, "info request failure"); return (e); } GFARM_MALLOC_ARRAY(jobs, n); if (jobs == NULL) { gflog_debug(GFARM_MSG_1001702, "allocation of 'jobs' failed"); return (GFARM_ERR_NO_MEMORY); } for (i = 0; i < n; i++) { e = gfp_xdr_recv(client, 0, &eof, "i", &jobs[i]); if (e != GFARM_ERR_NO_ERROR || eof) { gflog_debug(GFARM_MSG_1001703, "gfp_xdr_recv(jobs[%d]) failed", i); if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; free(jobs); return (e); } } if (skip || !from_client) { free(jobs); if (skip) return (GFARM_ERR_NO_ERROR); e = gfj_server_put_reply(peer, xid, sizep, diag, GFARM_ERR_OPERATION_NOT_PERMITTED, ""); gflog_debug(GFARM_MSG_1001704, "operation is not permitted for from_client"); return (e); } /* XXX FIXME too long giant lock */ giant_lock(); for (i = 0; i < n; i++) { if (jobs[i] < 0 || jobs[i] >= job_table_size || job_table[jobs[i]] == NULL) { e = gfj_server_put_reply(peer, xid, sizep, diag, GFARM_ERR_NO_SUCH_OBJECT, ""); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001705, "gfj_server_put_reply(info) failed"); giant_unlock(); free(jobs); return (e); } } else { /* XXXRELAY FIXME, reply size is not correct */ e = gfj_server_put_reply(peer, xid, sizep, diag, GFARM_ERR_NO_ERROR, ""); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001706, "gfj_server_put_reply(info) failed"); free(jobs); giant_unlock(); return (e); } /* XXXRELAY FIXME */ e = gfj_server_put_info_entry(peer_get_conn(peer), job_table[jobs[i]]->info); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001707, "gfj_server_put_info_entry() failed"); free(jobs); giant_unlock(); return (e); } } } free(jobs); giant_unlock(); return (GFARM_ERR_NO_ERROR); }
gfarm_error_t gfj_server_list(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); char *user; int i; gfarm_int32_t n; static const char diag[] = "GFJ_PROTO_LIST"; e = gfj_server_get_request(peer, sizep, diag, "s", &user); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001694, "list request failure"); return (e); } if (skip) { free(user); return (GFARM_ERR_NO_ERROR); } if (!from_client) { e = gfj_server_put_reply(peer, xid, sizep, diag, GFARM_ERR_OPERATION_NOT_PERMITTED, ""); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001695, "gfj_server_put_reply(list) failed"); return (e); } } else { /* XXX FIXME too long giant lock */ giant_lock(); n = 0; for (i = 0; i < job_table_size; i++) { if (job_table[i] != NULL && (*user == '\0' || strcmp(user, job_table[i]->info->user) == 0)) n++; } /* XXXRELAY FIXME, reply size is not correct */ e = gfj_server_put_reply(peer, xid, sizep, diag, GFARM_ERR_NO_ERROR, "i", n); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001696, "gfj_server_put_reply(register) failed"); giant_unlock(); return (e); } for (i = 0; i < job_table_size; i++) { if (job_table[i] != NULL && (*user == '\0' || strcmp(user, job_table[i]->info->user) == 0)) { /* XXXRELAY FIXME */ e = gfp_xdr_send(client, "i", (gfarm_int32_t)i); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001697, "gfp_xdr_send() failed"); giant_unlock(); return (e); } } } giant_unlock(); } free(user); return (GFARM_ERR_NO_ERROR); }
gfarm_error_t gfj_server_register(struct peer *peer, gfp_xdr_xid_t xid, size_t *sizep, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); char *user = peer_get_username(peer); int i, eof; gfarm_int32_t flags, total_nodes, argc, error, job_id = 0; struct gfarm_job_info *info; static const char diag[] = "GFJ_PROTO_REGISTER"; GFARM_MALLOC(info); if (info == NULL) { gflog_debug(GFARM_MSG_1001685, "allocation of gfarm_job_info failed"); return (GFARM_ERR_NO_MEMORY); } gfarm_job_info_clear(info, 1); e = gfj_server_get_request(peer, sizep, diag, "iisssi", &flags, &total_nodes, &info->job_type, &info->originate_host, &info->gfarm_url_for_scheduling, &argc); if (e != GFARM_ERR_NO_ERROR) { gflog_debug(GFARM_MSG_1001686, "gfj_server_get_request() failed"); return (e); } /* XXX - currently `flags' is just igored */ info->total_nodes = total_nodes; info->argc = argc; GFARM_MALLOC_ARRAY(info->argv, argc + 1); GFARM_MALLOC_ARRAY(info->nodes, total_nodes); if (info->argv == NULL || info->nodes == NULL) { gflog_debug(GFARM_MSG_1001687, "allocation of 'info->argv' or 'info->nodes' failed "); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); if (info->argv != NULL) free(info->argv); if (info->nodes != NULL) free(info->nodes); free(info); return (GFARM_ERR_NO_MEMORY); } for (i = 0; i < argc; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->argv[i]); if (e != GFARM_ERR_NO_ERROR || eof) { gflog_debug(GFARM_MSG_1001688, "gfp_xdr_recv(info->argv[i]) failed"); if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } } info->argv[i] = NULL; info->user = user; /* shared with file_table[].user */ for (i = 0; i < total_nodes; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->nodes[i].hostname); if (e != GFARM_ERR_NO_ERROR || eof) { gflog_debug(GFARM_MSG_1001689, "gfp_xdr_recv(hostname) failed"); if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } info->nodes[i].pid = 0; info->nodes[i].state = GFJ_NODE_NONE; } if (skip || !from_client) { for (i = 0; i < total_nodes; i++) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); if (skip) return (GFARM_ERR_NO_ERROR); error = GFARM_ERR_OPERATION_NOT_PERMITTED; gflog_debug(GFARM_MSG_1001690, "operation is not permitted for from_client"); } else { giant_lock(); job_id = job_table_add(info, peer_get_jobs_ref(peer)); giant_unlock(); if (job_id < JOB_ID_MIN) { job_id = 0; error = GFARM_ERR_TOO_MANY_JOBS; gflog_debug(GFARM_MSG_1001691, "too many jobs"); } else { error = GFARM_ERR_NO_ERROR; } } return (gfj_server_put_reply(peer, xid, sizep, diag, error, "i", job_id)); }
gfarm_error_t gfj_server_info(struct peer *peer, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); int i, eof; gfarm_int32_t n, *jobs; e = gfj_server_get_request(peer, "info", "i", &n); if (e != GFARM_ERR_NO_ERROR) return (e); GFARM_MALLOC_ARRAY(jobs, n); if (jobs == NULL) return (GFARM_ERR_NO_MEMORY); for (i = 0; i < n; i++) { e = gfp_xdr_recv(client, 0, &eof, "i", &jobs[i]); if (e != GFARM_ERR_NO_ERROR || eof) { if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; free(jobs); return (e); } } if (skip || !from_client) { free(jobs); if (skip) return (GFARM_ERR_NO_ERROR); e = gfj_server_put_reply(peer, "info", GFARM_ERR_OPERATION_NOT_PERMITTED, ""); return (e); } /* XXX FIXME too long giant lock */ giant_lock(); for (i = 0; i < n; i++) { if (jobs[i] < 0 || jobs[i] >= job_table_size || job_table[jobs[i]] == NULL) { e = gfj_server_put_reply(peer, "info", GFARM_ERR_NO_SUCH_OBJECT, ""); if (e != GFARM_ERR_NO_ERROR) { giant_unlock(); free(jobs); return (e); } } else { e = gfj_server_put_reply(peer, "info", GFARM_ERR_NO_ERROR, ""); if (e != GFARM_ERR_NO_ERROR) { free(jobs); giant_unlock(); return (e); } e = gfj_server_put_info_entry(peer_get_conn(peer), job_table[jobs[i]]->info); if (e != GFARM_ERR_NO_ERROR) { free(jobs); giant_unlock(); return (e); } } } free(jobs); giant_unlock(); return (GFARM_ERR_NO_ERROR); }
gfarm_error_t gfj_server_register(struct peer *peer, int from_client, int skip) { gfarm_error_t e; struct gfp_xdr *client = peer_get_conn(peer); char *user = peer_get_username(peer); int i, eof; gfarm_int32_t flags, total_nodes, argc, error, job_id = 0; struct gfarm_job_info *info; GFARM_MALLOC(info); if (info == NULL) return (GFARM_ERR_NO_MEMORY); gfarm_job_info_clear(info, 1); e = gfj_server_get_request(peer, "register", "iisssi", &flags, &total_nodes, &info->job_type, &info->originate_host, &info->gfarm_url_for_scheduling, &argc); if (e != GFARM_ERR_NO_ERROR) return (e); /* XXX - currently `flags' is just igored */ info->total_nodes = total_nodes; info->argc = argc; GFARM_MALLOC_ARRAY(info->argv, argc + 1); GFARM_MALLOC_ARRAY(info->nodes, total_nodes); if (info->argv == NULL || info->nodes == NULL) { free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); if (info->argv != NULL) free(info->argv); if (info->nodes != NULL) free(info->nodes); free(info); return (GFARM_ERR_NO_MEMORY); } for (i = 0; i < argc; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->argv[i]); if (e != GFARM_ERR_NO_ERROR || eof) { if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } } info->argv[i] = NULL; info->user = user; /* shared with file_table[].user */ for (i = 0; i < total_nodes; i++) { e = gfp_xdr_recv(client, 0, &eof, "s", &info->nodes[i].hostname); if (e != GFARM_ERR_NO_ERROR || eof) { if (e == GFARM_ERR_NO_ERROR) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } info->nodes[i].pid = 0; info->nodes[i].state = GFJ_NODE_NONE; } if (skip || !from_client) { for (i = 0; i < total_nodes; i++) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); if (skip) return (GFARM_ERR_NO_ERROR); error = GFARM_ERR_OPERATION_NOT_PERMITTED; } else { giant_lock(); job_id = job_table_add(info, peer_get_jobs_ref(peer)); giant_unlock(); if (job_id < JOB_ID_MIN) { job_id = 0; error = GFARM_ERR_TOO_MANY_JOBS; } else { error = GFARM_ERR_NO_ERROR; } } return (gfj_server_put_reply(peer, "register", error, "i", job_id)); }
char * gfj_server_register(int client_socket) { struct xxx_connection *client = file_table[client_socket].conn; char *user = file_table[client_socket].user; char *e; int i, eof; gfarm_int32_t flags, total_nodes, argc, job_id, error; struct gfarm_job_info *info; info = malloc(sizeof(struct gfarm_job_info)); if (info == NULL) return (GFARM_ERR_NO_MEMORY); gfarm_job_info_clear(info, 1); e = gfj_server_get_request(client, "register", "iisssi", &flags, &total_nodes, &info->job_type, &info->originate_host, &info->gfarm_url_for_scheduling, &argc); if (e != NULL) return (e); /* XXX - currently `flags' is just igored */ info->total_nodes = total_nodes; info->argc = argc; info->argv = malloc(sizeof(char *) * (argc + 1)); info->nodes = malloc(sizeof(struct gfarm_job_node_info) * total_nodes); if (info->argv == NULL || info->nodes == NULL) { free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); if (info->argv != NULL) free(info->argv); if (info->nodes != NULL) free(info->nodes); free(info); return (GFARM_ERR_NO_MEMORY); } for (i = 0; i < argc; i++) { e = xxx_proto_recv(client, 0, &eof, "s", &info->argv[i]); if (e != NULL || eof) { if (e == NULL) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } } info->argv[i] = NULL; info->user = user; /* shared with file_table[].user */ for (i = 0; i < total_nodes; i++) { e = xxx_proto_recv(client, 0, &eof, "s", &info->nodes[i].hostname); if (e != NULL || eof) { if (e == NULL) e = GFARM_ERR_PROTOCOL; while (--i >= 0) free(info->nodes[i].hostname); for (i = 0; i < argc; i++) free(info->argv[i]); free(info->job_type); free(info->originate_host); free(info->gfarm_url_for_scheduling); free(info->argv); free(info->nodes); return (e); } info->nodes[i].pid = 0; info->nodes[i].state = GFJ_NODE_NONE; } job_id = job_table_add(info, &file_table[client_socket].jobs); if (job_id < JOB_ID_MIN) { job_id = 0; error = GFJ_ERROR_TOO_MANY_JOBS; } else { error = GFJ_ERROR_NOERROR; } return (gfj_server_put_reply(client, "register", error, "i", job_id)); }