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; }
/* 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; }