#!/bin/bash
# 
# This script is used for Administration of RSBAC general ipc attributes
#
#
# Make sure we're really running bash.
#
[ -z "$BASH" ] && { echo "This menu requires bash" 1>&2; exit 1; }
#
# We also need the proc fs mounted.
[ ! -f /proc/stat ] && { echo "This menu requires proc fs mounted" 1>&2; exit 1; }
#
# Cache function definitions, turn off posix compliance
#
set -h +o posix

ATTRIBUTES="security_level object_category data_type \
            pm_object_class pm_ipc_purpose pm_object_type \
            ms_backbuf ms_buflen ms_str_nr ms_offset ms_scanned \
            rc_type"

# The dir for tmp files
if test -z "$TMPDIR" ; then TMPDIR=/tmp ; fi

# This must be a unique temporary filename
if ! TMPFILE=`mktemp -q $TMPDIR/rsbac_dialog.XXXXXX`
then
  TMPFILE=$TMPDIR/rsbac_dialog.$$
  if test -e $TMPFILE
  then rm $TMPFILE
  fi
fi
if ! TMPFILETWO=`mktemp -q $TMPDIR/rsbac_dialog.XXXXXX`
then
  TMPFILETWO=$TMPDIR/rsbac_dialog.$$.2
  if test -e $TMPFILETWO
  then rm $TMPFILETWO
  fi
fi

# set this to rsbac bin dir, if not in path (trailing / is mandatory!)
#
#if test -z "$RSBACPATH" ; then RSBACPATH=./ ; fi

# which dialog tool to use - dialog or kdialog
if test -z $DIALOG
then DIALOG=dialog
fi

if ! $DIALOG --clear
then
  echo $DIALOG menu program required! >&2
  exit
fi

# test for LINES and COLUMNS (should be exported e.g. in /etc/profile)
if test -z "$LINES" ; then LINES=25 ; fi
if test -z "$COLUMNS" ; then COLUMNS=80 ; fi
export LINES
export COLUMNS
declare -i BL=$LINES-4
declare -i BC=$COLUMNS-4
declare -i MAXLINES=$LINES-10
gl () {
  if test $1 -gt $MAXLINES
  then echo $MAXLINES
  else echo $1
  fi
}

if test -z "$BACKTITLE"
  then BACKTITLE="RSBAC Administration Tools v1.1.2" ; fi
TITLE="`whoami`@`hostname`: RSBAC Socket IPC Administration"
ERRTITLE="RSBAC Socket IPC Administration - ERROR"


get_attributes () {
  if test "$1" != "" -a "$2" != ""
    then \
        if test -z "$RSBAC_REDUCED"
        then
          SECLEVEL=`$RSBACPATH""attr_get_ipc sockid $1 $2 security_level`
          MACCAT=`$RSBACPATH""attr_get_ipc sockid $1 $2 mac_categories`
          OBJCAT=`$RSBACPATH""attr_get_ipc sockid $1 $2 object_category`
          DATATYPE=`$RSBACPATH""attr_get_ipc sockid $1 $2 data_type`
          PMCLASS=`$RSBACPATH""attr_get_ipc sockid $1 $2 pm_object_class`
          PMIPCPP=`$RSBACPATH""attr_get_ipc sockid $1 $2 pm_ipc_purpose`
          PMOBJTYPE=`$RSBACPATH""attr_get_ipc sockid $1 $2 pm_object_type`
          MSBACKBUF=`$RSBACPATH""attr_get_ipc sockid $1 $2 ms_backbuf`
          MSBUFLEN=`$RSBACPATH""attr_get_ipc sockid $1 $2 ms_buflen`
          MSSTRNR=`$RSBACPATH""attr_get_ipc sockid $1 $2 ms_str_nr`
          MSSTROFF=`$RSBACPATH""attr_get_ipc sockid $1 $2 ms_str_offset`
          MSSCANNED=`$RSBACPATH""attr_get_ipc sockid $1 $2 ms_scanned`
        fi
        RCTYPE=`$RSBACPATH""attr_get_ipc sockid $1 $2 rc_type`
  fi
}

