/* GnoSamba 0.3.3
 * copyright 1998-9 Perry Piplani
 * redistributable under the terms of the GPL:
 * http://www.gnu.org/copyleft/gpl.html
 */


#include <gtk/gtk.h>
#include <strings.h>
#include "gtksamba.h"
#include "../pix/share.xpm"
#include "../pix/delshare.xpm"
#include "../pix/delete.xpm"
#include "../pix/exit.xpm"
#include "../pix/new.xpm" 
#include "../pix/open.xpm"
#include "../pix/edit.xpm"
#include "../pix/save.xpm"
#include "../pix/samba.xpm"


void get_user_list(GtkWidget *combo){
  FILE *passwd;
  GList *list=NULL;
  char buff[1024], *s;

  if( (passwd=fopen("/etc/passwd","r")) == NULL)
    return;

  while(fgets(buff,1024,passwd)){
    s=strtok(buff,":");
    if(strcmp(s,"root"))
      list=g_list_append(list,g_strdup(s));
  }
  fclose(passwd);
  
  if(list){
    gtk_combo_set_popdown_strings (GTK_COMBO (combo), list);
    gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry),"");
  }

  while(list){
    g_free(list->data);
    list=g_list_remove_link(list,list);
  }

  return;

}

void get_group_list(GtkWidget *combo){
  FILE *passwd;
  GList *list=NULL;
  char buff[1024],s[34];

  if( (passwd=fopen("/etc/group","r")) == NULL)
    return;

  s[0]='@';

  while(fgets(buff,1024,passwd)){
    strncpy(s+1,strtok(buff,":"),32);
    if(strcmp(s,"@root"))
      list=g_list_append(list,g_strdup(s));
  }
  fclose(passwd);
  
  if(list){
    gtk_combo_set_popdown_strings (GTK_COMBO (combo), list);
    gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry),"");
  }
  
  while(list){
    g_free(list->data);
    list=g_list_remove_link(list,list);
  }

  return;

}

void c_button_list_add(GtkWidget *button, gpointer clist){
  GtkWidget *entry;
  gchar *text;
  int row;

  entry=gtk_object_get_data(GTK_OBJECT(button),"entry");
  text=gtk_entry_get_text(GTK_ENTRY(entry));

  if(GTK_CLIST(clist)->selection){
    row = (int)(GTK_CLIST(clist)->selection->data);
    gtk_clist_insert(GTK_CLIST(clist),row+1,&text);
  }
  else
    gtk_clist_insert(GTK_CLIST(clist),0,&text);

}

void c_button_list_rem(GtkWidget *button, gpointer clist){
  int row;

  if(GTK_CLIST(clist)->selection){
    row = (int)(GTK_CLIST(clist)->selection->data);
    gtk_clist_remove(GTK_CLIST(clist),row);
  }
  return;
}

void c_button_list_clr(GtkWidget *button, gpointer clist){

  gtk_clist_clear(GTK_CLIST(clist));
  return;
}
  
void c_toggle_insensitive(GtkWidget *toggle,gpointer widget){
  if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
    gtk_widget_set_sensitive(GTK_WIDGET(widget),FALSE);
  else
    gtk_widget_set_sensitive(GTK_WIDGET(widget),TRUE);
  return;
}

void c_choice_insensitive_one(GtkWidget *choicebox, gpointer widget){
  int index;

  index=gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox));
  if(index==1)
    gtk_widget_set_sensitive(GTK_WIDGET(widget),FALSE);
  else
    gtk_widget_set_sensitive(GTK_WIDGET(widget),TRUE);
  return;
}

void c_choice_insensitive_two(GtkWidget *choicebox, gpointer widget){
  int index;

  index=gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox));
  if(index==2)
    gtk_widget_set_sensitive(GTK_WIDGET(widget),FALSE);
  else
    gtk_widget_set_sensitive(GTK_WIDGET(widget),TRUE);
  return;
}

    

  

void handle_sensitivity(GtkWidget *mguru){
  
  switch(gnome_mguru_get_page(GNOME_MGURU(mguru))){
  case 0:
    gnome_mguru_set_state(GNOME_MGURU(mguru),
			  GNOME_MGURU_START);
    break;

  case 8:
    gnome_mguru_set_state(GNOME_MGURU(mguru),
			  GNOME_MGURU_LAST);
    break;
    
  default:
    gnome_mguru_set_state(GNOME_MGURU(mguru),
			  GNOME_MGURU_MIDDLE);
  }
  
}

int is_oct_string(char *s){
  char *p;
  for(p=s;*p && is_oct(*p); p++);
  if(*p)
    return 0;
  else
    return 1;
}

int is_dig_string(char *s){
  char *p;
  for(p=s;*p && isdigit(*p); p++);
  if(*p)
    return 0;
  else
    return 1;
}

void insert_service_modify_check(GtkWidget *mguru,GtkWidget *window){
  GtkWidget *entry;
  GtkWidget *servicelist;
  gchar *text, *name;
  int j;

  servicelist=gtk_object_get_data(GTK_OBJECT(window),"servicelist");
  entry=gtk_object_get_data(GTK_OBJECT(mguru),"name_entry");
  name=gtk_entry_get_text(GTK_ENTRY(entry));


  for(j=0; j < GTK_CLIST(servicelist)->rows; j++){
    gtk_clist_get_text(GTK_CLIST(servicelist),
		       j,0,&text);
    if(!strcasecmp(text,name)){
      gtk_clist_select_row(GTK_CLIST(servicelist),j,0);
      gtk_object_set_data(GTK_OBJECT(mguru),
			  "modify",GINT_TO_POINTER(1));
      return;
    }
  }
  gtk_object_set_data(GTK_OBJECT(mguru),
		      "modify",GINT_TO_POINTER(0));
  return;
}
char *make_string_list(GtkWidget *clist){
  char *list, *text;
  int j, len;
  int blocks=1;

  list=g_malloc(1024);
  list[0]='\0';
  len=1;

  for(j=0; j < GTK_CLIST(clist)->rows; j++){
    gtk_clist_get_text(GTK_CLIST(clist),
		       j,0,&text);
  
    len=len+strlen(text)+2;
    if(len > 1024*blocks)
      list=g_realloc(list,(++blocks)*1024);
    if(j)
      strcat(list,", ");
    strcat(list,text);
  }
  if(strlen(list))
    return list;
  
  g_free(list);
  return NULL;

}	

