archie/prospero/server/version.c
2024-05-27 16:13:40 +02:00

92 lines
3.1 KiB
C

/*
* Copyright (c) 1991, 1992 by the University of Southern California
*
* For copying and distribution information, please see the files
* <usc-copyr.h>.
*/
#include <usc-copyr.h>
#include <ardp.h>
#include <pserver.h> /* needed for def. of SERVER_DONT_FLAG_V1 */
#include <pfs.h>
#include <plog.h>
#include <pprot.h>
#include <pparse.h>
#include <psrv.h> /* For replyf */
#include "dirsrv.h"
/* Return the # of the client version, if it is one that this version of dirsrv
supports. If it is one that this version cannot support, or if there's an
error, return -1. */
int
version(req, command, next_word)
RREQ req;
char *command;
char *next_word;
{
int tmp;
int client_version;
char t_sw_id[40];
char *cp; /* throw-away temp. ptr. */
#ifndef SERVER_DONT_FLAG_V1
/* Save the last data encountered in order to avoid logging old software
versions quite so many times. */
static char last_oldvers_client_sw_id[40] = "";
static long last_oldvers_client_host = 0L;
#endif
t_sw_id[0] = '\0';
tmp = qsscanf(next_word,"%d %'!!s %r",&client_version,
t_sw_id, sizeof t_sw_id, &cp);
/* Save sw_id before checking tmp so we know how generated */
if(*t_sw_id) req->peer_sw_id = stcopyr(t_sw_id,req->peer_sw_id);
if (tmp < 0) {
interr_buffer_full();
return -1;
}
else if (tmp == 0) {
replyf(req,"VERSION %d %s\n", MAX_VERSION,PFS_SW_ID);
return MAX_VERSION;
} else if (tmp == 3) {
error_reply(req, "VERSION command takes at most 2 arguments,\
but we received: %'s", command);
return -1;
}
assert(tmp == 1 || tmp == 2); /* The client must want us to use
a certain version of the
protocol. */
if(client_version == MAX_VERSION) return client_version;
if((client_version < MAX_VERSION) &&
(client_version >= MIN_VERSION)) {
#ifndef SERVER_DONT_FLAG_V1
if ((last_oldvers_client_host != req->peer_addr.s_addr)
|| !strequal(last_oldvers_client_sw_id,t_sw_id)) {
/* Attempt to reduce the # of unnecessary repeated messages logged.
*/
plog(L_DIR_PWARN, req, "Old version in use: %d %s%s",
client_version,
(t_sw_id[0] ? ", by a client with software ID " : ""),
t_sw_id, 0);
qsprintf(last_oldvers_client_sw_id,
sizeof last_oldvers_client_sw_id, "%s", t_sw_id);
last_oldvers_client_host = req->peer_addr.s_addr;
}
#endif /* SERVER_DONT_FLAG_V1 */
return client_version;
}
if(MAX_VERSION == MIN_VERSION)
creplyf(req,"VERSION-NOT-SUPPORTED TRY %d",MAX_VERSION);
else creplyf(req,"VERSION-NOT-SUPPORTED TRY %d-%d",
MIN_VERSION,MAX_VERSION);
plog(L_DIR_PERR, req,
"Unimplemented version in use: %d %s%s",
client_version,
(t_sw_id[0] ? ", by a client with software ID " : ""),
t_sw_id, 0);
return -1;
}