static char* push_string(stroke_msg_t **strm, char *string)
{
- stroke_msg_t *stroke_msg;
- size_t string_length;
-
- if (string == NULL)
- {
- return NULL;
- }
- stroke_msg = *strm;
- string_length = strlen(string) + 1;
- stroke_msg->length += string_length;
-
- stroke_msg = realloc(stroke_msg, stroke_msg->length);
- strcpy((char*)stroke_msg + stroke_msg->length - string_length, string);
-
- *strm = stroke_msg;
- return (char*)(u_int)stroke_msg->length - string_length;
+ stroke_msg_t *stroke_msg;
+ size_t string_length;
+
+ if (string == NULL)
+ {
+ return NULL;
+ }
+ stroke_msg = *strm;
+ string_length = strlen(string) + 1;
+ stroke_msg->length += string_length;
+
+ stroke_msg = realloc(stroke_msg, stroke_msg->length);
+ strcpy((char*)stroke_msg + stroke_msg->length - string_length, string);
+
+ *strm = stroke_msg;
+ return (char*)(u_int)stroke_msg->length - string_length;
}
static int
send_stroke_msg (stroke_msg_t *msg)
{
- struct sockaddr_un ctl_addr = { AF_UNIX, CHARON_CTL_FILE };
- int sock;
-
- sock = socket(AF_UNIX, SOCK_STREAM, 0);
- if (sock < 0)
- {
+ struct sockaddr_un ctl_addr = { AF_UNIX, CHARON_CTL_FILE };
+ int sock;
+ int byte_count;
+ char buffer[64];
+
+ sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock < 0)
+ {
plog("socket() failed: %s", strerror(errno));
return -1;
- }
- if (connect(sock, (struct sockaddr *)&ctl_addr,
+ }
+ if (connect(sock, (struct sockaddr *)&ctl_addr,
offsetof(struct sockaddr_un, sun_path) + strlen(ctl_addr.sun_path)) < 0)
- {
+ {
plog("connect(charon_ctl) failed: %s", strerror(errno));
close(sock);
return -1;
- }
-
- /* send message */
- if (write(sock, msg, msg->length) != msg->length)
- {
+ }
+
+ /* send message */
+ if (write(sock, msg, msg->length) != msg->length)
+ {
plog("write(charon_ctl) failed: %s", strerror(errno));
close(sock);
return -1;
- }
-
- close(sock);
- return 0;
+ }
+ while ((byte_count = read(sock, buffer, sizeof(buffer)-1)) > 0)
+ {
+ buffer[byte_count] = '\0';
+ plog("%s", buffer);
+ }
+ if (byte_count < 0)
+ {
+ plog(stderr, "read() failed: %s", strerror(errno));
+ }
+
+ close(sock);
+ return 0;
}
static char *
int starter_stroke_add_conn(starter_conn_t *conn)
{
- stroke_msg_t *msg = malloc(sizeof(stroke_msg_t));
- int res;
-
- msg->length = sizeof(stroke_msg_t);
- msg->type = STR_ADD_CONN;
-
- msg->add_conn.name = push_string(&msg, connection_name(conn));
-
- msg->add_conn.me.id = push_string(&msg, conn->left.id);
- msg->add_conn.me.cert = push_string(&msg, conn->left.cert);
- msg->add_conn.me.address = push_string(&msg, inet_ntoa(conn->left.addr.u.v4.sin_addr));
- msg->add_conn.me.subnet = push_string(&msg, inet_ntoa(conn->left.subnet.addr.u.v4.sin_addr));
- msg->add_conn.me.subnet_mask = conn->left.subnet.maskbits;
-
- msg->add_conn.other.id = push_string(&msg, conn->right.id);
- msg->add_conn.other.cert = push_string(&msg, conn->right.cert);
- msg->add_conn.other.address = push_string(&msg, inet_ntoa(conn->right.addr.u.v4.sin_addr));
- msg->add_conn.other.subnet = push_string(&msg, inet_ntoa(conn->right.subnet.addr.u.v4.sin_addr));
- msg->add_conn.other.subnet_mask = conn->right.subnet.maskbits;
-
- res = send_stroke_msg(msg);
- free(msg);
- return res;
+ stroke_msg_t *msg = malloc(sizeof(stroke_msg_t));
+ int res;
+
+ msg->length = sizeof(stroke_msg_t);
+ msg->type = STR_ADD_CONN;
+
+ msg->add_conn.name = push_string(&msg, connection_name(conn));
+
+ msg->add_conn.me.id = push_string(&msg, conn->left.id);
+ msg->add_conn.me.cert = push_string(&msg, conn->left.cert);
+ msg->add_conn.me.address = push_string(&msg, inet_ntoa(conn->left.addr.u.v4.sin_addr));
+ msg->add_conn.me.subnet = push_string(&msg, inet_ntoa(conn->left.subnet.addr.u.v4.sin_addr));
+ msg->add_conn.me.subnet_mask = conn->left.subnet.maskbits;
+
+ msg->add_conn.other.id = push_string(&msg, conn->right.id);
+ msg->add_conn.other.cert = push_string(&msg, conn->right.cert);
+ msg->add_conn.other.address = push_string(&msg, inet_ntoa(conn->right.addr.u.v4.sin_addr));
+ msg->add_conn.other.subnet = push_string(&msg, inet_ntoa(conn->right.subnet.addr.u.v4.sin_addr));
+ msg->add_conn.other.subnet_mask = conn->right.subnet.maskbits;
+
+ res = send_stroke_msg(msg);
+ free(msg);
+ return res;
}
int starter_stroke_del_conn(starter_conn_t *conn)
{
- return 0;
+ return 0;
}
int starter_stroke_route_conn(starter_conn_t *conn)
{
- stroke_msg_t *msg = malloc(sizeof(stroke_msg_t));
- int res;
-
- msg->length = sizeof(stroke_msg_t);
- msg->type = STR_INSTALL;
- msg->install.name = push_string(&msg, connection_name(conn));
- res = send_stroke_msg(msg);
- free(msg);
- return res;
+ stroke_msg_t *msg = malloc(sizeof(stroke_msg_t));
+ int res;
+
+ msg->length = sizeof(stroke_msg_t);
+ msg->type = STR_INSTALL;
+ msg->install.name = push_string(&msg, connection_name(conn));
+ res = send_stroke_msg(msg);
+ free(msg);
+ return res;
}
int starter_stroke_initiate_conn(starter_conn_t *conn)
{
- stroke_msg_t *msg = malloc(sizeof(stroke_msg_t));
- int res;
-
- msg->length = sizeof(stroke_msg_t);
- msg->type = STR_INITIATE;
- msg->initiate.name = push_string(&msg, connection_name(conn));
- res = send_stroke_msg(msg);
- free(msg);
- return res;
+ stroke_msg_t *msg = malloc(sizeof(stroke_msg_t));
+ int res;
+
+ msg->length = sizeof(stroke_msg_t);
+ msg->type = STR_INITIATE;
+ msg->initiate.name = push_string(&msg, connection_name(conn));
+ res = send_stroke_msg(msg);
+ free(msg);
+ return res;
}