void mguru_make_service(GtkWidget *mguru,GtkWidget *window){
  GtkWidget *entry;
  GtkWidget *sublist;
  gchar *text;
  gchar *pair[2];
  GtkWidget *choicebox1, *choicebox2;
  int index1, index2;
  GtkWidget *clist;
  GtkWidget *checkbutton;
  
  index1=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(mguru),
					      "modify"));
  if(index1)
    smbwin_delete_service(window);

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"name_entry");
  text=gtk_entry_get_text(GTK_ENTRY(entry));

  smbwin_insert_service(text,window);
  sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"comment_entry");
  if(GTK_ENTRY(entry)->text_length){
    pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
    pair[0]=g_strdup("comment");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
  }

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"path_entry");
  if(GTK_ENTRY(entry)->text_length){
    pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
    pair[0]=g_strdup("path");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
  }

  choicebox1=gtk_object_get_data(GTK_OBJECT(mguru),"users_choice");
  index1=gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox1));
  choicebox2=gtk_object_get_data(GTK_OBJECT(mguru),"guest_choice");
  index2=gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox2));

  if(index2 != 2){
    pair[0]=g_strdup("guest ok");
    pair[1]=g_strdup("yes");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
    g_free(pair[1]);

    entry=gtk_object_get_data(GTK_OBJECT(mguru),"guest_account_entry");
    if(GTK_ENTRY(entry)->text_length){
      pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
      pair[0]=g_strdup("guest_account");
      gtk_clist_append(GTK_CLIST(sublist),pair);
      g_free(pair[0]);
  }

    
  }

  if(index2 == 1){
    pair[0]=g_strdup("guest only");
    pair[1]=g_strdup("yes");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
    g_free(pair[1]);
  }

  if(index1 == 1  &&  index2 !=1){
    clist=gtk_object_get_data(GTK_OBJECT(mguru),"valid_users_list");
    pair[1]=make_string_list(clist);
    if(pair[1]){
      pair[0]=g_strdup("valid users");
      gtk_clist_append(GTK_CLIST(sublist),pair);
      g_free(pair[0]);
      g_free(pair[1]);
    }
    
    clist=gtk_object_get_data(GTK_OBJECT(mguru),"invalid_users_list");
    pair[1]=make_string_list(clist);
    if(pair[1]){
      pair[0]=g_strdup("invalid users");
      gtk_clist_append(GTK_CLIST(sublist),pair);
      g_free(pair[0]);
      g_free(pair[1]);
    }
    
  }

  checkbutton=gtk_object_get_data(GTK_OBJECT(mguru),"all_hosts_toggle");
  if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton))){
    clist=gtk_object_get_data(GTK_OBJECT(mguru),"hosts_allow_list");
    pair[1]=make_string_list(clist);
    if(pair[1]){
      pair[0]=g_strdup("hosts allow");
      gtk_clist_append(GTK_CLIST(sublist),pair);
      g_free(pair[0]);
      g_free(pair[1]);
    }

    clist=gtk_object_get_data(GTK_OBJECT(mguru),"hosts_deny_list");
    pair[1]=make_string_list(clist);
    if(pair[1]){
      pair[0]=g_strdup("hosts deny");
      gtk_clist_append(GTK_CLIST(sublist),pair);
      g_free(pair[0]);
      g_free(pair[1]);
    }
  }

  choicebox1=gtk_object_get_data(GTK_OBJECT(mguru),"read_write_choice");
  index1=gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox1));


  pair[0]=g_strdup("writeable");
  if(index1 < 2)
    pair[1]=g_strdup("no");
  else
    pair[1]=g_strdup("yes");
  gtk_clist_append(GTK_CLIST(sublist),pair);
  g_free(pair[0]);
  g_free(pair[1]);
  
  if(index1 == 1 || index2 == 2){
    clist=gtk_object_get_data(GTK_OBJECT(mguru),"read_list");
    pair[1]=make_string_list(clist);
    if(pair[1]){
      pair[0]=g_strdup("read list");
      gtk_clist_append(GTK_CLIST(sublist),pair);
      g_free(pair[0]);
      g_free(pair[1]);
    }

    clist=gtk_object_get_data(GTK_OBJECT(mguru),"write_list");
    pair[1]=make_string_list(clist);
    if(pair[1]){
      pair[0]=g_strdup("write list");
      gtk_clist_append(GTK_CLIST(sublist),pair);
      g_free(pair[0]);
      g_free(pair[1]);
    }
  }

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"file_create_entry");
  if(GTK_ENTRY(entry)->text_length){
    pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
    pair[0]=g_strdup("create mask");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
  }

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"force_create_entry");
  if(GTK_ENTRY(entry)->text_length){
    pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
    pair[0]=g_strdup("force create mode");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
  }

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"directory_create_entry");
  if(GTK_ENTRY(entry)->text_length){
    pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
    pair[0]=g_strdup("directory mask");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
  }

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"force_directory_entry");
  if(GTK_ENTRY(entry)->text_length){
    pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
    pair[0]=g_strdup("force directory mode");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
  }

  checkbutton=gtk_object_get_data(GTK_OBJECT(mguru),"browseable_toggle");
  if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton))){
    pair[0]=g_strdup("browseable");
    pair[1]=g_strdup("no");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
    g_free(pair[1]);
  }

  checkbutton=gtk_object_get_data(GTK_OBJECT(mguru),"hide_dot_toggle");
  if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton))){
    pair[0]=g_strdup("hide dot files");
    pair[1]=g_strdup("no");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
    g_free(pair[1]);
  }

  entry=gtk_object_get_data(GTK_OBJECT(mguru),"max_connect_entry");
  if(GTK_ENTRY(entry)->text_length){
    pair[1]=gtk_entry_get_text(GTK_ENTRY(entry));
    pair[0]=g_strdup("max connections");
    gtk_clist_append(GTK_CLIST(sublist),pair);
    g_free(pair[0]);
  }

  return;
}

