aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorubq323 <ubq323@ubq323.website>2022-01-13 23:05:02 +0000
committerubq323 <ubq323@ubq323.website>2022-01-13 23:05:02 +0000
commit89a06314a63cff322c71b080869de48f47319078 (patch)
tree65a425a2ad46a316890bdc2fb28597e970edcb5e
parentd9ce6714cd63132ce9cdf0c9702815e8d135693f (diff)
add parsing of irc messages, not used anywhere yet
-rw-r--r--thing.c72
1 files changed, 66 insertions, 6 deletions
diff --git a/thing.c b/thing.c
index b3854ae..6914624 100644
--- a/thing.c
+++ b/thing.c
@@ -46,11 +46,11 @@ ssize_t sendall(int sockfd, void *buf, size_t len) {
}
total_sent += sent;
} while (total_sent < len);
-
+#ifdef DEBUG
char *the = strndup(buf, len);
printf("SEND [%s]\n",the);
free(the);
-
+#endif
return total_sent;
}
@@ -97,19 +97,75 @@ int irc_handshake(int sockfd) {
void irc_handle(int sockfd, char *start, char *end) {
DP("irc_handle...");
+#ifdef DEBUG
char *the = strndup(start,end-start);
printf("HANDLE [%s]\n",the);
free(the);
+#endif
if (strncmp(start, "PING", 4) == 0) {
start[1] = 'O';
sendall(sockfd, start, end-start);
start[1] = 'I';
+ return;
}
-
+ char *msg = start;
+ size_t msglen = end-start;
+ if (msglen > 512) {
+ fprintf(stderr,"message longer than 512 bytes, this is bad probably\n");
+ return;
+ }
+
+ // this is quite bad
+ // i should change it one day
+
+ char msg_source[512];
+ msg_source[0] = '\0';
+
+ char msg_command[512];
+ msg_command[0] = '\0';
+ char msg_params[16][512];
+ for (int i = 0; i < 16; i++)
+ msg_params[i][0] = '\0';
+ int i = 0;
+ if (msg[0] == ':') {
+ for (i = 1; i < msglen && msg[i] != ' ' && msg[i] != '\r' && msg[i] != '\n'; i++)
+ msg_source[i-1] = msg[i];
+ msg_source[i-1] = '\0';
+ i++;
+ }
+ int j;
+ for (j=0; i < msglen && msg[i] != ' ' && msg[i] != '\r' && msg[i] != '\n'; i++, j++)
+ msg_command[j] = msg[i];
+ msg_command[j] = '\0';
+ i++;
+
+ for (int px = 0; px < 16; px++) {
+ if (i >= msglen) break;
+ if (msg[i] == ':') {
+ memcpy(msg_params[px],&msg[i+1],msglen-i-2);
+ msg_params[px][msglen-i-1] = '\0';
+ break;
+ }
+ for (j = 0; i < msglen && msg[i] != ' ' && msg[i] != '\r' && msg[i] != '\n'; i++, j++)
+ msg_params[px][j] = msg[i];
+ msg_params[px][j] = '\0';
+ i++;
+ }
+#ifdef DEBUG
+ printf("source [%s]\n",msg_source);
+ printf("command [%s]\n",msg_command);
+ printf("params: ");
+ for (int px = 0; px < 16; px++)
+ printf("%d:[%s] ",px,msg_params[px]);
+ printf("\n");
+#endif
+
+
+
}
#define IRC_RECVBUF_SIZE 1024
@@ -132,11 +188,11 @@ void irc_recv(int sockfd) {
perror("recv");
exit(1);
}
-
+#ifdef DEBUG
char *the = strndup(irc_recvbuf_cur,s);
printf("RECV %ld [%s]\n",s,the);
free(the);
-
+#endif
char *buf_last = irc_recvbuf_cur+s;
char *cur;
@@ -252,7 +308,9 @@ int main(int argc, char *argv[]) {
.events = POLLIN,
},
};
+#ifdef DEBUG
printf("POLLIN %d POLLERR %d POLLHUP %d\n",POLLIN,POLLERR,POLLHUP);
+#endif
for (;;) {
int r;
@@ -260,7 +318,9 @@ int main(int argc, char *argv[]) {
perror("poll");
return 1;
}
+#ifdef DEBUG
printf("sock %d unix %d\n",pollfds[1].revents, pollfds[0].revents);
+#endif
if (pollfds[1].revents & POLLHUP) {
@@ -286,7 +346,7 @@ int main(int argc, char *argv[]) {
return 1;
}
for (size_t i = 0; i < amt; i++)
- if (buf[i] == '\r' || buf[i] == '\n' || buf[i] < ' ')
+ if (buf[i] == '\r' || buf[i] == '\n' || buf[i] == '\0')
buf[i] = ' ';
char msg[] = "PRIVMSG "CHANNEL" :";