#!/bin/sh

alterator_api_version=1
. alterator-sh-functions
. alterator-net-functions

write_string_params(){
  while read key val; do
    write_string_param "${key%:}" "${val}"
  done
}

write_bool_params(){
  while read key val; do
    write_bool_param "${key%:}" "${val}"
  done
}

write_error_filtered(){
  local err_msg="$(echo "$1" | sed -r "/quota.+: +Your +kernel +probably +supports +ext4 +quota >*/d")"
  [ -z "$err_msg" ] || write_error "$err_msg"
}

fs=""
uid=""
on_message()
{
  case "$in_action" in
    list)
      case "$in__objects" in
        availablefs) alterator-quota listavailablefs | write_enum ;;
        fs)          alterator-quota listfs          | write_enum ;;
        users)       alterator-quota list            | write_enum ;;
      esac
    ;;
    read)
      case "$in__objects" in
        quota)
          in_fs="${in_fs:-$fs}"
          in_uid="${in_uid:-$uid}"
          [ -n "$in_fs" -a -n "$in_uid" ] || return
          [ "$in_fs" != "#f" -a "$in_uid" != "#f" ] || return
          set_locale
          local ans="$( ( alterator-quota read -f "$in_fs" -u "$in_uid" |\
                       write_string_params ) 2>&1)"
          ans="${ans#alterator-quota: }"
          ans="${ans#Error: }"
          [ -z "$ans" ] || write_error_filtered "$ans"
        ;;
        fs)
          in_fs="${in_fs:-$fs}"
          [ -n "$in_fs" ] || return
          [ "$in_fs" != "#f" ] || return
          set_locale
          local ans="$( ( alterator-quota getquotastatus -f "$in_fs" |\
                       write_bool_params ) 2>&1)"
          ans="${ans#alterator-quota: }"
          ans="${ans#Error: }"
          [ -z "$ans" ] || write_error_filtered "$ans"
        ;;
      esac
    ;;
    write)
      case "$in__objects" in
        quota)
          uid="$in_uid"
          fs="$in_fs"
          set_locale
          local ans="$(alterator-quota write -f "$in_fs" -u "$in_uid" \
                       -q"${in_b_soft:-0},${in_b_hard:-0},${in_i_soft:-0},${in_i_hard:-0}" 2>&1)"
          ans="${ans#alterator-quota: }"
          ans="${ans#Error: }"
          [ -z "$ans" ] || write_error_filtered "$ans"
        ;;
        fs)
          fs="$in_fs"
          local enabled
          if test_bool "$in_enabled" ; then enabled="true" ; else enabled="false" ; fi
          set_locale
          local ans="$(alterator-quota setquotastatus -f "$in_fs" -e "$enabled" 2>&1)"
          ans="${ans#alterator-quota: }"
          ans="${ans#Error: }"
          [ -z "$ans" ] || write_error_filtered "$ans"
        ;;
      esac
    ;;
  esac
}

message_loop
