diff src/protocols/gg/libgg.h @ 2846:4b3f17ca66bf

[gaim-migrate @ 2859] so here it comes - some bugs fixed, new ones introduced: - password changing (was in part 1) - update to latest libgg (fixes password change on alpha) - auto away on idle (remembers GG_STATE_FRIENDS_MASK) - handle_errcode() can now use hide_login_progress() - remove encode_postdata() and use gg_urlencode() from libgg + encode only fields (not whole url) - fixed status related ugly bug in GG_EVENT_NOTIFY (!!!) - remove linefeed from messages Thanks, Arkadiusz Miskiewicz committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Wed, 05 Dec 2001 09:48:56 +0000
parents 9123abd0db92
children 12309c877020
line wrap: on
line diff
--- a/src/protocols/gg/libgg.h	Tue Dec 04 19:51:27 2001 +0000
+++ b/src/protocols/gg/libgg.h	Wed Dec 05 09:48:56 2001 +0000
@@ -1,8 +1,8 @@
-/* $Id: libgg.h 2805 2001-11-26 21:22:56Z warmenhoven $ */
+/* $Id: libgg.h 2859 2001-12-05 09:48:56Z warmenhoven $ */
 
 /*
  *  (C) Copyright 2001 Wojtek Kaniewski <wojtekka@irc.pl>,
- *                     Robert J. Woźny <speedy@atman.pl>
+ *                     Robert J. Woźny <speedy@ziew.org>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License Version 2 as
@@ -18,15 +18,15 @@
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#ifndef __LIBGG_H
-#define __LIBGG_H
+#ifndef __GG_LIBGG_H
+#define __GG_LIBGG_H
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #if defined(sun) && !defined(INADDR_NONE)
-#define INADDR_NONE 0xffffffff
+  #define INADDR_NONE 0xffffffff
 #endif
 
 #include <sys/types.h>
@@ -34,176 +34,297 @@
 /*
  * typ zmiennej określającej numerek danej osoby.
  */
-	typedef unsigned long uin_t;
+typedef unsigned long uin_t;
+
+/*
+ * struktura opisująca daną sesję. tworzona przez gg_login().
+ */
+struct gg_session {
+        int fd;         	/* podglądany deskryptor */
+        int check;      	/* sprawdzamy zapis czy odczyt */
+        int state;      	/* aktualny stan maszynki */
+        int error;      	/* kod błędu dla GG_STATE_ERROR */
+	int type;		/* rodzaj sesji. == GG_SESSION_GG */
+	
+        int async;      	/* czy połączenie jest asynchroniczne */
+	int pid;        	/* pid procesu resolvera */
+	int port;       	/* port, z którym się łączymy */
+	int seq;        	/* numer sekwencyjny ostatniej wiadomości */
+	int last_pong;  	/* czas otrzymania ostatniego ping/pong */
+
+	unsigned int server_ip;	/* adres serwera */
+	unsigned int client_ip;	/* adres klienta */
+	int client_port;	/* port, na którym klient słucha */
+
+	uin_t uin;		/* numerek klienta */
+	char *password;		/* i jego hasło. zwalniane automagicznie */
+        
+	int initial_status;	/* początkowy stan klienta */
+
+	char *recv_buf;		/* bufor na otrzymywane pakiety */
+	int recv_done;		/* ile już wczytano do bufora */
+        int recv_left;		/* i ile jeszcze trzeba wczytać */
+};
 
 /*
- * cośtam.
+ * ogólna struktura opisująca stan wszystkich operacji http.
  */
