10 #include <acess/devices/pty.h>
20 int main(int argc, const char *argv[], const char *envp[]);
22 int ParseArguments(int argc, const char *argv[]);
24 void Redraw_Screen(void);
26 void Exit(const char *Reason);
27 int writef(int FD, const char *Format, ...);
28 int OpenTCP(const char *AddressString, short PortNumber);
29 char *GetValue(char *Str, int *Ofs);
32 const char *gsExitReason = "No reason [BUG]";
35 void ExitHandler(void)
37 printf("\x1B[?1047l");
38 printf("Quit: %s\n", gsExitReason);
41 struct ptymode mode = {.InputMode = 0, .OutputMode = 0};
42 mode.InputMode = PTYIMODE_CANON|PTYIMODE_ECHO;
43 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
46 void Exit(const char *Reason)
48 gsExitReason = (Reason ? Reason : "User Requested");
49 exit( (Reason ? 1 : 0) );
52 int main(int argc, const char *argv[], const char *envp[])
57 if( (tmp = ParseArguments(argc, argv)) ) return tmp;
63 printf("\x1B[?1047h");
64 printf("\x1B[%i;%ir", 2, giTerminal_Height-2);
66 // HACK: Static server entry
67 // UCC (University [of Western Australia] Computer Club) IRC Server
68 // tServer *starting_server = Server_Connect( "UCC", "130.95.13.18", 6667 );
70 tServer *starting_server = Server_Connect( "Freenode", "84.240.3.129", 6667 );
72 // gWindow_Status.Server = Server_Connect( "VMHost", "10.0.2.2", 6667 );
73 // gWindow_Status.Server = Server_Connect( "BitlBee", "192.168.1.39", 6667 );
75 Windows_SetStatusServer(starting_server);
76 Windows_RepaintCurrent();
77 SetCursorPos(giTerminal_Height-1, 1);
78 printf("[(status)] ");
82 Servers_CloseAll("Client closing");
89 SetCursorPos(giTerminal_Height, 1);
90 printf("[(status)] ");
94 struct ptymode mode = {.InputMode = 0, .OutputMode = 0};
95 _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
99 fd_set readfds, errorfds;
105 Input_FillSelect(&nfds, &readfds);
106 Servers_FillSelect(&nfds, &readfds, &errorfds);
108 int rv = _SysSelect(nfds, &readfds, 0, &errorfds, NULL, 0);
112 Input_HandleSelect(nfds, &readfds);
115 Servers_HandleSelect(nfds, &readfds, &errorfds);
121 * \todo Actually implement correctly :)
123 int ParseArguments(int argc, const char *argv[])
128 void Redraw_Screen(void)
130 printf("\x1B[2J"); // Clear screen
131 printf("\x1B[H"); // Reset cursor
133 Windows_RepaintCurrent();
137 * \brief Write a formatted string to a file descriptor
140 int writef(int FD, const char *Format, ...)
145 va_start(args, Format);
146 len = vsnprintf(NULL, 0, Format, args);
151 va_start(args, Format);
152 vsnprintf(buf, len+1, Format, args);
155 return _SysWrite(FD, buf, len);
160 * \brief Initialise a TCP connection to \a AddressString on port \a PortNumber
162 int OpenTCP(const char *AddressString, short PortNumber)
168 addrType = Net_ParseAddress(AddressString, addrBuffer);
169 if( addrType == 0 ) {
170 fprintf(stderr, "Unable to parse '%s' as an IP address\n", AddressString);
171 _SysDebug("Unable to parse '%s' as an IP address\n", AddressString);
175 // Finds the interface for the destination address
176 fd = Net_OpenSocket(addrType, addrBuffer, "tcpc");
178 fprintf(stderr, "Unable to open TCP Client to '%s'\n", AddressString);
179 _SysDebug("Unable to open TCP client to '%s'\n", AddressString);
183 // Set remote port and address
184 // printf("Setting port and remote address\n");
185 _SysIOCtl(fd, 5, &PortNumber);
186 _SysIOCtl(fd, 6, addrBuffer);
189 // printf("Initiating connection\n");
190 if( _SysIOCtl(fd, 7, NULL) == 0 ) {
191 // Shouldn't happen :(
192 fprintf(stderr, "Unable to start connection\n");
201 * \brief Read a space-separated value from a string
203 char *GetValue(char *Src, int *Ofs)
206 char *ret = Src + pos;
209 if( !Src ) return NULL;
211 while( *ret == ' ' ) ret ++;
213 end = strchr(ret, ' ');
218 end = ret + strlen(ret) - 1;
222 while( *ret == ' ' ) end ++;