]> andersk Git - moira.git/blame_incremental - clients/moira/quota.c
missed 2 classes in CLASSES; now make clean really does.
[moira.git] / clients / moira / quota.c
... / ...
CommitLineData
1/* $Id$
2 *
3 * This is the file quota.c for the Moira Client, which allows users
4 * to quickly and easily maintain most parts of the Moira database.
5 * It Contains: Functions for manipulating the quota information.
6 *
7 * Created: 7/10/88
8 * By: Chris D. Peterson
9 *
10 * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
11 * For copying and distribution information, please see the file
12 * <mit-copyright.h>.
13 */
14
15#include <mit-copyright.h>
16#include <moira.h>
17#include <moira_site.h>
18#include "defs.h"
19#include "f_defs.h"
20#include "globals.h"
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25
26int afsfilsyshelper(int argc, char **argv, void *hint);
27int afsfilesys(char *name);
28
29static char *def_quota = NULL;
30
31#define DEFAULT_FILESYS DEFAULT_NONE
32#define DEFAULT_USER user /* this is the user who started moira. */
33#define NOBODY "[nobody]"
34#define DEFAULT_QTYPE "USER"
35
36
37/* Function Name: GetDefaultUserQuota
38 * Description: gets the user quota from moira, and caches the value.
39 * Arguments: override - if true, go to moira and override the cache.
40 * Returns: none.
41 * NOTE: Using a queue here is pretty useless, but StoreInfo expects
42 * one, and it works, so why fuck with it.
43 */
44
45static char *GetDefaultUserQuota(Bool override)
46{
47 int status;
48 char **info;
49 struct mqelem *top = NULL;
50 static char *val[] = {"def_quota", NULL};
51
52 if (override || (def_quota == NULL))
53 {
54 if ((status = do_mr_query("get_value", CountArgs(val), val,
55 StoreInfo, &top)))
56 {
57 com_err(program_name, status, " in ShowDefaultQuota");
58 if (!def_quota)
59 {
60 Put_message("No default Quota Found, setting default to 0.");
61 def_quota = strdup("0");
62 }
63 else
64 Put_message("No default Quota Found, retaining old value.");
65 }
66 else
67 {
68 top = QueueTop(top);
69 info = top->q_data;
70 FreeAndClear(&def_quota, TRUE);
71 def_quota = strdup(info[0]);
72 FreeQueue(top);
73 }
74 }
75 return def_quota;
76}
77
78/* Function Name: PrintDefaultQuota
79 * Description: Prints default quota info in a meaningful way.
80 * Arguments: value of the default quota.
81 * Returns: none.
82 */
83
84static void PrintDefaultQuota(char *quota)
85{
86 char temp_buf[BUFSIZ];
87 Put_message("");
88 sprintf(temp_buf, "The default quota is %s Kb.", quota);
89 Put_message(temp_buf);
90}
91
92/* Function Name: PrintQuota
93 * Description: Prints a users quota information.
94 * Arguments: info - a pointer to the quota information:
95 * Returns: none.
96 */
97
98static char *PrintQuota(char **info)
99{
100 char buf[BUFSIZ];
101
102 Put_message("");
103
104 if (!strcmp(info[Q_TYPE], "ANY"))
105 sprintf(buf, "Filesystem: %s", info[Q_FILESYS]);
106 else
107 sprintf(buf, "Filesystem: %-45s %s %s", info[Q_FILESYS],
108 info[Q_TYPE], info[Q_NAME]);
109 Put_message(buf);
110 sprintf(buf, "Machine: %-20s Directory: %-15s",
111 info[Q_MACHINE], info[Q_DIRECTORY]);
112 Put_message(buf);
113 sprintf(buf, "Quota: %s", info[Q_QUOTA]);
114 Put_message(buf);
115 sprintf(buf, MOD_FORMAT, info[Q_MODBY], info[Q_MODTIME], info[Q_MODWITH]);
116 Put_message(buf);
117 return info[Q_FILESYS];
118}
119
120
121int afsfilsyshelper(int argc, char **argv, void *hint)
122{
123 *(int *)hint = !strcmp(argv[FS_TYPE], "AFS");
124 return MR_CONT;
125}
126
127
128int afsfilesys(char *name)
129{
130 int status, ret = 0;
131 char *argv[1];
132
133 if (strchr(name, '*') || strchr(name, '?') || strchr(name, '\\'))
134 return 0;
135 argv[0] = name;
136 status = do_mr_query("get_filesys_by_label", 1, argv, afsfilsyshelper, &ret);
137 if (status == MR_SUCCESS)
138 return ret;
139 return status;
140}
141
142
143/* Function Name: GetQuotaArgs
144 * Description: gets quota args from the user
145 * Arguments: quota - if TRUE the get quota too.
146 * Returns: the arguments.
147 */
148
149static char **GetQuotaArgs(Bool quota)
150{
151 char **args = malloc(MAX_ARGS_SIZE * sizeof(char *));
152 int af;
153
154 if (!args)
155 {
156 Put_message("Could not allocate memory in GetQuotaArgs.");
157 return NULL;
158 }
159
160 args[Q_FILESYS] = strdup(DEFAULT_FILESYS);
161 args[Q_TYPE] = strdup(DEFAULT_QTYPE);
162 args[Q_NAME] = strdup(DEFAULT_USER);
163 if (quota)
164 {
165 args[Q_QUOTA] = strdup(GetDefaultUserQuota(FALSE));
166 args[Q_QUOTA + 1] = NULL; /* NULL terminate. */
167 }
168 else
169 args[Q_NAME + 1] = NULL; /* NULL terminate. */
170
171 /* Get filesystem. */
172
173 if (GetValueFromUser("Filesystem", &args[Q_FILESYS]) == SUB_ERROR)
174 return NULL;
175 if (quota && !ValidName(args[Q_FILESYS]))
176 return NULL;
177
178 af = afsfilesys(args[Q_FILESYS]);
179 if (af != 0 && af != 1)
180 {
181 if (af == MR_NO_MATCH)
182 Put_message("That filesystem does not exist.");
183 else
184 com_err(program_name, af, " in afsfilesys");
185 return NULL;
186 }
187 if (af)
188 {
189 args[Q_TYPE] = strdup("ANY");
190 args[Q_NAME] = strdup(NOBODY);
191 }
192 else
193 {
194 if (GetTypeFromUser("Quota type", "quota_type", &args[Q_TYPE]) ==
195 SUB_ERROR)
196 return NULL;
197 if (GetValueFromUser("Name", &args[Q_NAME]) == SUB_ERROR)
198 return NULL;
199 if (!ValidName(args[Q_NAME]))
200 return NULL;
201 }
202
203 if (quota) /* Get and check quota. */
204 {
205 if (GetValueFromUser("Quota", &args[Q_QUOTA]) == SUB_ERROR)
206 return NULL;
207 if (!ValidName(args[Q_QUOTA]))
208 return NULL;
209 }
210 return args;
211}
212
213/* Function Name: ShowDefaultQuota
214 * Description: This prints out a default quota for the system.
215 * Arguments: none
216 * Returns: DM_NORMAL.
217 */
218
219int ShowDefaultQuota(int argc, char **argv)
220{
221 PrintDefaultQuota(GetDefaultUserQuota(TRUE));
222 return DM_NORMAL;
223}
224
225/* Function Name: ChangeDefaultQuota
226 * Description: Changes the System Wide default quota.
227 * Arguments: argc, argv - New quota in argv[1].
228 * Returns: DM_NORMAL.
229 */
230
231int ChangeDefaultQuota(int argc, char *argv[])
232{
233 int status;
234 char temp_buf[BUFSIZ];
235 static char *newval[] = {
236 "def_quota", NULL, NULL
237 };
238
239 if (!ValidName(argv[1]))
240 return DM_NORMAL;
241
242 sprintf(temp_buf, "%s %s", "Are you sure that you want to",
243 "change the default quota for all new users");
244 if (Confirm(temp_buf))
245 {
246 newval[1] = argv[1];
247 if ((status = do_mr_query("update_value", CountArgs(newval),
248 newval, NULL, NULL)) == MR_SUCCESS)
249 {
250 FreeAndClear(&def_quota, TRUE);
251 def_quota = strdup(argv[1]);
252 }
253 else
254 com_err(program_name, status, " in update_value");
255 }
256 else
257 Put_message("Quota not changed.");
258
259 return DM_NORMAL;
260}
261
262/* ------------------------ Filesystem Quotas -------------------- */
263
264/* Function Name: GetQuota
265 * Description: Shows the quota of a filesystem w.r.t.
266 * a group, user, or anybody (AFS)
267 * Arguments: none
268 * Returns: DM_NORMAL
269 */
270
271int GetQuota(int argc, char **argv)
272{
273 struct mqelem *top = NULL;
274 int status;
275 char **args;
276
277 if (!(args = GetQuotaArgs(FALSE)))
278 return DM_NORMAL;
279
280 if ((status = do_mr_query("get_quota", CountArgs(args), args,
281 StoreInfo, &top)) != MR_SUCCESS)
282 com_err(program_name, status, " in get_quota");
283
284 FreeInfo(args);
285 free(args);
286
287 top = QueueTop(top);
288 Loop(top, (void (*)(char **)) PrintQuota);
289
290 FreeQueue(top);
291 return DM_NORMAL;
292}
293
294/* Function Name: GetQuotaByFilesys
295 * Description: Shows all quotas associated with the
296 * given filesystem
297 * Arguments: none
298 * Returns: DM_NORMAL
299 */
300
301int GetQuotaByFilesys(int argc, char **argv)
302{
303 struct mqelem *top = NULL;
304 int status;
305 char **args = malloc(2 * sizeof(char *));
306
307 if (!args)
308 {
309 Put_message("Could not allocate memory in GetQuotaByFilesys.");
310 return DM_NORMAL;
311 }
312
313 args[0] = strdup("");
314 args[1] = NULL;
315 if (GetValueFromUser("Filesystem", &args[0]) == SUB_ERROR)
316 return DM_NORMAL;
317
318 if ((status = do_mr_query("get_quota_by_filesys", 1, args,
319 StoreInfo, &top)) != MR_SUCCESS)
320 com_err(program_name, status, " in get_quota_by_filesys");
321
322 FreeInfo(args);
323 free(args);
324
325 top = QueueTop(top);
326 Loop(top, (void (*)(char **)) PrintQuota);
327
328 FreeQueue(top);
329 return DM_NORMAL;
330}
331
332/* Function Name: AddQuota
333 * Description: Adds a new quota record for a filesystem
334 * w.r.t. a user, group, or anybody (AFS).
335 * Arguments: None
336 * Returns: DM_NORMAL
337 */
338int AddQuota(int argc, char **argv)
339{
340 char **args;
341 int status;
342
343 if (!(args = GetQuotaArgs(TRUE)))
344 return DM_NORMAL;
345
346 if ((status = do_mr_query("add_quota", CountArgs(args), args,
347 NULL, NULL)) != MR_SUCCESS)
348 com_err(program_name, status, " in add_quota");
349
350 FreeInfo(args);
351 free(args);
352 return DM_NORMAL;
353}
354
355/* Function Name: RealUpdateQuota
356 * Description: Performs the actual update of the quota
357 * Arguments: info - the information nesc. to update the quota.
358 * Returns: none.
359 */
360
361static void RealUpdateQuota(char **info)
362{
363 int status;
364 char temp_buf[BUFSIZ];
365
366 sprintf(temp_buf, "New quota for filesystem %s (in KB)", info[Q_FILESYS]);
367 if (GetValueFromUser(temp_buf, &info[Q_QUOTA]) == SUB_ERROR)
368 {
369 Put_message("Not changed.");
370 return;
371 }
372
373 if ((status = do_mr_query("update_quota", 4, info,
374 NULL, NULL)) != MR_SUCCESS)
375 {
376 com_err(program_name, status, " in update_quota");
377 sprintf(temp_buf, "Could not perform quota change on %s",
378 info[Q_FILESYS]);
379 Put_message(temp_buf);
380 }
381}
382
383/* Function Name: UpdateQuota
384 * Description: Updates an existing quota for a filesytem
385 * w.r.t. a user, group, or anybody.
386 * Arguments: None
387 * Returns: DM_NORMAL
388 */
389
390int UpdateQuota(int argc, char **argv)
391{
392 int status;
393 char **args;
394 struct mqelem *top = NULL;
395
396 if (!(args = GetQuotaArgs(FALSE)))
397 return DM_NORMAL;
398
399 if ((status = do_mr_query("get_quota", CountArgs(args), args,
400 StoreInfo, &top)) != MR_SUCCESS)
401 com_err(program_name, status, " in get_quota");
402
403 FreeInfo(args); /* done with args, free them. */
404 free(args);
405 top = QueueTop(top);
406 Loop(top, RealUpdateQuota);
407
408 FreeQueue(top);
409 return DM_NORMAL;
410}
411
412
413/* Function Name: RealDeleteQuota
414 * Description: Actually removes the quota
415 * Arguments: info - all information about this quota.
416 * one_item - true if there is only one item in the queue, and
417 * we should confirm.
418 * Returns: none.
419 */
420
421static void RealDeleteQuota(char **info, Bool one_item)
422{
423 int status;
424 char temp_buf[BUFSIZ];
425
426 if (!strcmp(info[Q_TYPE], "ANY"))
427 {
428 sprintf(temp_buf, "Do you really want to delete the quota on %s",
429 info[Q_FILESYS]);
430 }
431 else
432 {
433 sprintf(temp_buf, "Do you really want to delete the %s %s's quota on %s",
434 (strcmp(info[Q_TYPE], "USER") ? "group" : "user"), info[Q_NAME],
435 info[Q_FILESYS]);
436 }
437
438 if (!one_item || Confirm(temp_buf))
439 {
440 if ((status = do_mr_query("delete_quota", 3, info,
441 NULL, NULL)) != MR_SUCCESS)
442 com_err(program_name, status, " in delete_quota");
443 else
444 Put_message("Quota sucessfully removed.");
445 }
446 else
447 Put_message("Aborted.");
448}
449
450/* Function Name: DeleteQuota
451 * Description: Removes the quota record for a filesystem
452 * w.r.t. a user, group, or anybody.
453 * Arguments: None
454 * Returns: DM_NORMAL
455 */
456
457int DeleteQuota(int argc, char **argv)
458{
459 int status;
460 char **args;
461 struct mqelem *top = NULL;
462
463 if (!(args = GetQuotaArgs(FALSE)))
464 return DM_NORMAL;
465
466 if ((status = do_mr_query("get_quota", 3, args, StoreInfo, &top)))
467 com_err(program_name, status, " in get_quota");
468
469 FreeInfo(args);
470 free(args);
471 top = QueueTop(top);
472 QueryLoop(top, PrintQuota, RealDeleteQuota,
473 "Delete this quota on filesystem");
474
475 FreeQueue(top);
476 return DM_NORMAL;
477}
This page took 0.065328 seconds and 5 git commands to generate.