Results 1 to 7 of 7

Thread: Applink

  1. #1
    Join Date
    Dec 2010
    Posts
    7
    Thanks
    1
    Platforms
    Windows

    Default Applink

    Hi there!

    I'm using OpenSSL for encryption purposes and I need to add a snippet Applink.c into my project, here is part of the source.

    #include "openssl/evp.h"

    #include "openssl/rsa.h"
    #include "openssl/pem.h"
    #include "openssl/bio.h"
    #include "openssl/rand.h"
    extern "C"
    {
    #include <openssl/applink.c>
    }


    but when I compile it, 22 compile errors are shown, here is the build output:

    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c: In function 'void** OPENSSL_Applink()':

    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:60: error: invalid conversion from 'void* (*)()' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:61: error: invalid conversion from 'void* (*)()' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:62: error: invalid conversion from 'void* (*)()' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:63: error: invalid conversion from 'int (*)(FILE*, const char*, ...)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:64: error: invalid conversion from 'char* (*)(char*, int, FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:65: error: invalid conversion from 'size_t (*)(void*, size_t, size_t, FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:66: error: invalid conversion from 'size_t (*)(const void*, size_t, size_t, FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:67: error: invalid conversion from 'int (*)(FILE*, char)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:68: error: invalid conversion from 'int (*)(FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:69: error: invalid conversion from 'int (*)(FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:71: error: invalid conversion from 'FILE* (*)(const char*, const char*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:72: error: invalid conversion from 'int (*)(FILE*, long int, int)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:73: error: invalid conversion from 'long int (*)(FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:74: error: invalid conversion from 'int (*)(FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:75: error: invalid conversion from 'int (*)(FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:76: error: invalid conversion from 'void (*)(FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:77: error: invalid conversion from 'int (*)(FILE*)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:79: error: invalid conversion from 'int (*)(const char*, int, ...)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:80: error: invalid conversion from 'int (*)(int, void*, unsigned int)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:81: error: invalid conversion from 'int (*)(int, const void*, unsigned int)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:82: error: invalid conversion from 'long int (*)(int, long int, int)' to 'void*'


    ..\..\..\..\OpenSSL-Win32\include/openssl/applink.c:83: error: invalid conversion from 'int (*)(int)' to 'void*'

    Have no idea if I should try to fix it, or if QT is not compatible with this or what, so any tip is welcome. Thanks in advance.

  2. #2
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Applink

    Can you show the code part (a bit before and after) of applink.c line 60?
    Are the includes you posted in an header file (*.h) or source file (*.c *.cpp)?
    Last edited by high_flyer; 18th December 2010 at 12:08. Reason: typo
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  3. #3
    Join Date
    Dec 2010
    Posts
    7
    Thanks
    1
    Platforms
    Windows

    Default Re: Applink

    Here is the code from line 1 to 59

    Qt Code:
    1. #define APPLINK_STDIN 1
    2. #define APPLINK_STDOUT 2
    3. #define APPLINK_STDERR 3
    4. #define APPLINK_FPRINTF 4
    5. #define APPLINK_FGETS 5
    6. #define APPLINK_FREAD 6
    7. #define APPLINK_FWRITE 7
    8. #define APPLINK_FSETMOD 8
    9. #define APPLINK_FEOF 9
    10. #define APPLINK_FCLOSE 10 /* should not be used */
    11.  
    12. #define APPLINK_FOPEN 11 /* solely for completeness */
    13. #define APPLINK_FSEEK 12
    14. #define APPLINK_FTELL 13
    15. #define APPLINK_FFLUSH 14
    16. #define APPLINK_FERROR 15
    17. #define APPLINK_CLEARERR 16
    18. #define APPLINK_FILENO 17 /* to be used with below */
    19.  
    20. #define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */
    21. #define APPLINK_READ 19
    22. #define APPLINK_WRITE 20
    23. #define APPLINK_LSEEK 21
    24. #define APPLINK_CLOSE 22
    25. #define APPLINK_MAX 22 /* always same as last macro */
    26.  
    27. #ifndef APPMACROS_ONLY
    28. #include <stdio.h>
    29. #include <io.h>
    30. #include <fcntl.h>
    31.  
    32. static void *app_stdin(void) { return stdin; }
    33. static void *app_stdout(void) { return stdout; }
    34. static void *app_stderr(void) { return stderr; }
    35. static int app_feof(FILE *fp) { return feof(fp); }
    36. static int app_ferror(FILE *fp) { return ferror(fp); }
    37. static void app_clearerr(FILE *fp) { clearerr(fp); }
    38. static int app_fileno(FILE *fp) { return _fileno(fp); }
    39. static int app_fsetmod(FILE *fp,char mod)
    40. { return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); }
    41.  
    42. #ifdef __cplusplus
    43. extern "C" {
    44. #endif
    45.  
    46. __declspec(dllexport)
    47. void **
    48. #if defined(__BORLANDC__)
    49. __stdcall /* __stdcall appears to be the only way to get the name
    50. * decoration right with Borland C. Otherwise it works
    51. * purely incidentally, as we pass no parameters. */
    52. #else
    53. __cdecl
    54. #endif
    55. OPENSSL_Applink(void)
    56. { static int once=1;
    57. static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX};
    58.  
    59. if (once) {
    60.  
    61. //* All the compile errors *
    62.  
    63. //and this is the rest
    64.  
    65. once = 0;
    66. }
    67.  
    68. return OPENSSL_ApplinkTable;
    69. }
    70.  
    71. #ifdef __cplusplus
    72. }
    73. #endif
    74. #endif
    To copy to clipboard, switch view to plain text mode 
    Last edited by high_flyer; 18th December 2010 at 12:09. Reason: code tags

  4. #4
    Join Date
    Jan 2006
    Location
    Munich, Germany
    Posts
    4,714
    Thanks
    21
    Thanked 418 Times in 411 Posts
    Qt products
    Qt3 Qt4 Qt5 Qt/Embedded
    Platforms
    Unix/X11 Windows

    Default Re: Applink

    Is the code in the 'if' statement (line 59) the complete code or have you removed some code?
    Is the following code:
    Qt Code:
    1. extern "C"
    2. {
    3. #include <openssl/applink.c>
    4. }
    To copy to clipboard, switch view to plain text mode 
    in a header or source file?

    In any rate, it looks that this is either a missing header problem, or, include order problem.
    Are you trying to include just a part of a lib in your code?
    ==========================signature=============== ==================
    S.O.L.I.D principles (use them!):
    https://en.wikipedia.org/wiki/SOLID_...iented_design)

    Do you write clean code? - if you are TDD'ing then maybe, if not, your not writing clean code.

  5. #5
    Join Date
    Dec 2010
    Posts
    7
    Thanks
    1
    Platforms
    Windows

    Default Re: Applink

    regarding your first question, that's it, I mean, I haven't touched any line, because this is an OpenSSL code, so I really don't want to mess with it and make it worse.

    About your second question, yes it is QT code where I'm including this snippet (Applink.c) into my program. I tried in both source and header files. The project is linked with libraries ssleay32.lib and libeay32.lib

    Here is the answer from OpenSSL people regarding the Openssl_No Applink error:

    "you have to compile small C snippet with compiler and/or options of your choice. The snippet gets installed as <install-root>/include/openssl/applink.c and should be either added to your application project or simply #include-d in one [and only one] of your application source files. Failure to link this shim module into your application manifests itself as fatal "no OPENSSL_Applink" run-time error. An explicit reminder is due that in this situation [mixing compiler options] it is as important to add CRYPTO_malloc_init prior first call to OpenSSL."

  6. #6
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Wiki edits
    17

    Default Re: Applink

    It seems to me that the easy way to do this is to:
    • Dispense with the #include
    • Copy applink.c into your project source directory
    • Add applink.c to SOURCES
    • Ensure that your LIBS variable includes suitable OpenSSL library paths and libraries
    • qmake && make

  7. #7
    Join Date
    Dec 2010
    Posts
    7
    Thanks
    1
    Platforms
    Windows

    Default Re: Applink

    Thanks for the input, I received this from user jonks and worked just fine.

    Hi,

    No problem. I had the same issue with compilation errors.
    You have to cast all the function pointers to (void*) like this:

    OPENSSL_Applink(void)
    { static int once=1;
    static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX};

    if (once)
    { OPENSSL_ApplinkTable[APPLINK_STDIN] = (void*)app_stdin;
    OPENSSL_ApplinkTable[APPLINK_STDOUT] = (void*)app_stdout;
    OPENSSL_ApplinkTable[APPLINK_STDERR] = (void*)app_stderr;
    OPENSSL_ApplinkTable[APPLINK_FPRINTF] = (void*)fprintf;
    OPENSSL_ApplinkTable[APPLINK_FGETS] = (void*)fgets;
    OPENSSL_ApplinkTable[APPLINK_FREAD] = (void*)fread;
    OPENSSL_ApplinkTable[APPLINK_FWRITE] = (void*)fwrite;
    OPENSSL_ApplinkTable[APPLINK_FSETMOD] = (void*)app_fsetmod;
    OPENSSL_ApplinkTable[APPLINK_FEOF] = (void*)app_feof;
    OPENSSL_ApplinkTable[APPLINK_FCLOSE] = (void*)fclose;

    OPENSSL_ApplinkTable[APPLINK_FOPEN] = (void*)fopen;
    OPENSSL_ApplinkTable[APPLINK_FSEEK] = (void*)fseek;
    OPENSSL_ApplinkTable[APPLINK_FTELL] = (void*)ftell;
    OPENSSL_ApplinkTable[APPLINK_FFLUSH] = (void*)fflush;
    OPENSSL_ApplinkTable[APPLINK_FERROR] = (void*)app_ferror;
    OPENSSL_ApplinkTable[APPLINK_CLEARERR] = (void*)app_clearerr;
    OPENSSL_ApplinkTable[APPLINK_FILENO] = (void*)app_fileno;

    OPENSSL_ApplinkTable[APPLINK_OPEN] = (void*)_open;
    OPENSSL_ApplinkTable[APPLINK_READ] = (void*)_read;
    OPENSSL_ApplinkTable[APPLINK_WRITE] = (void*)_write;
    OPENSSL_ApplinkTable[APPLINK_LSEEK] = (void*)_lseek;
    OPENSSL_ApplinkTable[APPLINK_CLOSE] = (void*)_close;

    once = 0;
    }

    return OPENSSL_ApplinkTable;
    }

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.