/* * C o p y r i g h t *(also read COPYING)* * * * * * * * * * * * * * * * * * *
 *                                                                             *
 *  Copyright (C) 2002  <Philip Van Hoof>                                      *
 *                                                                             *
 *  This program is free software; you can redistribute it and/or modify       *
 *  it under the terms of the GNU General Public License as published by       *
 *  the Free Software Foundation; either version 2 of the License, or          *
 *  (at your option) any later version.                                        *
 *                                                                             *
 *  This program is distributed in the hope that it will be useful,            *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of             *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
 *  GNU General Public License for more details.                               *
 *                                                                             *
 *  You should have received a copy of the GNU General Public License          *
 *  along with this program; if not, write to the Free Software                *
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  *
 *                                                                             *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 

#include "gui.h"


static gint
exec_su_failed (gpointer user_data)
{
#ifdef DEBUG
    printf("static gint exec_su_failed (gpointer user_data)\n");
#endif
	gnome_dialog_run_and_close (GNOME_DIALOG (gnome_error_dialog (
		_("Timeout when trying to execute 'su'."))));
	gtk_exit (EXIT_ERROR);
	return FALSE;
}


static void
su_has_died (GtkWidget *term, gpointer user_data)
{
	gchar *buf;
	gint len;

#ifdef DEBUG
    printf("static void su_has_died (GtkWidget *widget, gpointer user_data)\n");
#endif
	buf = zvt_term_get_buffer (ZVT_TERM (term), &len, VT_SELTYPE_CHAR, 3, 1, 200, 1);

	if (strlen(buf) > 1) {	
		gchar *display;

		display = g_strdup_printf("Gnome Xsu: %s ", buf);
		gnome_dialog_run_and_close (GNOME_DIALOG (gnome_error_dialog (_(display))));
		gtk_exit(EXIT_ERROR);
	} else { 
		gtk_exit(EXIT_CORRECT);
	}
	while (gtk_events_pending ()) gtk_main_iteration ();
	gtk_main_quit ();

}



void xsu_perform()
{ 
/* 
	Some code from gnomesu, thanks to Hongli Lai <hongli@telekabel.nl> 
*/
	GtkWidget *term;
	guint timeout, su_d13;
	int i; /* No gint. We will use this in a non-gnome thread */
	gchar *password_return, 
		  *username=gtk_entry_get_text (GTK_ENTRY (gtk_user_textbox)),
		  *password=gtk_entry_get_text (GTK_ENTRY (gtk_password_textbox)),
		  *command=gtk_entry_get_text (GTK_ENTRY (gtk_command_textbox));

#ifdef DEBUG
    printf("void xsu_perform()\n");
#endif

/* 0.2.1 *
	Minor security fix. Password would remain in memory if we don't
	clean the password textbox.
*/
	gtk_entry_set_text(GTK_ENTRY(gtk_password_textbox),"");
    gtk_widget_hide (gtk_xsu_window);
	
	if (password == NULL)
		return;

	term = zvt_term_new ();
	i = zvt_term_forkpty (ZVT_TERM (term), 
		ZVT_TERM_DO_UTMP_LOG | ZVT_TERM_DO_WTMP_LOG);

	su_d13 = gtk_signal_connect (GTK_OBJECT (term), "child_died", 
		GTK_SIGNAL_FUNC (su_has_died), NULL);

	if (i == 0)
	{
		gchar *buffer;

/* xsu 0.2.1 *
	Option to set the DISPLAY environment
	system() has been replaced with execlp()
   xsu 0.2.2 execlp() has been replaced with execl()
	This also fixes the problem that the zvt
	widget could not get the child_died signal.
*/
		if (set_display_env) {
			buffer = g_strdup_printf("%s%s;%s", SET_DISPL_ENV, displ_host, command);
/* xsu 0.2.4 *
	Memleak fix: Free display_host and command
*/
			g_free(displ_host);
			g_free(command);
		} else {
			buffer = g_strdup_printf("%s", command);
/* xsu 0.2.4 *
	Memleak fix: Free command
*/
			g_free(command);
		}
/* xsu 0.2.2 *
	Security issue noticed by Havoc 
	Security fix, execlp exports the PATH which is a security problem. SU_PATH contains
	the full path of the su binary found by the configure script.
*/
		/* buffer with " and/or ' gives some problems. */
		/* buffer = g_strdup_printf("%s - %s -c %s",SU_PATH, username, buffer); */

		/* su - username -c command */
		execl(SU_PATH, "-", username, "-c", buffer, NULL);
		/* We are not a gnome-application anymore but under control of su */
		
		/*username=g_strdup_printf("%s@localhost");
		  execl("/usr/bin/ssh", username, "-s", buffer, NULL);*/
		/* I tried using the SSH client for this. But it then gives an error
			that it has been put in the background after auth. */
		
		perror ("Could not exec\n");
		exit (EXIT_ERROR);
	} else if (i == -1) {
		perror ("ERROR: unable to fork:");
		gtk_exit (EXIT_ERROR);
	}
