Wind4 / vlmcsd

KMS Emulator in C (currently runs on Linux including Android, FreeBSD, Solaris, Minix, Mac OS, iOS, Windows with or without Cygwin)
https://forums.mydigitallife.net/threads/50234
8.35k stars 2.23k forks source link

OpenBSD 6.1/5.9 amd64 compile failing #11

Closed drnovsek closed 6 years ago

drnovsek commented 6 years ago

vlmcsd fails to compile with error in file './src/kms.c'on line 187: kms.c:(.text.InitializeClientLists+0xbb): undefined reference to `pthread_mutexattr_setpshared'

Tested on OpenBSD 5.9 and 6.1; got the same error.

Output:

user@xxx:vlmcsd-master $ uname -a
OpenBSD xxxxxxxxxx 5.9 GENERIC.MP#0 amd64
user@xxx:vlmcsd-master $ gmake
gmake[1]: Entering directory '/home/user/vlmcsd-master/src'
        CC      vlmcs.o <- vlmcs.c
        CC      kmsdata-full.o <- kmsdata-full.c
        CC      crypto.o <- crypto.c
        CC      endian.o <- endian.c
        CC      kms.o <- kms.c
        CC      output.o <- output.c
        CC      helpers.o <- helpers.c
        CC      shared_globals.o <- shared_globals.c
        CC      network.o <- network.c
        CC      rpc.o <- rpc.c
        CC      crypto_internal.o <- crypto_internal.c
kms.c: In function 'InitializeClientLists':
kms.c:185: warning: implicit declaration of function 'pthread_mutexattr_setpshared'
        CC      dns_srv.o <- dns_srv.c
        CC      ns_parse.o <- ns_parse.c
        CC      ns_name.o <- ns_name.c
        CC      kmsdata.o <- kmsdata.c
        CC      vlmcsd.o <- vlmcsd.c
        LD      ../bin/vlmcs <- vlmcs.o kmsdata-full.o crypto.o kms.o endian.o output.o shared_globals.o helpers.o network.o rpc.o crypto_internal.o dns_srv.o ns_parse.o ns_name.o
../build/vlmcs.o: In function `updateIniFile':
/home/user/vlmcsd-master/src/vlmcs.c:982: warning: warning: strcpy() is almost always misused, please use strlcpy()
../build/vlmcs.o: In function `CreateRequestBase':
/home/user/vlmcsd-master/src/vlmcs.c:1391: warning: warning: rand() may return deterministic values, is that what you want?
../build/vlmcs.o: In function `updateIniFile':
/home/user/vlmcsd-master/src/vlmcs.c:983: warning: warning: strcat() is almost always misused, please use strlcat()
../build/kms.o: In function `itoc':
/home/user/vlmcsd-master/src/kms.c:239: warning: warning: sprintf() is often misused, please use snprintf()
        LD      ../bin/vlmcsd <- vlmcsd.o kmsdata.o crypto.o kms.o endian.o output.o shared_globals.o helpers.o network.o rpc.o crypto_internal.o
../build/kms.o: In function `itoc':
/home/user/vlmcsd-master/src/kms.c:229: warning: warning: strcpy() is almost always misused, please use strlcpy()
../build/kms.o: In function `get16RandomBytes':
/home/user/vlmcsd-master/src/kms.c:691: warning: warning: rand() may return deterministic values, is that what you want?
../build/kms.o: In function `itoc':
/home/user/vlmcsd-master/src/kms.c:238: warning: warning: strcat() is almost always misused, please use strlcat()
/home/user/vlmcsd-master/src/kms.c:239: warning: warning: sprintf() is often misused, please use snprintf()
../build/kms.o: In function `InitializeClientLists':
kms.c:(.text.InitializeClientLists+0xbb): undefined reference to `pthread_mutexattr_setpshared'
collect2: ld returned 1 exit status
GNUmakefile:601: recipe for target '../bin/vlmcsd' failed
gmake[1]: *** [../bin/vlmcsd] Error 1
gmake[1]: Leaving directory '/home/user/vlmcsd-master/src'
GNUmakefile:110: recipe for target 'all' failed
gmake: *** [all] Error 2
drnovsek commented 6 years ago

Quick solution was to comment out the offending line, so far looks as if vlmcsd works, but please do review the patch:

--- vlmcsd-master/src/kms.c     Tue Oct 17 11:00:20 2017
+++ patched-vlmcsd-master/src/kms.c     Sun Jan 21 12:02:27 2018
@@ -182,7 +182,7 @@
 #      else // !__CYGWIN__
        pthread_mutexattr_t mutex_attr;
        pthread_mutexattr_init(&mutex_attr);
-       pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
+//     pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
        pthread_mutex_init(mutex, &mutex_attr);

 #      endif // !__CYGWIN__
rouben commented 6 years ago

This is a known issue documented and addressed here: https://forums.mydigitallife.net/threads/emulated-kms-servers-on-non-windows-platforms.50234/page-61#post-1379280

Since this site requires registration, I’ll quote the text here:

Deleting line 185 is actually a bad idea. I use a mutex to ensure only one thread / forked process can access the client list at a time in order to avoid data corruption. The fork version of vlmcsd needs to set the mutex to PTHREAD_PROCESS_SHARED to ensure it is not per process and thus useless.

To compile the threaded version of vlmcsd, just add "THREADS=1" to the command line. See "make help" for details.