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); }
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_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); }