#include #include #include #include #include #include #include #include #include #include #include #include #include #include int outfd; int err; static void okpressed(void *widget, void *clientdata) { GtkWidget *answer=clientdata; gchar *pass; int passlen; ssize_t wrote; (void)widget; pass=gtk_entry_get_text(GTK_ENTRY(answer)); passlen=strlen(pass); if(!passlen) return; if((wrote=write(outfd, pass, passlen))!=passlen) { if(wrote<0) syslog(LOG_ERR, "write error on outpipe: %m"); else syslog(LOG_ERR, "short write on outpipe"); err=1; } gtk_main_quit(); } int main(int argc, char **argv) { GtkWidget *mainwindow, *vbox, *question, *answer, *ok; char buf[1024]; gtk_init(&argc, &argv); openlog(argv[0], LOG_PID, LOG_DAEMON); if(argc!=4) { syslog(LOG_WARNING, "Usage error"); return 1; } outfd=atoi(argv[3]); mainwindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(mainwindow), "pppgetpass"); gtk_signal_connect(GTK_OBJECT(mainwindow), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), 0); vbox=gtk_vbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(mainwindow), vbox); gtk_widget_show(vbox); if(argv[1][0] && argv[2][0]) snprintf(buf, sizeof buf, "Password for PPP client %s on server %s: ", argv[1], argv[2]); else if(argv[1][0] && !argv[2][0]) snprintf(buf, sizeof buf, "Password for PPP client %s: ", argv[1]); else if(!argv[1][0] && argv[2][0]) snprintf(buf, sizeof buf, "Password for PPP on server %s: ", argv[2]); else snprintf(buf, sizeof buf, "Enter PPP password: "); question=gtk_label_new(buf); gtk_box_pack_start(GTK_BOX(vbox), question, FALSE, TRUE, 0); gtk_widget_show(question); answer=gtk_entry_new(); gtk_entry_set_visibility(GTK_ENTRY(answer), 0); gtk_box_pack_start(GTK_BOX(vbox), answer, FALSE, TRUE, 0); gtk_widget_show(answer); ok=gtk_button_new_with_label("OK"); gtk_box_pack_start(GTK_BOX(vbox), ok, FALSE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(okpressed), answer); gtk_widget_show(ok); gtk_widget_show(mainwindow); gtk_main(); return err; }