/**
 * Return a copy of the short description from the instance data
 * @ingroup globus_errno_error_object 
 * 
 * @param error
 *        The error object to retrieve the data from.
 * @return
 *        String containing the short description if it exists, NULL
 *        otherwise.
 */
static
char *
globus_l_error_errno_printable(
    globus_object_t *                   error)
{
    globus_module_descriptor_t *        base_source;
    char *                              sys_failed =
        _GCSL("A system call failed:");
    char *                              sys_error = NULL;
    int                                 length = 10 + strlen(sys_failed);
    char *                              printable;

#ifndef WIN32
    sys_error = globus_libc_system_error_string(
        *((int *) globus_object_get_local_instance_data(error)));
    length += sys_error ? strlen(sys_error) : 0;
#else
    length += FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 
        NULL,
        *((int *) globus_object_get_local_instance_data(error)), 
        0, 
        (LPTSTR)&sys_error,
        0,
        NULL);
#endif
    
    base_source = globus_error_get_source(error);

    if(base_source && base_source->module_name)
    {
        length += strlen(base_source->module_name);
        printable = globus_libc_malloc(length);
        globus_libc_snprintf(printable,length,"%s: %s %s",
                             base_source->module_name,
                             sys_failed,
                             sys_error ? sys_error : "(null)");
        
    }
    else
    {
        printable = globus_libc_malloc(length);
        globus_libc_snprintf(printable,length,"%s %s",
                             sys_failed,
                             sys_error ? sys_error : "(null)");
    }

#ifdef WIN32
    if(sys_error)
    {
        LocalFree(sys_error);
    }
#endif

    return printable;
    
}/* globus_l_error_errno_printable */
static globus_error_base_instance_t *
s_base_instance_data (globus_object_t * error)
{
  void * instance_data_vp;
  globus_object_t * base;
  globus_error_base_instance_t * instance_data;

  base = globus_object_upcast (error, GLOBUS_ERROR_TYPE_BASE);

  instance_data_vp 
    = globus_object_get_local_instance_data (base);
  
  instance_data = (globus_error_base_instance_t *) instance_data_vp;

  if ( instance_data != NULL ) {
    return instance_data;
  }
  else {
    instance_data = globus_malloc (sizeof(globus_error_base_instance_t));
    if (instance_data != NULL) {
      instance_data->source_module = NULL;
      instance_data->causal_error = NULL;
      
      globus_object_set_local_instance_data (base,
					     (void *) instance_data);
    }
    
    return instance_data;
  }
}
Пример #3
0
/**
 * Retrieve the major status from a gssapi error object.
 * @ingroup globus_gssapi_error_accessor  
 *
 * @param error
 *        The error from which to retrieve the major status
 * @return
 *        The major status stored in the object
 */
OM_uint32
globus_error_gssapi_get_major_status(
    globus_object_t *                   error)
{
    return ((globus_l_gssapi_error_data_t *)
            globus_object_get_local_instance_data(error))->major_status;
}/* globus_error_gssapi_get_major_status */
Пример #4
0
/**
 * Set the major status in a gssapi error object.
 * @ingroup globus_gssapi_error_accessor  
 *
 * @param error
 *        The error object for which to set the major status
 * @param major_status
 *        The major status
 * @return
 *        void
 */
void
globus_error_gssapi_set_major_status(
    globus_object_t *                   error,
    const OM_uint32                     major_status)
{
    ((globus_l_gssapi_error_data_t *)
     globus_object_get_local_instance_data(error))->major_status = major_status;
}/* globus_error_gssapi_set_major_status */
/**
 * @brief Print Error Data
 * @ingroup globus_openssl_error_object 
 * @details
 * Return an allocated string of the OpenSSL error from the instance data
 * 
 * @param error
 *        The error object to retrieve the data from.
 * @return
 *        String containing the OpenSSL error if it exists, NULL
 *        otherwise.
 */
