123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- /* Copyright (C) 2016 Max Riechelmann <max.riechelmann@student.kit.edu>
- (Karlsruhe Institute of Technology)
- This library is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by the
- Free Software Foundation; either version 2.1 of the License, or (at your
- option) any later version.
- This library is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- details.
- You should have received a copy of the GNU Lesser General Public License along
- with this library; if not, write to the Free Software Foundation, Inc., 51
- Franklin St, Fifth Floor, Boston, MA 02110, USA
- */
- #include "myco-agent.h"
- #include "../src/myco-memory.c"
- #define DEBUG 1
- int myco_agent_register(const char *agent_name) {
- int agent_message_queue_id;
- int global_message_queue_id;
- message msg = {};
- sprintf(msg.agent_name, "%s", agent_name);
- agent_message_queue_id = myco_create_private_message_queue();
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.message, "REGISTER AGENT");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if (DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- myco_remove_message_queue(agent_message_queue_id);
- exit(EXIT_FAILURE);
- }
- return agent_message_queue_id;
- }
- int myco_agent_unregister (const char *agent_name, int agent_message_queue_id) {
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.agent_name, "%s", agent_name);
- sprintf(msg.message, "UNREGISTER AGENT");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if (DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) == 0) {
- myco_remove_message_queue(agent_message_queue_id);
- } else {
- return -1;
- }
- return 0;
- }
- void *myco_agent_register_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name, int resource_transactional, pid_t pid, int size) {
- int file_descriptor = shm_open(resource_name, O_CREAT | O_TRUNC | O_RDWR, 0666);
- int r = ftruncate(file_descriptor, size);
- void *pointer = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0);
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.agent_name, "%s", agent_name);
- sprintf(msg.resource_name, "%s", resource_name);
- msg.resource_transactional = resource_transactional;
- msg.sender_pid = pid;
- msg.resource_size = size;
- msg.resource_pointer = pointer;
- sprintf(msg.message, "REGISTER RESOURCE");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- return NULL;
- }
- return pointer;
- }
- int myco_agent_unregister_resource (int agent_message_queue_id, const char *resource_name) {
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.resource_name, "%s", resource_name);
- sprintf(msg.message, "UNREGISTER RESOURCE");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- return -1;
- }
- int r = shm_unlink(resource_name);
- return 0;
- }
- int myco_agent_lock_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name) {
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.resource_name, "%s", resource_name);
- sprintf(msg.agent_name, "%s", agent_name);
- sprintf(msg.message, "LOCK RESOURCE");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- return -1;
- }
- return 0;
- }
- int myco_agent_release_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name, void *resource_pointer, int resource_size) {
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.resource_name, "%s", resource_name);
- sprintf(msg.agent_name, "%s", agent_name);
- sprintf(msg.message, "RELEASE RESOURCE");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- return -1;
- }
- int r = munmap(resource_pointer, resource_size);
- return 0;
- }
- int myco_agent_unlock_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name) {
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.resource_name, "%s", resource_name);
- sprintf(msg.agent_name, "%s", agent_name);
- sprintf(msg.message, "UNLOCK RESOURCE");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- return -1;
- }
- return 0;
- }
- struct resource myco_agent_request_resource(int agent_message_queue_id, char *agent_name, char *resource_name) {
- struct resource myresource;
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.resource_name, "%s", resource_name);
- sprintf(msg.agent_name, "%s", agent_name);
- sprintf(msg.message, "REQUEST RESOURCE");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- myresource.size = -1;
- return myresource;
- }
- myresource.size = msg.resource_size;
- int file_descriptor = shm_open(resource_name, O_RDWR, 0666);
- int r = ftruncate(file_descriptor, myresource.size);
- myresource.pointer = mmap(0, myresource.size, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0);
- sprintf(msg.message, "RESOURCE GRANTED");
- myco_send(msg.agent_message_queue_id, msg);
- return myresource;
- }
- int myco_agent_request_resource_list(int agent_message_queue_id) {
- char *resource_pointer;
- char *split;
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.message, "REQUEST LIST");
- msg.resource_size = 0;
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- return -1;
- }
- resource_pointer = malloc(msg.resource_size);
- if (myco_read_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, (void *)resource_pointer, msg.resource_size) == -1) {
- printf("ERROR: %s\n", strerror(errno));
- return -1;
- }
- sprintf(msg.message, "RESOURCE LIST GRANTED");
- myco_send(agent_message_queue_id, msg);
- printf("%s\n", resource_pointer);
- /*
- split = strtok(resource_pointer, ";");
- while (split != NULL) {
- printf("%s\n", split);
- split = strtok(NULL, ";");
- }
- */
- free(resource_pointer);
- return 0;
- }
- int myco_agent_write_remote_resource(int agent_message_queue_id, char *resource_name, void *pointer, int size, int force) {
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.resource_name, "%s", resource_name);
- if (force == 1) {
- sprintf(msg.message, "FORCE WRITE REMOTE RESOURCE");
- } else {
- sprintf(msg.message, "WRITE REMOTE RESOURCE");
- }
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if(DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- return -1;
- }
- if (strncmp(msg.message, "SUCCESS: forcing to overwrite resource", 20) == 0) {
- myco_write_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, pointer, size);
- }
- if (strncmp(msg.message, "SUCCESS: version updated, sending information for resource", 20) == 0) {
- myco_write_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, pointer, size);
- }
- return 0;
- }
- struct resource myco_agent_read_remote_resource(int agent_message_queue_id, char *resource_name) {
- struct resource myresource;
- message msg = {};
- msg.agent_message_queue_id = agent_message_queue_id;
- sprintf(msg.resource_name, "%s", resource_name);
- sprintf(msg.message, "READ REMOTE RESOURCE");
- msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
- if (DEBUG) {
- printf("%s", msg.message);
- }
- if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
- myresource.size = -1;
- return myresource;
- }
- myresource.pointer = malloc(msg.resource_size);
- myresource.size = msg.resource_size;
- if (myco_read_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, myresource.pointer, myresource.size) == -1) {
- fprintf(stderr, "FATAL ERROR in myco_read_memory() %s\n", strerror(errno));
- myresource.size = -1;
- return myresource;
- }
- sprintf(msg.message, "RESOURCE READ");
- myco_send(msg.agent_message_queue_id, msg);
- return myresource;
- }
|