summaryrefslogtreecommitdiff
path: root/noncore/net/wellenreiter/libwellenreiter/source/wl_proto.cc
blob: 0630d04a9b02ecbff96a9cf6d18be8096a5f51c6 (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
/*
 * 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, const 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, int maxlen)
{
  char len[5];

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

  /* Copy buffer to out pointer */
  memset(out, 0, maxlen);

  if(atoi(len)-3 > 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;

  /* 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);
  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;
}