]>
Commit | Line | Data |
---|---|---|
83d3aa0c | 1 | /* $Header$ |
2 | */ | |
3 | ||
4 | #include <stdio.h> | |
5 | #include <moira.h> | |
6 | #include <moira_site.h> | |
7 | #include <sys/types.h> | |
8 | #include <netdb.h> | |
9 | #include <sys/socket.h> | |
10 | #include <netinet/in.h> | |
11 | #include <Xm/Xm.h> | |
12 | #include "mmoira.h" | |
11a616d5 | 13 | #ifdef GDSS |
14 | #include <des.h> | |
15 | #include <krb.h> | |
16 | #include <gdss.h> | |
17 | #endif /* GDSS */ | |
83d3aa0c | 18 | |
19 | ||
11a616d5 | 20 | static char *MOD_FORMAT = "Modified by %s at %s with %s\n"; |
21 | ||
22 | ||
23 | /* atot: convert ASCII integer unix time into human readable date string */ | |
24 | ||
25 | char *atot(itime) | |
26 | char *itime; | |
27 | { | |
28 | int time; | |
29 | char *ct, *ctime(); | |
30 | ||
31 | time = atoi(itime); | |
32 | ct = ctime(&time); | |
33 | ct[24] = 0; | |
34 | return(&ct[4]); | |
35 | } | |
36 | ||
37 | ||
38 | /* Turn an integer number of minutes into a print string */ | |
39 | ||
40 | char *unparse_interval(i) | |
41 | int i; | |
42 | { | |
43 | static char uibuf[32]; | |
44 | ||
45 | sprintf(uibuf, "%d hrs %d mins", i / 60, i % 60); | |
46 | return(&uibuf[0]); | |
47 | } | |
83d3aa0c | 48 | |
49 | ||
b2d21e59 | 50 | static save_info(argc, argv, sq) |
51 | int argc; | |
52 | char **argv; | |
53 | struct save_queue *sq; | |
54 | { | |
55 | sq_save_args(argc, argv, sq); | |
11a616d5 | 56 | return(MR_CONT); |
b2d21e59 | 57 | } |
58 | ||
83d3aa0c | 59 | |
60 | int DisplayCallback(argc, info, form) | |
61 | int argc; | |
62 | char **info; | |
63 | EntryForm *form; | |
64 | { | |
65 | char buf[1024], name[128]; | |
11a616d5 | 66 | #ifdef GDSS |
67 | SigInfo si; | |
68 | #endif | |
69 | int i, status; | |
83d3aa0c | 70 | |
71 | switch (form->menu->operation) { | |
72 | case MM_SHOW_USER: | |
73 | sprintf(name, "%s, %s %s", info[U_LAST], info[U_FIRST], info[U_MIDDLE]); | |
74 | sprintf(buf, "Login name: %-20s Full name: %s\n", info[U_NAME], name); | |
75 | AppendToLog(buf); | |
76 | sprintf(buf, "User id: %-23s Login shell %-10s Class: %s\n", | |
77 | info[U_UID], info[U_SHELL], info[U_CLASS]); | |
78 | AppendToLog(buf); | |
11a616d5 | 79 | |
80 | #ifdef GDSS | |
81 | sprintf(buf, "%s:%s", info[U_NAME], info[U_MITID]); | |
82 | si.rawsig = NULL; | |
83 | status = GDSS_Verify(buf, strlen(buf), info[U_SIGNATURE], &si); | |
84 | #ifdef DEBUG | |
85 | hex_dump(info[U_SIGNATURE]); | |
86 | sprintf(buf, "GDSS_Verify => %d", status); | |
87 | AppendToLog(buf); | |
88 | #endif /* DEBUG */ | |
89 | #else /* GDSS */ | |
90 | status = 0; | |
91 | #endif /* GDSS */ | |
92 | ||
93 | sprintf(buf, "Account is: %-20s ID number: %-11s Signed: %s\n", | |
94 | user_states[atoi(info[U_STATE])], info[U_MITID], | |
95 | *info[U_SIGNATURE] ? (status ? "Bad" : "Yes") : "No"); | |
96 | AppendToLog(buf); | |
97 | if (atoi(info[U_SECURE])) | |
98 | sprintf(buf, "Secure password set on %s.\n", atot(info[U_SECURE])); | |
99 | else | |
100 | sprintf(buf, "No secure password set.\n"); | |
101 | AppendToLog(buf); | |
102 | sprintf(buf, "Comments: %s\n", info[U_COMMENT]); | |
83d3aa0c | 103 | AppendToLog(buf); |
104 | sprintf(buf, MOD_FORMAT, | |
105 | info[U_MODBY], info[U_MODTIME],info[U_MODWITH]); | |
106 | AppendToLog(buf); | |
107 | break; | |
108 | case MM_SHOW_FINGER: | |
11a616d5 | 109 | sprintf(buf, "Finger information for user: %s\n", info[F_NAME]); |
83d3aa0c | 110 | AppendToLog(buf); |
111 | sprintf(buf, "Login name: %-27s In real life: %s\n", info[F_NAME], | |
112 | info[F_FULLNAME]); | |
113 | AppendToLog(buf); | |
b2d21e59 | 114 | sprintf(buf, "Nickname: %-29s Department: %s\n", info[F_NICKNAME], |
115 | info[F_MIT_DEPT]); | |
116 | AppendToLog(buf); | |
83d3aa0c | 117 | sprintf(buf, "Home: %-33s Home phone: %s\n", info[F_HOME_ADDR], |
118 | info[F_HOME_PHONE]); | |
119 | AppendToLog(buf); | |
120 | sprintf(buf, "Office: %-31s Office phone: %s\n", info[F_OFFICE_ADDR], | |
121 | info[F_OFFICE_PHONE]); | |
122 | AppendToLog(buf); | |
123 | sprintf(buf, MOD_FORMAT, info[F_MODBY], info[F_MODTIME], | |
124 | info[F_MODWITH]); | |
125 | AppendToLog(buf); | |
126 | break; | |
127 | case MM_SHOW_POBOX: | |
11a616d5 | 128 | sprintf(buf, "Post Office information for user: %s\n", info[PO_NAME]); |
b2d21e59 | 129 | AppendToLog(buf); |
11a616d5 | 130 | sprintf(buf, "Type: %-8s Box: %s\n", info[PO_TYPE], info[PO_BOX]); |
83d3aa0c | 131 | AppendToLog(buf); |
132 | sprintf(buf, MOD_FORMAT, info[4], info[3], info[5]); | |
133 | AppendToLog(buf); | |
134 | break; | |
135 | case MM_SHOW_KRBMAP: | |
a7f0ee07 | 136 | sprintf(buf, "Kerberos mapping: User %-9s Principal %s", |
83d3aa0c | 137 | info[KMAP_USER], info[KMAP_PRINCIPAL]); |
138 | AppendToLog(buf); | |
139 | break; | |
140 | case MM_SHOW_FILSYS: | |
141 | case MM_SHOW_FSGROUP: | |
11a616d5 | 142 | sq_save_args(argc, info, form->extrastuff); |
28283b10 | 143 | return(MR_CONT); |
83d3aa0c | 144 | break; |
72a39330 | 145 | case MM_SHOW_NFS: |
146 | sprintf(buf,"Machine: %-20s Directory: %-15s Device: %s\n", | |
147 | info[NFS_NAME], info[NFS_DIR], info[NFS_DEVICE]); | |
148 | AppendToLog(buf); | |
149 | sprintf(buf, "Status: %s\n", format_filesys_type(info[NFS_STATUS])); | |
150 | AppendToLog(buf); | |
151 | sprintf(buf, "Quota Allocated: %-17s Size: %s\n", | |
152 | info[NFS_ALLOC], info[NFS_SIZE]); | |
153 | AppendToLog(buf); | |
154 | sprintf(buf, MOD_FORMAT, info[NFS_MODBY], info[NFS_MODTIME], | |
155 | info[NFS_MODWITH]); | |
156 | AppendToLog(buf); | |
157 | break; | |
83d3aa0c | 158 | case MM_SHOW_QUOTA: |
159 | if (!strcmp(info[Q_TYPE], "ANY")) | |
160 | sprintf(buf, "Filesystem: %s\n", info[Q_FILESYS]); | |
161 | else | |
162 | sprintf(buf, "Filesystem: %-45s %s %s\n", info[Q_FILESYS], | |
163 | info[Q_TYPE], info[Q_NAME]); | |
164 | AppendToLog(buf); | |
165 | sprintf(buf, "Machine: %-20s Directory: %-15s\n", | |
166 | info[Q_MACHINE], info[Q_DIRECTORY]); | |
167 | AppendToLog(buf); | |
168 | sprintf(buf, "Quota: %s\n", info[Q_QUOTA]); | |
169 | AppendToLog(buf); | |
170 | sprintf(buf, MOD_FORMAT, info[Q_MODBY], info[Q_MODTIME], info[Q_MODWITH]); | |
171 | AppendToLog(buf); | |
172 | break; | |
173 | case MM_SHOW_LIST: | |
b2d21e59 | 174 | (void) sprintf(buf, "List: %s\n", info[L_NAME]); |
83d3aa0c | 175 | AppendToLog(buf); |
176 | (void) sprintf(buf, "Description: %s\n", info[L_DESC]); | |
177 | AppendToLog(buf); | |
178 | if ( atoi(info[L_MAILLIST])) | |
179 | AppendToLog("This list is a mailing list.\n"); | |
180 | else | |
181 | AppendToLog("This list is NOT a mailing list.\n"); | |
182 | if (atoi(info[L_GROUP])) { | |
183 | (void) sprintf(buf,"This list is a Group and its ID number is %s\n", | |
184 | info[L_GID]); | |
185 | AppendToLog(buf); | |
186 | } else | |
187 | AppendToLog("This list is NOT a Group.\n"); | |
188 | if (strcmp(info[L_ACE_TYPE],"NONE") == 0) | |
189 | AppendToLog("This list has no Administrator, how strange?!\n"); | |
190 | else { | |
191 | sprintf(buf, "The Administrator of this list is the %s: %s\n", | |
192 | info[L_ACE_TYPE], info[L_ACE_NAME]); | |
193 | AppendToLog(buf); | |
194 | } | |
195 | (void) sprintf(buf, "This list is: %s, %s, and %s\n", | |
196 | atoi(info[L_ACTIVE]) ? "active" : "inactive", | |
197 | atoi(info[L_PUBLIC]) ? "public" : "private", | |
198 | atoi(info[L_HIDDEN]) ? "hidden" : "visible"); | |
199 | AppendToLog(buf); | |
200 | sprintf(buf, MOD_FORMAT, info[L_MODBY], info[L_MODTIME], info[L_MODWITH]); | |
201 | AppendToLog(buf); | |
202 | break; | |
203 | case MM_SHOW_MACH: | |
204 | sprintf(buf, "Machine: %-30s Type: %s\n", info[M_NAME], info[M_TYPE]); | |
205 | AppendToLog(buf); | |
206 | sprintf(buf, MOD_FORMAT, info[M_MODBY], info[M_MODTIME], info[M_MODWITH]); | |
207 | AppendToLog(buf); | |
208 | break; | |
209 | case MM_SHOW_CLUSTER: | |
210 | sprintf(buf, "Cluster: %s\n", info[C_NAME]); | |
211 | AppendToLog(buf); | |
212 | sprintf(buf, "Description: %s\n", info[C_DESCRIPT]); | |
213 | AppendToLog(buf); | |
214 | sprintf(buf, "Location: %s\n", info[C_LOCATION]); | |
215 | AppendToLog(buf); | |
216 | sprintf(buf, MOD_FORMAT, info[C_MODBY], info[C_MODTIME], info[C_MODWITH]); | |
217 | AppendToLog(buf); | |
218 | break; | |
219 | case MM_SHOW_CLDATA: | |
a7f0ee07 | 220 | sprintf(buf, "Cluster: %-20s Label: %-15s Data: %s", |
83d3aa0c | 221 | info[CD_NAME], info[CD_LABEL], info[CD_DATA]); |
222 | AppendToLog(buf); | |
223 | break; | |
b2d21e59 | 224 | case MM_SHOW_MCMAP: |
a7f0ee07 | 225 | sprintf(buf, "Machine: %-20s Cluster: %s", info[0], info[1]); |
b2d21e59 | 226 | AppendToLog(buf); |
227 | break; | |
83d3aa0c | 228 | case MM_SHOW_MEMBERS: |
229 | if (argc == 2) | |
a7f0ee07 | 230 | sprintf(buf, "%-9s %s", info[0], info[1]); |
83d3aa0c | 231 | else |
a7f0ee07 | 232 | sprintf(buf, "%s", info[0]); |
83d3aa0c | 233 | AppendToLog(buf); |
234 | break; | |
235 | case MM_STATS: | |
236 | sprintf(buf, "Table: %-20s Modified: %s\n", info[0], info[5]); | |
237 | AppendToLog(buf); | |
a7f0ee07 | 238 | sprintf(buf, " %-8D appends, %-8d updates, %-8d deletes", |
83d3aa0c | 239 | info[2], info[3], info[4]); |
240 | AppendToLog(buf); | |
241 | break; | |
242 | case MM_CLIENTS: | |
243 | { | |
244 | unsigned long host_address; | |
245 | struct hostent *host_entry; | |
246 | ||
247 | host_address = inet_addr(info[1]); | |
248 | if (host_address != NULL) { | |
249 | host_entry = gethostbyaddr((char *)&host_address, 4, AF_INET); | |
250 | if (host_entry != NULL) { | |
251 | free(info[1]); | |
252 | info[1] = strsave(host_entry->h_name); | |
253 | } | |
254 | } | |
255 | } | |
256 | sprintf(buf, "Principal %s on %s (%s)\n", info[0], info[1], info[2]); | |
257 | AppendToLog(buf); | |
a7f0ee07 | 258 | sprintf(buf, " Connected at %s, client %s", info[3], info[4]); |
83d3aa0c | 259 | AppendToLog(buf); |
260 | break; | |
261 | case MM_SHOW_VALUE: | |
262 | sprintf(buf, "Variable: %-20s Value: %s\n", stringval(form, 0), | |
263 | info[0]); | |
264 | AppendToLog(buf); | |
265 | break; | |
266 | case MM_SHOW_ALIAS: | |
267 | sprintf(buf, "Alias: %-20s Type: %-8s Value: %s\n", | |
268 | info[0], info[1], info[2]); | |
269 | AppendToLog(buf); | |
270 | break; | |
271 | case MM_SHOW_HOST: | |
83d3aa0c | 272 | if (atoi(info[SH_HOSTERROR])) |
273 | sprintf(name, "Error %d: %s", atoi(info[SH_HOSTERROR]), | |
274 | info[SH_ERRMSG]); | |
275 | else | |
276 | strcpy(name, "No error"); | |
28283b10 | 277 | sprintf(buf, "%s:%s %s/%s/%s/%s/%s\n", |
278 | info[SH_MACHINE], info[SH_SERVICE], | |
83d3aa0c | 279 | atoi(info[SH_ENABLE]) ? "Enabled" : "Disabled", |
280 | atoi(info[SH_SUCCESS]) ? "Success" : "Failure", | |
281 | atoi(info[SH_INPROGRESS]) ? "InProgress" : "Idle", | |
282 | atoi(info[SH_OVERRIDE]) ? "Override" : "Normal", name); | |
283 | AppendToLog(buf); | |
28283b10 | 284 | AppendToLog("Last Try Last Success Value1 Value2 Value3\n"); |
83d3aa0c | 285 | strcpy(name, atot(info[SH_LASTTRY])); |
28283b10 | 286 | sprintf(buf, "%-20s %-20s %-9d %-9d %s\n", name, |
83d3aa0c | 287 | atot(info[SH_LASTSUCCESS]), atoi(info[SH_VALUE1]), |
288 | atoi(info[SH_VALUE2]), info[SH_VALUE3]); | |
289 | AppendToLog(buf); | |
28283b10 | 290 | sprintf(buf, MOD_FORMAT, info[SH_MODBY], info[SH_MODTIME], |
291 | info[SH_MODWITH]); | |
292 | AppendToLog(buf); | |
83d3aa0c | 293 | break; |
294 | case MM_SHOW_DQUOTA: | |
295 | sprintf(buf, "The default quota is %s Kbytes.\n", info[0]); | |
296 | AppendToLog(buf); | |
297 | break; | |
298 | case MM_SHOW_DCM: | |
299 | if (argc == 2) | |
300 | sprintf(buf, "%s:%s\n", info[0], info[1]); | |
301 | else | |
302 | sprintf(buf, "%s\n", info[0]); | |
303 | AppendToLog(buf); | |
304 | break; | |
b2d21e59 | 305 | case MM_SHOW_PCAP: |
306 | sprintf(buf, "Printer: %-35s Spool host: %s\n", info[PCAP_NAME], | |
307 | info[PCAP_SPOOL_HOST]); | |
308 | AppendToLog(buf); | |
309 | sprintf(buf, "Spool directory: %-27s Remote Printer Name: %s\n", | |
310 | info[PCAP_SPOOL_DIR], info[PCAP_RPRINTER]); | |
311 | AppendToLog(buf); | |
312 | sprintf(buf, "Authentication: %-3s Price/page: %-3s Quota Server: %s\n", | |
313 | atoi(info[PCAP_AUTH]) ? "yes" : "no", | |
314 | info[PCAP_PRICE], info[PCAP_QSERVER]); | |
315 | AppendToLog(buf); | |
316 | sprintf(buf, "Comments: %s\n", info[PCAP_COMMENTS]); | |
317 | AppendToLog(buf); | |
318 | sprintf(buf, MOD_FORMAT, info[PCAP_MODBY], info[PCAP_MODTIME], | |
319 | info[PCAP_MODWITH]); | |
320 | AppendToLog(buf); | |
321 | break; | |
322 | case MM_SHOW_ZEPHYR: | |
323 | sprintf(buf, "Zephyr class: %s\n", info[ZA_CLASS]); | |
324 | AppendToLog(buf); | |
325 | if (!strcmp("NONE", info[ZA_XMT_TYPE])) | |
326 | name[0] = 0; | |
327 | else | |
328 | sprintf(name, "Name: %s", info[ZA_XMT_ID]); | |
329 | sprintf(buf, "XMT ACL Type %s %s\n", info[ZA_XMT_TYPE], name); | |
330 | AppendToLog(buf); | |
331 | if (!strcmp("NONE", info[ZA_SUB_TYPE])) | |
332 | name[0] = 0; | |
333 | else | |
334 | sprintf(name, "Name: %s", info[ZA_SUB_ID]); | |
335 | sprintf(buf, "SUB ACL Type %s %s\n", info[ZA_SUB_TYPE], name); | |
336 | AppendToLog(buf); | |
337 | if (!strcmp("NONE", info[ZA_IWS_TYPE])) | |
338 | name[0] = 0; | |
339 | else | |
340 | sprintf(name, "Name: %s", info[ZA_IWS_ID]); | |
341 | sprintf(buf, "IWS ACL Type %s %s\n", info[ZA_IWS_TYPE], name); | |
342 | AppendToLog(buf); | |
343 | if (!strcmp("NONE", info[ZA_IUI_TYPE])) | |
344 | name[0] = 0; | |
345 | else | |
346 | sprintf(name, "Name: %s", info[ZA_IUI_ID]); | |
347 | sprintf(buf, "IUI ACL Type %s %s\n", info[ZA_IUI_TYPE], name); | |
348 | AppendToLog(buf); | |
349 | break; | |
11a616d5 | 350 | case MM_SHOW_SERVICE: |
11a616d5 | 351 | sprintf(name, "%s:%s", info[SVC_ACE_TYPE], info[SVC_ACE_NAME]); |
d322239a | 352 | sprintf(buf, "Service: %-10s Type: %-8s Owner: %-11s\n", |
353 | info[SVC_SERVICE], info[SVC_TYPE], name); | |
11a616d5 | 354 | AppendToLog(buf); |
d322239a | 355 | sprintf(buf, "Interval %s, Target:%s, Script:%s\n", |
11a616d5 | 356 | unparse_interval(atoi(info[SVC_INTERVAL])), info[SVC_TARGET], |
357 | info[SVC_SCRIPT]); | |
358 | AppendToLog(buf); | |
359 | strcpy(name, atot(info[SVC_DFGEN])); | |
d322239a | 360 | sprintf(buf, "Generated %s; Last Checked %s\n", name, |
11a616d5 | 361 | atot(info[SVC_DFCHECK])); |
362 | AppendToLog(buf); | |
363 | if (atoi(info[SVC_HARDERROR])) | |
364 | sprintf(name, "Error %d: %s", atoi(info[SVC_HARDERROR]), | |
365 | info[SVC_ERRMSG]); | |
366 | else | |
367 | strcpy(name, "No error"); | |
d322239a | 368 | sprintf(buf, "%s/%s/%s\n", |
11a616d5 | 369 | atoi(info[SVC_ENABLE]) ? "Enabled" : "Disabled", |
370 | atoi(info[SVC_INPROGRESS]) ? "InProgress" : "Idle", name); | |
371 | AppendToLog(buf); | |
d322239a | 372 | sprintf(buf, MOD_FORMAT, info[SVC_MODBY], info[SVC_MODTIME], |
373 | info[SVC_MODWITH]); | |
374 | AppendToLog(buf); | |
11a616d5 | 375 | break; |
376 | case MM_SHOW_ACE_USE: | |
a7f0ee07 | 377 | sprintf(buf, "%s: %s", info[0], info[1]); |
11a616d5 | 378 | AppendToLog(buf); |
379 | break; | |
d322239a | 380 | case MM_SHOW_FS_ALIAS: |
381 | sprintf(buf, "Alias: %s; Real name %s\n", info[0], info[2]); | |
382 | AppendToLog(buf); | |
383 | break; | |
83d3aa0c | 384 | default: |
385 | for (i = 0; i < argc; i++) { | |
386 | if (i != 0) AppendToLog(", "); | |
387 | AppendToLog(info[i]); | |
388 | } | |
83d3aa0c | 389 | } |
28283b10 | 390 | AppendToLog("\n"); |
83d3aa0c | 391 | return(MR_CONT); |
392 | } | |
11a616d5 | 393 | |
394 | ||
395 | /* Display info about filesystem, doing FS groups & type MUL as well. | |
396 | * frees info before returning. | |
397 | */ | |
398 | ||
399 | ShowFilsys(info) | |
400 | char **info; | |
401 | { | |
402 | int stat, i; | |
403 | char **argv, buf[256]; | |
404 | struct save_queue *sq; | |
405 | ||
406 | if (!strcmp(info[FS_TYPE], "FSGROUP") || | |
407 | !strcmp(info[FS_TYPE], "MUL")) { | |
408 | sprintf(buf,"%20s %s: %s\n", " ", strcmp(info[FS_TYPE], "MUL") ? | |
409 | "Filesystem Group" : "Multiple Filesystem", | |
410 | info[FS_NAME]); | |
411 | AppendToLog(buf); | |
412 | ||
413 | sprintf(buf,"Comments: %s\n",info[FS_COMMENTS]); | |
414 | AppendToLog(buf); | |
415 | sprintf(buf, MOD_FORMAT, info[FS_MODBY], info[FS_MODTIME], | |
416 | info[FS_MODWITH]); | |
417 | AppendToLog(buf); | |
418 | AppendToLog("Containing the filesystems (in order):\n"); | |
419 | ||
420 | sq = sq_create(); | |
421 | if ((stat = MoiraQuery("get_fsgroup_members", 1, &info[FS_NAME], | |
422 | save_info, (char *)sq)) != 0) { | |
423 | if (stat == MR_NO_MATCH) | |
424 | AppendToLog(" [no members]"); | |
425 | else | |
426 | com_err(program_name, stat, ""); | |
427 | } else { | |
428 | while (sq_get_data(sq, &argv)) { | |
429 | sprintf(buf, " Filesystem: %-32s (sort key: %s)\n", | |
430 | argv[0], argv[1]); | |
431 | AppendToLog(buf); | |
432 | free(argv[0]); | |
433 | free(argv[1]); | |
434 | free(argv); | |
435 | } | |
436 | sq_destroy(sq); | |
437 | } | |
438 | } else { | |
439 | sprintf(buf,"Filesystem: %s\n", info[FS_NAME]); | |
440 | AppendToLog(buf); | |
441 | sprintf(buf,"Type: %-40s Machine: %-15s\n", | |
442 | info[FS_TYPE], info[FS_MACHINE]); | |
443 | AppendToLog(buf); | |
444 | sprintf(buf, "Packname: %s\n", info[FS_PACK]); | |
445 | AppendToLog(buf); | |
446 | sprintf(buf,"Default Access: %-29s Mountpoint %s\n", | |
447 | info[FS_ACCESS], info[FS_M_POINT]); | |
448 | AppendToLog(buf); | |
449 | sprintf(buf,"Comments: %s\n",info[FS_COMMENTS]); | |
450 | AppendToLog(buf); | |
451 | sprintf(buf, "User Ownership: %-30s Group Ownership: %s\n", | |
452 | info[FS_OWNER], info[FS_OWNERS]); | |
453 | AppendToLog(buf); | |
454 | sprintf(buf, "Update fileserver: %-27s Locker Type: %s\n", | |
455 | atoi(info[FS_CREATE]) ? "On" : "Off", | |
456 | info[FS_L_TYPE]); | |
457 | AppendToLog(buf); | |
458 | sprintf(buf, MOD_FORMAT, info[FS_MODBY], info[FS_MODTIME], | |
459 | info[FS_MODWITH]); | |
460 | AppendToLog(buf); | |
461 | } | |
28283b10 | 462 | for (i = 0; i < FS_MODWITH; i++) |
11a616d5 | 463 | free(info[i]); |
464 | free(info); | |
28283b10 | 465 | AppendToLog("\n"); |
11a616d5 | 466 | } |