|
|
1.1 root 1: /* control.c - */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/quipu/RCS/control.c,v 7.2 90/07/09 14:45:31 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/quipu/RCS/control.c,v 7.2 90/07/09 14:45:31 mrose Exp $
9: *
10: *
11: * $Log: control.c,v $
12: * Revision 7.2 90/07/09 14:45:31 mrose
13: * sync
14: *
15: * Revision 7.1 90/03/15 11:18:45 mrose
16: * quipu-sync
17: *
18: * Revision 7.0 89/11/23 22:16:58 mrose
19: * Release 6.0
20: *
21: */
22:
23: /*
24: * NOTICE
25: *
26: * Acquisition, use, and distribution of this module and related
27: * materials are subject to the restrictions of a license agreement.
28: * Consult the Preface in the User's Manual for the full terms of
29: * this agreement.
30: *
31: */
32:
33:
34: /* the routine dsa_control is called when the modifyentry operation
35: is performed, with and 'add attribute' request and the attribute type
36: is 'control'. The value decides what to control
37: This is strictly non standard, but gives the dua control of the dsa.
38: */
39:
40: #include "quipu/util.h"
41: #include "quipu/entry.h"
42: #include "quipu/dsp.h"
43: #include "quipu/ds_error.h"
44: #include "tailor.h"
45:
46: extern LLog * log_dsap;
47: #ifndef NO_STATS
48: extern LLog * log_stat;
49: #endif
50:
51: dsa_control (as,error,dn)
52: Attr_Sequence as;
53: struct DSError *error;
54: DN dn;
55: {
56: char * str;
57: DN dn2;
58: Entry theentry;
59: extern Entry database_root;
60: SFD attempt_restart();
61:
62: if ( ! manager(dn) ) {
63: error->dse_type = DSE_SECURITYERROR;
64: error->ERR_SECURITY.DSE_sc_problem = DSE_SC_ACCESSRIGHTS;
65: return (DS_ERROR_REMOTE);
66: }
67:
68: str = (char *) as->attr_value->avseq_av.av_struct;
69:
70: #ifndef NO_STATS
71: LLOG (log_stat,LLOG_NOTICE,("DSA control: %s",str));
72: #endif
73:
74: switch (*str) {
75: case 'd': /* -dump <directory> */
76: str = SkipSpace (++str);
77: /*
78: directory_dump (str, database_root);
79: */
80: return (DS_OK);
81: case 't': /* -tailor <string> */
82: str = SkipSpace (++str);
83: if (dsa_tai_string (str) == OK) {
84: isodexport (NULLCP);
85: return (DS_OK);
86: }
87: break;
88: case 'a': /* -abort */
89: LLOG (log_dsap,LLOG_FATAL,("*** abort signal ***"));
90: stop_listeners();
91: exit(0);
92: case 'b': /* -restart */
93: LLOG (log_dsap,LLOG_FATAL,("*** restart signal ***"));
94: attempt_restart (NOTOK);
95: exit(0); /* should not be reached */
96: case 'r': /* -refresh <entry> */
97: str = SkipSpace (++str);
98: if (lexequ (str,"root") == 0)
99: dn2= NULLDN;
100: else
101: if ((dn2 = str2dn (str)) == NULLDN)
102: break;
103:
104: if (refresh_from_disk (dn2) == OK)
105: return (DS_OK);
106: break;
107: case 'f': /* -resync <entry> */
108: str = SkipSpace (++str);
109: if (lexequ (str,"root") == 0)
110: dn2= NULLDN;
111: else
112: if ((dn2 = str2dn (str)) == NULLDN)
113: break;
114:
115: if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY)
116: #ifdef TURBO_DISK
117: if ( turbo_writeall(theentry->e_child) == OK )
118: return (DS_OK);
119: #else
120: if (journal (theentry->e_child) == OK)
121: return (DS_OK);
122: #endif
123: break;
124: case 'l': /* -lock <entry> */
125: str = SkipSpace (++str);
126: if (lexequ (str,"root") == 0)
127: dn2 = NULLDN;
128: else if ((dn2 = str2dn (str)) == NULLDN)
129: break;
130:
131: if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY) {
132: theentry->e_lock = TRUE;
133: return (DS_OK);
134: }
135: break;
136: case 'u': /* -unlock <entry> */
137: str = SkipSpace (++str);
138: if (lexequ (str,"root") == 0)
139: dn2 = NULLDN;
140: else if ((dn2 = str2dn (str)) == NULLDN)
141: break;
142:
143: if ((theentry = local_find_entry (dn2,FALSE)) != NULLENTRY) {
144: theentry->e_lock = FALSE;
145: return (DS_OK);
146: }
147: break;
148: case 's': /* -slave */
149: /*
150: * When we go async return of OK will mean that a getedb
151: * operation has been scheduled, NOT that it has succeeded.
152: */
153: str = SkipSpace (++str);
154: if (*str == NULL) {
155: slave_update();
156: return DS_OK;
157: }
158:
159: if (lexequ (str, "root") == 0)
160: dn2 = NULLDN;
161: else if ((dn2 = str2dn (str)) == NULLDN)
162: break;
163:
164: if (update_aux (dn2, dn2 == NULLDN) == OK)
165: return DS_OK;
166: break;
167: default:
168: break;
169: }
170:
171: error->dse_type = DSE_SERVICEERROR;
172: error->ERR_SERVICE.DSE_sv_problem = DSE_SV_UNWILLINGTOPERFORM;
173: return (DS_ERROR_REMOTE);
174: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.