-	struct gg_session {
-		int state, check;
-		int fd, pid;
-		int port;
-		int seq, async;
-		int last_pong;
+struct gg_http {
+        int fd;                 /* podglądany deskryptor */
+        int check;              /* sprawdzamy zapis czy odczyt */
+        int state;              /* aktualny stan maszynki */
+        int error;              /* kod błędu dla GG_STATE_ERROR */
+ 	int type;		/* rodzaj sesji. == GG_SESSION_HTTP */
+	
+        int async;              /* czy połączenie asynchroniczne */
+	int pid;                /* pid procesu resolvera */
+	int port;               /* port, z którym się łączymy */
+
+        char *query;            /* bufor zapytania http */
+        char *header;           /* bufor nagłówka */
+        int header_size;        /* rozmiar wczytanego nagłówka */
+        char *body;             /* bufor otrzymanych informacji */
+        int body_size;          /* ilość informacji */
 
-		/* powinno być ,,in_addr'', ale nie chcę inkludować sieci tutaj */
-		unsigned long server_ip;
+        void *data;             /* dane danej operacji http */
+};
 
-		uin_t uin;
-		char *password;
-		int initial_status;
+/*
+ * ogólna struktura opisująca różne sesje. przydatna w klientach.
+ */
+struct gg_common {
+        int fd;                 /* podglądany deskryptor */
+        int check;              /* sprawdzamy zapis czy odczyt */
+        int state;              /* aktualny stan maszynki */
+        int error;              /* kod błędu dla GG_STATE_ERROR */
+	int type;		/* rodzaj sesji */
+};
 
-		char *recv_buf;
-		int recv_done, recv_left;
-	};
+/*
+ * rodzaje sesji.
+ */
+enum {
+	GG_SESSION_GG = 1,	/* połączenie z serwerem gg */
+	GG_SESSION_HTTP,	/* ogólna sesja http */
+	GG_SESSION_SEARCH,	/* szukanie */
+	GG_SESSION_REGISTER,	/* rejestrowanie */
+};
 
 /*
  * różne stany asynchronicznej maszynki.
  */
-	enum {
-		GG_STATE_IDLE = 0,	/* wspólne */
-		GG_STATE_RESOLVING,
-		GG_STATE_CONNECTING_HTTP,
+enum {
+        /* wspólne */
+        GG_STATE_IDLE = 0,		/* nie powinno wystąpić. */
+        GG_STATE_RESOLVING,             /* wywołał gethostbyname() */
+	GG_STATE_CONNECTING,            /* wywołał connect() */
+	GG_STATE_READING_DATA,		/* czeka na dane http */
+	GG_STATE_ERROR,			/* wystąpił błąd. kod w x->error */
+
+        /* gg_session */
+	GG_STATE_CONNECTING_GG,         /* wywołał connect() */
+	GG_STATE_READING_KEY,           /* czeka na klucz */
+	GG_STATE_READING_REPLY,         /* czeka na odpowiedź */
+	GG_STATE_CONNECTED,             /* połączył się */
 
-		GG_STATE_WRITING_HTTP,	/* gg_login */
-		GG_STATE_CONNECTING_GG,
-		GG_STATE_WAITING_FOR_KEY,
-		GG_STATE_SENDING_KEY,
-		GG_STATE_CONNECTED,
+        /* gg_http */
+	GG_STATE_READING_HEADER,	/* czeka na nagłówek http */
+	GG_STATE_PARSING,               /* przetwarza dane */
+	GG_STATE_DONE,                  /* skończył */
+};
 
-		GG_STATE_READING_HEADER,	/* gg_search */
-		GG_STATE_READING_DATA,
-		GG_STATE_PARSING,
-		GG_STATE_FINISHED,
-	};
+/*
+ * dla zachowania kompatybilności wstecz. w wersji 1.0 będzie usunięte. oby.
+ */
+#define GG_STATE_WRITING_HTTP GG_STATE_READING_DATA
+#define GG_STATE_WAITING_FOR_KEY GG_STATE_READING_KEY
+#define GG_STATE_SENDING_KEY GG_STATE_READING_REPLY
+#define GG_STATE_FINISHED GG_STATE_DONE
 
 /*
  * co proces klienta powinien sprawdzać w deskryptorach?
  */
-	enum {
-		GG_CHECK_NONE = 0,
-		GG_CHECK_WRITE = 1,
-		GG_CHECK_READ = 2,
-	};
+enum {
+	GG_CHECK_NONE = 0,		/* nic. nie powinno wystąpić */
+	GG_CHECK_WRITE = 1,		/* sprawdzamy możliwość zapisu */
+	GG_CHECK_READ = 2,		/* sprawdzamy możliwość odczytu */
+};
 
-	struct gg_session *gg_login(uin_t uin, char *password, int async);
-	void gg_free_session(struct gg_session *sess);
-	void gg_logoff(struct gg_session *sess);
-	int gg_change_status(struct gg_session *sess, int status);
-	int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient,
-			    unsigned char *message);
-	int gg_ping(struct gg_session *sess);
+struct gg_session *gg_login(uin_t uin, char *password, int async);
+void gg_free_session(struct gg_session *sess);
+void gg_logoff(struct gg_session *sess);
+int gg_change_status(struct gg_session *sess, int status);
+int gg_send_message(struct gg_session *sess, int msgclass, uin_t recipient, unsigned char *message);
+int gg_ping(struct gg_session *sess);
 
