diff options
author | sr | 2012-12-19 19:35:32 +0100 |
---|---|---|
committer | sr | 2012-12-19 19:35:32 +0100 |
commit | fb6432cb3de7fc8dde366805b5cb9f4a82b85660 (patch) | |
tree | 813430ae0dde9a2ee6553736b0b6dabf22a5f985 /src | |
parent | [SERVER] Remove unix socket support for RPC interface (diff) | |
download | dnbd3-fb6432cb3de7fc8dde366805b5cb9f4a82b85660.tar.gz dnbd3-fb6432cb3de7fc8dde366805b5cb9f4a82b85660.tar.xz dnbd3-fb6432cb3de7fc8dde366805b5cb9f4a82b85660.zip |
[SERVER] Refactor code
[SERVER] Return List of Alt Servers on RPC_IMG_LIST
Diffstat (limited to 'src')
-rw-r--r-- | src/config.h | 4 | ||||
-rw-r--r-- | src/server/job.c | 29 | ||||
-rw-r--r-- | src/server/rpc.c (renamed from src/server/ipc.c) | 134 | ||||
-rw-r--r-- | src/server/rpc.h (renamed from src/server/ipc.h) | 38 | ||||
-rw-r--r-- | src/server/saveload.c | 8 | ||||
-rw-r--r-- | src/server/server.c | 21 | ||||
-rw-r--r-- | src/server/server.h | 2 | ||||
-rw-r--r-- | src/server/xmlutil.h | 16 |
8 files changed, 134 insertions, 118 deletions
diff --git a/src/config.h b/src/config.h index 2f348aa..35e5647 100644 --- a/src/config.h +++ b/src/config.h @@ -68,8 +68,6 @@ // +++++ Misc +++++ #define DEFAULT_SERVER_CONFIG_FILE "/etc/dnbd3/server.conf" #define DEFAULT_CLIENT_CONFIG_FILE "/etc/dnbd3/client.conf" -#define UNIX_SOCKET "/run/dnbd3-server.sock" -#define UNIX_SOCKET_GROUP "dnbd" -#define MAX_IPC_PAYLOAD 3000 +#define MAX_RPC_PAYLOAD 3000 #endif /* CONFIG_H_ */ diff --git a/src/server/job.c b/src/server/job.c index d1f99b8..71e09da 100644 --- a/src/server/job.c +++ b/src/server/job.c @@ -2,7 +2,7 @@ #include "saveload.h" #include "helper.h" #include "memlog.h" -#include "ipc.h" +#include "rpc.h" #include <stdint.h> #include <stdio.h> @@ -54,7 +54,7 @@ static void query_servers(); static char *create_cache_filename(char *name, int rid, char *buffer, int maxlen); static void add_alt_server(dnbd3_image_t *image, dnbd3_host_t *host); static void remove_alt_server(dnbd3_trusted_server_t *server); -static void update_image_atimes(time_t now); +static void dnbd3_update_atimes(time_t now); // @@ -97,7 +97,7 @@ void *dnbd3_job_thread(void *data) const time_t starttime = time(NULL); // // Update image atime - update_image_atimes(starttime); + dnbd3_update_atimes(starttime); // Call image deletion function if last call is more than 5 minutes ago if (starttime < next_delete_invocation) { @@ -345,7 +345,7 @@ static void connect_proxy_images() } } -static void update_image_atimes(time_t now) +static void dnbd3_update_atimes(time_t now) { GSList *iterator; pthread_spin_lock(&_spinlock); @@ -371,10 +371,11 @@ static void query_servers() dnbd3_trusted_server_t *server; dnbd3_host_t host; struct sockaddr_in addr4; - char xmlbuffer[MAX_IPC_PAYLOAD]; + char xmlbuffer[MAX_RPC_PAYLOAD]; for (num = 0;; ++num) { - // "Iterate" this way to prevent holding the lock for a long time, although it is possible to skip a server this way... + // "Iterate" this way to prevent holding the lock for a long time, + // although there is a very small chance to skip a server this way... pthread_spin_lock(&_spinlock); server = g_slist_nth_data(_trusted_servers, num); if (server == NULL) @@ -382,7 +383,7 @@ static void query_servers() pthread_spin_unlock(&_spinlock); break; // Done } - host = server->host; + host = server->host; // Copy host, in case server gets deleted by another thread pthread_spin_unlock(&_spinlock); // Connect if (host.type != AF_INET) @@ -415,8 +416,8 @@ static void query_servers() // // Send and receive info from server // Send message - dnbd3_ipc_t header; - header.cmd = htonl(IPC_IMG_LIST); + dnbd3_rpc_t header; + header.cmd = htonl(RPC_IMG_LIST); header.size = 0; send(client_sock, (char *)&header, sizeof(header), 0); if (!recv_data(client_sock, &header, sizeof(header))) @@ -426,14 +427,14 @@ static void query_servers() } header.cmd = ntohl(header.cmd); header.size = ntohl(header.size); - if (header.cmd != IPC_IMG_LIST) + if (header.cmd != RPC_IMG_LIST) { printf("[DEBUG] Error. Reply from other server was cmd:%d, error:%d\n", (int)header.cmd, (int)-1); goto communication_error; } - if (header.size > MAX_IPC_PAYLOAD) + if (header.size > MAX_RPC_PAYLOAD) { - memlogf("[WARNING] XML payload from other server exceeds MAX_IPC_PAYLOAD (%d > %d)", (int)header.size, (int)MAX_IPC_PAYLOAD); + memlogf("[WARNING] XML payload from other server exceeds MAX_RPC_PAYLOAD (%d > %d)", (int)header.size, (int)MAX_RPC_PAYLOAD); goto communication_error; } if (!recv_data(client_sock, xmlbuffer, header.size)) @@ -497,7 +498,7 @@ static void query_servers() printf("[DEBUG] Invalid image name: '%s'\n", image); goto free_current_image; } - snprintf(xmlbuffer, MAX_IPC_PAYLOAD, "%s/%s", ns, image); + snprintf(xmlbuffer, MAX_RPC_PAYLOAD, "%s/%s", ns, image); } else { @@ -512,7 +513,7 @@ static void query_servers() printf("[DEBUG] Ignoring remote image with invalid name '%s'\n", slash); goto free_current_image; } - snprintf(xmlbuffer, MAX_IPC_PAYLOAD, "%s/%s", image, slash); + snprintf(xmlbuffer, MAX_RPC_PAYLOAD, "%s/%s", image, slash); } // Image seems legit, check if there's a local copy dnbd3_namespace_t *trust; diff --git a/src/server/ipc.c b/src/server/rpc.c index a345794..152bf7c 100644 --- a/src/server/ipc.c +++ b/src/server/rpc.c @@ -18,7 +18,7 @@ * */ -#include "ipc.h" +#include "rpc.h" #include "../config.h" #include "server.h" #include "saveload.h" @@ -44,7 +44,7 @@ #include <libxml/xpath.h> #include "xmlutil.h" -#define IPC_PORT (PORT+1) +#define RPC_PORT (PORT+1) static int server_sock = -1; static volatile int keep_running = 1; @@ -56,11 +56,11 @@ static char *payload = NULL; putchar('\n'); \ } while (0) -static int ipc_receive(int client_sock); +static int rpc_receive(int client_sock); static int get_highest_fd(GSList *sockets); static int is_password_correct(xmlDocPtr doc); static int get_terminal_width(); -static int ipc_send_reply(int sock, dnbd3_ipc_t* header, int result_code, xmlDocPtr payload); +static int rpc_send_reply(int sock, dnbd3_rpc_t* header, int result_code, xmlDocPtr payload); static int get_highest_fd(GSList *sockets) { @@ -77,16 +77,16 @@ static int get_highest_fd(GSList *sockets) return max; } -void *dnbd3_ipc_mainloop() +void *dnbd3_rpc_mainloop() { // Check version and initialize LIBXML_TEST_VERSION - payload = malloc(MAX_IPC_PAYLOAD); + payload = malloc(MAX_RPC_PAYLOAD); if (payload == NULL) { - memlogf("[CRITICAL] Couldn't allocate IPC payload buffer. IPC disabled."); + memlogf("[CRITICAL] Couldn't allocate RPC payload buffer. RPC disabled."); pthread_exit((void *)0); return NULL; } @@ -97,14 +97,14 @@ void *dnbd3_ipc_mainloop() // Create socket if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { - perror("ERROR: IPC socket"); + perror("ERROR: RPC socket"); exit(EXIT_FAILURE); } memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; // IPv4 server.sin_addr.s_addr = INADDR_ANY; - server.sin_port = htons(IPC_PORT); // set port number + server.sin_port = htons(RPC_PORT); // set port number const int optval = 1; setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); @@ -112,14 +112,14 @@ void *dnbd3_ipc_mainloop() // Bind to socket if (bind(server_sock, (struct sockaddr *)&server, sizeof(server)) < 0) { - perror("ERROR: IPC bind"); + perror("ERROR: RPC bind"); exit(EXIT_FAILURE); } // Listen on socket if (listen(server_sock, 5) < 0) { - perror("ERROR: IPC listen"); + perror("ERROR: RPC listen"); exit(EXIT_FAILURE); } @@ -162,7 +162,7 @@ void *dnbd3_ipc_mainloop() { if (errno != EAGAIN) { - memlogf("[ERROR] Error accepting an IPC connection"); + memlogf("[ERROR] Error accepting an RPC connection"); if (++error_count > 10) goto end_loop; } @@ -185,13 +185,13 @@ void *dnbd3_ipc_mainloop() } else if (FD_ISSET(server_sock, &exceptset)) { - memlogf("[ERROR] An exception occurred on the IPC listening socket."); + memlogf("[ERROR] An exception occurred on the RPC listening socket."); if (++error_count > 10) goto end_loop; } else { - // Must be an active IPC connection + // Must be an active RPC connection int del = -1; for (iterator = sockets; iterator; iterator = iterator->next) { @@ -206,7 +206,7 @@ void *dnbd3_ipc_mainloop() if (FD_ISSET(client_sock, &readset)) { // Client sending data - if (!ipc_receive(client_sock)) + if (!rpc_receive(client_sock)) { // Connection has been closed close(client_sock); @@ -233,7 +233,7 @@ void *dnbd3_ipc_mainloop() } // End mainloop end_loop: - memlogf("[INFO] Shutting down IPC interface."); + memlogf("[INFO] Shutting down RPC interface."); if (server_sock != -1) { close(server_sock); @@ -246,7 +246,7 @@ end_loop: return NULL; } -void dnbd3_ipc_shutdown() +void dnbd3_rpc_shutdown() { keep_running = 0; if (server_sock == -1) @@ -258,14 +258,14 @@ void dnbd3_ipc_shutdown() /** * Returns !=0 if send/recv successful, 0 on any kind of network failure */ -static int ipc_receive(int client_sock) +static int rpc_receive(int client_sock) { GSList *iterator, *iterator2; #define STRBUFLEN 100 char strbuffer[STRBUFLEN]; - dnbd3_ipc_t header; + dnbd3_rpc_t header; uint32_t cmd; @@ -285,9 +285,9 @@ static int ipc_receive(int client_sock) if (header.size != 0) { // Message has payload, receive it - if (header.size > MAX_IPC_PAYLOAD) + if (header.size > MAX_RPC_PAYLOAD) { - memlogf("[WARNING] IPC command with payload of %u bytes ignored.", (unsigned int)header.size); + memlogf("[WARNING] RPC command with payload of %u bytes ignored.", (unsigned int)header.size); return 0; } if (!recv_data(client_sock, payload, header.size)) @@ -298,19 +298,17 @@ static int ipc_receive(int client_sock) switch (cmd) { - case IPC_EXIT: - memlogf("[INFO] Server shutdown by IPC request"); + case RPC_EXIT: + memlogf("[INFO] Server shutdown by RPC request"); header.size = ntohl(0); return_value = send_data(client_sock, &header, sizeof(header)); dnbd3_cleanup(); break; - case IPC_IMG_LIST: + case RPC_IMG_LIST: if (!createXmlDoc(&docReply, &root_node, "data")) goto case_end; - xmlNewTextChild(root_node, NULL, BAD_CAST "defaultns", BAD_CAST _local_namespace); - // Images parent_node = xmlNewNode(NULL, BAD_CAST "images"); if (parent_node == NULL) @@ -324,16 +322,14 @@ static int ipc_receive(int client_sock) tmp_node = xmlNewNode(NULL, BAD_CAST "image"); if (tmp_node == NULL) goto case_end; - xmlNewProp(tmp_node, BAD_CAST "name", BAD_CAST image->config_group); - sprintf(strbuffer, "%u", (unsigned int)image->atime); - xmlNewProp(tmp_node, BAD_CAST "atime", BAD_CAST strbuffer); - sprintf(strbuffer, "%d", image->rid); - xmlNewProp(tmp_node, BAD_CAST "rid", BAD_CAST strbuffer); - sprintf(strbuffer, "%llu", (unsigned long long)image->filesize); - xmlNewProp(tmp_node, BAD_CAST "size", BAD_CAST strbuffer); + xmlNewProp(tmp_node, BAD_CAST "name", BAD_CAST image->low_name); + xmlAddDecimalProp(image->rid, tmp_node, "rid"); + xmlAddDecimalProp(image->atime, tmp_node, "atime"); + xmlAddDecimalProp(image->delete_soft, tmp_node, "softdelete"); + xmlAddDecimalProp(image->delete_hard, tmp_node, "harddelete"); + xmlAddDecimalProp(image->filesize, tmp_node, "size"); if (image->file) xmlNewProp(tmp_node, BAD_CAST "file", BAD_CAST image->file); - xmlNewProp(tmp_node, BAD_CAST "servers", BAD_CAST "???"); // TODO if (image->cache_file && image->cache_map) { xmlNewProp(tmp_node, BAD_CAST "cachefile", BAD_CAST image->cache_file); @@ -341,9 +337,17 @@ static int ipc_receive(int client_sock) for (i = 0; i < size; ++i) if (image->cache_map[i]) complete += 100; - sprintf(strbuffer, "%d", complete / size); - xmlNewProp(tmp_node, BAD_CAST "cachefill", BAD_CAST strbuffer); + xmlAddDecimalProp(complete / size, tmp_node, "cachefill"); + } + int i; + char serverstr[1000] = {0}, target[100]; + for (i = 0; i < NUMBER_SERVERS; ++i) + { + if (image->servers[i].host.type == 0) continue; + if (!host_to_string(&(image->servers[i].host), target, 100)) continue; + strcat(serverstr, target); } + xmlNewProp(tmp_node, BAD_CAST "servers", BAD_CAST serverstr); // TODO xmlAddChild(parent_node, tmp_node); } pthread_spin_unlock(&_spinlock); @@ -353,7 +357,7 @@ static int ipc_receive(int client_sock) rpc_error = 0; break; - case IPC_CLIENT_LIST: + case RPC_CLIENT_LIST: if (!createXmlDoc(&docReply, &root_node, "data")) goto case_end; @@ -372,12 +376,10 @@ static int ipc_receive(int client_sock) tmp_node = xmlNewNode(NULL, BAD_CAST "client"); if (tmp_node == NULL) goto case_end; - *strbuffer = '\0'; host_to_string(&client->host, strbuffer, STRBUFLEN); xmlNewProp(tmp_node, BAD_CAST "address", BAD_CAST strbuffer); - xmlNewProp(tmp_node, BAD_CAST "image", BAD_CAST client->image->config_group); - sprintf(strbuffer, "%d", client->image->rid); - xmlNewProp(tmp_node, BAD_CAST "rid", BAD_CAST strbuffer); + xmlNewProp(tmp_node, BAD_CAST "image", BAD_CAST client->image->low_name); + xmlAddDecimalProp(client->image->rid, tmp_node, "rid"); xmlAddChild(parent_node, tmp_node); } } @@ -388,7 +390,7 @@ static int ipc_receive(int client_sock) rpc_error = 0; break; - case IPC_TRUSTED_LIST: + case RPC_TRUSTED_LIST: if (!createXmlDoc(&docReply, &root_node, "data")) goto case_end; @@ -438,7 +440,7 @@ static int ipc_receive(int client_sock) rpc_error = 0; break; - case IPC_GET_LOG: + case RPC_GET_LOG: if (!createXmlDoc(&docReply, &root_node, "data")) goto case_end; @@ -459,8 +461,8 @@ static int ipc_receive(int client_sock) rpc_error = 0; break; - case IPC_ADD_IMG: - case IPC_DEL_IMG: + case RPC_ADD_IMG: + case RPC_DEL_IMG: if (docRequest) { if (!is_password_correct(docRequest)) @@ -497,7 +499,7 @@ static int ipc_receive(int client_sock) if (image.config_group && rid_str) { image.rid = atoi(rid_str); - if (cmd == IPC_ADD_IMG) + if (cmd == RPC_ADD_IMG) rpc_error = dnbd3_add_image(&image); else rpc_error = dnbd3_del_image(&image); @@ -515,8 +517,8 @@ static int ipc_receive(int client_sock) break; - case IPC_ADD_NS: - case IPC_DEL_NS: + case RPC_ADD_NS: + case RPC_DEL_NS: if (docRequest) { if (!is_password_correct(docRequest)) @@ -532,14 +534,14 @@ static int ipc_receive(int client_sock) if (cur->type != XML_ELEMENT_NODE) continue; NEW_POINTERLIST; - char *host = (char *)XML_GETPROP(cur, "address"); - char *ns = (char *)XML_GETPROP(cur, "name"); - char *flags = (char *)XML_GETPROP(cur, "flags"); - char *comment = (char *)XML_GETPROP(cur, "comment"); + char *host = XML_GETPROP(cur, "address"); + char *ns = XML_GETPROP(cur, "name"); + char *flags = XML_GETPROP(cur, "flags"); + char *comment = XML_GETPROP(cur, "comment"); pthread_spin_lock(&_spinlock); if (host && ns) { - if (cmd == IPC_ADD_NS) + if (cmd == RPC_ADD_NS) { dnbd3_trusted_server_t *server = dnbd3_get_trusted_server(host, TRUE, comment); if (server) @@ -563,7 +565,7 @@ static int ipc_receive(int client_sock) break; default: - memlogf("[ERROR] Unknown IPC command: %u", (unsigned int)header.cmd); + memlogf("[ERROR] Unknown RPC command: %u", (unsigned int)header.cmd); rpc_error = htonl(ERROR_UNKNOWN_COMMAND); break; @@ -573,7 +575,7 @@ case_end: if (locked) pthread_spin_unlock(&_spinlock); // Send reply - return_value = ipc_send_reply(client_sock, &header, rpc_error, docReply); + return_value = rpc_send_reply(client_sock, &header, rpc_error, docReply); xmlFreeDoc(docReply); xmlFreeDoc(docRequest); @@ -581,7 +583,7 @@ case_end: return return_value; } -void dnbd3_ipc_send(int cmd) +void dnbd3_rpc_send(int cmd) { int client_sock, size; @@ -594,7 +596,7 @@ void dnbd3_ipc_send(int cmd) // Create socket if ((client_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { - perror("ERROR: IPC socket"); + perror("ERROR: RPC socket"); exit(EXIT_FAILURE); } @@ -606,17 +608,17 @@ void dnbd3_ipc_send(int cmd) memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; // IPv4 server.sin_addr.s_addr = inet_addr("127.0.0.1"); - server.sin_port = htons(IPC_PORT); // set port number + server.sin_port = htons(RPC_PORT); // set port number // Connect to server if (connect(client_sock, (struct sockaddr *)&server, sizeof(server)) < 0) { - perror("ERROR: IPC connect"); + perror("ERROR: RPC connect"); exit(EXIT_FAILURE); } // Send message - dnbd3_ipc_t header; + dnbd3_rpc_t header; header.cmd = htonl(cmd); header.size = 0; send(client_sock, (char *)&header, sizeof(header), MSG_WAITALL); @@ -624,7 +626,7 @@ void dnbd3_ipc_send(int cmd) header.cmd = ntohl(header.cmd); header.size = ntohl(header.size); - if (cmd == IPC_IMG_LIST && header.size > 0) + if (cmd == RPC_IMG_LIST && header.size > 0) { char *buf = malloc(header.size + 1); size = recv(client_sock, buf, header.size, MSG_WAITALL); @@ -764,15 +766,15 @@ void dnbd3_ipc_send(int cmd) */ static int is_password_correct(xmlDocPtr doc) { - if (_ipc_password == NULL) + if (_rpc_password == NULL) { - memlogf("[WARNING] IPC access granted as no password is set!"); + memlogf("[WARNING] RPC access granted as no password is set!"); return 1; } char *pass = getTextFromPath(doc, "/data/password"); if (pass == NULL) return 0; - if (strcmp(pass, _ipc_password) == 0) + if (strcmp(pass, _rpc_password) == 0) { xmlFree(pass); return 1; @@ -791,7 +793,7 @@ static int get_terminal_width() #define RETBUFLEN 8000 static char returnbuffer[RETBUFLEN]; -static int ipc_send_reply(int sock, dnbd3_ipc_t* header, int result_code, xmlDocPtr payload) +static int rpc_send_reply(int sock, dnbd3_rpc_t* header, int result_code, xmlDocPtr payload) { if (result_code == 0 && payload != NULL) { @@ -814,7 +816,7 @@ static int ipc_send_reply(int sock, dnbd3_ipc_t* header, int result_code, xmlDoc if (len >= RETBUFLEN) len = 10; header->size = htonl(len); - header->cmd = htonl(IPC_ERROR); + header->cmd = htonl(RPC_ERROR); if (!send_data(sock, header, sizeof(*header))) return FALSE; return send_data(sock, returnbuffer, len); diff --git a/src/server/ipc.h b/src/server/rpc.h index fabe6f8..a7c9f39 100644 --- a/src/server/ipc.h +++ b/src/server/rpc.h @@ -18,29 +18,29 @@ * */ -#ifndef IPC_H_ -#define IPC_H_ +#ifndef RPC_H_ +#define RPC_H_ #include <stdint.h> -#define IPC_EXIT 0 -#define IPC_RELOAD 1 -#define IPC_IMG_LIST 2 -#define IPC_ADD_IMG 3 -#define IPC_DEL_IMG 4 -#define IPC_ADD_NS 5 -#define IPC_DEL_NS 6 -#define IPC_CLIENT_LIST 7 -#define IPC_TRUSTED_LIST 8 -#define IPC_GET_LOG 9 -#define IPC_FIX_IMAGE 10 -#define IPC_ERROR 11 +#define RPC_EXIT 0 +#define RPC_RELOAD 1 +#define RPC_IMG_LIST 2 +#define RPC_ADD_IMG 3 +#define RPC_DEL_IMG 4 +#define RPC_ADD_NS 5 +#define RPC_DEL_NS 6 +#define RPC_CLIENT_LIST 7 +#define RPC_TRUSTED_LIST 8 +#define RPC_GET_LOG 9 +#define RPC_FIX_IMAGE 10 +#define RPC_ERROR 11 -void *dnbd3_ipc_mainloop(); +void *dnbd3_rpc_mainloop(); -void dnbd3_ipc_shutdown(); +void dnbd3_rpc_shutdown(); -void dnbd3_ipc_send(int cmd); +void dnbd3_rpc_send(int cmd); #pragma pack(1) @@ -49,7 +49,7 @@ typedef struct uint32_t handle;// 4byte uint32_t cmd; // 4byte uint32_t size; // 4byte -} dnbd3_ipc_t; +} dnbd3_rpc_t; #pragma pack(0) -#endif /* IPC_H_ */ +#endif /* RPC_H_ */ diff --git a/src/server/saveload.c b/src/server/saveload.c index 18dbae9..9b5318a 100644 --- a/src/server/saveload.c +++ b/src/server/saveload.c @@ -66,7 +66,7 @@ void dnbd3_load_config() srand(time(NULL)); - _ipc_password = g_key_file_get_string(_config_handle, "settings", "password", NULL); + _rpc_password = g_key_file_get_string(_config_handle, "settings", "password", NULL); _cache_dir = g_key_file_get_string(_config_handle, "settings", "cache_dir", NULL); if (_cache_dir == NULL) @@ -154,7 +154,7 @@ int dnbd3_add_image(dnbd3_image_t *image) close(fh); } // Lock here to prevent concurrent add calls to mess rids up. Cannot happen currently - // as IPC clients are not threaded and they're the only place where this is called, + // as RPC clients are not threaded and they're the only place where this is called, // but better be safe for the future... pthread_spin_lock(&_spinlock); if (image->rid == 0) @@ -371,13 +371,15 @@ static dnbd3_image_t *prepare_image(char *image_name, int rid, char *image_file, image->low_name = strdup(image_name); } + strtolower(image->low_name); + memlogf("[INFO] Loading image '%s'", image->low_name); + if (dnbd3_get_image(image->low_name, rid, 0)) { memlogf("[ERROR] Duplicate image in config: '%s' rid:%d", image_name, rid); goto error; } - strtolower(image->low_name); image->config_group = strdup(image_name); image->rid = rid; diff --git a/src/server/server.c b/src/server/server.c index bd5f10a..0c2f37a 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -35,7 +35,7 @@ #include "saveload.h" #include "job.h" #include "net.h" -#include "ipc.h" +#include "rpc.h" #include "memlog.h" static int sock; @@ -47,7 +47,7 @@ pthread_spinlock_t _spinlock; GSList *_dnbd3_clients = NULL; char *_config_file_name = DEFAULT_SERVER_CONFIG_FILE; char *_local_namespace = NULL; -char *_ipc_password = NULL; +char *_rpc_password = NULL; char *_cache_dir = NULL; GSList *_dnbd3_images = NULL; // of dnbd3_image_t GSList *_trusted_servers = NULL; @@ -83,7 +83,7 @@ void dnbd3_cleanup() close(sock); sock = -1; - dnbd3_ipc_shutdown(); + dnbd3_rpc_shutdown(); dnbd3_job_shutdown(); pthread_spin_lock(&_spinlock); @@ -135,9 +135,6 @@ void dnbd3_cleanup() g_slist_free(_dnbd3_images); pthread_spin_unlock(&_spinlock); -#ifndef IPC_TCP - unlink(UNIX_SOCKET); -#endif exit(EXIT_SUCCESS); } @@ -181,15 +178,15 @@ int main(int argc, char *argv[]) break; case 'r': printf("INFO: Reloading configuration file...\n\n"); - dnbd3_ipc_send(IPC_RELOAD); + dnbd3_rpc_send(RPC_RELOAD); return EXIT_SUCCESS; case 's': printf("INFO: Stopping running server...\n\n"); - dnbd3_ipc_send(IPC_EXIT); + dnbd3_rpc_send(RPC_EXIT); return EXIT_SUCCESS; case 'i': printf("INFO: Requesting information...\n\n"); - dnbd3_ipc_send(IPC_IMG_LIST); + dnbd3_rpc_send(RPC_IMG_LIST); return EXIT_SUCCESS; case 'H': dnbd3_print_help(argv[0]); @@ -231,9 +228,9 @@ int main(int argc, char *argv[]) timeout.tv_sec = SOCKET_TIMEOUT_SERVER; timeout.tv_usec = 0; - // setup ipc - pthread_t thread_ipc; - pthread_create(&(thread_ipc), NULL, &dnbd3_ipc_mainloop, NULL); + // setup rpc + pthread_t thread_rpc; + pthread_create(&(thread_rpc), NULL, &dnbd3_rpc_mainloop, NULL); pthread_t thread_job; pthread_create(&(thread_job), NULL, &dnbd3_job_thread, NULL); diff --git a/src/server/server.h b/src/server/server.h index fda5e46..8fb4f21 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -83,7 +83,7 @@ typedef struct extern GSList *_dnbd3_clients; // of dnbd3_client_t extern pthread_spinlock_t _spinlock; -extern char *_config_file_name, *_local_namespace, *_ipc_password, *_cache_dir; +extern char *_config_file_name, *_local_namespace, *_rpc_password, *_cache_dir; extern GSList *_dnbd3_images; // of dnbd3_image_t extern GSList *_trusted_servers; diff --git a/src/server/xmlutil.h b/src/server/xmlutil.h index ecfa4c4..4da8616 100644 --- a/src/server/xmlutil.h +++ b/src/server/xmlutil.h @@ -3,10 +3,13 @@ #include <libxml/xmlstring.h> #include <libxml/tree.h> +#include <inttypes.h> char *getTextFromPath(xmlDocPtr doc, char *xpath); char createXmlDoc(xmlDocPtr *doc, xmlNodePtr* root, char* rootName); +// Two macros to iterate over a node list + #define FOR_EACH_NODE(_doc, _path, _node) do { \ xmlXPathContextPtr _makro_xpathCtx = xmlXPathNewContext(_doc); \ if (_makro_xpathCtx) { \ @@ -23,6 +26,8 @@ char createXmlDoc(xmlDocPtr *doc, xmlNodePtr* root, char* rootName); xmlXPathFreeContext(_makro_xpathCtx); \ } while(0) +// Two macros to deal with temporary pointers + #define NUM_POINTERS_IN_LIST 20 #define NEW_POINTERLIST \ void *_makro_ptrlist[NUM_POINTERS_IN_LIST]; \ @@ -34,6 +39,17 @@ char createXmlDoc(xmlDocPtr *doc, xmlNodePtr* root, char* rootName); xmlFree(_makro_ptrlist[_makro_i_]); \ } } while(0) +// Macro to get a node property with automatic pointer handling (see two macros above) + #define XML_GETPROP(_node, _name) (char*)(_makro_ptrlist[(_makro_usedcount >= NUM_POINTERS_IN_LIST ? 0 : _makro_usedcount++)] = xmlGetNoNsProp(_node, BAD_CAST _name)) +// Inline function to print a numeric value to a char buffer and add as property + +static inline void xmlAddDecimalProp(int64_t value, xmlNodePtr node, char* name) +{ + char strbuffer[100]; + sprintf(strbuffer, "%" PRId64, value); + xmlNewProp(node, BAD_CAST name, BAD_CAST strbuffer); +} + #endif |