#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define INCL_DOSERRORS
#define INCL_DOSPROCESS
#define INCL_DOSMODULEMGR
#define INCL_LONGLONG
#include <os2.h>

#include "os2config.h"

char __OS2_G10_LOCALEDIR[__CCHMAXPATH+1];
char __OS2_GNUPG_LIBDIR[__CCHMAXPATH+1];
char __OS2_GNUPG_LIBEXECDIR[__CCHMAXPATH+1];
char __OS2_GNUPG_DATADIR[__CCHMAXPATH+1];
char __OS2_GNUPG_HOMEDIR[__CCHMAXPATH+1];

char __OS2_PROGFILE[__CCHMAXPATH+1];
char __OS2_PROGDIR[__CCHMAXPATH+1];

void __OS2_SETUP_PATH(void) {
	APIRET		rc;
	PIB*		my_pib;
	char*		cut_pos;
	char*		env_unixroot;
	char*		env_home;
	char*		env_gnupg;

	memset(&__OS2_G10_LOCALEDIR, 0, sizeof(__OS2_G10_LOCALEDIR));
	memset(&__OS2_GNUPG_LIBDIR, 0, sizeof(__OS2_GNUPG_LIBDIR));
	memset(&__OS2_GNUPG_LIBEXECDIR, 0, sizeof(__OS2_GNUPG_LIBEXECDIR));
	memset(&__OS2_GNUPG_DATADIR, 0, sizeof(__OS2_GNUPG_DATADIR));
	memset(&__OS2_GNUPG_HOMEDIR, 0, sizeof(__OS2_GNUPG_HOMEDIR));
	memset(&__OS2_PROGFILE, 0, sizeof(__OS2_PROGFILE));
	memset(&__OS2_PROGDIR, 0, sizeof(__OS2_PROGDIR));

	env_unixroot = getenv("UNIXROOT");
	env_home = getenv("HOME");
	env_gnupg = getenv("GPGDIR");

	if (env_unixroot != NULL) {
		strncpy((char*)&__OS2_G10_LOCALEDIR, env_unixroot, __CCHMAXPATH-30);
		strncpy((char*)&__OS2_GNUPG_LIBDIR, env_unixroot, __CCHMAXPATH-30);
		strncpy((char*)&__OS2_GNUPG_LIBEXECDIR, env_unixroot, __CCHMAXPATH-30);
		strncpy((char*)&__OS2_GNUPG_DATADIR, env_unixroot, __CCHMAXPATH-30);

		strcat((char*)&__OS2_G10_LOCALEDIR, "/usr/share/locale");
		strcat((char*)&__OS2_GNUPG_LIBDIR, "/usr/lib/gnupg");
		strcat((char*)&__OS2_GNUPG_LIBEXECDIR, "/usr/libexec/gnupg");
		strcat((char*)&__OS2_GNUPG_DATADIR, "/usr/share/gnupg");
	} else if (env_gnupg != NULL) {
		strncpy((char*)&__OS2_G10_LOCALEDIR, env_gnupg, __CCHMAXPATH-30);
		strcat((char*)&__OS2_G10_LOCALEDIR, "/locale");
		strncpy((char*)&__OS2_GNUPG_LIBDIR, env_gnupg, __CCHMAXPATH-30);
		strncpy((char*)&__OS2_GNUPG_LIBEXECDIR, env_gnupg, __CCHMAXPATH-30);
		strncpy((char*)&__OS2_GNUPG_DATADIR, env_gnupg, __CCHMAXPATH-30);
        } else {
		fprintf(stderr, "Neither UNIXROOT nor GPGDIR are set, trying to find gpg standard UNIX paths!\n");
		strcat((char*)&__OS2_G10_LOCALEDIR, "/usr/share/locale");
		strcat((char*)&__OS2_GNUPG_LIBDIR, "/usr/lib/gnupg");
		strcat((char*)&__OS2_GNUPG_LIBEXECDIR, "/usr/libexec/gnupg");
		strcat((char*)&__OS2_GNUPG_DATADIR, "/usr/share/gnupg");
	}

 	strcat((char*)&__OS2_GNUPG_HOMEDIR, "/.gnupg");

	if (env_home != NULL) {
		strncpy((char*)&__OS2_GNUPG_HOMEDIR, env_home, __CCHMAXPATH-30);
	}
	strcat((char*)&__OS2_GNUPG_HOMEDIR, "/.gnupg");

	rc = DosGetInfoBlocks(NULL, &my_pib);
	rc = DosQueryModuleName(my_pib->pib_hmte, CCHMAXPATH, (PCHAR)&__OS2_PROGFILE);
	if (rc != NO_ERROR) {
		fprintf(stderr, "DosQueryModuleHandle() failed (rc = %u)\n", (unsigned int)rc);fflush(stderr);
		return;
	}
	memcpy(&__OS2_PROGDIR, &__OS2_PROGFILE, sizeof(__OS2_PROGFILE));
	cut_pos = strrchr((char*)&__OS2_PROGDIR, '\\');
	*cut_pos = '\0';
}

