rendered paste body#include <stdio.h>#include <stdlib.h>#include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>#include <xmms/xmmsctrl.h>#define FILE_TYPES 3#define TCP_PORT 60000void xmmsinfo(int);void error(char *msg){ perror(msg); exit(1);}static gint xmms_session(void){ gint session; for(session = 0 ; session < 16 ; session++) if (xmms_remote_is_running(session)) return session; exit(1);}void xmmsinfo(int sock){ int x, n; char buffer[256], *out, *file = "", *title = ""; gint session, pos, rate=0, freq=0, nch=0, track_length=0, rerr=0; for(session = 0; session < 16; session++) if (xmms_remote_is_running(session)) break; if (session == 16) { exit(1); } else { session = xmms_session(); } pos = xmms_remote_get_playlist_pos(session); xmms_remote_get_info(session, &rate, &freq, &nch); file = xmms_remote_get_playlist_file(session, pos); track_length = xmms_remote_get_playlist_time(session, pos) / 1000; title = xmms_remote_get_playlist_title(session, pos); if (rate && freq && nch && file && track_length && title) { bzero(buffer,256); n = read(sock,buffer,256); if (n < 0) error("error reading from socket"); if (n < 0) error("error writing to socket"); sprintf(out, "%d:%-2.2d\n%d\n%d\n%d\n%s\n%s\n", track_length/60, track_length%60, rate, freq, nch, title, file); write(sock,out,strlen(out)); } else return 1; return 0;}int main(void){ int sockfd, newsockfd, portno, clilen, pid; struct sockaddr_in serv_addr, cli_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("error opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = TCP_PORT; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("error on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); while (1) { newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("error on accept"); pid = fork(); if (pid < 0) error("error on fork"); if (pid == 0) { close(sockfd); xmmsinfo(newsockfd); exit(0); } else close(newsockfd); } return 0;}