clear_attributes () {
         SOCKET=""
         SECLEVEL=""
         MACCAT=""
         OBJCAT=""
         DATATYPE=""
         PMCLASS=""
         PMIPCPP=""
         PMOBJTYPE=""
         MSBACKBUF=""
         MSBUFLEN=""
         MSSTRNR=""
         MSSTROFF=""
         MSSCANNED=""
         RCTYPE=""
}

onoff () {
   if test "$1" = "$2"
     then echo on
   else echo off
   fi
}

onoffb () {
   if test "$1" = "1"
     then echo on
   else echo off
   fi
}

list_item () {
   TMP2=""
   if test -L /proc/$1/fd/$2
   then TMP2=`ls -l /proc/$1/fd/$2|cut -c 56-|cut -f 3 -d ' '`
   fi
   if test "$TMP2" = ""
   then echo "not_found"
   else echo $TMP2
   fi
}

proc_name () {
   TMP2=""
   if test -f /proc/$1/cmdline
   then TMP2=`cat /proc/$1/stat|cut -f 2 -d ' '`
   fi
   if test "$TMP2" = ""
   then echo "not_available"
   else echo $TMP2
   fi
}

type_name () {
  if test -z "$SOCKET" -o -z "$1"
  then echo " "
  else if ! $RSBACPATH""rc_get_item TYPE $1 type_ipc_name
       then echo "(unknown)"
       fi
  fi
}

get_vname () {
  case $1 in
    seclevel)
      case $2 in
        0) echo unclassified
          ;;
        1) echo confidential
          ;;
        2) echo secret
          ;;
        3) echo top secret
          ;;
        252) echo max. level
          ;;
        253) echo rsbac-internal
          ;;
        254) echo inherit
          ;;
      esac 
      ;;
    objcat)
      case $2 in
        0) echo General
          ;;
        1) echo Security
          ;;
        2) echo System
          ;;
        *) echo N/A
          ;;
      esac 
      ;;
    datatype)
      case $2 in
        0) echo None
          ;;
        1) echo CDI
          ;;
        2) echo CDIIC
          ;;
        3) echo SI
          ;;
        *) echo N/A
          ;;
      esac 
      ;;
    pmobjtype)
      case $2 in
        0) echo None
          ;;
        1) echo TP
          ;;
        2) echo Personal Data
          ;;
        3) echo Non-Personal Data
          ;;
        4) echo IPC
          ;;
        5) echo Directory
          ;;
        *) echo N/A
          ;;
      esac 
      ;;
    onoff)
      case $2 in
        0) echo Off
          ;;
        1) echo On
          ;;
        *) echo N/A
          ;;
      esac 
      ;;
    msscanned)
      case $2 in
        0) echo To be scanned
          ;;
        1) echo Rejected
          ;;
        2) echo Active Rejected
          ;;
        *) echo N/A
          ;;
      esac 
      ;;
  esac
}

declare -i MAXCATLEN=$BC-38
cat_print () {
  if test $MAXCATLEN -ge 64
  then echo $1
  else echo "(too long)"
  fi
}

gen_cat_list () {
    for i in $*
    do
      TMP=`$RSBACPATH""attr_get_user $USERID mac_categories $i`
      echo $i `onoffb $TMP` `onoffb $TMP`
    done
}

if test "$1" != ""
then PROCESS=$1
else PROCESS=$$
fi
if test "$2" != ""
then SOCKET=$2
     get_attributes $PROCESS $SOCKET
fi


