#include #include #include #include #include #include extern char **environ; void quit(GtkWidget *window, gpointer data) { gtk_exit(0); } void execute(GtkWidget *widget, GtkWidget *entry) { int i, j, b; char *cmd = gtk_entry_get_text(GTK_ENTRY(entry)); char *argv[100], exe[100], *path[9]; struct stat bf; for (i=0; i<100; i++) { argv[i] = malloc(500); memset(argv[i], 0, 500); } i = j = b = 0; memset(exe, 0, 100); if (*cmd == 0) gtk_exit(0); while (*cmd == ' ') cmd++; while (*cmd != 0) { argv[i][j] = (*cmd != ' ') ? *cmd : (!b) ? 0 : ' '; if (*cmd == '"' || *cmd == '\'') b = (b) ? 0 : 1, j--; if (*cmd == ' ' && !b) { if (strcmp(argv[i], " ") > 0) i++; j=0; cmd++; } else j++, cmd++; } argv[i][j] = (argv[i][j] == '"' || argv[i][j] == '\'') ? 0 : argv[i][j]; if (i == 0 && j == 0) gtk_exit(0); argv[i+1] = 0; path[0] = "/bin"; path[1] = "/sbin"; path[2] = "/usr/bin"; path[3] = "/usr/sbin"; path[4] = "/usr/local/bin"; path[5] = "/usr/local/sbin"; path[6] = "/usr/games"; path[7] = "/usr/X11R6/bin"; path[8] = "."; if (argv[0][0] != '/') for (i=0; i<9; i++) { sprintf(exe, "%s/%s", path[i], argv[0]); if (stat(exe, &bf) == 0) break; } else strcpy(exe, argv[0]); if (execve(exe, argv, environ) == -1) gtk_exit(1); } int main(int argc, char *argv[]) { GtkWidget *window, *entry; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_uposition(GTK_WIDGET(window), 200, 300); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(quit), 0); entry = gtk_entry_new_with_max_length (1024); gtk_widget_set_usize(GTK_WIDGET(entry), 400, 20); gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(execute), entry); gtk_container_add(GTK_CONTAINER(window), entry); gtk_widget_show(entry); gtk_widget_show(window); gtk_window_set_focus(GTK_WINDOW(window), entry); gtk_main(); return 0; }