|
22 | 22 | #include <stdlib.h> |
23 | 23 | #include <string.h> |
24 | 24 | #include <sys/param.h> |
| 25 | +#include <sys/stat.h> |
25 | 26 | #include <sys/resource.h> |
26 | 27 | #include <sys/socket.h> |
27 | 28 | #include <sys/time.h> |
@@ -99,82 +100,68 @@ static bool service_running(pid_t pid) |
99 | 100 | } |
100 | 101 |
|
101 | 102 | #ifdef WITH_SPOTLIGHT |
102 | | -/*! Set indexers to index all our volumes */ |
| 103 | +/*! Set indexers to index all our volumes via a dconf keyfile */ |
103 | 104 | static int set_sl_volumes(void) |
104 | 105 | { |
105 | 106 | EC_INIT; |
106 | 107 | const struct vol *volumes, *vol; |
107 | | - struct bstrList *vollist = bstrListCreate(); |
| 108 | + FILE *fp = NULL; |
108 | 109 | int sysret; |
109 | | - bstring sep = bfromcstr(", "); |
110 | | - bstring volnamelist = NULL, cmd = NULL; |
| 110 | + bool first; |
| 111 | + |
111 | 112 | EC_NULL_LOG(volumes = getvolumes()); |
112 | 113 |
|
| 114 | + if (mkdir(INDEXER_DCONF_DB_DIR, 0755) != 0 && errno != EEXIST) { |
| 115 | + LOG(log_error, logtype_sl, |
| 116 | + "set_sl_volumes: failed to create " INDEXER_DCONF_DB_DIR ": %s", |
| 117 | + strerror(errno)); |
| 118 | + EC_FAIL; |
| 119 | + } |
| 120 | + |
| 121 | + if ((fp = fopen(INDEXER_DCONF_DB_DIR "/10-spotlight", "w")) == NULL) { |
| 122 | + LOG(log_error, logtype_sl, |
| 123 | + "set_sl_volumes: failed to open " INDEXER_DCONF_DB_DIR "/10-spotlight: %s", |
| 124 | + strerror(errno)); |
| 125 | + EC_FAIL; |
| 126 | + } |
| 127 | + |
| 128 | + fprintf(fp, "[" INDEXER_DCONF_PATH "]\n"); |
| 129 | + fprintf(fp, "index-recursive-directories=["); |
| 130 | + first = true; |
| 131 | + |
113 | 132 | for (vol = volumes; vol; vol = vol->v_next) { |
114 | 133 | if (vol->v_flags & AFPVOL_SPOTLIGHT) { |
115 | | - bstring volnamequot = bformat("'%s'", vol->v_path); |
116 | | - |
117 | | - if (vollist->qty == vollist->mlen |
118 | | - && bstrListAlloc(vollist, vollist->qty + 1) != BSTR_OK) { |
119 | | - LOG(log_error, logtype_default, |
120 | | - "set_sl_volumes: failed to initialize indexing for %s", |
121 | | - bdata(volnamequot)); |
| 134 | + if (!first) { |
| 135 | + fprintf(fp, ", "); |
122 | 136 | } |
123 | | - |
124 | | - vollist->entry[vollist->qty] = volnamequot; |
125 | | - vollist->qty++; |
| 137 | + fprintf(fp, "'%s'", vol->v_path); |
| 138 | + first = false; |
126 | 139 | } |
127 | 140 | } |
128 | 141 |
|
129 | | - volnamelist = bjoin(vollist, sep); |
130 | | - cmd = bformat("gsettings set " INDEXER_GSETTINGS_SCHEMA |
131 | | - " index-recursive-directories \"[%s]\"", |
132 | | - bdata(volnamelist) ? bdata(volnamelist) : ""); |
133 | | - LOG(log_debug, logtype_sl, "set_sl_volumes: %s", bdata(cmd)); |
134 | | - sysret = system(bdata(cmd)); |
135 | | - |
136 | | - if (sysret == -1) { |
137 | | - LOG(log_error, logtype_sl, "set_sl_volumes: system() failed to run '%s': %s", |
138 | | - bdata(cmd), strerror(errno)); |
139 | | - EC_FAIL; |
140 | | - } else if (sysret != 0) { |
141 | | - LOG(log_error, logtype_sl, "set_sl_volumes: command '%s' exited with status %d", |
142 | | - bdata(cmd), WEXITSTATUS(sysret)); |
143 | | - EC_FAIL; |
144 | | - } |
| 142 | + fprintf(fp, "]\n"); |
| 143 | + fprintf(fp, "index-single-directories=@as []\n"); |
| 144 | + fclose(fp); |
| 145 | + fp = NULL; |
145 | 146 |
|
146 | | - /* Disable default root user home indexing */ |
147 | | - sysret = system("gsettings set " INDEXER_GSETTINGS_SCHEMA |
148 | | - " index-single-directories \"[]\""); |
| 147 | + sysret = system("dconf update"); |
149 | 148 |
|
150 | 149 | if (sysret == -1) { |
151 | 150 | LOG(log_error, logtype_sl, |
152 | | - "set_sl_volumes: system() failed to run disable home indexing: %s", |
| 151 | + "set_sl_volumes: system() failed to run 'dconf update': %s", |
153 | 152 | strerror(errno)); |
154 | 153 | EC_FAIL; |
155 | 154 | } else if (sysret != 0) { |
156 | 155 | LOG(log_error, logtype_sl, |
157 | | - "set_sl_volumes: disable home indexing exited with status %d", |
| 156 | + "set_sl_volumes: 'dconf update' exited with status %d", |
158 | 157 | WEXITSTATUS(sysret)); |
159 | 158 | EC_FAIL; |
160 | 159 | } |
161 | 160 |
|
162 | 161 | EC_CLEANUP: |
163 | 162 |
|
164 | | - if (cmd) { |
165 | | - bdestroy(cmd); |
166 | | - } |
167 | | - |
168 | | - if (sep) { |
169 | | - bdestroy(sep); |
170 | | - } |
171 | | - |
172 | | - if (vollist) { |
173 | | - bstrListDestroy(vollist); |
174 | | - } |
175 | | - |
176 | | - if (volnamelist) { |
177 | | - bdestroy(volnamelist); |
| 163 | + if (fp) { |
| 164 | + fclose(fp); |
178 | 165 | } |
179 | 166 |
|
180 | 167 | EC_EXIT; |
@@ -712,6 +699,7 @@ int main(int argc, char **argv) |
712 | 699 | if (obj.options.flags & OPTION_SPOTLIGHT) { |
713 | 700 | setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=" _PATH_STATEDIR "spotlight.ipc", |
714 | 701 | 1); |
| 702 | + setenv("DCONF_PROFILE", INDEXER_DCONF_PROFILE, 1); |
715 | 703 | setenv("XDG_DATA_HOME", _PATH_STATEDIR, 0); |
716 | 704 | setenv("XDG_CACHE_HOME", _PATH_STATEDIR, 0); |
717 | 705 | setenv("TRACKER_USE_LOG_FILES", "1", 0); |
|
0 commit comments