PDA

View Full Version : Applink



Pechugo66
17th December 2010, 01:31
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.

high_flyer
17th December 2010, 10:12
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)?

Pechugo66
17th December 2010, 17:50
Here is the code from line 1 to 59


#define APPLINK_STDIN 1
#define APPLINK_STDOUT 2
#define APPLINK_STDERR 3
#define APPLINK_FPRINTF 4
#define APPLINK_FGETS 5
#define APPLINK_FREAD 6
#define APPLINK_FWRITE 7
#define APPLINK_FSETMOD 8
#define APPLINK_FEOF 9
#define APPLINK_FCLOSE 10 /* should not be used */

#define APPLINK_FOPEN 11 /* solely for completeness */
#define APPLINK_FSEEK 12
#define APPLINK_FTELL 13
#define APPLINK_FFLUSH 14
#define APPLINK_FERROR 15
#define APPLINK_CLEARERR 16
#define APPLINK_FILENO 17 /* to be used with below */

#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */
#define APPLINK_READ 19
#define APPLINK_WRITE 20
#define APPLINK_LSEEK 21
#define APPLINK_CLOSE 22
#define APPLINK_MAX 22 /* always same as last macro */

#ifndef APPMACROS_ONLY
#include <stdio.h>
#include <io.h>
#include <fcntl.h>

static void *app_stdin(void) { return stdin; }
static void *app_stdout(void) { return stdout; }
static void *app_stderr(void) { return stderr; }
static int app_feof(FILE *fp) { return feof(fp); }
static int app_ferror(FILE *fp) { return ferror(fp); }
static void app_clearerr(FILE *fp) { clearerr(fp); }
static int app_fileno(FILE *fp) { return _fileno(fp); }
static int app_fsetmod(FILE *fp,char mod)
{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); }

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport)
void **
#if defined(__BORLANDC__)
__stdcall /* __stdcall appears to be the only way to get the name
* decoration right with Borland C. Otherwise it works
* purely incidentally, as we pass no parameters. */
#else
__cdecl
#endif
OPENSSL_Applink(void)
{ static int once=1;
static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX};

if (once) {

//* All the compile errors *

//and this is the rest

once = 0;
}

return OPENSSL_ApplinkTable;
}

#ifdef __cplusplus
}
#endif
#endif

high_flyer
18th December 2010, 13:15
Is the code in the 'if' statement (line 59) the complete code or have you removed some code?
Is the following code:

extern "C"
{
#include <openssl/applink.c>
}
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?

Pechugo66
19th December 2010, 04:21
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."

ChrisW67
20th December 2010, 03:50
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

Pechugo66
20th December 2010, 05:18
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;
}