#include #include #include #include #include #include #include #include #include #include "config.c" #include "tinyosc.c" #include "tinyosc.h" /* chat-loop / main.c. sends text to vrchat using osc. Copyright (C) 2026 iceyrazor This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ static volatile bool keepRunning = true; // handle Ctrl+C static void sigintHandler(int x) { keepRunning = false; } // execute command and put output into ret_buf buffer void execlb(char* cmd, char* ret_buf) { int link[2]; pid_t pid; char buf[2048]; if (pipe(link) == -1) exit(-5); if ((pid = fork()) == -1) exit(-5); if (pid == 0) { dup2(link[1], STDOUT_FILENO); close(link[0]); close(link[1]); execl("/bin/sh", "sh", "-c", cmd, (char*)0); exit(0); } else { close(link[1]); int nbytes = read(link[0], buf, sizeof(buf)); if (nbytes > 2047) nbytes = 2047; snprintf(ret_buf, nbytes + 1, "%s", buf); wait(NULL); close(link[0]); } } int main() { char wbuffer[2048]; // declare a 2Kb buffer to read packet data into int port = 9000; struct sockaddr_in servaddr; int socketfd = socket(AF_INET, SOCK_DGRAM, 0); if (socketfd < 0) { perror("ERROR:"); return -1; } servaddr.sin_family = AF_INET; // IPv4 servaddr.sin_port = htons(port); // Server port servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // Server IP // register the SIGINT handler (Ctrl+C) signal(SIGINT, &sigintHandler); char* dist = (char*)malloc(sizeof(char) * 2048); execlb("uname -r", dist); dist[strlen(dist) - 1] = '\0'; init_arr(); char* comb_string = (char*)malloc(sizeof(char) * 2048); char* song_title = (char*)malloc(sizeof(char) * 2048); int i = 0; while (keepRunning) { execlb("src/title.sh", song_title); sprintf(comb_string, "%s\nLinux %s\n%s\n%s", title, dist, arr[i], song_title); int len = 0; len = tosc_writeMessage(wbuffer, sizeof(wbuffer), "/chatbox/input", "sTF", comb_string); sendto(socketfd, wbuffer, len, MSG_CONFIRM, (const struct sockaddr*)&servaddr, sizeof(servaddr)); sleep(3); i = i + 1; if (i >= arr_size) i = 0; } free(comb_string); free(dist); free(song_title); return 0; }