admin.c 5.79 KB
Newer Older
Linus Tolke's avatar
Linus Tolke committed
1
/*
2
3
 * $Id: admin.c,v 0.18 1995/01/01 19:31:42 ceder Exp $
 * Copyright (C) 1991, 1993, 1994, 1995  Lysator Academic Computer Association.
Linus Tolke's avatar
Linus Tolke committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 *
 * This file is part of the LysKOM server.
 * 
 * LysKOM is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by 
 * the Free Software Foundation; either version 1, or (at your option) 
 * any later version.
 * 
 * LysKOM is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with LysKOM; see the file COPYING.  If not, write to
 * Lysator, c/o ISY, Linkoping University, S-581 83 Linkoping, SWEDEN,
 * or the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, 
 * MA 02139, USA.
 *
 * Please mail bug reports to bug-lyskom@lysator.liu.se. 
 */
Per Cederqvist's avatar
Per Cederqvist committed
25
26
27
28
29
/*
 * admin.c
 *
 * Administrative calls.
 */
Per Cederqvist's avatar
Per Cederqvist committed
30

31
static char *rcsid = "$Id: admin.c,v 0.18 1995/01/01 19:31:42 ceder Exp $";
32
33
#include "rcs.h"
USE(rcsid);
Per Cederqvist's avatar
Per Cederqvist committed
34

Per Cederqvist's avatar
Per Cederqvist committed
35
36
#include <stdio.h>
#include <setjmp.h>
37
38
39
#ifdef HAVE_STDARG_H
#  include <stdarg.h>
#endif
40
41
#include <sys/types.h>
#include <time.h>
Per Cederqvist's avatar
Per Cederqvist committed
42
43

#include "misc-types.h"
44
#include "s-string.h"
Per Cederqvist's avatar
Per Cederqvist committed
45
#include "kom-types.h"
Per Cederqvist's avatar
Per Cederqvist committed
46
47
48
#include "manipulate.h"
#include "com.h"
#include "connections.h"
Per Cederqvist's avatar
Per Cederqvist committed
49
50
#include "kom-errno.h"
#include "cache.h"
Per Cederqvist's avatar
Per Cederqvist committed
51
#include "config.h"
Per Cederqvist's avatar
Per Cederqvist committed
52
53
#include "log.h"
#include "send-async.h"
54
#include "param.h"
55
#include "string-malloc.h"
56
57
#include "services.h"
#include "version-info.h"
Per Cederqvist's avatar
Per Cederqvist committed
58

Per Cederqvist's avatar
Per Cederqvist committed
59
60
61
62
63
64
/* All of the fields in this structure except the version number
   is set from the configuration file at startup (see ramkomd.c).
   The default values are also set in ramkomd.c; the values below are
   never used.  The defaults are as of this writing (1994-01-11
   19:57:22) equal to the values below, but don't trust that that is
   so when you read this. */
Per Cederqvist's avatar
Per Cederqvist committed
65
66
67
68
69
70
71
72
73
74
75
76
77
Info kom_info = 
{
#include "version.incl"
    ,				/* version */
    1,				/* conf_pres_conf */
    2,				/* pers_pres_conf */
    3,				/* motd_conf */
    4,				/* kom_news_conf */
    0				/* motd_of_lyskom */
};

/*
 * Return info about this server. This can (and should) be done
78
 * before logging in. motd_of_lyskom should be displayed before
Per Cederqvist's avatar
Per Cederqvist committed
79
80
81
82
83
84
85
86
87
 * prompting for username if it isn't 0.
 */
extern Success
get_info( Info *result )
{
    *result = kom_info;
    return OK;
}

88
89
90
91
92
93
94
95
96
97
extern Success
get_version_info( Version_info *result )
{
    /* Allowed before login. */
    result->protocol_version = kom_version_info.protocol_version;
    result->server_name = s_fcrea_str(kom_version_info.server_name);
    result->server_version = s_fcrea_str(kom_version_info.server_version);
    return OK;
}

