]> Git repositories of Nishi - okuu.git/commitdiff
some
authorNishi <nishi@nishi.boats>
Mon, 9 Sep 2024 13:22:05 +0000 (13:22 +0000)
committerNishi <nishi@nishi.boats>
Mon, 9 Sep 2024 13:22:05 +0000 (13:22 +0000)
git-svn-id: file:///raid/svn-personal/okuu/trunk@2 7d206d2a-66c2-044b-96de-ba755a9b3ba8

Bot/Makefile [new file with mode: 0644]
Bot/ircfw.c [new file with mode: 0644]
Bot/ircfw.h [new file with mode: 0644]
Bot/main.c [new file with mode: 0644]
Makefile [new file with mode: 0644]
Platform/generic.mk [new file with mode: 0644]

diff --git a/Bot/Makefile b/Bot/Makefile
new file mode 100644 (file)
index 0000000..039c1d1
--- /dev/null
@@ -0,0 +1,19 @@
+# $Id$
+
+include $(PWD)/Platform/$(PLATFORM).mk
+
+.PHONY: all clean
+.SUFFIXES: .c .o
+
+OBJS = main.o ircfw.o
+
+all: okuu$(EXEC)
+
+okuu$(EXEC): $(OBJS)
+       $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+
+.c.o:
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+clean:
+       rm -f *.o *.exe okuu
diff --git a/Bot/ircfw.c b/Bot/ircfw.c
new file mode 100644 (file)
index 0000000..967fbec
--- /dev/null
@@ -0,0 +1,165 @@
+/* $Id$ */
+
+#define IRCFW_SRC
+#include "ircfw.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+
+struct ircfw_message ircfw_message;
+
+char* ircfw_strcat(const char* a, const char* b) {
+       char* str = malloc(strlen(a) + strlen(b) + 1);
+       memcpy(str, a, strlen(a));
+       memcpy(str + strlen(a), b, strlen(b));
+       str[strlen(a) + strlen(b)] = 0;
+       return str;
+}
+
+char* ircfw_strcat3(const char* a, const char* b, const char* c) {
+       char* tmp = ircfw_strcat(a, b);
+       char* str = ircfw_strcat(tmp, c);
+       free(tmp);
+       return str;
+}
+
+char* ircfw_strdup(const char* str) { return ircfw_strcat(str, ""); }
+
+void ircfw_init(void) {
+       ircfw_message.prefix = NULL;
+       ircfw_message.params = NULL;
+       ircfw_message.command = NULL;
+}
+
+void ircfw_parse_params(const char* str) {
+       ircfw_message.params = malloc(sizeof(*ircfw_message.params));
+       ircfw_message.params[0] = NULL;
+       int i;
+       int incr = 0;
+       bool until_end = false;
+       char* dup = ircfw_strdup(str);
+       for(i = 0;; i++) {
+               if(dup[i] == 0 || (!until_end && dup[i] == ' ')) {
+                       char oldc = dup[i];
+                       dup[i] = 0;
+
+                       char* param = ircfw_strdup(dup + incr);
+
+                       char** old_params = ircfw_message.params;
+                       int j;
+                       for(j = 0; old_params[j] != NULL; j++)
+                               ;
+                       ircfw_message.params = malloc(sizeof(*ircfw_message.params) * (2 + j));
+                       for(j = 0; old_params[j] != NULL; j++) {
+                               ircfw_message.params[j] = old_params[j];
+                       }
+                       ircfw_message.params[j] = param;
+                       ircfw_message.params[j + 1] = NULL;
+                       free(old_params);
+
+                       incr = i + 1;
+                       if(oldc == 0) break;
+               } else if(dup[i] == ':' && !until_end) {
+                       until_end = true;
+                       incr = i + 1;
+               }
+       }
+       free(dup);
+}
+
+int ircfw_socket_send_cmd(int sock, const char* name, const char* cmd) {
+       char* str = ircfw_strcat(cmd, "\r\n");
+       if(name != NULL) {
+               char* old = str;
+               char* tmp = ircfw_strcat3(":", name, " ");
+               str = ircfw_strcat(tmp, old);
+               free(old);
+               free(tmp);
+       }
+       int st = send(sock, str, strlen(str), 0);
+       free(str);
+       return st < 0 ? 1 : 0;
+}
+
+int ircfw_socket_read_cmd(int sock) {
+       char c[2];
+       c[1] = 0;
+       char* str = malloc(1);
+       str[0] = 0;
+       bool err = false;
+       bool end = false;
+       while(1) {
+               int s = recv(sock, c, 1, 0);
+               if(s <= 0) {
+                       err = true;
+                       break;
+               }
+               if(c[0] == '\n') {
+                       end = true;
+                       break;
+               } else if(c[0] != '\r') {
+                       char* tmp = str;
+                       str = ircfw_strcat(tmp, c);
+                       free(tmp);
+               }
+       }
+       if(ircfw_message.prefix != NULL) free(ircfw_message.prefix);
+       if(ircfw_message.params != NULL) {
+               int i;
+               for(i = 0; ircfw_message.params[i] != NULL; i++) {
+                       free(ircfw_message.params[i]);
+               }
+               free(ircfw_message.params);
+       }
+       if(ircfw_message.command != NULL) free(ircfw_message.command);
+       ircfw_message.prefix = NULL;
+       ircfw_message.params = NULL;
+       ircfw_message.command = NULL;
+
+       if(str[0] == ':') {
+               int i;
+               for(i = 0; str[i] != 0; i++) {
+                       if(str[i] == ' ') {
+                               str[i] = 0;
+                               ircfw_message.prefix = ircfw_strdup(str + 1);
+                               i++;
+                               int start = i;
+                               for(;; i++) {
+                                       if(str[i] == ' ' || str[i] == 0) {
+                                               char oldc = str[i];
+                                               str[i] = 0;
+                                               ircfw_message.command = ircfw_strdup(str + start);
+                                               if(oldc != 0) {
+                                                       i++;
+                                                       ircfw_parse_params(str + i);
+                                               }
+                                               break;
+                                       }
+                               }
+                               break;
+                       }
+               }
+       } else {
+               int i;
+               for(i = 0; str[i] != 0; i++) {
+                       if(str[i] == ' ' || str[i] == 0) {
+                               char oldc = str[i];
+                               str[i] = 0;
+                               ircfw_message.command = ircfw_strdup(str);
+                               if(oldc != 0) {
+                                       i++;
+                                       ircfw_parse_params(str + i);
+                               }
+                               break;
+                       }
+               }
+       }
+
+       free(str);
+       return err ? 1 : 0;
+}
diff --git a/Bot/ircfw.h b/Bot/ircfw.h
new file mode 100644 (file)
index 0000000..f7baf4f
--- /dev/null
@@ -0,0 +1,22 @@
+/* $Id$ */
+
+#ifndef __IRCFW_H__
+#define __IRCFW_H__
+
+#define IRCFW_VERSION "1.00"
+
+struct ircfw_message {
+       char* prefix;
+       char* command;
+       char** params;
+};
+
+void ircfw_init(void);
+int ircfw_socket_send_cmd(int sock, const char* name, const char* cmd);
+int ircfw_socket_read_cmd(int sock);
+
+#ifndef IRCFW_SRC
+extern struct ircfw_message ircfw_message;
+#endif
+
+#endif
diff --git a/Bot/main.c b/Bot/main.c
new file mode 100644 (file)
index 0000000..b1eefe9
--- /dev/null
@@ -0,0 +1,40 @@
+/* $Id$ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+char* nntpserver;
+char* nntpuser;
+char* nntppass;
+int nntpport = 119;
+
+char* ircserver;
+int ircport = 6669;
+
+int main(){
+       printf("Okuu starting up\n");
+
+       nntpserver = getenv("NNTPSERVER");
+       nntpuser = getenv("NNTPUSER");
+       nntppass = getenv("NNTPPASS");
+       ircserver = getenv("IRCSERVER");
+       if(getenv("NNTPPORT") != NULL){
+               nntpport = atoi(getenv("NNTPPORT"));
+       }
+       if(getenv("IRCPORT") != NULL){
+               ircport = atoi(getenv("IRCPORT"));
+       }
+       bool bad = false;
+       if(nntpserver == NULL){
+               fprintf(stderr, "Set NNTPSERVER\n");
+               bad = true;
+       }
+       if(ircserver == NULL){
+               fprintf(stderr, "Set IRCSERVER\n");
+               bad = true;
+       }
+       if(bad){
+               return 1;
+       }
+}
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..f3c6860
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,14 @@
+# $Id$
+
+PLATFORM = generic
+PWD = `pwd`
+
+FLAGS = PWD=$(PWD) PLATFORM=$(PLATFORM)
+
+.PHONY: all clean ./Bot
+
+./Bot::
+       $(MAKE) -C $@ $(FLAGS)
+
+clean:
+       $(MAKE) -C ./Bot $(FLAGS) clean
diff --git a/Platform/generic.mk b/Platform/generic.mk
new file mode 100644 (file)
index 0000000..0eef4d1
--- /dev/null
@@ -0,0 +1,7 @@
+# $Id$
+
+CC = cc
+CFLAGS = -g -std=c99
+LDFLAGS =
+LIBS =
+EXEC =