/* <b>check</b><em>(dict=nil)</em>
 *
 * This interfaces to LibCrack to check the strength of the password. If
 * _dict_ is given, it is the path to the CrackLib dictionary, minus the
 * file's extension. For example, if the dictionary is located at
 * <tt>/usr/lib/cracklib_dict.pwd</tt>, _dict_ would be
 * <tt>/usr/lib/cracklib_dict</tt>. If it is not given, the dictionary found
 * at build time will be used.
 *
 * If a path is given that does not lead to a legible dictionary, a
 * Password::DictionaryError exception is raised. On success, +true+ is
 * returned. On failure, a Password::WeakPassword exception is raised.
 */
static VALUE passwd_check(VALUE self, VALUE args)
{
    VALUE dict;
    char *objection;
    char *buffer;

    /* pop the one and only argument we may have been passed */
    dict = rb_ary_pop(args);

    if (dict == Qnil || strcmp(STR2CSTR(dict), "") == 0) {
        /* no argument passed, so use default location from rbcrack.h */
        dict = rb_str_new2(CRACK_DICT);
    } else {
        buffer = malloc(strlen(STR2CSTR(dict)) + 8);
        strcpy(buffer, STR2CSTR(dict));
        strcat(buffer, ".pwd");

        if (access(buffer, R_OK) != 0) {
            free(buffer);
            rb_raise(ePassword_DictionaryError, "%s", strerror(errno));
        }

        free(buffer);

    }

    /* perform check on password */
    objection = FascistCheck(STR2CSTR(self), STR2CSTR(dict));

    /* return true on success; raise an exception otherwise */
    if (objection) {
        rb_raise(ePassword_WeakPassword, "%s", objection);
    } else {
        return Qtrue;
    }

}