static char* _fcitx_get_address () { char *env = getenv("FCITX_DBUS_ADDRESS"); if (env) return strdup(env); char* path = _fcitx_get_socket_path(); FILE* fp = fopen(path, "r"); free(path); if (!fp) return NULL; const int BUFSIZE = 1024; char buffer[BUFSIZE]; size_t sz = fread(buffer, sizeof(char), BUFSIZE, fp); fclose(fp); char *p = memchr(buffer, '\0', sz); if (!(p && sz == p - buffer + 2 * sizeof(pid_t) + 1)) return NULL; /* skip '\0' */ p++; pid_t *ppid = (pid_t*) p; pid_t daemonpid = ppid[0]; pid_t fcitxpid = ppid[1]; if (!fcitx_utils_pid_exists(daemonpid) || !fcitx_utils_pid_exists(fcitxpid)) return NULL; return strdup(buffer); }
void FcitxInstanceCleanUpIC(FcitxInstance* instance) { FcitxInputContext *rec = instance->ic_list, *last = NULL, *todel; while (rec) { FcitxAddon **pfrontend = FcitxInstanceGetPFrontend(instance, rec->frontendid); FcitxFrontend *frontend = (*pfrontend)->frontend; pid_t pid = 0; if (frontend->GetPid) pid = frontend->GetPid((*pfrontend)->addonInstance, rec); if (pid && !fcitx_utils_pid_exists(pid)) { if (last != NULL) last->next = rec->next; else instance->ic_list = rec->next; todel = rec; rec = rec->next; todel->next = instance->free_list; instance->free_list = todel; frontend->DestroyIC((*pfrontend)->addonInstance, todel); FreeICData(instance, todel); if (todel == instance->CurrentIC) { instance->CurrentIC = NULL; FcitxUICloseInputWindow(instance); FcitxUIOnInputUnFocus(instance); FcitxInstanceSetCurrentIC(instance, NULL); } } else { last = rec; rec = rec->next; } } }
QString FcitxQtConnectionPrivate::address() { QString addr; QByteArray addrVar = qgetenv("FCITX_DBUS_ADDRESS"); if (!addrVar.isNull()) return QString::fromLocal8Bit(addrVar); QFile file(socketFile()); if (!file.open(QIODevice::ReadOnly)) return QString(); const int BUFSIZE = 1024; char buffer[BUFSIZE]; size_t sz = file.read(buffer, BUFSIZE); file.close(); if (sz == 0) return QString(); char* p = buffer; while(*p) p++; size_t addrlen = p - buffer; if (sz != addrlen + 2 * sizeof(pid_t) + 1) return QString(); /* skip '\0' */ p++; pid_t *ppid = (pid_t*) p; pid_t daemonpid = ppid[0]; pid_t fcitxpid = ppid[1]; if (!fcitx_utils_pid_exists(daemonpid) || !fcitx_utils_pid_exists(fcitxpid)) return QString(); addr = QLatin1String(buffer); return addr; }