Ticket #461: sys_cmd.diff

File sys_cmd.diff, 4.3 KB (added by perepujal, 11 years ago)
  • navit.c

     
    715715        }
    716716}
    717717
     718static void
     719navit_cmd_sys_cmd(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid)
     720{
     721    navit_float x, y;
     722    char *cx, *cy;
     723    FILE * fp;
     724    int n, nparms, number_parms, no_default_parms, validpos;
     725    const char ** user_parms;
     726    struct attr valid_attr, geo_attr;
     727
     728   
     729    validpos = 1;
     730    no_default_parms = 0;
     731
     732/* Adapted from navit_layout_switch() function */
     733
     734    if (vehicle_get_attr(this->vehicle->vehicle, attr_position_coord_geo,&geo_attr,NULL)!=1) {
     735        //No position - no sun
     736        validpos = 0;
     737    }
     738
     739/* Why this is not checked first?, so don't need to get a invalid position before?
     740   Anyway, if the position is valid, this order allows to get the position closest to
     741   the place where the button was pressed.
     742   This is important at high speeds */
     743    if (vehicle_get_attr(this->vehicle->vehicle, attr_position_valid, &valid_attr,NULL) && valid_attr.u.num==attr_position_valid_invalid) {
     744        //No valid fix yet
     745        validpos = 0;       
     746    }
     747
     748    if(validpos == 1)
     749        {
     750            x = geo_attr.u.coord_geo->lng;
     751            y = geo_attr.u.coord_geo->lat;
     752        }
     753    else
     754        {
     755            x = 0;
     756            y = 0;
     757        }
     758
     759    nparms=0;
     760
     761    if(in)
     762        {
     763            while(in[nparms])
     764                {
     765                    if (in && in[nparms] && ATTR_IS_STRING(in[nparms]->type) && in[nparms]->u.str)
     766                        {
     767                            if(strstr(in[nparms]->u.str,"NO_DEFAULT_PARMS"))
     768                                {
     769                                    no_default_parms=1;
     770                                    break;
     771                                }
     772                        }
     773                    else
     774                        {
     775                            fprintf(stderr, "Incorrect parameter %i in a call to a %s() function.\nPlease, ensure that each parameter is enclosed by double quotes.\n", nparms + 1, function);
     776                            return;
     777                        }
     778                    nparms++;
     779                }
     780            if(!no_default_parms)
     781                {
     782                    /* Currently latitude, longitude and NULL */
     783                    number_parms = nparms + 3;
     784                }
     785            else
     786                number_parms = nparms + 1;
     787           
     788            user_parms = malloc((number_parms) * sizeof(const char **));
     789            if (!user_parms)
     790                return;
     791           
     792            for (n=0; n<nparms; n++)
     793                {
     794                    user_parms[n] = (const char *) in[n]->u.str;
     795                }
     796            if (!no_default_parms)
     797                {
     798                    cx=malloc(250);
     799                    cy = malloc(250);
     800                   
     801                    sprintf(cx, "%f", x);
     802                    sprintf(cy, "%f", y);
     803
     804                    user_parms[nparms] = (const char *) cx;
     805                    user_parms[nparms + 1] = (const char *) cy;
     806                    user_parms[nparms + 2] = NULL;
     807                }
     808            else
     809                user_parms[nparms] = NULL;
     810           
     811           
     812/* Check the existence of the file, FIXME Should check too the exec permissions */
     813            fp = fopen(user_parms[0], "r");
     814            if (fp == NULL)
     815                {
     816                    fprintf(stderr, "Warning: File '%s' not found\n", user_parms[0]);
     817                    return;
     818                }
     819            else
     820                {
     821                    fclose(fp);
     822                    if (fork() == 0)
     823                        {
     824                            execv(user_parms[0], (char *const) user_parms);
     825                        }
     826                }           
     827        }
     828}
     829
     830
    718831static struct command_table commands[] = {
    719832        {"zoom_in",command_cast(navit_cmd_zoom_in)},
    720833        {"zoom_out",command_cast(navit_cmd_zoom_out)},
     
    724837        {"set_destination",command_cast(navit_cmd_set_destination)},
    725838        {"announcer_toggle",command_cast(navit_cmd_announcer_toggle)},
    726839        {"fmt_coordinates",command_cast(navit_cmd_fmt_coordinates)},
     840        {"sys_cmd", command_cast(navit_cmd_sys_cmd)},
    727841};
    728842       
    729843