-	struct gg_notify_reply {
-		uin_t uin;	/* numerek */
-		unsigned long status;	/* status danej osoby */
-		unsigned long remote_ip;	/* adres ip delikwenta */
-		unsigned short remote_port;	/* port, na którym słucha klient */
-		unsigned long dunno1;	/* == 0x0b */
-		unsigned short dunno2;	/* znowu port? */
-	} __attribute__ ((packed));
+struct gg_notify_reply {
+	uin_t uin;			/* numerek */
+	unsigned long status;		/* status danej osoby */
+	unsigned long remote_ip;	/* adres ip delikwenta */
+	unsigned short remote_port;	/* port, na którym słucha klient */
+	unsigned long version;		/* == 0x0b */
+	unsigned short dunno2;		/* znowu port? */
+} __attribute__ ((packed));
 
-	struct gg_status {
-		uin_t uin;	/* numerek */
-		unsigned long status;	/* nowy stan */
-	} __attribute__ ((packed));
+struct gg_status {
+	uin_t uin;			/* numerek */
+	unsigned long status;		/* nowy stan */
+} __attribute__ ((packed));
 
-	enum {
-		GG_EVENT_NONE = 0,
-		GG_EVENT_MSG,
-		GG_EVENT_NOTIFY,
-		GG_EVENT_STATUS,
-		GG_EVENT_ACK,
-		GG_EVENT_CONN_FAILED,
-		GG_EVENT_CONN_SUCCESS,
-	};
-
-	enum {
-		GG_FAILURE_RESOLVING = 1,
-		GG_FAILURE_CONNECTING,
-		GG_FAILURE_INVALID,
-		GG_FAILURE_READING,
-		GG_FAILURE_WRITING,
-		GG_FAILURE_PASSWORD,
-	};
+enum {
+	GG_EVENT_NONE = 0,
+	GG_EVENT_MSG,
+	GG_EVENT_NOTIFY,
+	GG_EVENT_STATUS,
+	GG_EVENT_ACK,
+	GG_EVENT_CONN_FAILED,
+	GG_EVENT_CONN_SUCCESS,
+};
 
-	struct gg_event {
-		int type;
-		union {
-			struct {
-				uin_t sender;
-				int msgclass;
-				time_t time;
-				unsigned char *message;
-			} msg;
-			struct gg_notify_reply *notify;
-			struct gg_status status;
-			struct {
-				uin_t recipient;
-				int status;
-				int seq;
-			} ack;
-			int failure;
-		} event;
-	};
+/*
+ * niedługo się tego pozbędę na rzecz sensownej obsługi błędów. --w
+ */
+enum {
+	GG_FAILURE_RESOLVING = 1,
+	GG_FAILURE_CONNECTING,
+	GG_FAILURE_INVALID,
+	GG_FAILURE_READING,
+	GG_FAILURE_WRITING,
+	GG_FAILURE_PASSWORD,
+	GG_FAILURE_404,
+};
 
-	struct gg_event *gg_watch_fd(struct gg_session *sess);
-	void gg_free_event(struct gg_event *e);
-
-	int gg_notify(struct gg_session *sess, uin_t * userlist, int count);
-	int gg_add_notify(struct gg_session *sess, uin_t uin);
-	int gg_remove_notify(struct gg_session *sess, uin_t uin);
+/*
+ * rodzaje błędów, na razie używane przez http. bez rozczulania się nad
+ * powodami. klient powie, że albo nie znalazł hosta, albo nie mógł się
+ * połączyć, albo nie mógł wysłać, albo nie mógł odebrac. i tyle. jak
+ * ktoś będzie chciał, to będzie mógł sprawdzić errno. ale po co?
+ */
+enum {
+	GG_ERROR_RESOLVING = 1,
+	GG_ERROR_CONNECTING,
+	GG_ERROR_READING,
+	GG_ERROR_WRITING,
+};
 
 /*
- * jakieśtam bzdurki dotyczące szukania userów.
+ * struktura opisująca rodzaj zdarzenia. wychodzi z gg_watch_fd()
+ */
+struct gg_event {
+        int type;
+        union {
+                struct {
+                        uin_t sender;
+			int msgclass;
+			time_t time;
+                        unsigned char *message;
+                } msg;
+                struct gg_notify_reply *notify;
+                struct gg_status status;
+                struct {
+                        uin_t recipient;
+                        int status;
+                        int seq;
+                } ack;
+		int failure;
+        } event;
+};
+
+struct gg_event *gg_watch_fd(struct gg_session *sess);
+void gg_free_event(struct gg_event *e);
+
+int gg_notify(struct gg_session *sess, uin_t *userlist, int count);
+int gg_add_notify(struct gg_session *sess, uin_t uin);
+int gg_remove_notify(struct gg_session *sess, uin_t uin);
+
+
+/*
+ * OBSŁUGA HTTP
+ */
+
+struct gg_http *gg_http_connect(char *hostname, int port, int async, char *method, char *path, char *header);
+int gg_http_watch_fd(struct gg_http *h);
+void gg_http_stop(struct gg_http *h);
+void gg_free_http(struct gg_http *h);
+
+/* 
+ * SZUKANIE UŻYTKOWNIKÓW
  */
 