/* xsu 0.2.4 *
	Memleak fix: Free username
*/
	g_free(username);
	timeout = gtk_timeout_add (SU_DELAY, exec_su_failed, NULL);
	while (1)
	{
		char *buf;
		int len;

		buf = zvt_term_get_buffer (ZVT_TERM (term), &len,
			VT_SELTYPE_CHAR, 0, 0, strlen (SU_PWD_OUT), 0);
		if (strcmp (buf, SU_PWD_OUT) == 0)
		{
			gtk_timeout_remove (timeout);
			g_free (buf);
			break;
		}

		g_free (buf);
		while (gtk_events_pending ()) gtk_main_iteration ();
		usleep (5);
	}

	password_return = g_strdup_printf ("%s\n", password);
/* 0.2.2 *
	Minor security fix, clear the password from memory
*/  password = memset (password, 0, strlen (password));
	zvt_term_writechild (ZVT_TERM (term), password_return, strlen (password_return));
	password_return = memset (password_return, 0, strlen (password_return));
	g_free (password_return);
	g_free (password);
	password_return = NULL;
	password = NULL;

	gtk_signal_disconnect (GTK_OBJECT (term), su_d13);
	
	gtk_signal_connect (GTK_OBJECT (term), "child_died",
		GTK_SIGNAL_FUNC (su_has_died), NULL);


	gtk_main();
	return;
}


void on_gtk_password_textbox_activate (GtkButton *button, gpointer user_data)
{
#ifdef DEBUG
    printf("on_gtk_user_textbox_activate (GtkButton *button, gpointer user_data)\n");
#endif
    xsu_perform();
}

void on_gtk_user_textbox_activate (GtkButton *button, gpointer user_data)
{
#ifdef DEBUG
    printf("on_gtk_user_textbox_activate (GtkButton *button, gpointer user_data)\n");
#endif
    gtk_widget_grab_focus (gtk_password_textbox);
}

void on_gtk_command_textbox_activate (GtkButton *button, gpointer user_data)
{
#ifdef DEBUG
    printf("on_gtk_command_textbox_activate (GtkButton *button, gpointer user_data)\n");
#endif
	if (GTK_WIDGET_VISIBLE(gtk_user_textbox))
		gtk_widget_grab_focus (gtk_user_textbox);
	else
		gtk_widget_grab_focus (gtk_password_textbox);
}

void on_gtk_cancel_button_clicked (GtkButton *button, gpointer user_data)
{
#ifdef DEBUG
    printf("on_gtk_cancel_button_clicked (GtkButton *button, gpointer user_data)\n");
#endif
    exit(EXIT_ERROR);
}