while true ; do \
  if test -n "$RSBAC_REDUCED"
  then
    if ! \
    $DIALOG --title "$TITLE" \
            --backtitle "$BACKTITLE" \
            --menu "Main Menu" $BL $BC `gl 9` \
                "Process List:" "Choose process from list" \
                "Socket List:" "Choose socket fd from list" \
                "---------------" " "\
                "Process:" "$PROCESS / `proc_name $PROCESS`" \
                "Socket ID:" "$SOCKET / `list_item $PROCESS $SOCKET`" \
                "RC Type:" "$RCTYPE / `type_name $RCTYPE`" \
                "---------------" " "\
                "ACL Menu:" "Go to ACL menu" \
                "Quit" "" \
         2>$TMPFILE
     then rm $TMPFILE ; exit
    fi
  else
    if ! \
    $DIALOG --title "$TITLE" \
            --backtitle "$BACKTITLE" \
            --menu "Main Menu" $BL $BC `gl 21` \
                "Process List:" "Choose process from list" \
                "Socket List:" "Choose socket fd from list" \
                "---------------" " "\
                "Process:" "$PROCESS / `proc_name $PROCESS`" \
                "Socket ID:" "$SOCKET / `list_item $PROCESS $SOCKET`" \
                "Security Level:" "$SECLEVEL / `get_vname seclevel $SECLEVEL`" \
                "MAC Categories:" "`cat_print $MACCAT`" \
                "Object Category:" "$OBJCAT / `get_vname objcat $OBJCAT`" \
                "Data Type:" "$DATATYPE / `get_vname datatype $DATATYPE`" \
                "PM Object Class:" "$PMCLASS" \
                "PM IPC Purpose:" "$PMIPCPP" \
                "PM Object Type:" "$PMOBJTYPE / `get_vname pmobjtype $PMOBJTYPE`" \
                "MS Scanned:" "$MSSCANNED / `get_vname msscanned $MSSCANNED`" \
                "MS Backbuf:" "$MSBACKBUF" \
                "MS Buflen:" "$MSBUFLEN" \
                "MS Str Nr:" "$MSSTRNR" \
                "MS Str Offset:" "$MSSTROFF" \
                "RC Type:" "$RCTYPE / `type_name $RCTYPE`" \
                "---------------" " "\
                "ACL Menu:" "Go to ACL menu" \
                "Quit" "" \
         2>$TMPFILE
     then rm $TMPFILE ; exit
    fi
  fi

  case `cat $TMPFILE` in
    Process:)
        if $DIALOG --title "$TITLE" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "Process ID" $BL $BC $PROCESS \
           2>$TMPFILE
        then TMP=`cat $TMPFILE`
             if test -d /proc/$TMP
             then PROCESS=$TMP
                  clear_attributes
             else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Process: Unknown process $TMP!" 5 $BC
             fi
        fi
      ;;

    'Process List:')
        TMP=`ps axh|cut -c 1-5|sort -n`
#        echo `for i in $TMP ; do echo $i "\`list_item $i\`" ; done`
#        sleep 2
        if $DIALOG --title "$TITLE" \
                  --backtitle "$BACKTITLE" \
                  --menu "Choose Process" $BL $BC $MAXLINES \
                         `for i in $TMP ; do echo $i "\`proc_name $i\`" ; done` \
           2>$TMPFILE
        then TMP=`cat $TMPFILE`
             if test -d /proc/$TMP
             then PROCESS=$TMP
                  clear_attributes
             else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Process List: Unknown process $TMP!" 5 $BC
             fi
        fi
      ;;

    'Socket ID':)
       if test "$PROCESS" != ""
       then \
        if $DIALOG --title "$TITLE" \
                  --backtitle "$BACKTITLE" \
                  --inputbox "Socket ID" $BL $BC $SOCKET \
           2>$TMPFILE
        then TMP=`cat $TMPFILE`
             if test -L /proc/$PROCESS/fd/$TMP
             then SOCKET=$TMP
                  get_attributes $PROCESS $SOCKET
             else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Socket ID: Unknown socket fd $TMP!" 5 $BC
             fi
        fi
       else
         $DIALOG --title "$ERRTITLE" \
                --backtitle "$BACKTITLE" \
                --msgbox "Socket ID: No process/socket specified!" 5 $BC
       fi
      ;;

    'Socket List:')
       if test "$PROCESS" != ""
       then \
        TMP=`ls -l /proc/$PROCESS/fd|grep 'socket'|cut -c 56-|cut -f 1 -d ' '`