-	struct gg_search_result {
-		uin_t uin;
-		char *first_name;
-		char *last_name;
-		char *nickname;
-		int born;
-		int gender;
-		char *city;
-		int active;
-	};
+/*
+ * struktura opisująca kryteria wyszukiwania. argument gg_search().
+ */
+struct gg_search_request {
+	int active;		/* czy ma szukać tylko aktywnych? */
+
+	/* mode 0 */
+	char *nickname;		/* pseudonim */
+	char *first_name;	/* imię */
+	char *last_name;	/* nazwisko */
+	char *city;		/* miasto */
+	int gender;		/* płeć */
+	int min_birth;		/* urodzony od roku... */
+	int max_birth;		/* urodzony do roku... */
+	
+	/* mode 1 */
+	char *email;		/* adres e-mail */
+
+	/* mode 2 */
+	char *phone;		/* numer telefonu */
+	
+	/* mode 3 */
+	uin_t uin;		/* numerek */
+};
+
+/*
+ * struktura opisująca rezultat wyszukiwania. pole gg_http.
+ */
+struct gg_search {
+	int count;				/* ilość znalezionych */
+	struct gg_search_result *results;	/* tabelka z nimi */
+};
 
-	struct gg_search_request {
-		/* czy ma szukać tylko aktywnych? */
-		int active;
-		/* mode 0 */
-		char *nickname, *first_name, *last_name, *city;
-		int gender, min_birth, max_birth;
-		/* mode 1 */
-		char *email;
-		/* mode 2 */
-		char *phone;
-		/* mode 3 */
-		uin_t uin;
-	};
+/*
+ * pojedynczy rezultat wyszukiwania.
+ */
+struct gg_search_result {
+	uin_t uin;		/* numerek */
+	char *first_name;	/* imię */
+	char *last_name;	/* nazwisko */
+	char *nickname;		/* pseudonim */
+	int born;		/* rok urodzenia */
+	int gender;		/* płeć */
+	char *city;		/* miasto */
+	int active;		/* czy jest aktywny */
+};
 
-	struct gg_search {
-		struct gg_search_request request;
+#define GG_GENDER_NONE 0	/* nie podano lub bez znaczenia */
+#define GG_GENDER_FEMALE 1	/* kobieta */
+#define GG_GENDER_MALE 2	/* mężczyzna */
 
-		/* bzdurki */
-		int mode, fd, async, state, check, error, pid;
-		char *header_buf, *data_buf;
-		int header_size, data_size;
+struct gg_http *gg_search(struct gg_search_request *r, int async);
+int gg_search_watch_fd(struct gg_http *f);
+void gg_free_search(struct gg_http *f);
+
+struct gg_search_request *gg_search_request_mode_0(char *nickname, char *first_name, char *last_name, char *city, int gender, int min_birth, int max_birth, int active);
+struct gg_search_request *gg_search_request_mode_1(char *email, int active);
+struct gg_search_request *gg_search_request_mode_2(char *phone, int active);
+struct gg_search_request *gg_search_request_mode_3(uin_t uin, int active);
 
-		/* wyniki */
-		int count;
-		struct gg_search_result *results;
-	};
+/*
+ * OPERACJE NA KATALOGU PUBLICZNYM
+ */
 
