summaryrefslogtreecommitdiff
path: root/noncore/net/wellenreiter/libwellenreiter/source/wl_proto.cc
blob: 0d0f075d462e61deb5d4ee1df6334da4da980432 (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
/*
 * Communication protocol
 *
 * $Id$
 */

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

/* Adds a field to the buffer */
int add_field(char *buffer, const char *string, int len)
{
  char newlen[5];
  
  /* 3 Byte = Length */
  memset(newlen, 0, sizeof(newlen));
  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, int maxlen)
{
  char len[5];

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

  /* Copy buffer to out pointer */
  memset(out, 0, maxlen);
  if(atoi(len) > maxlen -1)
    memcpy(out, buffer + 3, maxlen - 1);
  else
    memcpy(out, buffer + 3, atoi(len));

  /* Return length of whole field (including 3 byte length) */
  return (atoi(len) + 3);
}

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

  ptr = (wl_network_t *)structure;

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

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

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

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

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

  /* Set ssid */
  if(len + ptr->ssid_len < sizeof(buffer) - 1)
    len += add_field(buffer + len, ptr->bssid, ptr->ssid_len);
  else
    len += add_field(buffer + len, ptr->bssid, sizeof(buffer) - len - 1);

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

  return ((!wl_send(guihost, guiport, buffer)) ? 0 : 1);
}

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

  ptr = (wl_network_t *)structure;

  /* packet type already determined, skip check */
  len += 2;

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

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

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

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

  return 1;
}