1#include <glib.h> 2#include <gdk/gdk.h> 3#include <gtk/gtkwindow.h> 4#include <gtk/gtkmain.h> 5#include <gtk/gtkbutton.h> 6#include <gtk/gtkvbox.h> 7#include <gtk/gtklabel.h> 8#include <gtk/gtkentry.h> 9#include <gtk/gtksignal.h> 10 11#include <stdio.h> 12#include <string.h> 13#include <stdlib.h> 14#include <unistd.h> 15#include <syslog.h> 16 17int outfd; 18int err; 19 20static void okpressed(void *widget, void *clientdata) 21{ 22 GtkWidget *answer=clientdata; 23 gchar *pass; 24 int passlen; 25 ssize_t wrote; 26 (void)widget; 27 28 pass=gtk_entry_get_text(GTK_ENTRY(answer)); 29 30 passlen=strlen(pass); 31 if(!passlen) 32 return; 33 34 if((wrote=write(outfd, pass, passlen))!=passlen) { 35 if(wrote<0) 36 syslog(LOG_ERR, "write error on outpipe: %m"); 37 else 38 syslog(LOG_ERR, "short write on outpipe"); 39 err=1; 40 } 41 gtk_main_quit(); 42} 43 44int main(int argc, char **argv) 45{ 46 GtkWidget *mainwindow, *vbox, *question, *answer, *ok; 47 char buf[1024]; 48 gtk_init(&argc, &argv); 49 50 openlog(argv[0], LOG_PID, LOG_DAEMON); 51 if(argc!=4) { 52 syslog(LOG_WARNING, "Usage error"); 53 return 1; 54 } 55 outfd=atoi(argv[3]); 56 mainwindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); 57 gtk_window_set_title(GTK_WINDOW(mainwindow), "pppgetpass"); 58 gtk_signal_connect(GTK_OBJECT(mainwindow), "destroy", 59 GTK_SIGNAL_FUNC(gtk_main_quit), 0); 60 61 vbox=gtk_vbox_new(FALSE, 5); 62 gtk_container_add(GTK_CONTAINER(mainwindow), vbox); 63 gtk_widget_show(vbox); 64 65 if(argv[1][0] && argv[2][0]) 66 snprintf(buf, sizeof buf, "Password for PPP client %s on server %s: ", argv[1], argv[2]); 67 else if(argv[1][0] && !argv[2][0]) 68 snprintf(buf, sizeof buf, "Password for PPP client %s: ", argv[1]); 69 else if(!argv[1][0] && argv[2][0]) 70 snprintf(buf, sizeof buf, "Password for PPP on server %s: ", argv[2]); 71 else 72 snprintf(buf, sizeof buf, "Enter PPP password: "); 73 question=gtk_label_new(buf); 74 gtk_box_pack_start(GTK_BOX(vbox), question, FALSE, TRUE, 0); 75 gtk_widget_show(question); 76 77 answer=gtk_entry_new(); 78 gtk_entry_set_visibility(GTK_ENTRY(answer), 0); 79 gtk_box_pack_start(GTK_BOX(vbox), answer, FALSE, TRUE, 0); 80 gtk_widget_show(answer); 81 82 ok=gtk_button_new_with_label("OK"); 83 gtk_box_pack_start(GTK_BOX(vbox), ok, FALSE, TRUE, 0); 84 gtk_signal_connect(GTK_OBJECT(ok), "clicked", 85 GTK_SIGNAL_FUNC(okpressed), answer); 86 gtk_widget_show(ok); 87 88 gtk_widget_show(mainwindow); 89 gtk_main(); 90 91 return err; 92} 93