Ejemplo n.º 1
0
const char *cli_errstr(struct cli_state *cli)
{   
	static fstring cli_error_message;
	uint32 flgs2 = SVAL(cli->inbuf,smb_flg2), errnum;
        uint8 errclass;
        int i;
	
	if (!cli->initialised) {
		fstrcpy(cli_error_message, "[Programmer's error] cli_errstr called on unitialized cli_stat struct!\n");
		return cli_error_message;
	}
		
	/* Was it server socket error ? */
	if (cli->fd == -1 && cli->smb_rw_error) {
		switch(cli->smb_rw_error) {
			case READ_TIMEOUT:
				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
					"Call timed out: server did not respond after %d milliseconds", 
					cli->timeout);
				break;
			case READ_EOF:
				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
					"Call returned zero bytes (EOF)\n" );
				break;
			case READ_ERROR:
				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
					"Read error: %s\n", strerror(errno) );
				break;
			case WRITE_ERROR:
				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
					"Write error: %s\n", strerror(errno) );
				break;
			default:
				slprintf(cli_error_message, sizeof(cli_error_message) - 1,
					"Unknown error code %d\n", cli->smb_rw_error );
				break;
		}
		return cli_error_message;
	}

        /* Case #1: RAP error */
	if (cli->rap_error) {
		for (i = 0; rap_errmap[i].message != NULL; i++) {
			if (rap_errmap[i].err == cli->rap_error) {
				return rap_errmap[i].message;
			}
		} 

		slprintf(cli_error_message, sizeof(cli_error_message) - 1, "RAP code %d", 
			cli->rap_error);

		return cli_error_message;
	}

        /* Case #2: 32-bit NT errors */
	if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
                NTSTATUS status = NT_STATUS(IVAL(cli->inbuf,smb_rcls));

                return get_nt_error_msg(status);
        }

        cli_dos_error(cli, &errclass, &errnum);

        /* Case #3: SMB error */

	return cli_smb_errstr(cli);
}
Ejemplo n.º 2
0
const char *cli_errstr(struct cli_state *cli)
{
    fstring cli_error_message;
    uint32 flgs2 = SVAL(cli->inbuf,smb_flg2), errnum;
    uint8 errclass;
    int i;
    char *result;

    if (!cli->initialised) {
        fstrcpy(cli_error_message, "[Programmer's error] cli_errstr called on unitialized cli_stat struct!\n");
        goto done;
    }

    /* Was it server socket error ? */
    if (cli->fd == -1 && cli->smb_rw_error) {
        switch(cli->smb_rw_error) {
        case SMB_READ_TIMEOUT:
            slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                     "Call timed out: server did not respond after %d milliseconds",
                     cli->timeout);
            break;
        case SMB_READ_EOF:
            slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                     "Call returned zero bytes (EOF)" );
            break;
        case SMB_READ_ERROR:
            slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                     "Read error: %s", strerror(errno) );
            break;
        case SMB_WRITE_ERROR:
            slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                     "Write error: %s", strerror(errno) );
            break;
        case SMB_READ_BAD_SIG:
            slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                     "Server packet had invalid SMB signature!");
            break;
        case SMB_NO_MEMORY:
            slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                     "Out of memory");
            break;
        default:
            slprintf(cli_error_message, sizeof(cli_error_message) - 1,
                     "Unknown error code %d\n", cli->smb_rw_error );
            break;
        }
        goto done;
    }

    /* Case #1: RAP error */
    if (cli->rap_error) {
        for (i = 0; rap_errmap[i].message != NULL; i++) {
            if (rap_errmap[i].err == cli->rap_error) {
                return rap_errmap[i].message;
            }
        }

        slprintf(cli_error_message, sizeof(cli_error_message) - 1, "RAP code %d",
                 cli->rap_error);

        goto done;
    }

    /* Case #2: 32-bit NT errors */
    if (flgs2 & FLAGS2_32_BIT_ERROR_CODES) {
        NTSTATUS status = NT_STATUS(IVAL(cli->inbuf,smb_rcls));

        return nt_errstr(status);
    }

    cli_dos_error(cli, &errclass, &errnum);

    /* Case #3: SMB error */

    return cli_smb_errstr(cli);

done:
    result = talloc_strdup(talloc_tos(), cli_error_message);
    SMB_ASSERT(result);
    return result;
}