|
@@ -35,7 +35,8 @@ int myco_daemon_register_agent(message msg) {
|
|
|
|
|
|
if (myco_daemon_find_agent(msg.agent_name) != NULL) {
|
|
if (myco_daemon_find_agent(msg.agent_name) != NULL) {
|
|
sprintf(msg.message, "ERROR: agent %s already exists\n", msg.agent_name);
|
|
sprintf(msg.message, "ERROR: agent %s already exists\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -58,7 +59,8 @@ int myco_daemon_register_agent(message msg) {
|
|
}
|
|
}
|
|
|
|
|
|
sprintf(msg.message, "SUCCESS: agent %s registered\n", msg.agent_name);
|
|
sprintf(msg.message, "SUCCESS: agent %s registered\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
}
|
|
}
|
|
@@ -70,7 +72,8 @@ int myco_daemon_unregister_agent(message msg) {
|
|
|
|
|
|
if (current_agent == NULL) {
|
|
if (current_agent == NULL) {
|
|
sprintf(msg.message, "ERROR: agent %s could not be unregistered\n", msg.agent_name);
|
|
sprintf(msg.message, "ERROR: agent %s could not be unregistered\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -80,7 +83,8 @@ int myco_daemon_unregister_agent(message msg) {
|
|
current_agent->next->prev = current_agent->prev;
|
|
current_agent->next->prev = current_agent->prev;
|
|
free(current_agent);
|
|
free(current_agent);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -90,16 +94,18 @@ int myco_daemon_unregister_agent(message msg) {
|
|
current_agent->next->prev = NULL;
|
|
current_agent->next->prev = NULL;
|
|
free(current_agent);
|
|
free(current_agent);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
// Last element
|
|
// Last element
|
|
if (current_agent->next == NULL && current_agent->prev != NULL) {
|
|
if (current_agent->next == NULL && current_agent->prev != NULL) {
|
|
current_agent->prev->next = NULL;
|
|
current_agent->prev->next = NULL;
|
|
free(current_agent);
|
|
free(current_agent);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -108,12 +114,14 @@ int myco_daemon_unregister_agent(message msg) {
|
|
first_agent = NULL;
|
|
first_agent = NULL;
|
|
free(current_agent);
|
|
free(current_agent);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
sprintf(msg.message, "SUCCESS: agent %s unregistered\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
sprintf(msg.message, "ERROR: agent %s could not be unregistered - data structure seems to be damaged!\n", msg.agent_name);
|
|
sprintf(msg.message, "ERROR: agent %s could not be unregistered - data structure seems to be damaged!\n", msg.agent_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -144,9 +152,17 @@ myco_resource *myco_daemon_find_resource(const char *resource_name) {
|
|
int myco_daemon_register_resource(message msg) {
|
|
int myco_daemon_register_resource(message msg) {
|
|
myco_resource *current_resource;
|
|
myco_resource *current_resource;
|
|
|
|
|
|
|
|
+ if (myco_daemon_find_agent(msg.agent_name) == NULL) {
|
|
|
|
+ sprintf(msg.message, "ERROR: agent %s does not exist\n", msg.agent_name);
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (myco_daemon_find_resource(msg.resource_name) != NULL) {
|
|
if (myco_daemon_find_resource(msg.resource_name) != NULL) {
|
|
sprintf(msg.message, "ERROR: resource %s already exists\n", msg.resource_name);
|
|
sprintf(msg.message, "ERROR: resource %s already exists\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -173,7 +189,8 @@ int myco_daemon_register_resource(message msg) {
|
|
}
|
|
}
|
|
|
|
|
|
sprintf(msg.message, "SUCCESS: resource %s registered\n", msg.resource_name);
|
|
sprintf(msg.message, "SUCCESS: resource %s registered\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -184,7 +201,8 @@ int myco_daemon_unregister_resource(message msg) {
|
|
|
|
|
|
if (current_resource == NULL) {
|
|
if (current_resource == NULL) {
|
|
sprintf(msg.message, "ERROR: resource %s could not be unregistered\n", msg.resource_name);
|
|
sprintf(msg.message, "ERROR: resource %s could not be unregistered\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -194,7 +212,8 @@ int myco_daemon_unregister_resource(message msg) {
|
|
current_resource->next->prev = current_resource->prev;
|
|
current_resource->next->prev = current_resource->prev;
|
|
free(current_resource);
|
|
free(current_resource);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -204,16 +223,18 @@ int myco_daemon_unregister_resource(message msg) {
|
|
current_resource->next->prev = NULL;
|
|
current_resource->next->prev = NULL;
|
|
free(current_resource);
|
|
free(current_resource);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
// Last element
|
|
// Last element
|
|
if (current_resource->next == NULL && current_resource->prev != NULL) {
|
|
if (current_resource->next == NULL && current_resource->prev != NULL) {
|
|
current_resource->prev->next = NULL;
|
|
current_resource->prev->next = NULL;
|
|
free(current_resource);
|
|
free(current_resource);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -222,18 +243,21 @@ int myco_daemon_unregister_resource(message msg) {
|
|
first_resource = NULL;
|
|
first_resource = NULL;
|
|
free(current_resource);
|
|
free(current_resource);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
sprintf(msg.message, "SUCCESS: resource %s unregistered\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
- sprintf(msg.message, "ERROR: resource %s could not be unregistered - data structure seems to be damaged!\n", msg.resource_name);
|
|
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ sprintf(msg.message, "FATAL ERROR: resource %s could not be unregistered - data structure seems to be damaged!\n", msg.resource_name);
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
int myco_daemon_request_resource(message msg) {
|
|
int myco_daemon_request_resource(message msg) {
|
|
sprintf(msg.message, "SUCCESS: resource granted\n");
|
|
sprintf(msg.message, "SUCCESS: resource granted\n");
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -267,53 +291,57 @@ int myco_daemon_request_list(message msg, pid_t pid) {
|
|
current_resource = current_resource->next;
|
|
current_resource = current_resource->next;
|
|
}
|
|
}
|
|
|
|
|
|
- printf("%s\n", resource_pointer);
|
|
|
|
-
|
|
|
|
msg.sender_pid = pid;
|
|
msg.sender_pid = pid;
|
|
msg.resource_size = resource_size;
|
|
msg.resource_size = resource_size;
|
|
msg.resource_pointer = (void *)resource_pointer;
|
|
msg.resource_pointer = (void *)resource_pointer;
|
|
sprintf(msg.message, "SUCCESS: sending resource list\n");
|
|
sprintf(msg.message, "SUCCESS: sending resource list\n");
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
|
|
- free(resource_pointer);
|
|
|
|
- // free when done.
|
|
|
|
|
|
+ msg = myco_receive(msg.agent_message_queue_id);
|
|
|
|
+ if (strcmp(msg.message, "RESOURCE GRANTED\n") == 0) {
|
|
|
|
+ free(resource_pointer);
|
|
|
|
+ } else {
|
|
|
|
+ fprintf(stderr, "ERROR: myco_daemon_request_list: %s\n", strerror(errno));
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
int myco_daemon_request_remote_resource(message msg) {
|
|
int myco_daemon_request_remote_resource(message msg) {
|
|
sprintf(msg.message, "SUCCESS: remote resource shared\n");
|
|
sprintf(msg.message, "SUCCESS: remote resource shared\n");
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
int myco_daemon_write_remote_resource(message msg) {
|
|
int myco_daemon_write_remote_resource(message msg) {
|
|
sprintf(msg.message, "SUCCESS: written to remote resource %s\n", msg.resource_name);
|
|
sprintf(msg.message, "SUCCESS: written to remote resource %s\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
int myco_daemon_read_remote_resource(message msg) {
|
|
int myco_daemon_read_remote_resource(message msg) {
|
|
sprintf(msg.message, "SUCCESS: read from remote resource %s\n", msg.resource_name);
|
|
sprintf(msg.message, "SUCCESS: read from remote resource %s\n", msg.resource_name);
|
|
- msgsnd(msg.agent_message_queue_id, &msg, TOTAL_LENGTH, 0);
|
|
|
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
int myco_daemon_start(pid) {
|
|
int myco_daemon_start(pid) {
|
|
- int message_queue_id;
|
|
|
|
|
|
+ int daemon_message_queue_id;
|
|
message msg;
|
|
message msg;
|
|
|
|
|
|
// Create message queue
|
|
// Create message queue
|
|
- message_queue_id = msgget(KEY, PERM | IPC_CREAT);
|
|
|
|
- if (message_queue_id < 0) {
|
|
|
|
- printf("ERROR: Message queue could not be created. %s\n", strerror(errno));
|
|
|
|
|
|
+ daemon_message_queue_id = myco_create_global_message_queue();
|
|
|
|
+ if (daemon_message_queue_id < 0) {
|
|
|
|
+ fprintf(stderr, "ERROR: Message queue could not be created. %s\n", strerror(errno));
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
// Receive messages
|
|
// Receive messages
|
|
while (1) {
|
|
while (1) {
|
|
- if (msgrcv(message_queue_id, &msg, TOTAL_LENGTH, 0, 0) == -1) {
|
|
|
|
- printf("ERROR: No message could be received. %s\n", strerror(errno));
|
|
|
|
|
|
+ msg = myco_receive(daemon_message_queue_id);
|
|
|
|
+ if (msg.message == NULL) {
|
|
|
|
+ fprintf(stderr, "FATAL ERROR: No message could be received. %s\n", strerror(errno));
|
|
return -1;
|
|
return -1;
|
|
} else {
|
|
} else {
|
|
if (strcmp(msg.message, "REGISTER AGENT\n") == 0) {
|
|
if (strcmp(msg.message, "REGISTER AGENT\n") == 0) {
|
|
@@ -345,6 +373,11 @@ int myco_daemon_start(pid) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (myco_remove_message_queue(daemon_message_queue_id) == -1) {
|
|
|
|
+ fprintf(stderr, "FATAL ERROR: could not remove message queue %d\n", daemon_message_queue_id);
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
return EXIT_SUCCESS;
|