void on_gtk_ok_button_clicked (GtkButton *button, gpointer user_data)
{

#ifdef DEBUG
    printf("on_gtk_ok_button_clicked (GtkButton *button, gpointer user_data)\n");
#endif
    xsu_perform();
}
GtkWidget* create_gtk_xsu_window (void)
{

  tooltips = gtk_tooltips_new ();
  gtk_xsu_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_set_name (gtk_xsu_window, "gtk_xsu_window");
  gtk_object_set_data (GTK_OBJECT (gtk_xsu_window), "gtk_xsu_window", gtk_xsu_window);
  gtk_tooltips_set_tip (tooltips, gtk_xsu_window, _(NAME " " VERSION " by " AUTHOR), NULL);
  if (title_in)
	gtk_window_set_title (GTK_WINDOW (gtk_xsu_window), arg_title);
  else 
	gtk_window_set_title (GTK_WINDOW (gtk_xsu_window), _(NAME " " VERSION));
	
  gtk_window_set_position (GTK_WINDOW (gtk_xsu_window), GTK_WIN_POS_CENTER);
  gtk_window_set_policy (GTK_WINDOW (gtk_xsu_window), FALSE, FALSE, FALSE);
  gtk_window_table = gtk_table_new (6, 2, FALSE);
  gtk_widget_set_name (gtk_window_table, "gtk_window_table");
  gtk_widget_ref (gtk_window_table);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_window_table", gtk_window_table,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_window_table);
  gtk_container_add (GTK_CONTAINER (gtk_xsu_window), gtk_window_table);

  gtk_password_label = gtk_label_new (_("Username : "));
  gtk_widget_set_name (gtk_password_label, "gtk_password_label");
  gtk_widget_ref (gtk_password_label);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_password_label", gtk_password_label,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_password_label);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_password_label, 0, 1, 2, 3,
                    (GtkAttachOptions) (GTK_FILL),
                    (GtkAttachOptions) (0), 0, 0);
  gtk_misc_set_alignment (GTK_MISC (gtk_password_label), 4.91738e-07, 0);
  gtk_misc_set_padding (GTK_MISC (gtk_password_label), 24, 8);

  gtk_commandtxt_label = gtk_label_new (_("Command :"));
  gtk_widget_set_name (gtk_commandtxt_label, "gtk_commandtxt_label");
  gtk_widget_ref (gtk_commandtxt_label);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_commandtxt_label", gtk_commandtxt_label,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_commandtxt_label);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_commandtxt_label, 0, 1, 1, 2,
                    (GtkAttachOptions) (GTK_FILL),
                    (GtkAttachOptions) (0), 0, 0);
  gtk_misc_set_alignment (GTK_MISC (gtk_commandtxt_label), 0, 7.45058e-09);
  gtk_misc_set_padding (GTK_MISC (gtk_commandtxt_label), 24, 6);

  if (message_in)
    gtk_text_label = gtk_label_new (_(arg_message));
  else
    gtk_text_label = gtk_label_new (_("The action you requested requires root\npriveleges.\nPlease enter the correct password for it\nbelow and press [Return] or click OK."));
  
  gtk_widget_set_name (gtk_text_label, "gtk_text_label");
  gtk_widget_ref (gtk_text_label);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_text_label", gtk_text_label,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_text_label);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_text_label, 1, 2, 0, 1,
                    (GtkAttachOptions) (GTK_FILL),
                    (GtkAttachOptions) (0), 0, 0);
  gtk_label_set_justify (GTK_LABEL (gtk_text_label), GTK_JUSTIFY_LEFT);
  gtk_misc_set_alignment (GTK_MISC (gtk_text_label), 0, 7.45058e-09);
  gtk_misc_set_padding (GTK_MISC (gtk_text_label), 9, 14);

  gtk_keys_pixmap = gnome_pixmap_new_from_xpm_d (keys_xpm);

  gtk_widget_set_name (gtk_keys_pixmap, "gtk_keys_pixmap");
  gtk_widget_ref (gtk_keys_pixmap);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_keys_pixmap", gtk_keys_pixmap,
                            (GtkDestroyNotify) gtk_widget_unref);
			    
  gtk_widget_show (gtk_keys_pixmap);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_keys_pixmap, 0, 1, 0, 1,
                    (GtkAttachOptions) (GTK_FILL),
                    (GtkAttachOptions) (GTK_FILL), 0, 0);

  gtk_password_textbox = gtk_entry_new ();
  gtk_widget_set_name (gtk_password_textbox, "gtk_password_textbox");
  gtk_widget_ref (gtk_password_textbox);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_password_textbox", gtk_password_textbox,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_password_textbox);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_password_textbox, 1, 2, 3, 4,
                    (GtkAttachOptions) (GTK_EXPAND),
                    (GtkAttachOptions) (0), 0, 0);	    
  gtk_widget_set_usize (gtk_password_textbox, 230, -2);
  gtk_tooltips_set_tip (tooltips, gtk_password_textbox, _("Type the password here"), NULL);
  gtk_entry_set_visibility (GTK_ENTRY (gtk_password_textbox), FALSE);

  gtk_user_textbox = gtk_entry_new ();
  gtk_widget_set_name (gtk_user_textbox, "gtk_user_textbox");
  gtk_widget_ref (gtk_user_textbox);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_user_textbox", gtk_user_textbox,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_user_textbox);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_user_textbox, 1, 2, 2, 3,
                    (GtkAttachOptions) (0),
                    (GtkAttachOptions) (0), 0, 0);
  gtk_widget_set_usize (gtk_user_textbox, 230, -2);
  gtk_tooltips_set_tip (tooltips, gtk_user_textbox, _("Type the username here"), NULL);

  gtk_command_textbox = gtk_entry_new ();
  gtk_widget_set_name (gtk_command_textbox, "gtk_command_textbox");
  gtk_widget_ref (gtk_command_textbox);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_command_textbox", gtk_command_textbox,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_command_textbox);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_command_textbox, 1, 2, 1, 2,
                    (GtkAttachOptions) (GTK_EXPAND),
                    (GtkAttachOptions) (0), 0, 0);
  gtk_widget_set_usize (gtk_command_textbox, 230, -2);
  gtk_tooltips_set_tip (tooltips, gtk_command_textbox, _("Type the command here"), NULL);
