loop []
end
+fun sendOption f (bio, opt) =
+ case opt of
+ NONE => OpenSSL.writeInt (bio, 0)
+ | SOME x => (OpenSSL.writeInt (bio, 1);
+ f (bio, x))
+
+fun recvOption f bio =
+ case OpenSSL.readInt bio of
+ SOME 0 => SOME NONE
+ | SOME 1 =>
+ (case f bio of
+ SOME x => SOME (SOME x)
+ | NONE => NONE)
+ | _ => NONE
+
fun send (bio, m) =
case m of
MsgOk => OpenSSL.writeInt (bio, 1)
| MsgRegenerate => OpenSSL.writeInt (bio, 14)
| MsgRmuser dom => (OpenSSL.writeInt (bio, 15);
OpenSSL.writeString (bio, dom))
- | MsgCreateDbUser s => (OpenSSL.writeInt (bio, 16);
- OpenSSL.writeString (bio, s))
+ | MsgCreateDbUser {dbtype, passwd} => (OpenSSL.writeInt (bio, 16);
+ OpenSSL.writeString (bio, dbtype);
+ sendOption OpenSSL.writeString (bio, passwd))
| MsgCreateDbTable {dbtype, dbname} => (OpenSSL.writeInt (bio, 17);
OpenSSL.writeString (bio, dbtype);
OpenSSL.writeString (bio, dbname))
| 13 => Option.map MsgRmdom (recvList OpenSSL.readString bio)
| 14 => SOME MsgRegenerate
| 15 => Option.map MsgRmuser (OpenSSL.readString bio)
- | 16 => Option.map MsgCreateDbUser (OpenSSL.readString bio)
+ | 16 => (case (OpenSSL.readString bio, recvOption OpenSSL.readString bio) of
+ (SOME dbtype, SOME passwd) =>
+ SOME (MsgCreateDbUser {dbtype = dbtype, passwd = passwd})
+ | _ => NONE)
| 17 => (case (OpenSSL.readString bio, OpenSSL.readString bio) of
(SOME dbtype, SOME dbname) =>
SOME (MsgCreateDbTable {dbtype = dbtype, dbname = dbname})