void c_service_mguru_button(GtkWidget *mguru, 
			  gint page,
			  gint button,
			  gpointer window){

  GtkWidget *entry;
  GtkWidget *choicebox1, *choicebox2;
  int index;
  GtkWidget *dialog;
                   
  switch(button){
  case 0:
    dialog=gtk_object_get_data(GTK_OBJECT(mguru),"dialog");
    make_user_mesg("New service cancelled.","Information");
    gtk_widget_destroy(GTK_WIDGET(dialog));
    resensitize_sw(GTK_WIDGET(window));
    break;
    
    
  case 1:
    if(page==1)
      gnome_mguru_set_page(GNOME_MGURU(mguru),0);
    else if(page==2)
      gnome_mguru_set_page(GNOME_MGURU(mguru),1);
    else if(page==3)
      gnome_mguru_set_page(GNOME_MGURU(mguru),2);
    else if(page==4){
      choicebox1=gtk_object_get_data(GTK_OBJECT(mguru),"users_choice");
      choicebox2=gtk_object_get_data(GTK_OBJECT(mguru),"guest_choice");
      if(gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox1))==0 ||
	 gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox2))==1)
	gnome_mguru_set_page(GNOME_MGURU(mguru),2);
      else
	gnome_mguru_set_page(GNOME_MGURU(mguru),3);
    }
    else if(page==5)
      gnome_mguru_set_page(GNOME_MGURU(mguru),4);
    else if(page==6)
      gnome_mguru_set_page(GNOME_MGURU(mguru),5);
    else if(page==7){
      choicebox1=gtk_object_get_data(GTK_OBJECT(mguru),"read_write_choice");
      index=gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox1));
      if( index==0 || index==3 )
	gnome_mguru_set_page(GNOME_MGURU(mguru),5);
      else
	gnome_mguru_set_page(GNOME_MGURU(mguru),6);
    }
    else if(page==8)
      gnome_mguru_set_page(GNOME_MGURU(mguru),7);
    handle_sensitivity(mguru);
    break;
    
    
  case 2:
    if(page==0){
      entry=gtk_object_get_data(GTK_OBJECT(mguru),"name_entry");
      if(!(GTK_ENTRY(entry)->text_length))
	make_user_mesg("Enter the service name!","Warning");
      else{
	insert_service_modify_check(mguru,window);
	gnome_mguru_set_page(GNOME_MGURU(mguru),1);
      }
    }
    else if(page==1){
      entry=gtk_object_get_data(GTK_OBJECT(mguru),"path_entry");
      if(!(GTK_ENTRY(entry)->text_length))
	make_user_mesg("Enter a path to share!","Warning");
      else
	gnome_mguru_set_page(GNOME_MGURU(mguru),2);
    }
    else if(page==2){
      choicebox1=gtk_object_get_data(GTK_OBJECT(mguru),"users_choice");
      choicebox2=gtk_object_get_data(GTK_OBJECT(mguru),"guest_choice");
      if(gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox1))==0 ||
	 gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox2))==1)
	gnome_mguru_set_page(GNOME_MGURU(mguru),4);
      else
	gnome_mguru_set_page(GNOME_MGURU(mguru),3);
    }
    else if(page==3)
      gnome_mguru_set_page(GNOME_MGURU(mguru),4);
    else if(page==4)
      gnome_mguru_set_page(GNOME_MGURU(mguru),5);
    else if(page==5){
      choicebox1=gtk_object_get_data(GTK_OBJECT(mguru),"read_write_choice");
      index=gnome_choice_box_get_index(GNOME_CHOICE_BOX(choicebox1));
      if( index==0 || index==3 )
	gnome_mguru_set_page(GNOME_MGURU(mguru),7);
      else
	gnome_mguru_set_page(GNOME_MGURU(mguru),6);
    }
    else if(page==6)
      gnome_mguru_set_page(GNOME_MGURU(mguru),7);
    else if(page==7){
      index=0;
      entry=gtk_object_get_data(GTK_OBJECT(mguru),"file_create_entry");
      if(GTK_ENTRY(entry)->text_length)
	if(!is_oct_string(gtk_entry_get_text(GTK_ENTRY(entry))))
	  index=1;
      entry=gtk_object_get_data(GTK_OBJECT(mguru),"force_create_entry");
      if(GTK_ENTRY(entry)->text_length)
	if(!is_oct_string(gtk_entry_get_text(GTK_ENTRY(entry))))
	  index=1;
      entry=gtk_object_get_data(GTK_OBJECT(mguru),"directory_create_entry");
      if(GTK_ENTRY(entry)->text_length)
	if(!is_oct_string(gtk_entry_get_text(GTK_ENTRY(entry))))
	  index=1;
      entry=gtk_object_get_data(GTK_OBJECT(mguru),"force_directory_entry");
      if(GTK_ENTRY(entry)->text_length)
	if(!is_oct_string(gtk_entry_get_text(GTK_ENTRY(entry))))
	  index=1;
      if(index)
	make_user_mesg("Enter octal values or leave blank","Warning");
      else
	gnome_mguru_set_page(GNOME_MGURU(mguru),8);
    }
    handle_sensitivity(mguru);
    break;
    
    
  case 3:
    entry=gtk_object_get_data(GTK_OBJECT(mguru),"max_connect_entry");
    if(GTK_ENTRY(entry)->text_length)
      if(!is_dig_string(gtk_entry_get_text(GTK_ENTRY(entry)))){
	make_user_mesg("Enter integer value or leave blank","Warning");
	return;
      }
      
    mguru_make_service(mguru,GTK_WIDGET(window));
    dialog=gtk_object_get_data(GTK_OBJECT(mguru),"dialog");
    make_user_mesg("New service created","Information");
    gtk_widget_destroy(GTK_WIDGET(dialog));
    resensitize_sw(GTK_WIDGET(window));
  }
    
  return;
  
}



GtkWidget *service_guru_page_one(GtkWidget *guru, GtkWidget *window){
  GtkWidget *vbox;
  GtkWidget *label;
  GtkWidget *combo;
  GList *services=NULL;
  int j;
  gchar *text;
  GtkWidget *servicelist;

  servicelist=gtk_object_get_data(GTK_OBJECT(window),"servicelist");


  vbox=gtk_vbox_new(TRUE,0);
  
  label = gtk_label_new("Enter a new service name or\n choose and existing one");
  gtk_box_pack_start (GTK_BOX (vbox), 
                      label, TRUE, TRUE, 10);
  gtk_widget_show (label);
  
    label = gtk_label_new
      ("Note: this will overwrite an\nexisting service. Future versions\n will allow you to modify a service.");
  gtk_box_pack_start (GTK_BOX (vbox), 
                      label, TRUE, TRUE, 10);
  gtk_widget_show (label);

  for(j=0; j < GTK_CLIST(servicelist)->rows; j++){
    gtk_clist_get_text(GTK_CLIST(servicelist),
		       j,0,&text);
    if(strcasecmp(text,"global") &&
       strcasecmp(text,"printers") &&
       strcasecmp(text,"homes"))
      services=g_list_append(services,text);
  }

  combo=gtk_combo_new ();
  if(services)
    gtk_combo_set_popdown_strings (GTK_COMBO (combo), services);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      combo, TRUE, TRUE, 10);
  gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry),"");
  gtk_widget_show (combo);

  gtk_object_set_data(GTK_OBJECT(guru),"name_entry",
		      GTK_COMBO(combo)->entry);

    while(services){
    services=g_list_remove_link(services,services);
  }
  
  return vbox;

}

