typedef int (*setmode_op_t)(pcap_t *, int);
typedef int (*setmintocopy_op_t)(pcap_t *, int);
typedef HANDLE (*getevent_op_t)(pcap_t *);
-typedef int (*oid_get_request_op_t)(pcap_t *, pcap_oid_data_t *);
-typedef int (*oid_set_request_op_t)(pcap_t *, pcap_oid_data_t *);
+typedef int (*oid_get_request_op_t)(pcap_t *, bpf_u_int32, void *, size_t);
+typedef int (*oid_set_request_op_t)(pcap_t *, bpf_u_int32, const void *, size_t);
typedef u_int (*sendqueue_transmit_op_t)(pcap_t *, pcap_send_queue *, int);
typedef int (*setuserbuffer_op_t)(pcap_t *, int);
typedef int (*live_dump_op_t)(pcap_t *, char *, int, int);
}
static int
-TcOidGetRequest(pcap_t *p, pcap_oid_data_t *data _U_)
+TcOidGetRequest(pcap_t *p, bpf_u_int32 oid _U_, void *data _U_, size_t len _U_
{
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"An OID get request cannot be performed on a TurboCap device");
}
static int
-TcOidSetRequest(pcap_t *p, pcap_oid_data_t *data _U_)
+TcOidSetRequest(pcap_t *p, bpf_u_int32 oid _U_, const void *data _U_,
+ size_t len _U_)
{
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"An OID set request cannot be performed on a TurboCap device");
}
static int
-pcap_oid_get_request_win32(pcap_t *p, pcap_oid_data_t *data)
+pcap_oid_get_request_win32(pcap_t *p, bpf_u_int32 oid, void *data, size_t len)
{
+ PACKET_OID_DATA *oid_data_arg;
char errbuf[PCAP_ERRBUF_SIZE+1];
- if (!PacketRequest(p->adapter, FALSE, data)) {
+ /*
+ * Allocate a PACKET_OID_DATA structure to hand to PacketRequest().
+ * It should be big enough to hold "len" bytes of data; it
+ * will actually be slightly larger, as PACKET_OID_DATA has a
+ * 1-byte data array at the end, standing in for the variable-length
+ * data that's actually there.
+ */
+ oid_data_arg = malloc(sizeof (PACKET_OID_DATA) + len);
+ if (oid_data_arg == NULL) {
+ snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+ "Couldn't allocate argument buffer for PacketRequest");
+ return PCAP_ERROR);
+ }
+
+ /*
+ * No need to copy the data - we're doing a fetch.
+ */
+ oid_data_arg->oid = oid;
+ oid_data_arg->length = len;
+ if (!PacketRequest(p->adapter, FALSE, oid_data_arg)) {
pcap_win32_err_to_str(GetLastError(), errbuf);
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"Error calling PacketRequest: %s", errbuf);
+ free(oid_data_arg);
return PCAP_ERROR;
}
+
+ /*
+ * Copy back the data we fetched.
+ */
+ memcpy(data, oid_data_arg->data, len);
+ free(oid_data_arg);
return 0;
}
static int
-pcap_oid_set_request_win32(pcap_t *p, pcap_oid_data_t *data)
+pcap_oid_set_request_win32(pcap_t *p, bpf_u_int32 oid, const void *data,
+ size_t len)
{
+ PACKET_OID_DATA *oid_data_arg;
char errbuf[PCAP_ERRBUF_SIZE+1];
+ /*
+ * Allocate a PACKET_OID_DATA structure to hand to PacketRequest().
+ * It should be big enough to hold "len" bytes of data; it
+ * will actually be slightly larger, as PACKET_OID_DATA has a
+ * 1-byte data array at the end, standing in for the variable-length
+ * data that's actually there.
+ */
+ oid_data_arg = malloc(sizeof (PACKET_OID_DATA) + len);
+ if (oid_data_arg == NULL) {
+ snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+ "Couldn't allocate argument buffer for PacketRequest");
+ return PCAP_ERROR);
+ }
+
+ oid_data_arg->oid = oid;
+ oid_data_arg->length = len;
+ memcpy(oid_data_arg->data, data, len);
if (!PacketRequest(p->adapter, TRUE, data)) {
pcap_win32_err_to_str(GetLastError(), errbuf);
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"Error calling PacketRequest: %s", errbuf);
+ free(oid_data_arg);
return PCAP_ERROR;
}
+
+ /*
+ * No need to copy the data - we're doing a set.
+ */
+ free(oid_data_arg);
return 0;
}
}
int
-pcap_oid_get_request(pcap_t *p, pcap_oid_data_t *data)
+pcap_oid_get_request(pcap_t *p, bpf_u_int32 oid, void *data, size_t len)
{
- return (p->oid_get_request_op(p, data));
+ return (p->oid_get_request_op(p, oid, data, len));
}
static int
-pcap_oid_get_request_dead(pcap_t *p, pcap_oid_data_t *data)
+pcap_oid_get_request_dead(pcap_t *p, bpf_u_int32 oid _U_, void *data _U_,
+ size_t len _U_)
{
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"An OID get request cannot be performed on a pcap_open_dead pcap_t");
}
int
-pcap_oid_set_request(pcap_t *p, pcap_oid_data_t *data)
+pcap_oid_set_request(pcap_t *p, bpf_u_int32 oid, const void *data, size_t len)
{
- return (p->oid_set_request_op(p, data));
+ return (p->oid_set_request_op(p, oid, data, len));
}
static int
-pcap_oid_set_request_dead(pcap_t *p, pcap_oid_data_t *data)
+pcap_oid_set_request_dead(pcap_t *p, bpf_u_int32 oid _U_, const void *data _U_,
+ size_t len _U_)
{
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"An OID set request cannot be performed on a pcap_open_dead pcap_t");
HANDLE pcap_getevent(pcap_t *p);
-/*
- * Same as Packet.dll's PACKET_OID_DATA.
- */
-typedef struct {
- bpf_u_int32 oid; /* OID code */
- bpf_u_int32 length; /* length of the data field */
- u_char data[1]; /* first byte of the data field */
-} pcap_oid_data_t;
-
-int pcap_oid_get_request(pcap_t *p, pcap_oid_data_t *data);
-int pcap_oid_set_request(pcap_t *p, pcap_oid_data_t *data);
+int pcap_oid_get_request(pcap_t *, bpf_u_int32, void *, size_t);
+int pcap_oid_set_request(pcap_t *, bpf_u_int32, const void *, size_t);
pcap_send_queue* pcap_sendqueue_alloc(u_int memsize);
}
static int
-sf_oid_get_request(pcap_t *p, pcap_oid_data_t *data)
+sf_oid_get_request(pcap_t *p, bpf_u_int32 oid _U_, void *data _U_,
+ size_t len _U_)
{
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"An OID get request cannot be performed on a file");
}
static int
-sf_oid_set_request(pcap_t *p, pcap_oid_data_t *data)
+sf_oid_set_request(pcap_t *p, bpf_u_int32 oid _U_, const void *data _U_,
+ size_t len _U_)
{
snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
"An OID set request cannot be performed on a file");