Ticket #461: navit.diff.works.on.opensuse.c

File navit.diff.works.on.opensuse.c, 3.6 KB (added by number6, 11 years ago)

Proper diff

Line 
1Index: navit.c
2===================================================================
3--- navit.c    (revision 3744)
4+++ navit.c    (working copy)
5@@ -735,6 +735,94 @@
6     }
7 }
8 
9+static void
10+navit_cmd_sys_cmd(struct navit *this, char *function, struct attr **in, struct attr ***out, int *valid)
11+{
12+    navit_float x, y;
13+    char *cx, *cy;
14+    FILE * fp;
15+    int n, nparms, number_parms, no_default_parms, validpos;
16+    const char ** user_parms;
17+    struct attr valid_attr, geo_attr;
18+
19+     
20+    validpos = 1;
21+    no_default_parms = 0;
22+
23+
24+    nparms=0;
25+
26+    if(in)
27+        {
28+            while(in[nparms])
29+                {
30+                    if (in && in[nparms] && ATTR_IS_STRING(in[nparms]->type) && in[nparms]->u.str)
31+                        {
32+                            if(strstr(in[nparms]->u.str,"NO_DEFAULT_PARMS"))
33+                                {
34+                                    no_default_parms=1;
35+                                    break;
36+                                }
37+                        }
38+                    else
39+                        {
40+                            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);
41+                            return;
42+                        }
43+                    nparms++;
44+                }
45+            if(!no_default_parms)
46+                {
47+                    /* Currently latitude, longitude and NULL */
48+                    number_parms = nparms + 3;
49+                }
50+            else
51+                number_parms = nparms + 1;
52+             
53+            user_parms = malloc((number_parms) * sizeof(const char **));
54+            if (!user_parms)
55+                return;
56+             
57+            for (n=0; n<nparms; n++)
58+                {
59+                    user_parms[n] = (const char *) in[n]->u.str;
60+                }
61+            if (!no_default_parms)
62+                {
63+                    cx=malloc(250);
64+                    cy = malloc(250);
65+                     
66+                    sprintf(cx, "%f", x);
67+                    sprintf(cy, "%f", y);
68+
69+                    user_parms[nparms] = (const char *) cx;
70+                    user_parms[nparms + 1] = (const char *) cy;
71+                    user_parms[nparms + 2] = NULL;
72+                }
73+            else
74+                user_parms[nparms] = NULL;
75+             
76+             
77+/* Check the existence of the file, FIXME Should check too the exec permissions */
78+            fp = fopen(user_parms[0], "r");
79+            if (fp == NULL)
80+                {
81+                    fprintf(stderr, "Warning: File '%s' not found\n", user_parms[0]);
82+                    return;
83+                }
84+            else
85+                {
86+                    fclose(fp);
87+                    if (fork() == 0)
88+                        {
89+                               execv(user_parms[0], (char *const) user_parms);
90+                //system(user_parms[0]);
91+                        }
92+                }             
93+        }
94+}
95+
96+
97 static struct command_table commands[] = {
98     {"zoom_in",command_cast(navit_cmd_zoom_in)},
99     {"zoom_out",command_cast(navit_cmd_zoom_out)},
100@@ -744,6 +832,7 @@
101     {"set_destination",command_cast(navit_cmd_set_destination)},
102     {"announcer_toggle",command_cast(navit_cmd_announcer_toggle)},
103     {"fmt_coordinates",command_cast(navit_cmd_fmt_coordinates)},
104+    {"sys_cmd", command_cast(navit_cmd_sys_cmd)},
105 };
106     
107