GtkWidget *service_guru_page_two(GtkWidget *guru){
  GtkWidget *table;
  GtkWidget *label;
  GtkWidget *path_entry;
  GtkWidget *comment_entry;

  table=gtk_table_new (2, 3, TRUE);
  
  label = gtk_label_new("Comment:");
  gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,0,1);
  gtk_widget_show (label);

  comment_entry=gnome_entry_new("comment entry");
  gtk_table_attach_defaults(GTK_TABLE(table),comment_entry,1,3,0,1);
  gtk_widget_show (comment_entry);

  gtk_object_set_data(GTK_OBJECT(guru),"comment_entry",
		      gnome_entry_gtk_entry(GNOME_ENTRY(comment_entry)));

  label = gtk_label_new("Path:");
  gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2);
  gtk_widget_show (label);

  path_entry=gnome_file_entry_new("path entry",
			     "Path to be served");
  gtk_table_attach(GTK_TABLE(table),path_entry,1,3,1,2,
		   GTK_FILL | GTK_EXPAND,
		   GTK_EXPAND,0,0);
  gtk_widget_show (path_entry);

  gtk_object_set_data(GTK_OBJECT(guru),"path_entry",
		      gnome_file_entry_gtk_entry(GNOME_FILE_ENTRY(path_entry)));

  return table;

}




GtkWidget *service_guru_page_three(GtkWidget *guru){
  GtkWidget *vbox;
  GtkWidget *separator;
  GtkWidget *choicebox1, *choicebox2;
  GtkWidget *combo;
  GtkWidget *label;
  GtkWidget *hbox;

  vbox=gtk_vbox_new(FALSE,0);

  choicebox1=gnome_choice_box_new(CHOICE_BOX_VV,NULL,
				 "Allow all users",
				 "Select valid and invalid users",
				 NULL);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      choicebox1, TRUE, TRUE, 0);
  gnome_choice_box_set_index(GNOME_CHOICE_BOX(choicebox1),1);
  gtk_widget_show (choicebox1);

  gtk_object_set_data(GTK_OBJECT(guru),"users_choice",choicebox1);

  separator = gtk_hseparator_new ();
  gtk_box_pack_start (GTK_BOX (vbox), 
                      separator, TRUE, TRUE, 0);
  gtk_widget_show (separator);

  choicebox2=gnome_choice_box_new(CHOICE_BOX_VV,NULL,
				 "Allow guest access",
				 "Allow only guest access",
				 "Do not allow guest access",
				 NULL);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      choicebox2, TRUE, TRUE, 0);
  gnome_choice_box_set_index(GNOME_CHOICE_BOX(choicebox2),2);
  gtk_widget_show (choicebox2);

  gtk_object_set_data(GTK_OBJECT(guru),"guest_choice",choicebox2);

  hbox=gtk_hbox_new(FALSE,0);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      hbox, TRUE, TRUE, 0);
  gtk_widget_show (hbox);

  label = gtk_label_new("Account for guest access:");
  gtk_box_pack_start (GTK_BOX (hbox), 
                      label, TRUE, TRUE, 10);
  gtk_widget_show (label);

  combo=gtk_combo_new ();
  get_user_list(combo);
  gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry),"nobody");  
  gtk_box_pack_start (GTK_BOX (hbox), 
                      combo, TRUE, TRUE, 10);
  gtk_widget_show (combo);

  gtk_object_set_data(GTK_OBJECT(guru),"guest_account_entry",
		      GTK_COMBO(combo)->entry);

  gtk_signal_connect(GTK_OBJECT(choicebox2),"choice_made",
		     c_choice_insensitive_one,choicebox1);
  gtk_signal_connect(GTK_OBJECT(choicebox2),"choice_made",
		     c_choice_insensitive_two,hbox);
  

  return vbox;

}

GtkWidget *service_guru_page_four(GtkWidget *guru){
  GtkWidget *table;
  GtkWidget *button;
  GtkWidget *gcombo, *ucombo;
  GtkWidget *label;
  GtkWidget *scrolled;
  GtkWidget *clist_allow;
  GtkWidget *clist_deny;
  char *valid_users[1] = {
    "valid users"
  };
  char *invalid_users[1] = {
    "invalid users"
  };

  table=gtk_table_new(8,4,TRUE);

  gtk_table_set_col_spacings(GTK_TABLE(table),5);
  gtk_table_set_row_spacings(GTK_TABLE(table),5);

  clist_allow=gtk_clist_new_with_titles( 1,valid_users );
  gtk_clist_set_selection_mode(GTK_CLIST(clist_allow),
			       GTK_SELECTION_BROWSE);
  scrolled=gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 
				 GTK_POLICY_AUTOMATIC, 
				 GTK_POLICY_AUTOMATIC);
  gtk_table_attach_defaults(GTK_TABLE(table),scrolled,0,1,0,8);
  gtk_widget_show (scrolled);
  gtk_container_add(GTK_CONTAINER(scrolled),clist_allow);
  gtk_widget_show (clist_allow);

  gtk_object_set_data(GTK_OBJECT(guru),"valid_users_list",
		      clist_allow);

  ucombo=gtk_combo_new ();
  get_user_list(ucombo);
  gtk_table_attach_defaults(GTK_TABLE(table),ucombo,1,3,1,2);
  gtk_widget_show (ucombo);

  gcombo=gtk_combo_new ();
  get_group_list(gcombo);
  gtk_table_attach_defaults(GTK_TABLE(table),gcombo,1,3,4,5);
  gtk_widget_show (gcombo);

  clist_deny=gtk_clist_new_with_titles( 1,invalid_users );
  gtk_clist_set_selection_mode(GTK_CLIST(clist_deny),
			       GTK_SELECTION_BROWSE);
  scrolled=gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 
				 GTK_POLICY_AUTOMATIC, 
				 GTK_POLICY_AUTOMATIC);
  gtk_table_attach_defaults(GTK_TABLE(table),scrolled,3,4,0,8);
  gtk_widget_show (scrolled);
  gtk_container_add(GTK_CONTAINER(scrolled),clist_deny);
  gtk_widget_show (clist_deny); 

  gtk_object_set_data(GTK_OBJECT(guru),"invalid_users_list",
		      clist_deny);


  button=gtk_button_new_with_label(">>>  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,6,7);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_rem,clist_allow);
  
  button=gtk_button_new_with_label("<--Clear");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,7,8);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_clr,clist_allow);

  label = gtk_label_new("Users:");
  gtk_table_attach_defaults(GTK_TABLE(table),label,1,3,0,1);
  gtk_widget_show (label);

  button=gtk_button_new_with_label("<<<  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,2,3);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(ucombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_allow);

  label = gtk_label_new("Groups:");
  gtk_table_attach_defaults(GTK_TABLE(table),label,1,3,3,4);
  gtk_widget_show (label);


  button=gtk_button_new_with_label("<<<  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,5,6);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(gcombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_allow);		     
  
  button=gtk_button_new_with_label("  >>>");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,2,3);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(ucombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_deny);  
  
  button=gtk_button_new_with_label("  >>>");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,5,6);
  gtk_widget_show (button);  
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(gcombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_deny);

  button=gtk_button_new_with_label("  <<<");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,6,7);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_rem,clist_deny);
  
  button=gtk_button_new_with_label("Clear-->");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,7,8);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_clr,clist_deny);

  return table;

}

