Changeset 3874


Ignore:
Timestamp:
Nov 2, 2009, 6:25:45 PM (11 years ago)
Author:
Pascal Terjan
Message:
  • Add first version of process selector
Location:
neercs/trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/grab.c

    r3873 r3874  
    2020#include <errno.h>
    2121#include <fcntl.h>
     22#include <glob.h>
     23#include <libgen.h>
    2224#include <signal.h>
    2325#include <stdio.h>
     
    197199}
    198200
     201struct process {
     202    long pid;
     203    char *cmdline;
     204};
     205
     206static int list_process(struct process ** process_list)
     207{
     208    glob_t pglob;
     209    unsigned int i, n=0;
     210    glob("/proc/[0-9]*", GLOB_NOSORT, NULL, &pglob);
     211    *process_list = malloc(pglob.gl_pathc*sizeof(struct process));
     212    for(i=0; i<pglob.gl_pathc; i++)
     213    {
     214        glob_t pglob2;
     215        unsigned int j;
     216        char * fds;
     217        (*process_list)[n].pid = atoi(basename(pglob.gl_pathv[i]));
     218        /* Don't allow grabbing ourselves */
     219        if((*process_list)[n].pid == getpid())
     220            continue;
     221        asprintf(&fds, "%s/fd/*", pglob.gl_pathv[i]);
     222        glob(fds, GLOB_NOSORT, NULL, &pglob2);
     223        free(fds);
     224        for(j=0; j<pglob2.gl_pathc; j++)
     225        {
     226            char path[4096];
     227            readlink(pglob2.gl_pathv[j], path, sizeof(path));
     228            if(strstr(path, "/dev/pt"))
     229            {
     230                char * cmdfile;
     231                int fd;
     232                asprintf(&cmdfile, "%s/cmdline", pglob.gl_pathv[i]);
     233                fd = open(cmdfile, O_RDONLY);
     234                free(cmdfile);
     235                if(fd)
     236                {
     237                    read(fd, path,  sizeof(path));
     238                    (*process_list)[n].cmdline = strdup(path);
     239                    close(fd);
     240                    n++;
     241                    break;
     242                }
     243            }
     244        }
     245        globfree(&pglob2);
     246    }
     247    globfree(&pglob);
     248    return n;
     249}
     250
     251long select_process(struct screen_list* screen_list)
     252{
     253    caca_event_t ev;
     254    enum caca_event_type t;
     255    int current_line = 1;
     256    int refresh = 1;
     257    int nb_process, i;
     258    int ret = 0;
     259    int start = 0;
     260    struct process * process_list;
     261
     262    nb_process = list_process(&process_list);
     263
     264    screen_list->cv = caca_create_canvas(0, 0);
     265    screen_list->dp = caca_create_display(screen_list->cv);
     266    if(!screen_list->dp)
     267        goto end;
     268    caca_set_cursor(screen_list->dp, 0);
     269    caca_set_display_title(screen_list->dp, PACKAGE_STRING);
     270    while(1)
     271    {
     272        if(refresh)
     273        {
     274            caca_set_color_ansi(screen_list->cv, CACA_BLUE, CACA_BLUE);
     275            caca_fill_box(screen_list->cv,
     276                          0, 0,
     277                          caca_get_canvas_width(screen_list->cv),
     278                          caca_get_canvas_height(screen_list->cv),
     279                          '#');
     280            caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_BLUE);
     281            caca_draw_cp437_box(screen_list->cv,
     282                                0, 0,
     283                                caca_get_canvas_width(screen_list->cv),
     284                                caca_get_canvas_height(screen_list->cv)
     285                                );
     286            caca_printf(screen_list->cv, 2, 2, "Please select a process to grab:");
     287            for(i=0; i<nb_process && i<caca_get_canvas_height(screen_list->cv)-4; i++)
     288            {
     289                if(i == current_line-1)
     290                {
     291                    caca_set_attr(screen_list->cv, CACA_BOLD);
     292                    caca_set_color_ansi(screen_list->cv, CACA_GREEN, CACA_BLUE);
     293                    caca_put_char(screen_list->cv, 1, i+3, '>');
     294                }
     295                else
     296                {
     297                    caca_set_attr(screen_list->cv, 0);
     298                    caca_set_color_ansi(screen_list->cv, CACA_LIGHTGRAY, CACA_BLUE);
     299                    caca_put_char(screen_list->cv, 1, i+3, ' ');
     300                }
     301                caca_printf(screen_list->cv,
     302                            3, i+3,
     303                            "%5d %s",
     304                            process_list[i+start].pid,
     305                            process_list[i+start].cmdline);
     306            }
     307            caca_refresh_display(screen_list->dp);
     308            refresh = 0;
     309        }
     310       
     311        if(!caca_get_event(screen_list->dp,
     312                           CACA_EVENT_KEY_PRESS
     313                           |CACA_EVENT_RESIZE
     314                           |CACA_EVENT_QUIT,
     315                           &ev, 10000))
     316            continue;
     317       
     318        t = caca_get_event_type(&ev);
     319       
     320        if(t & CACA_EVENT_KEY_PRESS)
     321        {
     322            unsigned int c = caca_get_event_key_ch(&ev);
     323            switch(c)
     324            {
     325            case CACA_KEY_UP:
     326                if(current_line>1)
     327                    current_line--;
     328                if(current_line < start && start > 0)
     329                    start--;
     330                break;
     331            case CACA_KEY_DOWN:
     332                if(current_line<nb_process)
     333                    current_line++;
     334                if(current_line > start + caca_get_canvas_height(screen_list->cv)-3)
     335                    start++;
     336                break;
     337            case CACA_KEY_RETURN:
     338                ret = process_list[current_line-1].pid;
     339                goto end;
     340                break;
     341            case CACA_KEY_ESCAPE:
     342                goto end;
     343                break;
     344            default:
     345                break;
     346            }
     347            refresh = 1;
     348        }
     349        else if(t & CACA_EVENT_RESIZE)
     350        {
     351            refresh = 1;
     352        }
     353        else if(t & CACA_EVENT_QUIT)
     354            goto end;
     355    }
     356
     357end:
     358    if(screen_list->dp)
     359    {
     360        caca_free_display(screen_list->dp);
     361        screen_list->dp = NULL;
     362    }
     363    if(screen_list->cv)
     364    {
     365        caca_free_canvas(screen_list->cv);
     366        screen_list->cv = NULL;
     367    }
     368    return ret;
     369}
     370
  • neercs/trunk/src/main.c

    r3872 r3874  
    6969    printf("Options :\n");
    7070    printf("\t--config\t-c <file>\t\tuse given config file\n");
    71     printf("\t--pid\t\t-P <pid>\t\tgrab <pid>\n");
     71    printf("\t--pid\t\t-P [pid]\t\tgrab process\n");
    7272    printf("\t\t\t-r [session]\t\treattach to a detached neercs\n");
    7373    printf("\t\t\t-R [session]\t\treattach if possible, otherwise start a new session\n");
     
    449449                { "config",      1, NULL, 'c' },
    450450#if defined USE_GRAB
    451                 { "pid",         1, NULL, 'P' },
     451                { "pid",         0, NULL, 'P' },
    452452#endif
    453453                { "help",        0, NULL, 'h' },
     
    456456            };
    457457#if defined USE_GRAB
    458         int c = mygetopt(argc, argv, "c:S:R::r::P:hv", long_options, &option_index);
     458        int c = mygetopt(argc, argv, "c:S:R::r::P::hv", long_options, &option_index);
    459459#else
    460460        int c = mygetopt(argc, argv, "c:S:R::r::hv", long_options, &option_index);
     
    477477            break;
    478478        case 'P': /* --pid */
    479             pidopt = atoi(myoptarg);
     479            if(myoptarg)
     480            {
     481                pidopt = atoi(myoptarg);
     482                if(pidopt <= 0)
     483                {
     484                    fprintf(stderr, "Invalid pid %d\n", pidopt);
     485                    if(screen_list->to_grab)
     486                        free(screen_list->to_grab);
     487                    return -1;
     488                }
     489            }
     490            else
     491                pidopt = select_process(screen_list);
    480492            if(pidopt <= 0)
    481493            {
    482                 fprintf(stderr, "Invalid pid %d\n", pidopt);
    483                 if(screen_list->to_grab)
    484                     free(screen_list->to_grab);
    485                 return -1;
     494                s+=1;
     495                break;
    486496            }
    487497            if(!screen_list->to_grab)
  • neercs/trunk/src/neercs.h

    r3457 r3874  
    228228int create_pty_grab(long pid, unsigned int w, unsigned int h);
    229229int grab_process(long pid, char *ptyname, int ptyfd);
     230long select_process(struct screen_list* screen_list);
    230231
    231232long int import_term(struct screen_list *screen_list, struct screen *sc, void const *data, unsigned int size);
Note: See TracChangeset for help on using the changeset viewer.