static
char *
globus_l_error_openssl_printable(
    globus_object_t *                   error)
{
    globus_openssl_error_handle_t       handle;
    char *                              error_string;
    static char *                       _function_name_ =
        "globus_l_error_openssl_printable";

    GLOBUS_I_GSI_OPENSSL_ERROR_DEBUG_ENTER;

    if(!error)
    {
        error_string = NULL;
        goto done;
    }

    handle = (globus_openssl_error_handle_t)
             globus_object_get_local_instance_data(error);

    if(globus_openssl_error_handle_get_data_flags(handle) & ERR_TXT_STRING)
    {
        error_string = globus_common_create_string(
            _GOESL("OpenSSL Error: %s:%d: in library: %s, function %s: %s %s"),
            globus_openssl_error_handle_get_filename(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_filename(handle),
            globus_openssl_error_handle_get_linenumber(handle),
            globus_openssl_error_handle_get_library(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_library(handle),
            globus_openssl_error_handle_get_function(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_function(handle),
            globus_openssl_error_handle_get_reason(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_reason(handle),
            globus_openssl_error_handle_get_data(handle));
    }
    else
    {
        error_string = globus_common_create_string(
            _GOESL("OpenSSL Error: %s:%d: in library: %s, function %s: %s"),
            globus_openssl_error_handle_get_filename(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_filename(handle),
            globus_openssl_error_handle_get_linenumber(handle),
            globus_openssl_error_handle_get_library(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_library(handle),
            globus_openssl_error_handle_get_function(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_function(handle),
            globus_openssl_error_handle_get_reason(handle) == NULL ? "(null)" :
            globus_openssl_error_handle_get_reason(handle));        
    }

 done:

    GLOBUS_I_GSI_OPENSSL_ERROR_DEBUG_EXIT;
    return error_string;
}/* globus_l_error_openssl_printable */
static
char *
globus_l_error_ftp_printable(
    globus_object_t *                   error)
{
    globus_l_error_ftp_data_t *         data;
    char *                              error_string;
    char                                buf[4];
    char *                              message;
    int                                 message_len;
    
    if(!error)
    {
        return NULL;
    }

    data = (globus_l_error_ftp_data_t *)
        globus_object_get_local_instance_data(error);
    message = data->message;
    
    if(message)
    {
        message_len = strlen(message);
        if(message_len > 3 && message[3] == ' ')
        {
            buf[0] = message[0];
            buf[1] = message[1];
            buf[2] = message[2];
            buf[3] = '\0';
            
            if(data->code == atoi(buf))
            {
                message += 4;
                message_len -= 4;
            }
        }
    }
    else
    {
        message_len = 0;
    }
    
    error_string = globus_malloc(sizeof(char) * (15 + message_len));
    if(error_string)
    {
        sprintf(
            error_string,
            "%d %s",
            data->code,
            message ? message : "");
    }
    
    return error_string;
}
int
globus_error_ftp_error_get_code(
    globus_object_t *                   error)
{
    int                                 code = 0;
    globus_l_error_ftp_data_t *         data;
    
    do
    {
        if(globus_object_get_type(error) == GLOBUS_ERROR_TYPE_FTP)
        {
            data = (globus_l_error_ftp_data_t *)
                globus_object_get_local_instance_data(error);
            code = data->code;
        }
    } while(code == 0 && (error = globus_error_get_cause(error)));
    
    return code;
}
Пример #8
0
/**
 * Retrieve the minor status from a gssapi error object.
 * @ingroup globus_gssapi_error_accessor  
 *
 * @param error
 *        The error from which to retrieve the minor status
 * @return
 *        The minor status stored in the object
 */
OM_uint32
globus_error_gssapi_get_minor_status(
    globus_object_t *                   error)
{
    globus_l_gssapi_error_data_t *      data;
    
    data = (globus_l_gssapi_error_data_t *)
        globus_object_get_local_instance_data(error);
    if(data)
    {
        if(data->is_globus_gsi)
        {
            return (OM_uint32) globus_error_put(
                globus_object_copy(globus_error_get_cause(error)));
        }
        else
        {
            return data->minor_status;
        }
    }
    
    return 0;
}
/**
 * Return a copy of the short description from the instance data
 * @ingroup globus_gssapi_error_object 
 * 
 * @param error
 *        The error object to retrieve the data from.
 * @return
 *        String containing the short description if it exists, NULL
 *        otherwise.
 */
static
char *
globus_l_error_gssapi_printable(
    globus_object_t *                   error)
{
    OM_uint32	                        minor_status;
    OM_uint32                           message_context;
    gss_buffer_desc                     status_string_desc 
        = GSS_C_EMPTY_BUFFER;
    gss_buffer_t                        status_string = &status_string_desc;
    char *                              msg = NULL;
    char *                              tmp;
    int                                 len = 0;
    globus_l_gssapi_error_data_t *      data;
    
    data = (globus_l_gssapi_error_data_t *)
         globus_object_get_local_instance_data(error);
    
    if(data->is_globus_gsi)
    {
        message_context = 0;
        do
        {
            if(gss_display_status(&minor_status,
                                   data->major_status,
                                   GSS_C_GSS_CODE,
                                   GSS_C_NO_OID,
                                   &message_context,
                                   status_string) == GSS_S_COMPLETE)
            {
                if(status_string->length)
                {
                    if(msg)
                    {
                        tmp = globus_realloc(
                            msg,
                            sizeof(char) * (len + status_string->length + 1));
                    }
                    else
                    {
                        tmp = globus_malloc(
                            sizeof(char) * (status_string->length + 1));
                    }
                    if(tmp)
                    {
                        memcpy(
                            tmp + len,
                            status_string->value,
                            status_string->length);
                        msg = tmp;
                        len += status_string->length;
                    }
                }
                gss_release_buffer(&minor_status, status_string);
            }
        } while(message_context != 0);
        
        if(msg)
        {
            if(msg[len - 1] == '\n')
            {
                len--;
            }
            msg[len] = '\0';
        }
    }
    else
    {
        globus_gss_assist_display_status_str(
            &msg, NULL, data->major_status, data->minor_status, 0);
    }
    
    return msg;
}/* globus_l_error_gssapi_printable */