GtkWidget *service_guru_page_five(GtkWidget *guru){
  GtkWidget *vbox;
  GtkWidget *checkbutton;
  GtkWidget *table;
  GtkWidget *button;
  GtkWidget *hostlist;
  GtkWidget *label;
  GtkWidget *scrolled;
  GtkWidget *clist_allow;
  GtkWidget *clist_deny;
  char *valid_hosts[1] = {
    "valid hosts"
  };
  char *invalid_hosts[1] = {
    "invalid hosts"
  };

  vbox=gtk_vbox_new(FALSE,0);

  checkbutton=gtk_check_button_new_with_label("Allow all hosts");
  gtk_box_pack_start (GTK_BOX (vbox), 
                      checkbutton, TRUE, TRUE, 10); 
  gtk_widget_show (checkbutton);

  gtk_object_set_data(GTK_OBJECT(guru),"all_hosts_toggle",
		      checkbutton);  
  
  table=gtk_table_new(6,4,TRUE);

  gtk_table_set_row_spacings(GTK_TABLE(table),5);
  gtk_table_set_col_spacings(GTK_TABLE(table),5);

  clist_allow=gtk_clist_new_with_titles( 1,valid_hosts );
  gtk_clist_set_selection_mode(GTK_CLIST(clist_allow),
			       GTK_SELECTION_BROWSE);
  scrolled=gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 
				 GTK_POLICY_AUTOMATIC, 
				 GTK_POLICY_AUTOMATIC);
  gtk_table_attach_defaults(GTK_TABLE(table),scrolled,0,1,0,6);
  gtk_widget_show (scrolled);
  gtk_container_add(GTK_CONTAINER(scrolled),clist_allow);
  gtk_widget_show (clist_allow);

  gtk_object_set_data(GTK_OBJECT(guru),"hosts_allow_list",
		      clist_allow);

  clist_deny=gtk_clist_new_with_titles( 1,invalid_hosts );
  gtk_clist_set_selection_mode(GTK_CLIST(clist_deny),
			       GTK_SELECTION_BROWSE);
  scrolled=gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 
				 GTK_POLICY_AUTOMATIC, 
				 GTK_POLICY_AUTOMATIC);
  gtk_table_attach_defaults(GTK_TABLE(table),scrolled,3,4,0,6);
  gtk_widget_show (scrolled);
  gtk_container_add(GTK_CONTAINER(scrolled),clist_deny);
  gtk_widget_show (clist_deny); 

  gtk_object_set_data(GTK_OBJECT(guru),"hosts_deny_list",
		      clist_deny);

  hostlist=gnome_entry_new("host list");
  gtk_table_attach_defaults(GTK_TABLE(table),hostlist,1,3,1,2);
  gtk_widget_show (hostlist);

  button=gtk_button_new_with_label(">>>  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,4,5);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_rem,clist_allow);
  
  button=gtk_button_new_with_label("<--Clear");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,5,6);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_clr,clist_allow);

  label = gtk_label_new("Hostnames or IP addresses");
  gtk_table_attach_defaults(GTK_TABLE(table),label,1,3,0,1);
  gtk_widget_show (label);  



  button=gtk_button_new_with_label("<<<  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,2,3);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(hostlist)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_allow);
  
  button=gtk_button_new_with_label("  >>>");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,2,3);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(hostlist)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_deny);

  button=gtk_button_new_with_label("  <<<");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,4,5);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_rem,clist_deny);
  
  button=gtk_button_new_with_label("Clear-->");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,5,6);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_clr,clist_deny);

  gtk_box_pack_start (GTK_BOX (vbox), 
                      table, TRUE, TRUE, 10); 
  gtk_widget_show (table);

  gtk_signal_connect(GTK_OBJECT(checkbutton),"toggled",
		     c_toggle_insensitive,table);
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton),FALSE);

  return vbox;

}

GtkWidget *service_guru_page_six(GtkWidget *guru){
  GtkWidget *choicebox;

  choicebox=gnome_choice_box_new
    (CHOICE_BOX_VV,
     "Select an option for read write access\nNote all Unix access restrictions still apply",
     "Make service read only",
     "Default to read only, then specify access by user",
     "Default to read/write, then specify access by user",
     "Let Unix access restrictions alone control access",
     NULL);

  gtk_object_set_data(GTK_OBJECT(guru),"read_write_choice",
		      choicebox);

  return choicebox;

}

GtkWidget *service_guru_page_seven(GtkWidget *guru){
  GtkWidget *table;
  GtkWidget *button;
  GtkWidget *ucombo, *gcombo;
  GtkWidget *label;
  GtkWidget *scrolled;
  GtkWidget *clist_read;
  GtkWidget *clist_write;
  char *read_list[1] = {
    "read only list"
  };
  char *write_list[1] = {
    "write list"
  };

  table=gtk_table_new(8,4,TRUE);

  gtk_table_set_col_spacings(GTK_TABLE(table),5);
  gtk_table_set_row_spacings(GTK_TABLE(table),5);

  clist_read=gtk_clist_new_with_titles( 1,read_list );
  gtk_clist_set_selection_mode(GTK_CLIST(clist_read),
			       GTK_SELECTION_BROWSE);
  scrolled=gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 
				 GTK_POLICY_AUTOMATIC, 
				 GTK_POLICY_AUTOMATIC);
  gtk_table_attach_defaults(GTK_TABLE(table),scrolled,0,1,0,8);
  gtk_widget_show (scrolled);
  gtk_container_add(GTK_CONTAINER(scrolled),clist_read);
  gtk_widget_show (clist_read);

  gtk_object_set_data(GTK_OBJECT(guru),"read_list",
		      clist_read);

  ucombo=gtk_combo_new ();
  get_user_list(ucombo);
  gtk_table_attach_defaults(GTK_TABLE(table),ucombo,1,3,1,2);
  gtk_widget_show (ucombo);

  gcombo=gtk_combo_new ();
  get_group_list(gcombo);
  gtk_table_attach_defaults(GTK_TABLE(table),gcombo,1,3,4,5);
  gtk_widget_show (gcombo);

  clist_write=gtk_clist_new_with_titles( 1,write_list );
  gtk_clist_set_selection_mode(GTK_CLIST(clist_write),
			       GTK_SELECTION_BROWSE);
  scrolled=gtk_scrolled_window_new(NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), 
				 GTK_POLICY_AUTOMATIC, 
				 GTK_POLICY_AUTOMATIC);
  gtk_table_attach_defaults(GTK_TABLE(table),scrolled,3,4,0,8);
  gtk_widget_show (scrolled);
  gtk_container_add(GTK_CONTAINER(scrolled),clist_write);
  gtk_widget_show (clist_write); 

  gtk_object_set_data(GTK_OBJECT(guru),"write_list",
		      clist_write);

  button=gtk_button_new_with_label(">>>  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,6,7);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_rem,clist_read);
  
  button=gtk_button_new_with_label("<--Clear");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,7,8);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_clr,clist_read);

  label = gtk_label_new("Users:");
  gtk_table_attach_defaults(GTK_TABLE(table),label,1,3,0,1);
  gtk_widget_show (label);

  button=gtk_button_new_with_label("<<<  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,2,3);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(ucombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_read);

  label = gtk_label_new("Groups:");
  gtk_table_attach_defaults(GTK_TABLE(table),label,1,3,3,4);
  gtk_widget_show (label);


  button=gtk_button_new_with_label("<<<  ");
  gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,5,6);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(gcombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_read);		     
  
  button=gtk_button_new_with_label("  >>>");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,2,3);
  gtk_widget_show (button);
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(ucombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_write);  
  
  button=gtk_button_new_with_label("  >>>");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,5,6);
  gtk_widget_show (button);  
  gtk_object_set_data(GTK_OBJECT(button),"entry",
		      GTK_COMBO(gcombo)->entry);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_add,clist_write);

  button=gtk_button_new_with_label("  <<<");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,6,7);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_rem,clist_write);
  
  button=gtk_button_new_with_label("Clear-->");
  gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,7,8);
  gtk_widget_show (button);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
		     c_button_list_clr,clist_write);

  return table;

}
  

