Compare commits

..

No commits in common. "23296963772e44e28bed945455bd27fcb88a0391" and "6c099af4a16d783a06d5dffa21e5f63bbab43f3c" have entirely different histories.

5 changed files with 41 additions and 116 deletions

BIN
clii

Binary file not shown.

View file

@ -1,17 +0,0 @@
CC = gcc
CFLAGS = -Wall -g
LDFLAGS = -lncurses
OBJS = main.o wsock.o
DEPS = main.c
all: clii
clean:
rm -f $(OBJS)
clii: $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: src/%.c
$(CC) -o $@ $(CFLAGS) -c $<
.PHONY: all clean

View file

@ -3,15 +3,18 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include "wsock.h" #include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
/** CONSTS & UTILITIES **/ /************************/
/**************************/ /* CONSTS & UTILITIES */
/************************/
const char FII_ADDR[] = "chatsrv-neru.flashii.net"; const char FII_ADDR[] = "chatsrv-neru.flashii.net";
const char USAGE[] = const char USAGE[] =
"clii -- Command-Line Flashii Chat\n" "flashii -- Terminal-Based Flashii Chat\n"
"USAGE: clii [session key]\n\n" "USAGE: flashii [session key]\n\n"
"Session key will be stored for future use until\n" "Session key will be stored for future use until\n"
"a new session key is given to the program.\n\n" "a new session key is given to the program.\n\n"
"If you do not know your session key, visit\n" "If you do not know your session key, visit\n"
@ -21,25 +24,47 @@ const char USAGE[] =
const char* _home(const char*); const char* _home(const char*);
/** GLOBALS **/ /*****************/
/***************/ /* DATA BUFFER */
/*****************/
struct buffer_t {
char* data;
int length;
struct buffer_t* next;
};
typedef struct buffer_t buffer_t;
/****************/
/* WEB SOCKET */
/****************/
typedef struct {
int sock;
} wsock_t;
wsock_t* wsock_open(const char*, uint16_t);
void wsock_close(wsock_t*);
/*************/
/* GLOBALS */
/*************/
struct { struct {
char session[256]; char session[256];
} _G; } _G;
/** MAIN **/
/************/
int main(int argc, char** argv) { int main(int argc, char** argv) {
FILE* fp; FILE* fp;
printf("Loading session key ...");
switch(argc) { switch(argc) {
case 1: case 1:
printf("Loading session key ...\n");
if((fp = fopen(_home(".fiikey"), "r")) == NULL) { if((fp = fopen(_home(".fiikey"), "r")) == NULL) {
printf("No previous session key found.\n");
printf("%s\n", USAGE); printf("%s\n", USAGE);
return -1; return -1;
} }
@ -53,22 +78,22 @@ int main(int argc, char** argv) {
return 0; return 0;
} }
printf("New session key provided. Storing ...\n");
strcpy(_G.session, argv[1]); strcpy(_G.session, argv[1]);
if((fp = fopen(_home(".fiikey"), "w")) != NULL) { if((fp = fopen(_home(".fiikey"), "w")) != NULL) {
fputs(_G.session, fp); fputs(_G.session, fp);
fclose(fp); fclose(fp);
} else }
printf("Could not write to ~/.fiikey. Session key will not be stored.\n");
break; break;
default: default:
printf("%s\n", USAGE); printf("%s\n", USAGE);
return -1; return -1;
} }
printf("Session key loaded.\n");
printf("Connecting to Flashii ...\n"); printf("Connecting to Flashii ...\n");
for(;;); struct hostent* fiihost;
fiihost = gethostbyname(FII_ADDR);
initscr(); initscr();
raw(); noecho(); raw(); noecho();

View file

@ -1,3 +0,0 @@
#include "wsock.h"

View file

@ -1,80 +0,0 @@
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
/** DATA BUFFER **/
/*******************/
struct buffer_t {
char* data;
int length;
struct buffer_t* next;
};
typedef struct buffer_t buffer_t;
buffer_t* buffer_create();
int buffer_length(buffer_t*);
void buffer_append(buffer_t*, const char*, int);
void buffer_append_str(buffer_t*, const char*);
char* buffer_read(buffer_t*, int*);
char* buffer_read_str(buffer_t*, int*);
char* buffer_flush(buffer_t*, int*);
char* buffer_flush_str(buffer_t*, int*);
void buffer_clear(buffer_t*);
void buffer_free(buffer_t*);
/** WEB SOCKET **/
/******************/
typedef enum {
// block on system calls
WS_BLOCK = 0,
// do not block on system calls
WS_NOBLOCK = 1,
// block until a full packet is received
WS_FULL_RECV = 2,
// block until a full packet is sent
WS_FULL_SEND = 4
} ws_mode_t;
// mode options that are not mutually exclusive can be
// concatenated using the OR (|) operator. note that
// WS_BLOCK and WS_NOBLOCK control blocking only on the
// system socket functions, whereas WS_FULL_RECV and
// WS_FULL_SEND will block on the protocol level, until
// a packet is fully sent or received
// for example, WS_BLOCK alone with block until data is
// available, but will immediately return nothing if the
// data received is not a full packet. however, using
// WS_BLOCK | WS_FULL_RECV will block until data is
// available, and then until a full websocket packet is
// fully constructed, after which the data is returned.
// noblock behaves in the same way except the system
// calls will not block, but with WS_FULL_RECV enabled
// it will then block until a full packet is constructed
// currently WS_FULL_SEND is set to be always enabled
// when the mode is changed because i do not currently
// see a need for partial sends in this client, thus
// all sends will block until the full packet is sent
// over the wire. if anyone else modifying this client
// has an EXTREME THIRST for partial sends, they can
// implement this behavior themselves
typedef struct {
int sock, mode;
buffer_t buffer;
} wsock_t;
wsock_t* wsock_open(const char*, const char*, uint16_t);
int wsock_mode_set(wsock_t*, int);
int wsock_mode_get(wsock_t*);
int wsock_is_open(wsock_t*);
void wsock_close(wsock_t*);