-#define GG_GENDER_NONE 0
-#define GG_GENDER_FEMALE 1
-#define GG_GENDER_MALE 2
+struct gg_pubdir {
+	int success;		/* czy się udało */
+	uin_t uin;		/* otrzymany numerek. 0 jeśli błąd */
+};
 
-	struct gg_search *gg_search(struct gg_search_request *r, int async);
-	int gg_search_watch_fd(struct gg_search *f);
-	void gg_free_search(struct gg_search *f);
-	void gg_search_cancel(struct gg_search *f);
+struct gg_http *gg_register(char *email, char *password, int async);
+void gg_free_register(struct gg_http *f);
+
+int gg_pubdir_watch_fd(struct gg_http *f);
+#define gg_register_watch_fd gg_pubdir_watch_fd
 
 /*
  * jeśli chcemy sobie podebugować, wystarczy ustawić `gg_debug_level'.
@@ -211,7 +332,7 @@
  * się ustawiać odpowiednich leveli, więc większość szła do _MISC.
  */
 
-	extern int gg_debug_level;
+extern int gg_debug_level;
 
 #define GG_DEBUG_NET 1
 #define GG_DEBUG_TRAFFIC 2
@@ -219,7 +340,16 @@
 #define GG_DEBUG_FUNCTION 8
 #define GG_DEBUG_MISC 16
 
-	void gg_debug(int level, char *format, ...);
+void gg_debug(int level, char *format, ...);
+
+/*
+ * Pare małych zmiennych do obsługi "http proxy"
+ *   
+ */
+ 
+extern int gg_http_use_proxy;
+extern char *gg_http_proxy_host;
+extern int gg_http_proxy_port;
 
 /*
  * -------------------------------------------------------------------------
@@ -230,41 +360,47 @@
  * -------------------------------------------------------------------------
  */
 
-	int gg_resolve(int *fd, int *pid, char *hostname);
-	int gg_connect(void *addr, int port, int async);
-	char *gg_alloc_sprintf(char *format, ...);
-	char *gg_get_line(char **ptr);
-	char *gg_urlencode(char *str);
+int gg_resolve(int *fd, int *pid, char *hostname);
+void gg_debug(int level, char *format, ...);
+char *gg_alloc_sprintf(char *format, ...);
+char *gg_get_line(char **ptr);
+int gg_connect(void *addr, int port, int async);
+void gg_read_line(int sock, char *buf, int length);
+void gg_chomp(char *line);
+char *gg_urlencode(char *str);
+int gg_http_hash(unsigned char *email, unsigned char *password);
 
 #define GG_APPMSG_HOST "appmsg.gadu-gadu.pl"
 #define GG_APPMSG_PORT 80
 #define GG_PUBDIR_HOST "pubdir.gadu-gadu.pl"
 #define GG_PUBDIR_PORT 80
+#define GG_REGISTER_HOST "register.gadu-gadu.pl"
+#define GG_REGISTER_PORT 80
 #define GG_DEFAULT_PORT 8074
 #define GG_HTTPS_PORT 443
 #define GG_HTTP_USERAGENT "Mozilla/4.7 [en] (Win98; I)"
 
-	struct gg_header {
-		unsigned long type;	/* typ pakietu */
-		unsigned long length;	/* długość reszty pakietu */
-	} __attribute__ ((packed));
+struct gg_header {
+	unsigned long type;		/* typ pakietu */
+	unsigned long length;		/* długość reszty pakietu */
+} __attribute__ ((packed));
 
 #define GG_WELCOME 0x0001
 
-	struct gg_welcome {
-		unsigned long key;	/* klucz szyfrowania hasła */
-	} __attribute__ ((packed));
-
+struct gg_welcome {
+	unsigned long key;		/* klucz szyfrowania hasła */
+} __attribute__ ((packed));
+	
 #define GG_LOGIN 0x000c
 
-	struct gg_login {
-		uin_t uin;	/* twój numerek */
-		unsigned long hash;	/* hash hasła */
-		unsigned long status;	/* status na dzień dobry */
-		unsigned long dunno;	/* == 0x0b */
-		unsigned long local_ip;	/* mój adres ip */
-		unsigned short local_port;	/* port, na którym słucham */
-	} __attribute__ ((packed));
+struct gg_login {
+	uin_t uin;			/* twój numerek */
+	unsigned long hash;		/* hash hasła */
+	unsigned long status;		/* status na dzień dobry */
+	unsigned long dunno;		/* == 0x0b */
+	unsigned long local_ip;		/* mój adres ip */
+	unsigned short local_port;	/* port, na którym słucham */
+} __attribute__ ((packed));
 
 #define GG_LOGIN_OK 0x0003
 
