2 * $Source: /cvs/cvsroot/d2x/arch/linux/ukali.c,v $
5 * $Date: 2001-10-19 07:39:26 $
7 * FIXME: add description
9 * $Log: not supported by cvs2svn $
10 * Revision 1.2 2001/10/19 07:29:37 bradleyb
11 * Brought linux networking in line with d1x, moved some arch/linux_* stuff to arch/linux/
20 #include <sys/socket.h>
21 #include <sys/types.h>
23 #include <netinet/in.h>
24 #include <arpa/inet.h>
32 //added 05/17/99 Matt Mueller - needed to redefine FD_* so that no asm is used
36 struct sockaddr_in kalinix_addr;
39 int knix_newSock(void) {
42 struct sockaddr_in taddr;
44 taddr.sin_family = AF_INET;
45 taddr.sin_addr.s_addr = inet_addr("127.0.0.1");
48 if ((tempsock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
51 fcntl(tempsock, F_SETFL, fcntl(tempsock, F_GETFL) | O_NONBLOCK);
53 if ((bind(tempsock, (struct sockaddr *)&taddr, sizeof(taddr))) < 0) {
60 int knix_Send(int hand, char *data, int len) {
63 while ((t = sendto(hand, data, len, 0, (struct sockaddr *)&kalinix_addr,
64 sizeof(kalinix_addr))) < 0) {
73 int knix_Recv(int hand, char *data, int len) {
74 struct sockaddr_in taddr;
79 return recvfrom(hand, data, len, 0, (struct sockaddr *)&taddr, &tlen);
83 int knix_WaitforSocket(int hand, int timems) {
91 tv.tv_usec = timems * 1000;
92 return select(hand + 1, &set, NULL, NULL, &tv);
95 int knix_ReceivePacket(int hand, char *outdata, int *outlen, kaliaddr_ipx *from) {
96 static char data[MAX_PACKET_SIZE];
99 len = knix_Recv(hand, data, sizeof(data));
101 if (len <= 0) return 0;
104 // case 1: // open socket
106 // case 2: // close socket
108 case 3: // received data packet
112 from->sa_family = AF_IPX;
113 memcpy(from->sa_nodenum, &data[1], sizeof(from->sa_nodenum));
114 memset(from->sa_netnum, 0, sizeof(from->sa_netnum));
115 memcpy(&from->sa_socket, &data[9], sizeof(unsigned short));
116 memcpy(outdata, &data[11], len-11 > *outlen ? *outlen : len-11);
119 case 4: // myipxaddress
121 memcpy(g_mynodenum, &data[1], 6);
123 // case 5: // Init KaliNix connection
125 case 6: // open response
126 case 7: // close response
128 // memcpy(g_LastPort, &data[1], sizeof(g_LastPort))
136 int knix_GetMyAddress(void) {
140 kalinix_addr.sin_family = AF_INET;
141 kalinix_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
142 kalinix_addr.sin_port = htons(4213);
144 g_sockfd = knix_newSock();
147 initdata[0] = 5; // Get Address
148 knix_Send(g_sockfd, initdata, sizeof(initdata));
154 int KaliSendPacket(int hand, char *data, int len, kaliaddr_ipx *to) {
155 static char sendbuf[MAX_PACKET_SIZE+11];
157 // char sa_nodenum[6];
163 memcpy(&sendbuf[1], to->sa_nodenum, sizeof(to->sa_nodenum));
164 memcpy(&sendbuf[7], &to->sa_socket, sizeof(to->sa_socket));
165 memset(&sendbuf[9], 0, sizeof(to->sa_socket));
166 len = len > MAX_PACKET_SIZE ? MAX_PACKET_SIZE : len;
167 memcpy(&sendbuf[11], data, len);
169 if (!knix_Send(hand, sendbuf, len+11)){
176 int KaliReceivePacket(int hand, char *data, int len, kaliaddr_ipx *from) {
182 t = knix_ReceivePacket(hand, data, &newlen, from);
184 while (t != 0 && t != 3)
185 t = knix_ReceivePacket(hand, data, &newlen, from);
193 int KaliGetNodeNum(kaliaddr_ipx *myaddr) {
196 if (g_sockfd < 0 && knix_GetMyAddress())
200 if (knix_WaitforSocket(g_sockfd, 100) > 0) {
201 if (knix_ReceivePacket(g_sockfd, NULL, 0, NULL) == 4)
213 memcpy(myaddr->sa_nodenum, g_mynodenum, sizeof(g_mynodenum));
219 int KaliCloseSocket(int hand) {
220 char opendata[3] = {2, 0, 0};
223 knix_Send(hand, opendata, sizeof(opendata));
227 if (knix_WaitforSocket(hand, 100) > 0) {
228 if (knix_ReceivePacket(hand, NULL, 0, NULL) == 7)
232 knix_Send(hand, opendata, sizeof(opendata));
240 int KaliOpenSocket(unsigned short port) {
246 opendata[0] = 1; // open socket
247 memcpy(&opendata[1], &port, sizeof(port));
248 pid = (int)htonl(getpid());
249 memcpy(&opendata[3], &pid, sizeof(pid));
250 strncpy(&opendata[7], KALI_PROCESS_NAME, sizeof(KALI_PROCESS_NAME));
253 if ((hand = knix_newSock()) < 0)
256 knix_Send(hand, opendata, sizeof(opendata));
260 if (knix_WaitforSocket(hand, 100) > 0) {
261 if (knix_ReceivePacket(hand, NULL, 0, NULL) == 6)
265 knix_Send(hand, opendata, sizeof(opendata));