Example #1
0
DLLEXPORT int
tqsl_init() {
	static char semaphore = 0;
	unsigned int i;
	static char path[TQSL_MAX_PATH_LEN];
#ifdef __WIN32__
	HKEY hkey;
	DWORD dtype;
	DWORD bsize = sizeof path;
	int wval;
#endif

	/* OpenSSL API tends to change between minor version numbers, so make sure
	 * we're using the right version */
	long SSLver = SSLeay();
	int SSLmajor = (SSLver >> 28) & 0xff;
	int SSLminor = (SSLver >> 20) & 0xff;
	int TQSLmajor = (OPENSSL_VERSION_NUMBER >> 28) & 0xff;
	int TQSLminor =  (OPENSSL_VERSION_NUMBER >> 20) & 0xff;

	if (SSLmajor != TQSLmajor || 
		(SSLminor != TQSLminor && 
		(SSLmajor != 9 && SSLminor != 7 && TQSLminor == 6))) {
		tQSL_Error = TQSL_OPENSSL_VERSION_ERROR;
		return 1;
	}
	ERR_clear_error();
	tqsl_getErrorString();	/* Clear the error status */
	if (semaphore)
		return 0;
	ERR_load_crypto_strings();
	OpenSSL_add_all_algorithms();
	for (i = 0; i < (sizeof custom_objects / sizeof custom_objects[0]); i++) {
		if (OBJ_create(custom_objects[i][0], custom_objects[i][1], custom_objects[i][2]) == 0) {
			tQSL_Error = TQSL_OPENSSL_ERROR;
			return 1;
		}
	}
	if (tQSL_BaseDir == NULL) {
		char *cp;
		if ((cp = getenv("TQSLDIR")) != NULL && *cp != '\0')
			strncpy(path, cp, sizeof path);
		else {
#ifdef __WIN32__
			if ((wval = RegOpenKeyEx(HKEY_CURRENT_USER,
				"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
				0, KEY_READ, &hkey)) == ERROR_SUCCESS) {
				wval = RegQueryValueEx(hkey, "AppData", 0, &dtype, (LPBYTE)path, &bsize);
				RegCloseKey(hkey);
			}
			if (wval != ERROR_SUCCESS)
				strcpy(path, "C:");
			strcat(path, "/TrustedQSL");
#else
#ifdef LOTW_SERVER
			strcpy(path, "/var/lotw/tqsl");
#else
			if (getenv("HOME") != NULL) {
				strncpy(path, getenv("HOME"), sizeof path);
				strncat(path, "/", sizeof path - strlen(path));
				strncat(path, ".tqsl", sizeof path - strlen(path));
			} else
				strcpy(path, ".tqsl");
#endif  /* LOTW_SERVER */
#endif  /* WINDOWS */
		}
		if (pmkdir(path, 0700)) {
			strncpy(tQSL_ErrorFile, path, sizeof tQSL_ErrorFile);
			tQSL_Error = TQSL_SYSTEM_ERROR;
			return 1;
		}
		tQSL_BaseDir = path;
	}
	semaphore = 1;
	return 0;
}
Example #2
0
/* set document basedir  */
int qindex_set_basedir(QINDEX *qindex, char *basedir)
{
    int i = 0, j = 0, taskid = 0;
    char path[Q_PATH_MAX];
    QTASK *tasks = NULL;
    struct stat st = {0};
    off_t size = 0;

    if(qindex)
    {
        strcpy(qindex->basedir, basedir);
        /* log */
        sprintf(path, "%s/%s", basedir, QINDEX_LOG_NAME);
        pmkdir(path);
        LOGGER_INIT(qindex->logger, path);
        LOGGER_SET_LEVEL(qindex->logger, qindex->log_level);
        /* xdict */
        sprintf(path, "%s/%s", basedir, QINDEX_XDICT_NAME);
        if((qindex->xdict = mmtrie_init(path)) == NULL)
        {
            fprintf(stderr, "Initialize xdict(%s) failed, %s\n", path, strerror(errno));
            _exit(-1);
            return -1;
        }
        /* mmqueue */
        sprintf(path, "%s/%s", basedir, QINDEX_MMQUEUE_NAME);
        qindex->mmqueue = mmqueue_init(path);
        /* db */
        sprintf(path, "%s/%s", basedir, QINDEX_DB_DIR);
        qindex->db = db_init(path, 0);
        /* update */
        sprintf(path, "%s/%s", basedir, QINDEX_UPDATE_DIR);
        qindex->update = db_init(path, 0);
        /* qstate */
        sprintf(path, "%s/%s", basedir, QINDEX_STATE_NAME);
        if((qindex->qstatefd = open(path, O_CREAT|O_RDWR, 0644)) <= 0)
        {
            fprintf(stderr, "open state file(%s) failed, %s\n", path, strerror(errno));
            _exit(-1);
        }
        else
        {
            fstat(qindex->qstatefd, &st);
            if(st.st_size < sizeof(QSTATE))
            {
                if(ftruncate(qindex->qstatefd, 0) != 0
                        || ftruncate(qindex->qstatefd, sizeof(QSTATE)) != 0)_exit(-1);
            }
            if((qindex->state = (QSTATE *)mmap(NULL, sizeof(QSTATE), PROT_READ|PROT_WRITE,
                    MAP_SHARED, qindex->qstatefd, 0)) == NULL || qindex->state == (void *)-1)
            {
                fprintf(stderr, "mmap state failed, %s\n", strerror(errno));
                _exit(-1);
            }
            if(st.st_size < sizeof(QSTATE)) memset(qindex->state, 0, sizeof(QSTATE));
            if(qindex->state->nnodes > 0)
            {
                for(i = 1; i < Q_NODE_MAX; i++)
                {
                    if(qindex->state->nodes[i].status > 0 && qindex->state->nodes[i].ntasks > 0
                            && (tasks = qindex->state->nodes[i].tasks))
                    {
                        for(j = 0; j < Q_TASKS_MAX; j++)
                        {
                            if(tasks[j].status > 0)
                            {
                                taskid = i * Q_TASKS_MAX + j;
                                iqueue_push(qindex->queue, taskid);
                            }
                        }
                    }
                }
            }
        }
        /* xpacket */
        sprintf(path, "%s/%s", basedir, QINDEX_XPACKET_NAME);
        if((qindex->xpacketio.fd = open(path, O_CREAT|O_RDWR, 0644)) > 0
                && fstat(qindex->xpacketio.fd, &st) == 0)
        {
            qindex->xpacketio.end = st.st_size;
            size = sizeof(XPACKET) * Q_XPACKET_MAX;
            if(st.st_size > size) size = st.st_size;
            if((qindex->xpacketio.map = (char *)mmap(NULL, size, PROT_READ|PROT_WRITE,
                            MAP_SHARED, qindex->xpacketio.fd, 0))
                    && qindex->xpacketio.map != (void *)-1)
            {
                qindex->xpacketio.size = size;
            }
            else
            {
                fprintf(stderr, "mmap xpacket file (%s) failed, %s\n", path, strerror(errno));
                _exit(-1);
            }
        }
        else
        {
            fprintf(stderr, "open xpacket file(%s) failed, %s\n", path, strerror(errno));
            _exit(-1);
        }
        /* block terms map */
        sprintf(path, "%s/%s", basedir, QINDEX_MAP_NAME);
        qindex->map = mmtrie_init(path);
        /* bsterm file */
        sprintf(path, "%s/%s", basedir, QINDEX_BSTERM_NAME);
        if((qindex->bstermio.fd = open(path, O_CREAT|O_RDWR, 0644)) > 0
                && fstat(qindex->bstermio.fd, &st) == 0)
        {
            qindex->bstermio.end = st.st_size;
            size = sizeof(BSTERM) * Q_BSTERM_MAX;
            if(st.st_size > size) size = st.st_size;
            if((qindex->bstermio.map = (char *)mmap(NULL, size, PROT_READ|PROT_WRITE,
                            MAP_SHARED, qindex->bstermio.fd, 0))
                    && qindex->bstermio.map != (void *)-1)
            {
                qindex->bstermio.size = size;
            }
            else
            {
                fprintf(stderr, "mmap bsterm file (%s) failed, %s\n", path, strerror(errno));
                _exit(-1);
            }
        }
        else
        {
            fprintf(stderr, "open bsterm file(%s) failed, %s\n", path, strerror(errno));
            _exit(-1);
        }
        /* name map */
        sprintf(path, "%s/%s", basedir, QINDEX_NODEMAP_NAME);
        qindex->namemap = mmtrie_init(path);
        /* id map */
        sprintf(path, "%s/%s", basedir, QINDEX_IDMAP_NAME);
        qindex->idmap = mmtree64_init(path);
        if(qindex->state->rootid == 0)
        {
            qindex->state->rootid = mmtree64_new_tree(qindex->idmap);
        }
        return 0;
    }
    return -1;
}