+/** Copies a username, cleaning it in the process.
+ *
+ * @param[out] dest Destination buffer for user name.
+ * @param[in] src Source buffer for user name. Must be distinct from
+ * \a dest.
+ */
+void clean_username(char *dest, const char *src)
+{
+ int rlen = USERLEN;
+ char ch;
+
+ /* First character can be ~, later characters cannot. */
+ if (!IsCntrl(*src))
+ {
+ ch = *src++;
+ *dest++ = IsUserChar(ch) ? ch : '_';
+ rlen--;
+ }
+ while (rlen-- && !IsCntrl(ch = *src++))
+ {
+ *dest++ = (IsUserChar(ch) && (ch != '~')) ? ch : '_';
+ }
+ *dest = '\0';
+}
+