@@ -273,39 +409,39 @@
 #define GG_NEW_STATUS 0x0002
 
 #define GG_STATUS_NOT_AVAIL 0x0001	/* rozłączony */
-#define GG_STATUS_AVAIL 0x0002	/* dostępny */
-#define GG_STATUS_BUSY 0x0003	/* zajęty */
+#define GG_STATUS_AVAIL 0x0002		/* dostępny */
+#define GG_STATUS_BUSY 0x0003		/* zajęty */
 #define GG_STATUS_INVISIBLE 0x0014	/* niewidoczny (GG 4.6) */
 
 #define GG_STATUS_FRIENDS_MASK 0x8000	/* tylko dla znajomych (GG 4.6) */
 
-	struct gg_new_status {
-		unsigned long status;	/* na jaki zmienić? */
-	} __attribute__ ((packed));
+struct gg_new_status {
+	unsigned long status;			/* na jaki zmienić? */
+} __attribute__ ((packed));
 
 #define GG_NOTIFY 0x0010
-
-	struct gg_notify {
-		uin_t uin;	/* numerek danej osoby */
-		char dunno1;	/* == 3 */
-	} __attribute__ ((packed));
-
+	
+struct gg_notify {
+	uin_t uin;		/* numerek danej osoby */
+	char dunno1;		/* == 3 */
+} __attribute__ ((packed));
+	
 #define GG_NOTIFY_REPLY 0x000c	/* tak, to samo co GG_LOGIN */
-
+	
 /* struct gg_notify_reply zadeklarowane wyżej */
 
 #define GG_ADD_NOTIFY 0x000d
 #define GG_REMOVE_NOTIFY 0x000e
-
-	struct gg_add_remove {
-		uin_t uin;	/* numerek */
-		char dunno1;	/* == 3 */
-	} __attribute__ ((packed));
+	
+struct gg_add_remove {
+	uin_t uin;		/* numerek */
+	char dunno1;		/* == 3 */
+} __attribute__ ((packed));
 
 #define GG_STATUS 0x0002
 
 /* struct gg_status zadeklarowane wcześniej */
-
+	
 #define GG_SEND_MSG 0x000b
 
 #define GG_CLASS_QUEUED 0x0001
@@ -313,37 +449,48 @@
 #define GG_CLASS_MSG 0x0004
 #define GG_CLASS_CHAT 0x0008
 
-	struct gg_send_msg {
-		unsigned long recipient;
-		unsigned long seq;
-		unsigned long msgclass;
-	} __attribute__ ((packed));
+struct gg_send_msg {
+	unsigned long recipient;
+	unsigned long seq;
+	unsigned long msgclass;
+} __attribute__ ((packed));
 
 #define GG_SEND_MSG_ACK 0x0005
 
 #define GG_ACK_DELIVERED 0x0002
 #define GG_ACK_QUEUED 0x0003
-
-	struct gg_send_msg_ack {
-		unsigned long status;
-		unsigned long recipient;
-		unsigned long seq;
-	} __attribute__ ((packed));
+	
+struct gg_send_msg_ack {
+	unsigned long status;
+	unsigned long recipient;
+	unsigned long seq;
+} __attribute__ ((packed));
 
 #define GG_RECV_MSG 0x000a
-
-	struct gg_recv_msg {
-		unsigned long sender;
-		unsigned long seq;
-		unsigned long time;
-		unsigned long msgclass;
-	} __attribute__ ((packed));
+	
+struct gg_recv_msg {
+	unsigned long sender;
+	unsigned long seq;
+	unsigned long time;
+	unsigned long msgclass;
+} __attribute__ ((packed));
 
 #define GG_PING 0x0008
-
+	
 #define GG_PONG 0x0007
 
 #ifdef __cplusplus
 }
 #endif
-#endif
+
+#endif /* __GG_LIBGG_H */
+
+/*
+ * Local variables:
+ * c-indentation-style: k&r
+ * c-basic-offset: 8
+ * indent-tabs-mode: notnil
+ * End:
+ *
+ * vim: shiftwidth=8:
+ */