#        echo `for i in $TMP ; do echo $i "\`list_item $PROCESS $i\`" ; done`
#        sleep 2
        if $DIALOG --title "$TITLE" \
                  --backtitle "$BACKTITLE" \
                  --menu "Choose Socket for Process $PROCESS" $BL $BC $MAXLINES \
                         `for i in $TMP ; do echo $i "\`list_item $PROCESS $i\`" ; done` \
           2>$TMPFILE
        then TMP=`cat $TMPFILE`
             if test -L /proc/$PROCESS/fd/$TMP
             then SOCKET=$TMP
                  get_attributes $PROCESS $SOCKET
             else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Socket List: Unknown socket fd $TMP!" 5 $BC
             fi
        fi
       else
         $DIALOG --title "$ERRTITLE" \
                --backtitle "$BACKTITLE" \
                --msgbox "Socket List: No process/socket specified!" 5 $BC
       fi
      ;;

    'Security Level:')
        if test "$TYPE" != "NONE"
        then \
          if $DIALOG --title "$TITLE" \
                    --backtitle "$BACKTITLE" \
                    --radiolist "Choose Security Level for $PROCESS / $SOCKET" $BL $BC 4 \
                                0 "`get_vname seclevel 0`" `onoff 0 $SECLEVEL` \
                                1 "`get_vname seclevel 1`" `onoff 1 $SECLEVEL` \
                                2 "`get_vname seclevel 2`" `onoff 2 $SECLEVEL` \
                                3 "`get_vname seclevel 3`" `onoff 3 $SECLEVEL` \
             2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET security_level $TMP &>$TMPFILE
               then SECLEVEL=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Security Level: No process/socket specified!" 5 $BC
        fi
      ;;

    'MAC Categories:')
        if test "$TYPE" != "NONE"
        then \
          ALLCATNR=`$RSBACPATH""attr_get_file_dir list_category_nr`
          if $DIALOG --title "MAC Categories for $PROCESS/$SOCKET" \
                    --backtitle "$BACKTITLE" \
                    --checklist "Bits: $MACCAT" $BL $BC $MAXLINES \
                    `gen_cat_list $ALLCATNR` \
             2>$TMPFILE
          then TMP=`cat $TMPFILE|tr -d '"'`
               for i in $ALLCATNR
               do
                 if ! $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET mac_categories $i 0 &>$TMPFILE
                 then \ 
                   $DIALOG --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head -n 1 $TMPFILE`" $BL $BC
                   continue
                 fi
               done
               for i in $TMP
               do
                 if ! $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET mac_categories $i 1 &>$TMPFILE
                 then \
                   $DIALOG --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head -n 1 $TMPFILE`" $BL $BC
                   continue
                 fi
               done
               MACCAT=`$RSBACPATH""attr_get_ipc sockid $1 $2 mac_categories`
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "MAC Categories: No process/socket specified!" 5 $BC
        fi
      ;;

    'Object Category:')
        if test "$TYPE" != "NONE"
        then \
          if $DIALOG --title "$TITLE" \
                    --backtitle "$BACKTITLE" \
                    --radiolist "Choose Object Category for $PROCESS / $SOCKET" $BL $BC 3 \
                                0 "`get_vname objcat 0`" `onoff 0 $OBJCAT` \
                                1 "`get_vname objcat 1`" `onoff 1 $OBJCAT` \
                                2 "`get_vname objcat 2`" `onoff 2 $OBJCAT` \
             2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET object_category $TMP &>$TMPFILE
               then OBJCAT=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Object Category: No process/socket specified!" 5 $BC
        fi
      ;;

    'Data Type:')
        if test "$TYPE" != "NONE"
        then \
          if $DIALOG --title "$TITLE" \
                    --backtitle "$BACKTITLE" \
                    --radiolist "Choose Data Type for $PROCESS / $SOCKET" $BL $BC 5 \
                                0 "`get_vname datatype 0`" `onoff 0 $DATATYPE` \
                                1 "`get_vname datatype 1`" `onoff 1 $DATATYPE` \
                                2 "`get_vname datatype 2`" `onoff 2 $DATATYPE` \
                                3 "`get_vname datatype 3`" `onoff 3 $DATATYPE` \
             2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET data_type $TMP &>$TMPFILE
               then DATATYPE=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "Data Type: No process/socket specified!" 5 $BC
        fi
      ;;

    'PM Object Class:')
        if test "$TYPE" != "NONE"
        then \
           if $DIALOG --title "$TITLE" \
                     --backtitle "$BACKTITLE" \
                     --inputbox "PM Object Class (long integer) for $PROCESS / $SOCKET" \
                                $BL $BC "$PMCLASS" \
              2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET pm_object_class $TMP &>$TMPFILE
               then PMCLASS=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "PM Object Class: No process/socket specified!" 5 $BC
        fi
      ;;

    'PM IPC Purpose:')
        if test "$TYPE" != "NONE"
        then \
           if $DIALOG --title "$TITLE" \
                     --backtitle "$BACKTITLE" \
                     --inputbox "PM IPC Purpose (long integer) for $PROCESS / $SOCKET" \
                                $BL $BC "$PMIPCPP" \
              2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET pm_ipc_purpose $TMP &>$TMPFILE
               then PMIPCPP=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "PM IPC Purpose: No process/socket specified!" 5 $BC
        fi
      ;;

    'PM Object Type:')
        if test "$TYPE" != "NONE"
        then \
          if $DIALOG --title "$TITLE" \
                    --backtitle "$BACKTITLE" \
                    --radiolist "Choose PM Object Type for $PROCESS / $SOCKET" $BL $BC 6 \
                                0 "`get_vname pmobjtype 0`" `onoff 0 $PMOBJTYPE` \
                                1 "`get_vname pmobjtype 1`" `onoff 1 $PMOBJTYPE` \
                                2 "`get_vname pmobjtype 2`" `onoff 2 $PMOBJTYPE` \
                                3 "`get_vname pmobjtype 3`" `onoff 3 $PMOBJTYPE` \
                                4 "`get_vname pmobjtype 4`" `onoff 4 $PMOBJTYPE` \
                                5 "`get_vname pmobjtype 5`" `onoff 5 $PMOBJTYPE` \
             2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET pm_object_type $TMP &>$TMPFILE
               then PMOBJTYPE=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "PM Object Type: No process/socket specified!" 5 $BC
        fi
      ;;

    'MS Backbuf:')
        if test "$TYPE" != "NONE"
        then \
           if $DIALOG --title "$TITLE" \
                     --backtitle "$BACKTITLE" \
                     --inputbox "MS Backbuf (long integer) for $PROCESS / $SOCKET" \
                                $BL $BC "$MSBACKBUF" \
              2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET ms_backbuf $TMP &>$TMPFILE
               then MSBACKBUF=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "MS Backbuf: No process/socket specified!" 5 $BC
        fi
      ;;

    'MS Buflen:')
        if test "$TYPE" != "NONE"
        then \
           if $DIALOG --title "$TITLE" \
                     --backtitle "$BACKTITLE" \
                     --inputbox "MS Buflen (long integer) for $PROCESS / $SOCKET" \
                                $BL $BC "$MSBUFLEN" \
              2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET ms_buflen $TMP &>$TMPFILE
               then MSBUFLEN=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "MS Buflen: No process/socket specified!" 5 $BC
        fi
      ;;

    'MS Str Nr:')
        if test "$TYPE" != "NONE"
        then \
           if $DIALOG --title "$TITLE" \
                     --backtitle "$BACKTITLE" \
                     --inputbox "MS Str Nr (long integer) for $PROCESS / $SOCKET" \
                                $BL $BC "$MSSTRNR" \
              2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET ms_str_nr $TMP &>$TMPFILE
               then MSSTRNR=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "MS Str Nr: No process/socket specified!" 5 $BC
        fi
      ;;

    'MS Str Offset:')
        if test "$TYPE" != "NONE"
        then \
           if $DIALOG --title "$TITLE" \
                     --backtitle "$BACKTITLE" \
                     --inputbox "MS Str Offset (long integer) for $PROCESS / $SOCKET" \
                                $BL $BC "$MSSTROFF" \
              2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET ms_str_offset $TMP &>$TMPFILE
               then MSSTROFF=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "MS Str Offset: No process/socket specified!" 5 $BC
        fi
      ;;

    'MS Scanned:')
        if test "$TYPE" != "NONE"
        then \
          if $DIALOG --title "$TITLE" \
                    --backtitle "$BACKTITLE" \
                    --radiolist "Choose MS Scanned for $PROCESS / $SOCKET" $BL $BC 6 \
                                0 "`get_vname msscanned 0`" `onoff 0 $MSSCANNED` \
                                1 "`get_vname msscanned 1`" `onoff 1 $MSSCANNED` \
                                2 "`get_vname msscanned 2`" `onoff 2 $MSSCANNED` \
             2>$TMPFILE
          then TMP=`cat $TMPFILE`
               if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET ms_scanned $TMP &>$TMPFILE
               then MSSCANNED=$TMP
               else \
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "`head -n 1 $TMPFILE`" $BL $BC
               fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "MS Scanned: No process/socket specified!" 5 $BC
        fi
      ;;

    'RC Type:')
        if test "$TYPE" != "NONE"
        then \
          if $RSBACPATH""rc_get_item list_used_ipc_types >$TMPFILE
          then \
            if $DIALOG --title "$TITLE" \
                      --backtitle "$BACKTITLE" \
                      --menu "Choose RC Type for $PROCESS / $SOCKET" $BL $BC $MAXLINES \
                      `cat $TMPFILE` \
               2>$TMPFILE
            then TMP=`cat $TMPFILE`
                 if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET rc_type $TMP &>$TMPFILE
                 then RCTYPE=$TMP
                 else \
                   $DIALOG --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head -n 1 $TMPFILE`" $BL $BC
                 fi
            fi
          else \
            if $DIALOG --title "$TITLE" \
                      --backtitle "$BACKTITLE" \
                      --inputbox "RC Type (integer) for $PROCESS / $SOCKET" \
                                 $BL $BC "$RCTYPE" \
                2>$TMPFILE
            then TMP=`cat $TMPFILE`
                 if $RSBACPATH""attr_set_ipc sockid $PROCESS $SOCKET rc_type $TMP &>$TMPFILE
                 then RCTYPE=$TMP
                 else \
                   $DIALOG --title "$ERRTITLE" \
                          --backtitle "$BACKTITLE" \
                          --msgbox "`head -n 1 $TMPFILE`" $BL $BC
                 fi
            fi
          fi
        else
                 $DIALOG --title "$ERRTITLE" \
                        --backtitle "$BACKTITLE" \
                        --msgbox "RC Type: No process/socket specified!" 5 $BC
        fi
      ;;

    'ACL Menu:')
        $RSBACPATH""rsbac_acl_menu IPC
      ;;

    Quit)
        rm $TMPFILE ; exit
      ;;

    *)
        $DIALOG --title "$ERRTITLE" \
               --backtitle "$BACKTITLE" \
               --msgbox "Main Menu: Selection Error!" 5 $BC

  esac
# sleep 2
done