/* xsu 0.2.3 *
	The buttons and their size in other languages have been fixed. This
	bug was filed by Robert Millan <zeratul2@wanadoo.es>
*/
  gtk_hbox = gtk_hbox_new (FALSE, 0);
  gtk_widget_show (gtk_hbox);

  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_hbox, 1, 2, 5, 6,
					(GtkAttachOptions) (GTK_FILL),
					(GtkAttachOptions) (0), 0, 7);

  gtk_utilbox = gtk_hbutton_box_new();
  gtk_box_pack_start(GTK_BOX(gtk_hbox), gtk_utilbox, FALSE, TRUE, 14);  
  gtk_button_box_set_layout(GTK_BUTTON_BOX(gtk_utilbox), gnome_preferences_get_button_layout());
  gtk_button_box_set_spacing(GTK_BUTTON_BOX(gtk_utilbox), GNOME_PAD);
  gtk_widget_show(gtk_utilbox);

  gtk_ok_button = gnome_stock_button (GNOME_STOCK_BUTTON_OK);
  gtk_box_pack_start(GTK_BOX(gtk_utilbox), gtk_ok_button, FALSE, FALSE, 5);
  GTK_WIDGET_SET_FLAGS(gtk_ok_button, GTK_CAN_DEFAULT);
  gtk_widget_grab_default(gtk_ok_button);
  gtk_widget_show (gtk_ok_button);
  gtk_tooltips_set_tip (tooltips, gtk_ok_button, _("Press this button when finished"), NULL);

  gtk_cancel_button = gnome_stock_button (GNOME_STOCK_BUTTON_CANCEL);
  gtk_box_pack_start(GTK_BOX(gtk_utilbox), gtk_cancel_button, FALSE, FALSE, 5);
  gtk_widget_show (gtk_cancel_button);  
  GTK_WIDGET_SET_FLAGS(gtk_cancel_button, GTK_CAN_DEFAULT);
  gtk_tooltips_set_tip (tooltips, gtk_cancel_button, _("Press this button to Cancel"), NULL);

  gtk_password_label = gtk_label_new (_("Password :"));
  gtk_widget_set_name (gtk_txtuser_label, "gtk_password_label");
  gtk_widget_ref (gtk_password_label);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_password_label", gtk_password_label,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_password_label);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_password_label, 0, 1, 3, 4,
                    (GtkAttachOptions) (GTK_FILL),
                    (GtkAttachOptions) (0), 0, 0);
  gtk_misc_set_alignment (GTK_MISC (gtk_password_label), 0, 7.45058e-09);
  gtk_misc_set_padding (GTK_MISC (gtk_password_label), 24, 2);

  gtk_separator_one = gtk_hseparator_new ();
  gtk_widget_set_name (gtk_separator_one, "gtk_separator_one");
  gtk_widget_ref (gtk_separator_one);
  gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_separator_one", gtk_separator_one,
                            (GtkDestroyNotify) gtk_widget_unref);
  gtk_widget_show (gtk_separator_one);
  gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_separator_one, 0, 2, 4, 5,
                    (GtkAttachOptions) (GTK_FILL),
                    (GtkAttachOptions) (GTK_FILL), 0, 8);


  gtk_signal_connect (GTK_OBJECT (gtk_user_textbox), "activate",
			GTK_SIGNAL_FUNC (on_gtk_user_textbox_activate), gtk_user_textbox);
		      
		      
  gtk_signal_connect (GTK_OBJECT (gtk_password_textbox), "activate",
			GTK_SIGNAL_FUNC (on_gtk_password_textbox_activate), gtk_password_textbox);


  gtk_signal_connect (GTK_OBJECT (gtk_command_textbox), "activate",
			GTK_SIGNAL_FUNC (on_gtk_command_textbox_activate), gtk_command_textbox);
		            
		      
  gtk_signal_connect (GTK_OBJECT (gtk_cancel_button), "clicked",
                      GTK_SIGNAL_FUNC (on_gtk_cancel_button_clicked),
                      NULL);

  gtk_signal_connect (GTK_OBJECT (gtk_ok_button), "clicked",
                      GTK_SIGNAL_FUNC (on_gtk_ok_button_clicked),
                      NULL);

  gtk_object_set_data (GTK_OBJECT (gtk_xsu_window), "tooltips", tooltips);

  return gtk_xsu_window;
}

