19 int main(int argc, const char *argv[], const char *envp[]);
21 int ParseArguments(int argc, const char *argv[]);
23 void Redraw_Screen(void);
25 void Exit(const char *Reason);
26 int writef(int FD, const char *Format, ...);
27 int OpenTCP(const char *AddressString, short PortNumber);
28 char *GetValue(char *Str, int *Ofs);
31 const char *gsExitReason = "No reason [BUG]";
34 void ExitHandler(void)
36 printf("\x1B[?1047l");
37 printf("Quit: %s\n", gsExitReason);
40 void Exit(const char *Reason)
42 gsExitReason = (Reason ? Reason : "User Requested");
43 exit( (Reason ? 1 : 0) );
46 int main(int argc, const char *argv[], const char *envp[])
51 if( (tmp = ParseArguments(argc, argv)) ) return tmp;
57 printf("\x1B[?1047h");
58 printf("\x1B[%i;%ir", 1, giTerminal_Height-1);
60 SetCursorPos(giTerminal_Height-1, 1);
61 printf("[(status)] ");
63 // HACK: Static server entry
64 // UCC (University [of Western Australia] Computer Club) IRC Server
65 tServer *starting_server = Server_Connect( "UCC", "130.95.13.18", 6667 );
67 // gWindow_Status.Server = Server_Connect( "Freenode", "89.16.176.16", 6667 );
69 // gWindow_Status.Server = Server_Connect( "VMHost", "10.0.2.2", 6667 );
70 // gWindow_Status.Server = Server_Connect( "BitlBee", "192.168.1.39", 6667 );
72 if( !starting_server )
75 Windows_SetStatusServer(starting_server);
79 Servers_CloseAll("Client closing");
86 SetCursorPos(giTerminal_Height-1, 1);
87 printf("[(status)] ");
92 fd_set readfds, errorfds;
98 Input_FillSelect(&nfds, &readfds);
99 Servers_FillSelect(&nfds, &readfds, &errorfds);
101 int rv = _SysSelect(nfds, &readfds, 0, &errorfds, NULL, 0);
105 Input_HandleSelect(nfds, &readfds);
108 Servers_HandleSelect(nfds, &readfds, &errorfds);
114 * \todo Actually implement correctly :)
116 int ParseArguments(int argc, const char *argv[])
121 void Redraw_Screen(void)
123 printf("\x1B[2J"); // Clear screen
124 printf("\x1B[0;0H"); // Reset cursor
126 Windows_RepaintCurrent();
130 * \brief Write a formatted string to a file descriptor
133 int writef(int FD, const char *Format, ...)
138 va_start(args, Format);
139 len = vsnprintf(NULL, 0, Format, args);
144 va_start(args, Format);
145 vsnprintf(buf, len+1, Format, args);
148 return _SysWrite(FD, buf, len);
153 * \brief Initialise a TCP connection to \a AddressString on port \a PortNumber
155 int OpenTCP(const char *AddressString, short PortNumber)
161 addrType = Net_ParseAddress(AddressString, addrBuffer);
162 if( addrType == 0 ) {
163 fprintf(stderr, "Unable to parse '%s' as an IP address\n", AddressString);
164 _SysDebug("Unable to parse '%s' as an IP address\n", AddressString);
168 // Finds the interface for the destination address
169 fd = Net_OpenSocket(addrType, addrBuffer, "tcpc");
171 fprintf(stderr, "Unable to open TCP Client to '%s'\n", AddressString);
172 _SysDebug("Unable to open TCP client to '%s'\n", AddressString);
176 // Set remote port and address
177 // printf("Setting port and remote address\n");
178 _SysIOCtl(fd, 5, &PortNumber);
179 _SysIOCtl(fd, 6, addrBuffer);
182 // printf("Initiating connection\n");
183 if( _SysIOCtl(fd, 7, NULL) == 0 ) {
184 // Shouldn't happen :(
185 fprintf(stderr, "Unable to start connection\n");
194 * \brief Read a space-separated value from a string
196 char *GetValue(char *Src, int *Ofs)
199 char *ret = Src + pos;
202 if( !Src ) return NULL;
204 while( *ret == ' ' ) ret ++;
206 end = strchr(ret, ' ');
211 end = ret + strlen(ret) - 1;
215 while( *ret == ' ' ) end ++;