GtkWidget *service_guru_page_eight(GtkWidget *guru){
  GtkWidget *table;
  GtkWidget *entry;
  GtkWidget *label;
  GtkRequisition requisition;

  table=gtk_table_new(5,4,TRUE);

  gtk_table_set_row_spacings(GTK_TABLE(table),5);
  gtk_table_set_col_spacings(GTK_TABLE(table),5);

  label = gtk_label_new("Enter octal values, or leave blank for defaults:");
  gtk_table_attach_defaults(GTK_TABLE(table),label,0,4,0,1);
  gtk_widget_show (label); 

  label = gtk_label_new("File Creation Mode (default 0744)\nTo be masked with DOS mode");
  gtk_table_attach_defaults(GTK_TABLE(table),label,0,3,1,2);
  gtk_widget_show (label); 

  entry=gtk_entry_new_with_max_length(4);
  gtk_widget_size_request(entry,&requisition);
  gtk_widget_set_usize(entry,20,requisition.height);
  gtk_table_attach_defaults(GTK_TABLE(table),entry,3,4,1,2);
  gtk_widget_show (entry);

  gtk_object_set_data(GTK_OBJECT(guru),"file_create_entry",
		      entry);

  label = gtk_label_new("Force Creation Mode (default 0000)\nTo be bitwise OR'ed with mode above");
  gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_RIGHT);
  gtk_table_attach_defaults(GTK_TABLE(table),label,0,3,2,3);
  gtk_widget_show (label); 

  entry=gtk_entry_new_with_max_length(4);
  gtk_widget_size_request(entry,&requisition);
  gtk_widget_set_usize(entry,20,requisition.height);
  gtk_table_attach_defaults(GTK_TABLE(table),entry,3,4,2,3);
  gtk_widget_show (entry);

  gtk_object_set_data(GTK_OBJECT(guru),"force_create_entry",
		      entry);

  label = gtk_label_new("Directory Creation Mode (default 0744)\nTo be masked with DOS mode");
  gtk_table_attach_defaults(GTK_TABLE(table),label,0,3,3,4);
  gtk_widget_show (label);

  entry=gtk_entry_new_with_max_length(4);
  gtk_widget_size_request(entry,&requisition);
  gtk_widget_set_usize(entry,20,requisition.height);
  gtk_table_attach_defaults(GTK_TABLE(table),entry,3,4,3,4);
  gtk_widget_show (entry);

    gtk_object_set_data(GTK_OBJECT(guru),"directory_create_entry",
		      entry);

  label = gtk_label_new("Force Directory Mode (default 0000)\nTo be bitwise OR'ed with mode above");
  gtk_table_attach_defaults(GTK_TABLE(table),label,0,3,4,5);
  gtk_widget_show (label); 

  entry=gtk_entry_new_with_max_length(4);
  gtk_widget_size_request(entry,&requisition);
  gtk_widget_set_usize(entry,20,requisition.height);
  gtk_table_attach_defaults(GTK_TABLE(table),entry,3,4,4,5);
  gtk_widget_show (entry);

  gtk_object_set_data(GTK_OBJECT(guru),"force_directory_entry",
		      entry);

  return table;

}

GtkWidget *service_guru_page_nine(GtkWidget *guru){
  GtkWidget *vbox;
  GtkWidget *hbox;
  GtkWidget *entry;
  GtkWidget *checkbutton;
  GtkWidget *label;

  vbox=gtk_vbox_new(FALSE,0);

  checkbutton=gtk_check_button_new_with_label("Make service browseable");
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton),TRUE);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      checkbutton, TRUE, TRUE, 10); 
  gtk_widget_show (checkbutton); 

  gtk_object_set_data(GTK_OBJECT(guru),"browseable_toggle",
		      checkbutton);

  checkbutton=gtk_check_button_new_with_label("Hide hidden (dot) files");
  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton),TRUE);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      checkbutton, TRUE, TRUE, 10); 
  gtk_widget_show (checkbutton);

  gtk_object_set_data(GTK_OBJECT(guru),"hide_dot_toggle",
		      checkbutton);

  hbox=gtk_hbox_new(FALSE,0);
  gtk_box_pack_start (GTK_BOX (vbox), 
                      hbox, TRUE, TRUE, 10);
  gtk_widget_show (hbox);

  label = gtk_label_new("Maximum number of connections:");
  gtk_box_pack_start (GTK_BOX (hbox), 
                      label, TRUE, TRUE, 10);
  gtk_widget_show (label);

  entry=gnome_entry_new ("max_connect");
  gtk_box_pack_start (GTK_BOX (hbox),
                      entry, TRUE, TRUE, 10);
  gtk_widget_show (entry); 

  gtk_object_set_data(GTK_OBJECT(guru),"max_connect_entry",
		      gnome_entry_gtk_entry(GNOME_ENTRY(entry))); 

  return vbox;

}

gint c_guru_diag_delete(GtkWidget *button, GdkEvent *event, 
			gpointer window){

  resensitize_sw(GTK_WIDGET(window));
  return FALSE;

}

