Changeset 9ee5268 in rtems-libbsd


Ignore:
Timestamp:
Jun 26, 2015, 5:15:57 AM (4 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.11, 5283630d2c9d40deb0183696d278e02644fe4326, freebsd-9.3, bc2ba9a9cdc7381c2a4f2ae6ee303be636f31368
Children:
c6e5395
Parents:
45a6041
Message:

tcpdump: Allow enter/return to exit tcpdump.

Implement the PCAP loop in a separate thread and block the shell
thread in the stdin getchar. When a user presses enter/return
call the PCAP break loop function to have it return.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • freebsd/contrib/tcpdump/tcpdump.c

    r45a6041 r9ee5268  
    4646#include <machine/rtems-bsd-program.h>
    4747#include <machine/rtems-bsd-commands.h>
     48#include <rtems.h>
    4849#endif /* __rtems__ */
    4950
     
    111112#define SIGNAL_REQ_INFO SIGUSR1
    112113#endif
     114
     115#ifdef __rtems__
     116/*
     117 * Run the PCAP loop in a separate task and have the shell thread block on the
     118 * input.
     119 */
     120typedef struct
     121{
     122    volatile bool running;
     123    pcap_t *pd;
     124    int cnt;
     125    pcap_handler cb;
     126    u_char *ud;
     127    int ret;
     128} rtems_pcap_loop_args;
     129
     130static void
     131rtems_pcap_loop_thread (rtems_task_argument arg)
     132{
     133    rtems_pcap_loop_args* pcap_loop_arg = (rtems_pcap_loop_args*) arg;
     134
     135    pcap_loop_arg->ret = pcap_loop(pcap_loop_arg->pd,
     136                                   pcap_loop_arg->cnt,
     137                                   pcap_loop_arg->cb,
     138                                   pcap_loop_arg->ud);
     139
     140    pcap_loop_arg->running = false;
     141
     142    rtems_task_delete(RTEMS_SELF);
     143}
     144
     145static int
     146rtems_pcap_loop(pcap_t *pd, int cnt, pcap_handler cb, u_char *ud)
     147{
     148    rtems_status_code   sc;
     149    rtems_task_priority priority;
     150    rtems_name          name;
     151    rtems_id            id;
     152
     153    rtems_pcap_loop_args pcap_loop_args;
     154
     155    pcap_loop_args.running = true;
     156    pcap_loop_args.pd = pd;
     157    pcap_loop_args.cnt = cnt;
     158    pcap_loop_args.cb = cb;
     159    pcap_loop_args.ud = ud;
     160    pcap_loop_args.ret = 0;
     161
     162    sc = rtems_task_set_priority (RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &priority);
     163
     164    if (sc != RTEMS_SUCCESSFUL) {
     165        fprintf(stderr, "error: cannot get current priority: %s\n",
     166                rtems_status_text (sc));
     167        return -1;
     168    }
     169
     170    name = rtems_build_name('T', 'C', 'P', 'D');
     171
     172    sc = rtems_task_create (name, priority, 4 * 1024,
     173                            RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
     174                            RTEMS_PREEMPT | RTEMS_TIMESLICE | RTEMS_NO_ASR,
     175                            &id);
     176
     177    if (sc != RTEMS_SUCCESSFUL)
     178    {
     179        fprintf(stderr, "error: cannot create helper thread: %s\n",
     180                rtems_status_text (sc));
     181        return -1;
     182    }
     183
     184    sc = rtems_task_start (id,
     185                           rtems_pcap_loop_thread,
     186                           &pcap_loop_args);
     187    if (sc != RTEMS_SUCCESSFUL)
     188    {
     189        fprintf(stderr, "error: cannot start helper thread: %s\n",
     190                rtems_status_text (sc));
     191        rtems_task_delete (id);
     192        return -1;
     193    }
     194
     195    printf("Press ENTER to end\n");
     196
     197    while (true)
     198    {
     199        int c = getchar ();
     200
     201        if ((c == '\r') || (c == '\n') || (c == 'q') || (c == 'Q'))
     202        {
     203            pcap_breakloop(pd);
     204            while (true)
     205            {
     206                if (!pcap_loop_args.running)
     207                    break;
     208                usleep(10000);
     209            }
     210            break;
     211        }
     212    }
     213
     214    return 0;
     215}
     216#define pcap_loop rtems_pcap_loop
     217#endif /* __rtems__ */
    113218
    114219netdissect_options Gndo;
Note: See TracChangeset for help on using the changeset viewer.