Per Cederqvist's avatar
Per Cederqvist committed
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* /// */
extern Success
set_motd_of_lyskom (Text_no motd)
{
    Text_stat *old_motd = NULL;
    Text_stat *new_motd = NULL;

    CHK_LOGIN(FAILURE);

    if ( !ENA(admin, 1) )
    {
	kom_errno = KOM_PERM;
	return FAILURE;
    }
    
    /* Check that the new motd exists before deleting the old*/

    if ( motd != 0 )
    {
	GET_T_STAT(new_motd, motd, FAILURE);
118
	if ( new_motd->no_of_marks >= param.max_marks_text )
Per Cederqvist's avatar
Per Cederqvist committed
119
	{
120
121
122
	    log("LIMIT: set_motd_of_lyskom(%d): New motd has %d marks.\n",
		motd, new_motd->no_of_marks);
	    kom_errno = KOM_MARK_LIMIT;
Per Cederqvist's avatar
Per Cederqvist committed
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
	    return FAILURE;
	}
    }
    
    /* Unmark the previous motd if it exists. */

    if ( kom_info.motd_of_lyskom != 0
	&& (old_motd = cached_get_text_stat(kom_info.motd_of_lyskom)) != NULL)
    {
	if ( old_motd->no_of_marks > 0 )
	{
	    --old_motd->no_of_marks;
	    mark_text_as_changed( kom_info.motd_of_lyskom );
	}
	else
	{
	    log("ERROR: do_set_motd(): Old motd not marked\n");
	}
    }

    /* Mark the new motd */

    if ( motd != 0 )
    {
	++new_motd->no_of_marks;
	mark_text_as_changed( motd );
    }
    
    kom_info.motd_of_lyskom = motd;

    return OK;
}




/*
 * Force all clients to read a message.
 * Sends an asynchronous message. This is obsoleted by send_message.
 */
extern Success
164
broadcast (const String message)
Per Cederqvist's avatar
Per Cederqvist committed
165
{
166
    return send_message(0, message);
Per Cederqvist's avatar
Per Cederqvist committed
167
168
169
170
171
172
}

/*
 * Send a message
 */
extern Success
173
send_message (Conf_no recipient,
Per Cederqvist's avatar
Per Cederqvist committed
174
175
	      const String message)
{
176
177
178
179
180
    Conference *conf_c;
    unsigned short end;
    unsigned short ix;
    Success retval;

Per Cederqvist's avatar
Per Cederqvist committed
181
182
    CHK_LOGIN(FAILURE);

183
    if (s_strlen(message) > param.broadcast_len)
184
185
186
187
188
    {
	kom_errno = KOM_LONG_STR;
	return FAILURE;
    }

189
190
191
192
193
194
195
196
197
198
199
200
    if (recipient != 0 && cached_conf_exists(recipient) == FALSE)
    {
	kom_errno = KOM_UNDEF_CONF;
	return FAILURE;
    }
    
    if (recipient == 0 || cached_get_conf_type(recipient).letter_box == 1)
	return async_send_message(recipient, ACTPERS, message);
    else
    {
	/* The recipient is a conference.  Send the message to all
	   members of that conference. */
Per Cederqvist's avatar
Per Cederqvist committed
201

202
203
204
205
206
207
208
209
210
211
212
213
214
215
	GET_C_STAT(conf_c, recipient, FAILURE);
	end = conf_c->members.no_of_members;
	retval = FAILURE;
	for (ix = 0; ix < end; ix++)
	{
	    if (async_send_group_message(conf_c->members.members[ix].member,
					 recipient, ACTPERS, message) == OK) 
	    {
		retval = OK;
	    }
	}
	return retval;
    }
}
Per Cederqvist's avatar
Per Cederqvist committed
216
217
218
219
220
221


/*
 * Make LysKOM sync its files.
 */
extern Success
Per Cederqvist's avatar
Per Cederqvist committed
222
sync_kom (void) 
Per Cederqvist's avatar
Per Cederqvist committed
223
224
225
226
227
228
229
230
231
232
{
    cache_sync_all();
    dump_statistics();
    return OK;
}

/*
 * Close LysKOM. exit_val is (currently) not used. The database is synced.
 */
extern Success
Per Cederqvist's avatar
Per Cederqvist committed
233
shutdown_kom (int exit_val) 
Per Cederqvist's avatar
Per Cederqvist committed
234
{
235
236
237
238
    char *name;
    char *user;
    char *host;

Per Cederqvist's avatar
Per Cederqvist committed
239
240
241
242
243
244
245
    CHK_LOGIN(FAILURE);
    if ( !ENA(admin, 1) )
    {
	kom_errno = KOM_PERM;
	return FAILURE;
    }

246
247
248
249
250
251
252
253
254
    name = s_crea_c_str (active_connection->username);
    user = s_crea_c_str (active_connection->ident_user);
    host = s_crea_c_str (active_connection->hostname);
    log ("shutdown initiated by person %d (%s) via %s@%s.\n", 
	 ACTPERS, name, user, host);
    string_free(host);
    string_free(user);
    string_free(name);
    
Per Cederqvist's avatar
Per Cederqvist committed
255
256
257
    go_and_die = TRUE;
    return OK;
}