myco-daemon.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. /* Copyright (C) 2016 Max Riechelmann <max.riechelmann@student.kit.edu>
  2. (Karlsruhe Institute of Technology)
  3. This library is free software; you can redistribute it and/or modify it
  4. under the terms of the GNU Lesser General Public License as published by the
  5. Free Software Foundation; either version 2.1 of the License, or (at your
  6. option) any later version.
  7. This library is distributed in the hope that it will be useful, but WITHOUT
  8. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  10. details.
  11. You should have received a copy of the GNU Lesser General Public License along
  12. with this library; if not, write to the Free Software Foundation, Inc., 51
  13. Franklin St, Fifth Floor, Boston, MA 02110, USA
  14. */
  15. #include "myco-daemon.h"
  16. #include "../src/myco-memory.c"
  17. #include "../src/myco-modules.h"
  18. #define DEBUG 1
  19. myco_agent *first_agent = NULL;
  20. myco_resource *first_resource = NULL;
  21. myco_agent *myco_daemon_find_agent(const char *agent_name) {
  22. myco_agent *current_agent;
  23. current_agent = first_agent;
  24. while (current_agent != NULL) {
  25. if (strcmp(current_agent->name, agent_name) == 0) {
  26. return current_agent;
  27. }
  28. current_agent = current_agent->next;
  29. }
  30. return NULL;
  31. }
  32. int myco_daemon_register_agent(message msg) {
  33. myco_agent *current_agent;
  34. if (myco_daemon_find_agent(msg.agent_name) != NULL) {
  35. sprintf(msg.message, "ERROR: agent %s already exists\n", msg.agent_name);
  36. myco_send(msg.agent_message_queue_id, msg);
  37. return -1;
  38. }
  39. if (first_agent == NULL) {
  40. first_agent = malloc(sizeof(myco_agent));
  41. first_agent->next = NULL;
  42. first_agent->prev = NULL;
  43. sprintf(first_agent->name, "%s", msg.agent_name);
  44. first_agent->message_queue_id = msg.agent_message_queue_id;
  45. } else {
  46. current_agent = first_agent;
  47. while (current_agent->next != NULL) {
  48. current_agent = current_agent->next;
  49. }
  50. current_agent->next = malloc(sizeof(myco_agent));
  51. current_agent->next->prev = current_agent;
  52. current_agent->next->next = NULL;
  53. sprintf(current_agent->next->name, "%s", msg.agent_name);
  54. current_agent->next->message_queue_id = msg.agent_message_queue_id;
  55. }
  56. sprintf(msg.message, "SUCCESS: agent %s registered\n", msg.agent_name);
  57. myco_send(msg.agent_message_queue_id, msg);
  58. return 0;
  59. }
  60. int myco_daemon_unregister_agent(message msg) {
  61. myco_agent *current_agent;
  62. myco_resource *current_resource;
  63. current_agent = myco_daemon_find_agent(msg.agent_name);
  64. if ((current_resource = myco_daemon_find_resource_by_agent(msg.agent_name)) != NULL) {
  65. sprintf(msg.message, "ERROR: agent %s still has resource %s\n", msg.agent_name, current_resource->name);
  66. myco_send(msg.agent_message_queue_id, msg);
  67. return -1;
  68. }
  69. if (current_agent == NULL) {
  70. sprintf(msg.message, "ERROR: agent %s could not be unregistered\n", msg.agent_name);
  71. myco_send(msg.agent_message_queue_id, msg);
  72. return -1;
  73. }
  74. // Element in the middle
  75. if (current_agent->next != NULL && current_agent->prev != NULL) {
  76. current_agent->prev->next = current_agent->next;
  77. current_agent->next->prev = current_agent->prev;
  78. free(current_agent);
  79. sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
  80. myco_send(msg.agent_message_queue_id, msg);
  81. return 0;
  82. }
  83. // First element
  84. if (current_agent->next != NULL && current_agent->prev == NULL) {
  85. first_agent = current_agent->next;
  86. current_agent->next->prev = NULL;
  87. free(current_agent);
  88. sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
  89. myco_send(msg.agent_message_queue_id, msg);
  90. return 0;
  91. }
  92. // Last element
  93. if (current_agent->next == NULL && current_agent->prev != NULL) {
  94. current_agent->prev->next = NULL;
  95. free(current_agent);
  96. sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
  97. myco_send(msg.agent_message_queue_id, msg);
  98. return 0;
  99. }
  100. // Only remaining
  101. if (current_agent->next == NULL && current_agent->prev == NULL) {
  102. first_agent = NULL;
  103. free(current_agent);
  104. sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
  105. myco_send(msg.agent_message_queue_id, msg);
  106. return 0;
  107. }
  108. sprintf(msg.message, "ERROR: agent %s could not be unregistered - data structure seems to be damaged!\n", msg.agent_name);
  109. myco_send(msg.agent_message_queue_id, msg);
  110. return -1;
  111. }
  112. myco_resource *myco_daemon_find_resource_by_agent(const char *agent_name) {
  113. myco_resource *current_resource;
  114. current_resource = first_resource;
  115. while (current_resource != NULL) {
  116. if (strcmp(current_resource->agent, agent_name) == 0) {
  117. return current_resource;
  118. }
  119. current_resource = current_resource->next;
  120. }
  121. return NULL;
  122. }
  123. myco_resource *myco_daemon_find_resource(const char *resource_name) {
  124. myco_resource *current_resource;
  125. current_resource = first_resource;
  126. while (current_resource != NULL) {
  127. if (strcmp(current_resource->name, resource_name) == 0) {
  128. return current_resource;
  129. }
  130. current_resource = current_resource->next;
  131. }
  132. return NULL;
  133. }
  134. int myco_daemon_register_resource(message msg) {
  135. myco_resource *current_resource;
  136. if (myco_daemon_find_agent(msg.agent_name) == NULL) {
  137. sprintf(msg.message, "ERROR: agent %s does not exist\n", msg.agent_name);
  138. myco_send(msg.agent_message_queue_id, msg);
  139. return -1;
  140. }
  141. if (myco_daemon_find_resource(msg.resource_name) != NULL) {
  142. sprintf(msg.message, "ERROR: resource %s already exists\n", msg.resource_name);
  143. myco_send(msg.agent_message_queue_id, msg);
  144. return -1;
  145. }
  146. // Insert as first element
  147. if (first_resource == NULL) {
  148. first_resource = malloc(sizeof(myco_resource));
  149. first_resource->next = NULL;
  150. first_resource->prev = NULL;
  151. sprintf(first_resource->name, "%s", msg.resource_name);
  152. sprintf(first_resource->agent, "%s", msg.agent_name);
  153. first_resource->pid = msg.sender_pid;
  154. first_resource->pointer = msg.resource_pointer;
  155. first_resource->size = msg.resource_size;
  156. first_resource->read_locked = 0;
  157. first_resource->transfer_locked = 1;
  158. first_resource->transactional = msg.resource_transactional;
  159. first_resource->version = 0;
  160. } else {
  161. // Insert as last element
  162. current_resource = first_resource;
  163. while (current_resource->next != NULL) {
  164. current_resource = current_resource->next;
  165. }
  166. current_resource->next = malloc(sizeof(myco_resource));
  167. current_resource->next->prev = current_resource;
  168. current_resource->next->next = NULL;
  169. sprintf(current_resource->next->name, "%s", msg.resource_name);
  170. sprintf(current_resource->next->agent, "%s", msg.agent_name);
  171. current_resource->next->pid = msg.sender_pid;
  172. current_resource->next->pointer = msg.resource_pointer;
  173. current_resource->next->size = msg.resource_size;
  174. current_resource->next->transfer_locked = 1;
  175. current_resource->next->read_locked = 0;
  176. current_resource->next->transactional = msg.resource_transactional;
  177. current_resource->next->version = 0;
  178. }
  179. sprintf(msg.message, "SUCCESS: resource %s registered\n", msg.resource_name);
  180. myco_send(msg.agent_message_queue_id, msg);
  181. return 0;
  182. }
  183. int myco_daemon_unregister_resource(message msg) {
  184. myco_resource *current_resource;
  185. current_resource = myco_daemon_find_resource(msg.resource_name);
  186. if (current_resource == NULL) {
  187. sprintf(msg.message, "ERROR: resource %s could not be unregistered\n", msg.resource_name);
  188. myco_send(msg.agent_message_queue_id, msg);
  189. return -1;
  190. }
  191. // Element in the middle
  192. if (current_resource->next != NULL && current_resource->prev != NULL) {
  193. current_resource->prev->next = current_resource->next;
  194. current_resource->next->prev = current_resource->prev;
  195. free(current_resource);
  196. sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
  197. myco_send(msg.agent_message_queue_id, msg);
  198. return 0;
  199. }
  200. // First element
  201. if (current_resource->next != NULL && current_resource->prev == NULL) {
  202. first_resource = current_resource->next;
  203. current_resource->next->prev = NULL;
  204. free(current_resource);
  205. sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
  206. myco_send(msg.agent_message_queue_id, msg);
  207. return 0;
  208. }
  209. // Last element
  210. if (current_resource->next == NULL && current_resource->prev != NULL) {
  211. current_resource->prev->next = NULL;
  212. free(current_resource);
  213. sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
  214. myco_send(msg.agent_message_queue_id, msg);
  215. return 0;
  216. }
  217. // Only remaining
  218. if (current_resource->next == NULL && current_resource->prev == NULL) {
  219. first_resource = NULL;
  220. free(current_resource);
  221. sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
  222. myco_send(msg.agent_message_queue_id, msg);
  223. return 0;
  224. }
  225. sprintf(msg.message, "FATAL ERROR: resource %s could not be unregistered - data structure seems to be damaged!\n", msg.resource_name);
  226. myco_send(msg.agent_message_queue_id, msg);
  227. return -1;
  228. }
  229. int myco_daemon_request_resource(message msg) {
  230. myco_resource *current_resource;
  231. // Check if resource exists
  232. if ((current_resource = myco_daemon_find_resource(msg.resource_name)) == NULL) {
  233. sprintf(msg.message, "ERROR: resource %s does not exist\n", msg.resource_name);
  234. myco_send(msg.agent_message_queue_id, msg);
  235. return -1;
  236. }
  237. // Check if agent that requests already owns the resource
  238. if (strcmp(current_resource->agent, msg.agent_name) == 0) {
  239. sprintf(msg.message, "ERROR: resource %s already belongs to agent %s\n", msg.resource_name, msg.agent_name);
  240. myco_send(msg.agent_message_queue_id, msg);
  241. return -1;
  242. }
  243. // Check if resource is transactional
  244. if (current_resource->transactional != RESOURCE_TRANSACTIONAL) {
  245. sprintf(msg.message, "ERROR: resource %s is not transactional\n", msg.resource_name);
  246. myco_send(msg.agent_message_queue_id, msg);
  247. return -1;
  248. }
  249. // TODO: Handle case where resource is on another node (another agent)
  250. // If on same node, send information
  251. msg.sender_pid = current_resource->pid;
  252. msg.resource_size = current_resource->size;
  253. msg.resource_pointer = current_resource->pointer;
  254. sprintf(msg.message, "SUCCESS: resource found on same node, sending information\n");
  255. myco_send(msg.agent_message_queue_id, msg);
  256. msg = myco_receive(msg.agent_message_queue_id);
  257. if (strcmp(msg.message, "RESOURCE GRANTED") == 0) {
  258. // Transfer ownership of resource to agent
  259. sprintf(current_resource->agent, "%s", msg.agent_name);
  260. current_resource->pid = msg.sender_pid;
  261. current_resource->pointer = msg.resource_pointer;
  262. } else {
  263. fprintf(stderr, "ERROR: myco_daemon_request: %s\n", strerror(errno));
  264. return -1;
  265. }
  266. return 0;
  267. }
  268. int myco_daemon_request_list(message msg, pid_t pid) {
  269. myco_resource *current_resource;
  270. current_resource = first_resource;
  271. char *resource_pointer;
  272. char tmp[64];
  273. int resource_size = 0;
  274. if (current_resource == NULL) {
  275. sprintf(msg.message, "ERROR: no resources\n");
  276. myco_send(msg.agent_message_queue_id, msg);
  277. return -1;
  278. }
  279. while (current_resource != NULL) {
  280. resource_size += strlen(current_resource->name) + strlen(current_resource->agent) + strlen("1");
  281. resource_size += strlen("(,,,);");
  282. resource_size += 22;
  283. current_resource = current_resource->next;
  284. }
  285. resource_pointer = malloc(resource_size);
  286. memset(resource_pointer, 0, resource_size);
  287. current_resource = first_resource;
  288. while (current_resource != NULL) {
  289. strcat(resource_pointer, current_resource->name);
  290. strcat(resource_pointer, "(");
  291. strcat(resource_pointer, current_resource->agent);
  292. strcat(resource_pointer, ",");
  293. sprintf(tmp, "%d", current_resource->size);
  294. strcat(resource_pointer, tmp);
  295. strcat(resource_pointer, ",");
  296. sprintf(tmp, "%p", current_resource->pointer);
  297. strcat(resource_pointer, tmp);
  298. strcat(resource_pointer, ",");
  299. sprintf(tmp, "%d", current_resource->read_locked);
  300. strcat(resource_pointer, tmp);
  301. strcat(resource_pointer, ",");
  302. sprintf(tmp, "%d", current_resource->transfer_locked);
  303. strcat(resource_pointer, tmp);
  304. strcat(resource_pointer, ",");
  305. if (current_resource->transactional) {
  306. strcat(resource_pointer, "1");
  307. } else {
  308. strcat(resource_pointer, "0");
  309. }
  310. strcat(resource_pointer, ");");
  311. current_resource = current_resource->next;
  312. }
  313. msg.sender_pid = pid;
  314. msg.resource_size = resource_size;
  315. msg.resource_pointer = (void *)resource_pointer;
  316. sprintf(msg.message, "SUCCESS: sending resource list\n");
  317. myco_send(msg.agent_message_queue_id, msg);
  318. msg = myco_receive(msg.agent_message_queue_id);
  319. if (strcmp(msg.message, "RESOURCE LIST GRANTED") == 0) {
  320. free(resource_pointer);
  321. } else {
  322. fprintf(stderr, "ERROR: resource list was not granted: %s\n", strerror(errno));
  323. free(resource_pointer);
  324. return -1;
  325. }
  326. return 0;
  327. }
  328. int myco_daemon_write_remote_resource(message msg, int force) {
  329. myco_resource *current_resource;
  330. // Check if resource exists
  331. if ((current_resource = myco_daemon_find_resource(msg.resource_name)) == NULL) {
  332. sprintf(msg.message, "ERROR: resource %s does not exist\n", msg.resource_name);
  333. myco_send(msg.agent_message_queue_id, msg);
  334. return -1;
  335. }
  336. if (force == 1) {
  337. sprintf(msg.message, "SUCCESS: forcing to overwrite resource %s, sending information\n", msg.resource_name);
  338. msg.resource_pointer = current_resource->pointer;
  339. msg.resource_size = current_resource->size;
  340. msg.sender_pid = current_resource->pid;
  341. myco_send(msg.agent_message_queue_id, msg);
  342. return 0;
  343. } else {
  344. if (current_resource->version > msg.version) {
  345. sprintf(msg.message, "ERROR: resource %s is newer than your copied version\n", msg.resource_name);
  346. myco_send(msg.agent_message_queue_id, msg);
  347. return -1;
  348. } else {
  349. sprintf(msg.message, "SUCCESS: version updated, sending information for resource %s\n", msg.resource_name);
  350. msg.resource_pointer = current_resource->pointer;
  351. msg.resource_size = current_resource->size;
  352. msg.sender_pid = current_resource->pid;
  353. myco_send(msg.agent_message_queue_id, msg);
  354. current_resource->version += 1;
  355. myco_send(msg.agent_message_queue_id, msg);
  356. return 0;
  357. }
  358. }
  359. }
  360. int myco_daemon_read_remote_resource(message msg) {
  361. myco_resource *current_resource;
  362. // Check if resource exists
  363. if ((current_resource = myco_daemon_find_resource(msg.resource_name)) == NULL) {
  364. sprintf(msg.message, "ERROR: resource %s does not exist\n", msg.resource_name);
  365. myco_send(msg.agent_message_queue_id, msg);
  366. return -1;
  367. }
  368. // Check if agent that requests already owns the resource
  369. if (strcmp(current_resource->agent, msg.agent_name) == 0) {
  370. sprintf(msg.message, "ERROR: resource %s already belongs to agent %s\n", msg.resource_name, msg.agent_name);
  371. myco_send(msg.agent_message_queue_id, msg);
  372. return -1;
  373. }
  374. // TODO: Handle case where resource is on another node (another agent)
  375. // If on same node, send information
  376. msg.sender_pid = current_resource->pid;
  377. msg.resource_size = current_resource->size;
  378. msg.resource_pointer = current_resource->pointer;
  379. sprintf(msg.message, "SUCCESS: resource found on same node, sending information\n");
  380. myco_send(msg.agent_message_queue_id, msg);
  381. msg = myco_receive(msg.agent_message_queue_id);
  382. if (strcmp(msg.message, "RESOURCE READ") == 0) {
  383. } else {
  384. fprintf(stderr, "ERROR: myco_daemon_reead_remote: %s\n", strerror(errno));
  385. return -1;
  386. }
  387. return 0;
  388. }
  389. int myco_daemon_lock_resource(message msg) {
  390. myco_resource *current_resource;
  391. current_resource = myco_daemon_find_resource(msg.resource_name);
  392. if (current_resource != NULL && current_resource->transfer_locked == 1 && strcmp(current_resource->agent, msg.agent_name) == 0) {
  393. current_resource->read_locked = 1;
  394. sprintf(msg.message, "SUCCESS: resource %s locked\n", msg.resource_name);
  395. myco_send(msg.agent_message_queue_id, msg);
  396. return 0;
  397. } else {
  398. sprintf(msg.message, "ERROR: resource %s could not be locked\n", msg.resource_name);
  399. myco_send(msg.agent_message_queue_id, msg);
  400. return -1;
  401. }
  402. }
  403. int myco_daemon_release_resource(message msg) {
  404. myco_resource *current_resource;
  405. current_resource = myco_daemon_find_resource(msg.resource_name);
  406. if (current_resource != NULL && strcmp(current_resource->agent, msg.agent_name) == 0) {
  407. current_resource->transfer_locked = 0;
  408. sprintf(msg.message, "SUCCESS: resource %s released\n", msg.resource_name);
  409. myco_send(msg.agent_message_queue_id, msg);
  410. return 0;
  411. } else {
  412. sprintf(msg.message, "ERROR: resource %s could not be released\n", msg.resource_name);
  413. myco_send(msg.agent_message_queue_id, msg);
  414. return -1;
  415. }
  416. }
  417. int myco_daemon_unlock_resource(message msg) {
  418. myco_resource *current_resource;
  419. current_resource = myco_daemon_find_resource(msg.resource_name);
  420. if (current_resource != NULL && current_resource->transfer_locked == 1 && strcmp(current_resource->agent, msg.agent_name) == 0) {
  421. current_resource->read_locked = 0;
  422. sprintf(msg.message, "SUCCESS: resource %s unlocked\n", msg.resource_name);
  423. myco_send(msg.agent_message_queue_id, msg);
  424. return 0;
  425. } else {
  426. sprintf(msg.message, "ERROR: resource %s could not be locked\n", msg.resource_name);
  427. myco_send(msg.agent_message_queue_id, msg);
  428. return -1;
  429. }
  430. }
  431. int myco_daemon_connect(char* ip, int port) {
  432. struct sockaddr_in address;
  433. int mysocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
  434. address.sin_family = AF_INET;
  435. address.sin_port = htons (port);
  436. inet_aton (ip, &address.sin_addr);
  437. connect (mysocket, (struct sockaddr *) &address, sizeof (address));
  438. return mysocket;
  439. }
  440. int myco_daemon_start(pid) {
  441. char *buffer = malloc (1024);
  442. int daemon_message_queue_id;
  443. message msg = {0};
  444. // Connect to indexer
  445. int socket = myco_daemon_connect("127.0.0.1", 15000);
  446. // Create message queue
  447. daemon_message_queue_id = myco_create_global_message_queue();
  448. if (daemon_message_queue_id < 0) {
  449. fprintf(stderr, "ERROR: Message queue could not be created. %s\n", strerror(errno));
  450. return -1;
  451. }
  452. // Receive messages
  453. while (1) {
  454. // Receive messages from indexer
  455. int size = recv (socket, buffer, 1023, 0);
  456. if( size > 0)
  457. buffer[size] = '\0';
  458. printf ("%s\n", buffer);
  459. // Receive messages from agents
  460. msg = myco_receive(daemon_message_queue_id);
  461. if (DEBUG) {
  462. printf("%d, %s, %s, %s, %p, %d, %d, %d, %d", msg.agent_message_queue_id, msg.agent_name, msg.message, \
  463. msg.resource_name, msg.resource_pointer, msg.resource_size, msg.resource_transactional, msg.sender_pid, msg.version);
  464. }
  465. if (msg.message == NULL) {
  466. fprintf(stderr, "FATAL ERROR: No message could be received. %s\n", strerror(errno));
  467. return -1;
  468. } else {
  469. // Handle indexer
  470. char tcp_message[MESSAGE_LENGTH + RESOURCE_NAME_LENGTH + AGENT_NAME_LENGTH];
  471. strcpy(tcp_message, msg.message);
  472. strcat(tcp_message, ";");
  473. if (msg.agent_name[0] != '\0') {
  474. strcat(tcp_message, msg.agent_name);
  475. } else {
  476. strcat(tcp_message, "-");
  477. }
  478. strcat(tcp_message, ";");
  479. if (msg.resource_name[0] != '\0') {
  480. strcat(tcp_message, msg.resource_name);
  481. } else {
  482. strcat(tcp_message, "-");
  483. }
  484. send(socket, tcp_message, strlen(tcp_message), 0);
  485. // Handle agents
  486. if (strcmp(msg.message, "REGISTER AGENT") == 0) {
  487. myco_daemon_register_agent(msg);
  488. }
  489. if (strcmp(msg.message, "UNREGISTER AGENT") == 0) {
  490. myco_daemon_unregister_agent(msg);
  491. }
  492. if (strcmp(msg.message, "REGISTER RESOURCE") == 0) {
  493. myco_daemon_register_resource(msg);
  494. }
  495. if (strcmp(msg.message, "UNREGISTER RESOURCE") == 0) {
  496. myco_daemon_unregister_resource(msg);
  497. }
  498. if (strcmp(msg.message, "REQUEST RESOURCE") == 0) {
  499. myco_daemon_request_resource(msg);
  500. }
  501. if (strcmp(msg.message, "REQUEST LIST") == 0) {
  502. myco_daemon_request_list(msg, pid);
  503. }
  504. if (strcmp(msg.message, "WRITE REMOTE RESOURCE") == 0) {
  505. myco_daemon_write_remote_resource(msg, 0);
  506. }
  507. if (strcmp(msg.message, "FORCE WRITE REMOTE RESOURCE") == 0) {
  508. myco_daemon_write_remote_resource(msg, 1);
  509. }
  510. if (strcmp(msg.message, "READ REMOTE RESOURCE") == 0) {
  511. myco_daemon_read_remote_resource(msg);
  512. }
  513. if (strcmp(msg.message, "LOCK RESOURCE") == 0) {
  514. myco_daemon_lock_resource(msg);
  515. }
  516. if (strcmp(msg.message, "UNLOCK RESOURCE") == 0) {
  517. myco_daemon_unlock_resource(msg);
  518. }
  519. if (strcmp(msg.message, "RELEASE RESOURCE") == 0) {
  520. myco_daemon_release_resource(msg);
  521. }
  522. }
  523. }
  524. close (socket);
  525. if (myco_remove_message_queue(daemon_message_queue_id) == -1) {
  526. fprintf(stderr, "FATAL ERROR: could not remove message queue %d\n", daemon_message_queue_id);
  527. return -1;
  528. }
  529. return EXIT_SUCCESS;
  530. }