void make_insert_service_dialog(GtkWidget *window){

  GtkWidget *mguru;
  GtkWidget *dialog;
  GtkWidget *page;
  GtkWidget *graphic=NULL;

  desensitize_sw(GTK_WIDGET(window));

  graphic = gnome_pixmap_new_from_xpm_d(samba_xpm);

  dialog = gnome_dialog_new(_("GnoSamba Service Guru"),
			    NULL);
  gtk_signal_connect(GTK_OBJECT(dialog), "delete_event",
                     GTK_SIGNAL_FUNC(c_guru_diag_delete),
                     window);

  mguru = gnome_mguru_new(TRUE,GNOME_DIALOG(dialog),graphic);                   
  
  
  page=service_guru_page_one(mguru,window);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Select a service");
  
  page=service_guru_page_two(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Basic parameters");
  
  page=service_guru_page_three(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"User Access Control");

  page=service_guru_page_four(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Select User Access Control");

  page=service_guru_page_five(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Host Access Control");

  page=service_guru_page_six(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Read Write Control");

  page=service_guru_page_seven(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Read Write Control");

  page=service_guru_page_eight(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Read Write Control");

  page=service_guru_page_nine(mguru);
  gtk_widget_show(page);
  gnome_mguru_append_page(GNOME_MGURU(mguru),page,"Read Write Control");

  gtk_object_set_data(GTK_OBJECT(mguru),"dialog",dialog);
  gtk_signal_connect(GTK_OBJECT(mguru),
		     "mguru_click",
		     GTK_SIGNAL_FUNC(c_service_mguru_button),
		     window);
  gtk_widget_show(mguru);
  gtk_widget_show(dialog);
  handle_sensitivity(mguru);
  return;

}

void c_del_diag_ok(GtkWidget *button, gpointer window){
  GtkWidget *diagwin;
  int row;
  GtkWidget *sublist;

  diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
  sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
  
  
  row = (int)(GTK_CLIST(sublist)->selection->data);
  gtk_clist_remove(GTK_CLIST(sublist),row);

  resensitize_sw(GTK_WIDGET(window));
  

  gtk_widget_destroy(diagwin);
  gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
  return;
  
}

void make_del_dialog(GtkWidget *window){
  GtkWidget *diagwin;  
  GtkWidget *label;
  GtkWidget *vbox;
  char *text;
  int row;
  GtkWidget *sublist;

  desensitize_sw(window);

  sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
  row = (int)(GTK_CLIST(sublist)->selection->data);

  gtk_clist_get_text(GTK_CLIST(sublist),
			row ,0,&text);

  diagwin = gnome_dialog_new (text,NULL);
  gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);

  vbox=gtk_vbox_new(FALSE,0);
  gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox), 
		      vbox, TRUE, TRUE, 10);
  gtk_container_border_width (GTK_CONTAINER (vbox), 0);
  gtk_widget_show (vbox);

  gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
                     GTK_SIGNAL_FUNC(c_param_diag_delete),
                     window);
  gtk_window_position (GTK_WINDOW (diagwin),GTK_WIN_POS_CENTER);
  label = gtk_label_new("delete parameter:");
  gtk_box_pack_start (GTK_BOX (vbox), 
		      label, TRUE, TRUE, 0);
  gtk_widget_show (label);
  label = gtk_label_new(text);
  gtk_box_pack_start (GTK_BOX (vbox), 
		      label, TRUE, TRUE, 0);
  gtk_widget_show (label);

  gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
					 "Delete",
					 GNOME_STOCK_MENU_CUT);
  gnome_dialog_append_button(GNOME_DIALOG(diagwin),
			     GNOME_STOCK_BUTTON_CANCEL);
  gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
			      GTK_SIGNAL_FUNC(c_del_diag_ok),
			      window);
  gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
			      GTK_SIGNAL_FUNC(c_param_diag_cancel),
			      window);
  
  gtk_widget_show(diagwin);
  return;
}

void c_del_service_ok(GtkWidget *button, gpointer window){
  GtkWidget *diagwin;

  diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
  
  smbwin_delete_service(GTK_WIDGET(window));
  
  resensitize_sw(GTK_WIDGET(window));

  gtk_widget_destroy(diagwin);
  gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
  return;
  
}

void make_del_service_dialog(GtkWidget *window){
  GtkWidget *diagwin;
  GtkWidget *label;
  GtkWidget *vbox;
  char *text;
  int row;
  GtkWidget *servicelist;

  servicelist=gtk_object_get_data(GTK_OBJECT(window),"servicelist");


  desensitize_sw(GTK_WIDGET(window));

  row = (int)(GTK_CLIST(servicelist)->selection->data);

  gtk_clist_get_text(GTK_CLIST(servicelist),
			row ,0,&text);

  diagwin = gnome_dialog_new (text,NULL);
  gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);

  vbox=gtk_vbox_new(FALSE,0);
  gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox), 
		      vbox, TRUE, TRUE, 0);
  gtk_container_border_width (GTK_CONTAINER (vbox), 10);
  gtk_widget_show (vbox);

  gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
                     GTK_SIGNAL_FUNC(c_param_diag_delete),
                     window);
  
  gtk_window_position (GTK_WINDOW(diagwin),GTK_WIN_POS_CENTER);
  label = gtk_label_new("delete service:");
  gtk_box_pack_start (GTK_BOX (vbox), 
		      label, TRUE, TRUE, 0);
  gtk_widget_show (label);
  label = gtk_label_new(text);
  gtk_box_pack_start (GTK_BOX (vbox), 
		      label, TRUE, TRUE, 0);
  gtk_widget_show (label);

  gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
					 "Delete",
					 GNOME_STOCK_MENU_CUT);
  gnome_dialog_append_button(GNOME_DIALOG(diagwin),
			     GNOME_STOCK_BUTTON_CANCEL);
  gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
			      GTK_SIGNAL_FUNC(c_del_service_ok),
			      window);
  gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
			      GTK_SIGNAL_FUNC(c_param_diag_cancel),
			      window);

  gtk_widget_show(diagwin);
  return;
}


void make_user_mesg(char *message, char *title){
  if(!strcasecmp("Error",title))
    gnome_error_dialog(message);
  else if(!strcasecmp("Warning",title))
    gnome_warning_dialog(message);
  else
    gnome_ok_dialog(message);
  return;
}

