HelenOS sources
This source file includes following definitions.
- pcapctl_dump_exchange_end
- pcapctl_cat_get_svc
- pcapctl_is_valid_device
- pcapctl_is_valid_ops_number
- pcapctl_list
- pcapctl_dump_open
- pcapctl_dump_close
- pcapctl_dump_start
- pcapctl_dump_stop
#include <errno.h>
#include <async.h>
#include <str.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include "pcapdump_client.h"
#include "pcapdump_ipc.h"
static void pcapctl_dump_exchange_end(async_exch_t *exch)
{
async_exchange_end(exch);
}
static errno_t pcapctl_cat_get_svc(int *index, service_id_t *svc)
{
errno_t rc;
category_id_t pcap_cat;
size_t count;
service_id_t *pcap_svcs = NULL;
rc = loc_category_get_id("pcap", &pcap_cat, 0);
if (rc != EOK) {
fprintf(stderr, "Error resolving category 'pcap'.\n");
return rc;
}
rc = loc_category_get_svcs(pcap_cat, &pcap_svcs, &count);
if (rc != EOK) {
fprintf(stderr, "Error resolving list of pcap services.\n");
free(pcap_svcs);
return rc;
}
if (*index < (int)count) {
*svc = pcap_svcs[*index];
free(pcap_svcs);
return EOK;
}
return ENOENT;
}
errno_t pcapctl_is_valid_device(int *index)
{
errno_t rc;
category_id_t pcap_cat;
size_t count;
service_id_t *pcap_svcs = NULL;
rc = loc_category_get_id("pcap", &pcap_cat, 0);
if (rc != EOK) {
fprintf(stderr, "Error resolving category pcap.\n");
return rc;
}
rc = loc_category_get_svcs(pcap_cat, &pcap_svcs, &count);
if (rc != EOK) {
fprintf(stderr, "Error resolving list of pcap services.\n");
free(pcap_svcs);
return rc;
}
if (*index + 1 > (int)count || *index < 0) {
return EINVAL;
}
return EOK;
}
errno_t pcapctl_is_valid_ops_number(int *index, pcapctl_sess_t *sess)
{
async_exch_t *exch = async_exchange_begin(sess->sess);
ipc_call_t answer;
aid_t req = async_send_0(exch, PCAP_CONTROL_GET_OPS_NUM, &answer);
async_exchange_end(exch);
errno_t retval;
async_wait_for(req, &retval);
if (retval != EOK) {
return retval;
}
int ops_count = (int)ipc_get_arg1(&answer);
if (*index + 1 > ops_count || *index < 0) {
return EINVAL;
}
return EOK;
}
errno_t pcapctl_list(void)
{
errno_t rc;
category_id_t pcap_cat;
size_t count;
service_id_t *pcap_svcs = NULL;
rc = loc_category_get_id("pcap", &pcap_cat, 0);
if (rc != EOK) {
fprintf(stderr, "Error resolving category pcap.\n");
return rc;
}
rc = loc_category_get_svcs(pcap_cat, &pcap_svcs, &count);
if (rc != EOK) {
fprintf(stderr, "Error resolving list of pcap services.\n");
free(pcap_svcs);
return rc;
}
fprintf(stdout, "Devices:\n");
for (unsigned i = 0; i < count; ++i) {
char *name = NULL;
loc_service_get_name(pcap_svcs[i], &name);
fprintf(stdout, "%d. %s\n", i, name);
}
free(pcap_svcs);
return EOK;
}
errno_t pcapctl_dump_open(int *index, pcapctl_sess_t **rsess)
{
errno_t rc;
service_id_t svc;
pcapctl_sess_t *sess = calloc(1, sizeof(pcapctl_sess_t));
if (sess == NULL)
return ENOMEM;
if (*index == -1) {
*index = 0;
}
rc = pcapctl_cat_get_svc(index, &svc);
if (rc != EOK) {
fprintf(stderr, "Error finding the device with index: %d\n", *index);
goto error;
}
async_sess_t *new_session = loc_service_connect(svc, INTERFACE_PCAP_CONTROL, 0);
if (new_session == NULL) {
fprintf(stderr, "Error connecting to service.\n");
rc = EREFUSED;
goto error;
}
sess->sess = new_session;
*rsess = sess;
return EOK;
error:
pcapctl_dump_close(sess);
return rc;
}
errno_t pcapctl_dump_close(pcapctl_sess_t *sess)
{
free(sess);
return EOK;
}
errno_t pcapctl_dump_start(const char *name, int *ops_index, pcapctl_sess_t *sess)
{
errno_t rc;
async_exch_t *exch = async_exchange_begin(sess->sess);
size_t size = str_size(name);
aid_t req = async_send_1(exch, PCAP_CONTROL_SET_START, *ops_index, NULL);
rc = async_data_write_start(exch, name, size);
pcapctl_dump_exchange_end(exch);
if (rc != EOK) {
async_forget(req);
return rc;
}
errno_t retval;
async_wait_for(req, &retval);
return retval;
}
errno_t pcapctl_dump_stop(pcapctl_sess_t *sess)
{
errno_t rc;
async_exch_t *exch = async_exchange_begin(sess->sess);
rc = async_req_0_0(exch, PCAP_CONTROL_SET_STOP);
pcapctl_dump_exchange_end(exch);
return rc;
}
HelenOS homepage, sources at GitHub