summaryrefslogtreecommitdiff
path: root/noncore/net/wellenreiter/libwellenreiter/source/wl_proto.cc
blob: f15523f8fed76f2a3c6141ad9cc5935447724d22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * Communication protocol
 *
 * $Id$
 */

#include "wl_proto.hh"
#include "wl_log.hh"
#include "wl_sock.hh"

/* Adds a field to the buffer */
int add_field(char *buffer, char *string, int len)
{
  char newlen[5];
  
  /* 3 Byte = Length */
  snprintf(newlen, sizeof(newlen) - 1, "%.3d", len);
  memcpy(buffer, newlen, 3);
  
  /* Length bytes = Value */
  memcpy(buffer + 3, string, atoi(newlen));
  
  /* Return length of attached field */
  return (atoi(newlen) + 3);
}

int get_field(const char *buffer, char *out)
{
  char len[5];

  /* Get length of value */
  memcpy(len, buffer, 3);

  /* Copy buffer to out pointer */
  memset(out, 0, atoi(len) + 1);
  memcpy(out, buffer + 3, atoi(len));

  return atoi(len) + 3;
}

/* Send found network to GUI */
int send_network_found (const char *guihost, int guiport, void *structure)
{
  wl_network_t *ptr;
  char buffer[2048];
  char temp[128];
  int retval=0, len=0;

  memset(temp, 0, sizeof(temp));

  ptr = (wl_network_t *)structure;

  /* Type = Found new net (without length field) */
  memset(temp, 0, sizeof(temp));
  snprintf(temp, sizeof(temp), "%.2d", NETFOUND);
  memcpy(buffer, temp, 2);
  len += 2;

  /* Set Net-type */
  memset(temp, 0, sizeof(temp));
  snprintf(temp, sizeof(temp), "%d", ptr->net_type);
  retval = add_field(buffer + len, temp, 1);
  len += retval;

  /* Set channel */
  memset(temp, 0, sizeof(temp));
  snprintf(temp, sizeof(temp), "%.2d", ptr->channel);
  retval = add_field(buffer + len, temp, 2); 
  len += retval;

  /* Set WEP y/n */
  memset(temp, 0, sizeof(temp));
  snprintf(temp, sizeof(temp), "%d", ptr->wep);
  retval = add_field(buffer + len, temp, 1);
  len += retval;

  /* Set Mac */
  retval = add_field(buffer + len, (char *)ptr->mac, 17);
  len += retval;

  /* Set ssid */
  retval = add_field(buffer + len, (char *)ptr->bssid, ptr->ssid_len);

  /* Send prepared buffer to GUI */
#ifdef DEBUG
  wl_loginfo("Sending network to GUI: '%s'", buffer);
#endif

  wl_send(guihost, guiport, buffer);

  return 1;
}

/* Fill buffer into structur */
int get_network_found (void *structure, const char *buffer)
{
  wl_network_t *ptr;
  char temp[512];
  int retval=0, len=0;

  ptr = (wl_network_t *)structure;
  
  /* packet type already determined */
  len += 2;

  /* Get net type */
  memset(temp, 0, sizeof(temp));
  retval = get_field(buffer + len, temp);
  len += retval;
  ptr->net_type = atoi(temp); 
   
  /* Get channel */
  memset(temp, 0, sizeof(temp));
  retval = get_field(buffer + len, temp);
  len += retval;
  ptr->channel = atoi(temp);

  /* Set WEP y/n */
  memset(temp, 0, sizeof(temp));
  retval = get_field(buffer + len, temp);
  len += retval;
  ptr->wep = atoi(temp);

  /* Set MAC address */
  retval = get_field(buffer + len, ptr->mac);
  len += retval;

  /* Set BSSID */
  retval = get_field(buffer + len, ptr->bssid);

  return 1;
}