void sw_main_menu(GtkWidget *window){

  GnomeUIInfo filemenu[] = {
    { GNOME_APP_UI_ITEM, 
      N_("Open Configuration File"), NULL,
      c_conf_open, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_NEW,
      's', GDK_CONTROL_MASK, NULL},
    { GNOME_APP_UI_ITEM,
      N_("Open Alternate File"), NULL,
      c_alt_open, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN,
      'o', GDK_CONTROL_MASK, NULL},    
    { GNOME_APP_UI_ITEM,
      N_("Open From Server"), NULL,
      NULL, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_JUMP_TO,
      0, 0, NULL},    
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM, 
      N_("Write to Current File"), NULL,
      c_write_conf, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE,
      'w', GDK_CONTROL_MASK, NULL},
    { GNOME_APP_UI_ITEM,
      N_("Write to Alternate File"), NULL,
      c_write_alt, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SAVE_AS,
      'a', GDK_CONTROL_MASK, NULL},    
    { GNOME_APP_UI_ITEM,
      N_("Write to Server"), NULL,
      NULL,NULL,NULL,
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_JUMP_TO,
      0, 0, NULL},    
    GNOMEUIINFO_SEPARATOR,  
    { GNOME_APP_UI_ITEM,
      N_("Preferences"), NULL,
      c_make_pref_box, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF,
      'p', GDK_CONTROL_MASK, NULL},
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM,
      N_("Close"), NULL,
      c_smbwin_close, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CLOSE,
      'c', GDK_CONTROL_MASK, NULL}, 
    { GNOME_APP_UI_ITEM,
      N_("New Window"), NULL,
      c_smbwin_new, window, NULL, 
      GNOME_APP_PIXMAP_NONE, NULL,
      0,0, NULL},
    { GNOME_APP_UI_ITEM,
      N_("Exit"), NULL,
      c_make_exit_dialog, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_QUIT,
      'q', GDK_CONTROL_MASK, NULL},
    GNOMEUIINFO_END
  };

  GnomeUIInfo editmenu[] = {
    { GNOME_APP_UI_ITEM,
      N_("Edit Parameter"), NULL,
      c_edit_param, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PROP,
      'e', GDK_CONTROL_MASK, NULL},
    { GNOME_APP_UI_ITEM,
      N_("New Parameter"), NULL,
      c_make_inserter, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_COPY,
      'i', GDK_CONTROL_MASK , NULL},
    { GNOME_APP_UI_ITEM,
      N_("New Service"), NULL,
      c_insert_service, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PASTE,
      'n',GDK_CONTROL_MASK, NULL},
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM,
      N_("Delete Parameter"), NULL,
      c_delete_param, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CUT,
      'd', GDK_CONTROL_MASK, NULL},
    { GNOME_APP_UI_ITEM,
      N_("Delete Service"), NULL,
      c_delete_service, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CUT,
      0, 0, NULL},
    GNOMEUIINFO_END
  };

  GnomeUIInfo optionsmenu[] = {
    { GNOME_APP_UI_ITEM,
      N_("Run testparm"), NULL,
      c_run_testparm, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_EXEC,
      't', GDK_CONTROL_MASK, NULL},
    { GNOME_APP_UI_ITEM,
      N_("Run smbstatus"), NULL,
      c_run_smbstatus, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SEARCH,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM,
      N_("Restart Samba"), NULL,
      c_restart_samba, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_REFRESH,
      0, 0, NULL},
    GNOMEUIINFO_END
  };

  GnomeUIInfo helpmenu[] = {
    { GNOME_APP_UI_ITEM,
      N_("smb.conf(5)"), NULL,
      c_make_overview, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_BOOK_OPEN,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM,
      N_("testparm(1)"), NULL,
      c_man_testparm, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_BOOK_OPEN,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM,
      N_("smbstatus(1)"), NULL,
      c_man_smbstatus, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_BOOK_OPEN,
      0, 0, NULL}, 
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM,
      N_("Selected Parameter"), NULL,
      c_help_sel_param, window, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_INDEX,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM,
      N_("Look Up Parameter"), NULL,
      c_make_param_lookup, NULL, NULL, 
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_INDEX,
      0, 0, NULL},
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM,
      N_("About"), NULL,
      c_help_about, NULL, NULL, 
      GNOME_APP_PIXMAP_NONE, NULL,
      0, 0, NULL},
    GNOMEUIINFO_END
  };

  GnomeUIInfo mainmenu[] = {
    GNOMEUIINFO_SUBTREE(N_("_File"), filemenu),
    GNOMEUIINFO_SUBTREE(N_("_Edit"), editmenu),
    GNOMEUIINFO_SUBTREE(N_("_Options"), optionsmenu),
    GNOMEUIINFO_SUBTREE(N_("_Help"), helpmenu),
    GNOMEUIINFO_END
  };

  gnome_app_create_menus(GNOME_APP(window), mainmenu);
  return;

}

void sw_toolbars(GtkWidget *window){
  GnomeUIInfo toolbar[] = {
    { GNOME_APP_UI_ITEM, 
      N_("Open"), N_("Open Configuration"),
      GTK_SIGNAL_FUNC(c_alt_open), window, NULL, 
      GNOME_APP_PIXMAP_DATA, open_xpm,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM, 
      N_("Write"), N_("Write Configuration"),
      GTK_SIGNAL_FUNC(c_write_alt), window, NULL, 
      GNOME_APP_PIXMAP_DATA, save_xpm,
      0, 0, NULL},
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM, 
      N_("Insert"), N_("Insert Service"),
      GTK_SIGNAL_FUNC(c_insert_service), window, NULL, 
      GNOME_APP_PIXMAP_DATA, share_xpm,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM, 
      N_("Delete"), N_("Delete Service"),
      GTK_SIGNAL_FUNC(c_delete_service), window, NULL, 
      GNOME_APP_PIXMAP_DATA, delshare_xpm,
      0, 0, NULL},
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM, 
      N_("Edit"), N_("Edit Parameter"),
      GTK_SIGNAL_FUNC(c_edit_param), window, NULL, 
      GNOME_APP_PIXMAP_DATA, edit_xpm,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM, 
      N_("Insert"), N_("Insert Parameter"),
      GTK_SIGNAL_FUNC(c_make_inserter), window, NULL, 
      GNOME_APP_PIXMAP_DATA, new_xpm,
      0, 0, NULL},
    { GNOME_APP_UI_ITEM, 
      N_("Delete"), N_("Delete Parameter"),
      GTK_SIGNAL_FUNC(c_delete_param), window, NULL, 
      GNOME_APP_PIXMAP_DATA, delete_xpm,
      0, 0, NULL},
    GNOMEUIINFO_SEPARATOR,
    { GNOME_APP_UI_ITEM, 
      N_("Exit"), N_("Quit Program"),
      GTK_SIGNAL_FUNC(c_make_exit_dialog), window, NULL, 
      GNOME_APP_PIXMAP_DATA, exit_xpm,
      0, 0, NULL},
    GNOMEUIINFO_END
  };
  gnome_app_create_toolbar(GNOME_APP(window), toolbar);
  return;
}

    


  


syntax highlighted by Code2HTML, v. 0.9.1