ibus: complete setup before publication

This commit is contained in:
2026-08-14 02:48:49 +09:00
parent 6a2b2bccc4
commit f395f29918
4 changed files with 123 additions and 13 deletions

55
ibus.c
View File

@@ -182,14 +182,15 @@ writeaddr(char *path, char *addr)
fd = -1;
if(fprintf(fp, "IBUS_ADDRESS=%s\n", addr) < 0 ||
fprintf(fp, "IBUS_DAEMON_PID=%d\n", (int)getpid()) < 0 ||
fflush(fp) < 0 || fsync(fileno(fp)) < 0)
fflush(fp) < 0 || fsync(fileno(fp)) < 0 ||
fstat(fileno(fp), &st) < 0)
goto out;
if(fclose(fp) < 0){
fp = nil;
goto out;
}
fp = nil;
if(rename(tmp, path) < 0 || lstat(path, &st) < 0)
if(rename(tmp, path) < 0)
goto out;
addrdev = st.st_dev;
addrino = st.st_ino;
@@ -695,11 +696,19 @@ newconn(DBusServer *s, DBusConnection *c, void *_)
USED(_);
if(nconns >= Maxconns)
return;
dbus_connection_ref(c);
dbus_connection_set_watch_functions(c, addwatch, removewatch, togglewatch, nil, nil);
if(!dbus_connection_set_watch_functions(c, addwatch, removewatch,
togglewatch, nil, nil)){
fprintf(stderr, "strans: ibus: cannot watch client connection\n");
return;
}
memset(&vt, 0, sizeof(vt));
vt.message_function = onmsg;
dbus_connection_register_fallback(c, "/", &vt, nil);
if(!dbus_connection_register_fallback(c, "/", &vt, nil)){
fprintf(stderr, "strans: ibus: cannot register client handler\n");
dbus_connection_set_watch_functions(c, nil, nil, nil, nil, nil);
return;
}
dbus_connection_ref(c);
conns[nconns++] = c;
}
@@ -726,7 +735,10 @@ ibusinit(void)
DBusError err;
char addr[128];
char *full;
int cleanupregistered;
full = nil;
cleanupregistered = 0;
if(buildaddrpath(addrfile, sizeof(addrfile)) < 0){
fprintf(stderr, "strans: ibus: cannot build address path\n");
return -1;
@@ -745,20 +757,37 @@ ibusinit(void)
return -1;
}
dbus_server_set_new_connection_function(srv, newconn, nil, nil);
dbus_server_set_watch_functions(srv, addwatch, removewatch, togglewatch, nil, nil);
if(!dbus_server_set_watch_functions(srv, addwatch, removewatch,
togglewatch, nil, nil)){
fprintf(stderr, "strans: ibus: cannot watch server\n");
goto fail;
}
full = dbus_server_get_address(srv);
if(full == nil){
fprintf(stderr, "strans: ibus: cannot get server address\n");
goto fail;
}
if(!atexit(unlinkaddr)){
fprintf(stderr, "strans: ibus: cannot register address cleanup\n");
goto fail;
}
cleanupregistered = 1;
if(writeaddr(addrfile, full) < 0){
fprintf(stderr, "strans: ibus: cannot write %s\n", addrfile);
dbus_free(full);
dbus_server_disconnect(srv);
dbus_server_unref(srv);
srv = nil;
addrfile[0] = '\0';
return -1;
goto fail;
}
dbus_free(full);
atexit(unlinkaddr);
return 0;
fail:
if(cleanupregistered)
atexitdont(unlinkaddr);
if(full != nil)
dbus_free(full);
dbus_server_disconnect(srv);
dbus_server_unref(srv);
srv = nil;
addrfile[0] = '\0';
return -1;
}
void