/*! General callback for executing shells. * The argument is a command followed by arguments as defined in the input syntax. * Simple example: * CLIgen input syntax: <a type:int32>, cligen_exec_cb("ls ${a}"); * CLI input: > 42 * Shell command: ls 42 * More advanced example: * CLIgen input syntax: [<a type:int> | <b type:ipv4addr>], * cligen_exec_cb("foo.sh ${a:-99} ${b:-1.2.3.4}"); * CLI input: > 22 * Shell command: foo.sh 22 1.2.3.4 * CLI input: > 2.3.4.5 * Shell command: foo.sh 99 1.2.3.4. */ int cligen_exec_cb(cligen_handle handle, cvec *cvv, cvec *argv) { cg_var *cv = NULL; char buf[64]; int pid; int ret; int status; if (argv == NULL) return 0; if ((pid = fork()) == 0){ /* child */ while ((cv = cvec_each1(cvv, cv)) != NULL) { if (cv_const_get(cv)) continue; cv2str(cv, buf, sizeof(buf)-1); setenv(cv_name_get(cv), buf, 1 ); } cv2str(cvec_i(argv, 0), buf, sizeof(buf)-1); ret = system(buf); exit(0); } /* Wait for child to finish */ if(waitpid (pid, &status, 0) == pid) ret = WEXITSTATUS(status); else ret = -1; return ret; }
static PyObject * CgVar_const_get(CgVar *self) { if (cv_const_get(self->cv)) Py_RETURN_TRUE; else Py_RETURN_FALSE; }