ibus: complete setup before publication
This commit is contained in:
55
ibus.c
55
ibus.c
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user