int main (int argc, char *argv[])
{
	GtkWidget *gtk_xsu_window;
	gchar 	  *arg_command,
			  *arg_username,
			  *arg_iconfile;
	gint 	  x;
	gboolean  command_in=FALSE, 
			  username_in=FALSE,
			  icon_in=FALSE, 
			  dis_textboxes=FALSE,
			  hide_textboxes=FALSE,
			  endofargs=FALSE,
			  first=TRUE;

    /*	Nope..no popt, maybe next time. Oh and getopt stuff is not
		the same in *BSD as with GNU getopt, so I don't immedialty 
		feel like wanting to change this option parsing :-\. 

		Some problems about parsing the arguments have been filed by
		Jeff Licquia <licquia@debian.org>. I added the "--" option
		which stops parsing. (Only " and \ have to be escaped of course,
		this depends on your shell)
	*/

	for (x=0; x<argc; x++)
	{
/* xsu 0.2.3 *
		Argument "--" stops argument parsing and collects all arguments
		after the "--" argument. It will put all these arguments in one
		string and use this string in arg_command.
*/
		if (!strcmp (argv[x], "--")) endofargs=TRUE;
			
		if (endofargs) {
			gchar *buffer;
			buffer = g_strdup(argv[x+1]);
			if (buffer) {
				if (first) {
					arg_command = g_strdup_printf("%s",buffer);
					first=FALSE;
				} else {
					arg_command = g_strdup_printf("%s %s", arg_command, buffer);
				}
				continue;
			} else {
				command_in=TRUE;
				break;
			}
		}
		
		if ((!strcmp (argv[x], "-c")) || (!strcmp (argv[x], "--command")))
		{
			if (argv[x+1] != NULL)
			{
				arg_command = g_strdup(argv[x+1]);
				command_in=TRUE;
			}
		}
    
		if ((!strcmp (argv[x], "-u")) || (!strcmp (argv[x], "--username")))
		{
			if (argv[x+1] != NULL)
			{	
				arg_username = g_strdup(argv[x+1]);
				username_in=TRUE;
			}
		}

		if ((!strcmp (argv[x], "-m")) || (!strcmp (argv[x], "--message")))
		{
			if (argv[x+1] != NULL)
			{	
				int i;
				arg_message = g_strdup(argv[x+1]);
				for (i=0;i<strlen(arg_message);++i)
					if (arg_message[i]=='^') arg_message[i]='\n';
				for (i=0;i<strlen(arg_message);++i)
					if (arg_message[i]=='~') arg_message[i]='\t';
				message_in=TRUE;
			}
		}
/* xsu 0.1.5 *
	Option to load another icon
*/	
		if ((!strcmp (argv[x], "-i")) || (!strcmp (argv[x], "--icon")))
		{
			if (argv[x+1] != NULL)
			{
				arg_iconfile = g_strdup(argv[x+1]);
				icon_in=TRUE;
			}
		}
/* xsu 0.1.6 *
	Option to set another window title
*/	
		if ((!strcmp (argv[x], "-t")) || (!strcmp (argv[x], "--title")))
		{
			if (argv[x+1] != NULL)
			{
				arg_title = g_strdup(argv[x+1]);
				title_in=TRUE;
			}
		}

/* xsu 0.1.4 *
	Option to disable the Command and User entries.
*/
		if ((!strcmp (argv[x], "-d")) || (!strcmp (argv[x], "--unadaptable")))
		{
			dis_textboxes=TRUE;
		}

		if ((!strcmp (argv[x], "-e")) || (!strcmp (argv[x], "--hide")))
		{
			hide_textboxes=TRUE;
		}
/* xsu 0.2.1 *
	Option to set the DISPLAY environment
*/
		if ((!strcmp (argv[x], "-a")) || (!strcmp (argv[x], "--set-display")))
		{
			set_display_env=TRUE;
	    	if ((argv[x+1] != NULL) && ((argv[x+1])[0] != '-'))
	    	{ /* if there is a 2e argument and it does not begin with a dash */
				displ_host = g_strdup(argv[x+1]);
	    	} else {
				displ_host = g_strdup(":0");
	    	}
		}
		if ((!strcmp (argv[x], "-v")) || (!strcmp (argv[x], "--version")))
		{
			printf(NAME " " VERSION " by " AUTHOR "\n");
			exit(EXIT_CORRECT);
		}
	
		if ((!strcmp (argv[x], "-h")) || (!strcmp (argv[x], "--help")))
		{
			printf(NAME " " VERSION " by " AUTHOR "\n\n");
			printf("Arguments :\n\n");
			printf("\t-u|--username \"USERNAME\"\n");
			printf("\t-c|--command \"COMMAND\"\n");
			printf("\t-m|--message \"MESSAGE\"\n");
			printf("\t-i|--icon \"FILENAME\"\n");
			printf("\t-t|--title \"WINDOW TITLE\"\n");
			printf("\t-a|--set-display [\"HOSTNAME\"]\n");
			printf("\t-d|--unadaptable\n");
			printf("\t-e|--hide\n");
			printf("\t-h|--help\n\n");
			printf("ps. for \"message\" :\n");
			printf("\t* You can use ^ if you want a newline in the message string.\n");
			printf("\t* You can use ~ if you want a tab in the message string.\n\n");  
			
			exit(EXIT_CORRECT);
		}

	}


/* xsu 0.1.0 *
	This one is to confuse gnome_init() actually. I don't want
	gnome to use the program arguments. And I am to lazy to learn
	how to use popt. Well.. if you are not..modify so that it uses
	popt and send me the patch :)
	xsu 0.1.4 *
	Option (dis_textboxes) to disable the Command and User entries.
*/

	argc=1;
	/* And init gnome ... */
	gnome_init (NAME, VERSION, argc, argv);
	gtk_xsu_window = create_gtk_xsu_window ();

	if (username_in) /* If there was a username argument */
	{
		gtk_entry_set_text(GTK_ENTRY(gtk_user_textbox),arg_username);
		if (dis_textboxes) gtk_entry_set_editable(GTK_ENTRY(gtk_user_textbox), FALSE);
		if (hide_textboxes) 
		{
			gtk_widget_hide(gtk_user_textbox);
			gtk_widget_hide(gtk_password_label);
		}
	} else {
		gtk_widget_grab_focus (gtk_user_textbox);
	}
	if (command_in) /* If there was a command argument */
	{
		gtk_entry_set_text(GTK_ENTRY(gtk_command_textbox),arg_command);
		if (dis_textboxes) gtk_entry_set_editable(GTK_ENTRY(gtk_command_textbox), FALSE);
		if (hide_textboxes) 
		{ 
			gtk_widget_hide(gtk_command_textbox);
			gtk_widget_hide(gtk_commandtxt_label);
		}
	} else {
		gtk_widget_grab_focus (gtk_command_textbox);
	}
	if ((command_in) && (username_in)) /* if both */
	{
		gtk_widget_grab_focus (gtk_password_textbox);
	}
/* xsu 0.1.5 *
	Option to load another icon
*/
	if (icon_in) {
		gtk_widget_destroy(gtk_keys_pixmap);
		gtk_keys_pixmap = gnome_pixmap_new_from_file(arg_iconfile);

		gtk_widget_set_name (gtk_keys_pixmap, "gtk_keys_pixmap");
		gtk_widget_ref (gtk_keys_pixmap);
		gtk_object_set_data_full (GTK_OBJECT (gtk_xsu_window), "gtk_keys_pixmap", gtk_keys_pixmap,
					(GtkDestroyNotify) gtk_widget_unref);			    
		gtk_widget_show (gtk_keys_pixmap);
		gtk_table_attach (GTK_TABLE (gtk_window_table), gtk_keys_pixmap, 0, 1, 0, 1,
					(GtkAttachOptions) (GTK_FILL),
					(GtkAttachOptions) (GTK_FILL), 0, 0);
	}
	/* All done.. lets go gnome'ing :) */
	gtk_widget_show (gtk_xsu_window);
	gtk_main ();    

	return 0;
}



syntax highlighted by Code2HTML, v. 0.9.1