/* * Copyright (c) 2026 Nakidai Perumenei * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "ircd.h" #include #include #include #include #include static void move(struct Peer *peer, size_t n) { memmove(peer->buf, peer->buf + n, sizeof(peer->buf) - n); memset(peer->buf + sizeof(peer->buf) - n, 0, n); peer->recvd -= n; } int handle(struct Peer *peer) { struct Message msg; char *p, *c; while ((p = memmem(peer->buf, sizeof(peer->buf), "\r\n", 2))) { if (memchr(peer->buf, '\0', p - peer->buf)) { warnx("got 0 from %d", peer->fd); goto next; } *p = 0; if (parse_message(peer->buf, &msg)) { warnx("malformed input from %d", peer->fd); goto next; } for (c = msg.command; *c; ++c) *c = tolower(*c); if (find(msg.command)(&msg, peer)) return 1; next: move(peer, p - peer->buf + 2); } if (peer->recvd == sizeof(peer->buf)) { /* * TODO: maybe somehow be more careful with peer data? * or drop them? */ memset(peer->buf, 0, sizeof(peer->buf)); peer->recvd = 0; } return 0; }