static void start_aprsis_thread(void *ptr) { GError *error = NULL; aprsis_ctx *ctx = ptr; g_message("connecting to %s", ctx->host); if (aprsis_connect(ctx)) { g_error("failed to connect"); } g_message("logging in..."); aprsis_login(ctx); aprsis_set_filter(ctx, DEF_HOME_LAT, DEF_HOME_LON, DEF_RAD); //aprsis_set_filter_string(ctx, "p/M/G/2"); // callsigns beginning with G, M or 2 - UK callsigns, normally //aprsis_set_filter_string(ctx, "p/HB9"); // Swiss callsigns aprsis_io = g_io_channel_unix_new (ctx->sockfd); g_io_channel_set_encoding(aprsis_io, NULL, &error); if (!g_io_add_watch (aprsis_io, G_IO_IN | G_IO_ERR | G_IO_HUP, aprsis_got_packet, ctx)) g_error ("Cannot add watch on GIOChannel!"); }
int aprsis_connect(const char *hostname, int port, const char *mycall, char *filter) { int sock; struct sockaddr_in sa; struct hostent *he; int ret; he = gethostbyname(hostname); if (!he || (he->h_length < 1)) return -ENETUNREACH; sa.sin_family = AF_INET; memcpy(&sa.sin_addr, he->h_addr_list[0], sizeof(sa.sin_addr)); sa.sin_port = htons(port); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) return sock; ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa)); if (ret < 0) goto out; ret = aprsis_login(sock, mycall, filter); if (ret < 0) goto out; printf("Connected to host: %s, on port: %d\n", hostname, port); out: if (ret) { close(sock); return ret; } return sock; }