A lot of fixes found with valgrind
This commit is contained in:
225
lib/client.c
225
lib/client.c
@@ -49,88 +49,87 @@ char cpath[108]; /* Client socket path */
|
||||
|
||||
int socket_connect(char *user, char *prg, char *city)
|
||||
{
|
||||
int s;
|
||||
static char buf[SS_BUFSIZE];
|
||||
static char tty[18];
|
||||
int s;
|
||||
static char buf[SS_BUFSIZE], tty[18];
|
||||
|
||||
myname = prg;
|
||||
myname = prg;
|
||||
|
||||
/*
|
||||
* Create Unix Datagram socket for the client.
|
||||
*/
|
||||
s = socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
if (s == -1) {
|
||||
perror(myname);
|
||||
printf("Unable to create Unix Datagram socket\n");
|
||||
return -1;
|
||||
}
|
||||
/*
|
||||
* Create Unix Datagram socket for the client.
|
||||
*/
|
||||
s = socket(AF_UNIX, SOCK_DGRAM, 0);
|
||||
if (s == -1) {
|
||||
perror(myname);
|
||||
printf("Unable to create Unix Datagram socket\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Client will bind to an address so the server will get
|
||||
* an address in its recvfrom call and use it to send
|
||||
* data back to the client.
|
||||
*/
|
||||
memset(&clntaddr, 0, sizeof(clntaddr));
|
||||
clntaddr.sun_family = AF_UNIX;
|
||||
strcpy(clntaddr.sun_path, cpath);
|
||||
/*
|
||||
* Client will bind to an address so the server will get
|
||||
* an address in its recvfrom call and use it to send
|
||||
* data back to the client.
|
||||
*/
|
||||
memset(&clntaddr, 0, sizeof(clntaddr));
|
||||
clntaddr.sun_family = AF_UNIX;
|
||||
strcpy(clntaddr.sun_path, cpath);
|
||||
|
||||
if (bind(s, (struct sockaddr *)&clntaddr, sizeof(clntaddr)) < 0) {
|
||||
close(s);
|
||||
perror(myname);
|
||||
printf("Can't bind socket %s\n", cpath);
|
||||
return -1;
|
||||
}
|
||||
if (bind(s, (struct sockaddr *)&clntaddr, sizeof(clntaddr)) < 0) {
|
||||
close(s);
|
||||
perror(myname);
|
||||
printf("Can't bind socket %s\n", cpath);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If running seteuid as another user, chown to mbse.bbs
|
||||
*/
|
||||
if (getuid() != geteuid()) {
|
||||
chown(cpath, getuid(), getgid());
|
||||
} else {
|
||||
chmod(cpath, 0775);
|
||||
}
|
||||
/*
|
||||
* If running seteuid as another user, chown to mbse.bbs
|
||||
*/
|
||||
if (getuid() != geteuid()) {
|
||||
chown(cpath, getuid(), getgid());
|
||||
} else {
|
||||
chmod(cpath, 0775);
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup address structure for the server socket.
|
||||
*/
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
servaddr.sun_family = AF_UNIX;
|
||||
strcpy(servaddr.sun_path, spath);
|
||||
/*
|
||||
* Setup address structure for the server socket.
|
||||
*/
|
||||
memset(&servaddr, 0, sizeof(servaddr));
|
||||
servaddr.sun_family = AF_UNIX;
|
||||
strcpy(servaddr.sun_path, spath);
|
||||
|
||||
/*
|
||||
* Now that we have an connection, we gather
|
||||
* information to tell the server who we are.
|
||||
*/
|
||||
if (isatty(1) && (ttyname(1) != NULL)) {
|
||||
strcpy(tty, ttyname(1));
|
||||
if (strchr(tty, 'p'))
|
||||
memccpy(tty, index(tty, 'p'), '\0', strlen(tty));
|
||||
else if (strchr(tty, 't'))
|
||||
memccpy(tty, index(tty, 't'), '\0', strlen(tty));
|
||||
else if (strchr(tty, 'c'))
|
||||
memccpy(tty, index(tty, 'c'), '\0', strlen(tty));
|
||||
} else {
|
||||
strcpy(tty, "-");
|
||||
}
|
||||
sock = s;
|
||||
|
||||
/*
|
||||
* Send the information to the server.
|
||||
*/
|
||||
sprintf(buf, "AINI:5,%d,%s,%s,%s,%s;", getpid(), tty, user, prg, city);
|
||||
if (socket_send(buf) != 0) {
|
||||
sock = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now that we have an connection, we gather
|
||||
* information to tell the server who we are.
|
||||
*/
|
||||
if (isatty(1) && (ttyname(1) != NULL)) {
|
||||
strcpy(tty, ttyname(1));
|
||||
if (strchr(tty, 'p'))
|
||||
strcpy(tty, index(tty, 'p'));
|
||||
else if (strchr(tty, 't'))
|
||||
strcpy(tty, index(tty, 't'));
|
||||
else if (strchr(tty, 'c'))
|
||||
strcpy(tty, index(tty, 'c'));
|
||||
} else {
|
||||
strcpy(tty, "-");
|
||||
}
|
||||
sock = s;
|
||||
strcpy(buf, socket_receive());
|
||||
if (strncmp(buf, "100:0;", 6) != 0) {
|
||||
printf("AINI not acknowledged by the server\n");
|
||||
sock = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send the information to the server.
|
||||
*/
|
||||
sprintf(buf, "AINI:5,%d,%s,%s,%s,%s;", getpid(), tty, user, prg, city);
|
||||
if (socket_send(buf) != 0) {
|
||||
sock = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
strcpy(buf, socket_receive());
|
||||
if (strncmp(buf, "100:0;", 6) != 0) {
|
||||
printf("AINI not acknowledged by the server\n");
|
||||
sock = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return s;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
@@ -140,14 +139,14 @@ int socket_connect(char *user, char *prg, char *city)
|
||||
*/
|
||||
int socket_send(char *buf)
|
||||
{
|
||||
if (sock == -1)
|
||||
return -1;
|
||||
if (sock == -1)
|
||||
return -1;
|
||||
|
||||
if (sendto(sock, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) != strlen(buf)) {
|
||||
printf("Socket send failed error %d\n", errno);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
if (sendto(sock, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) != strlen(buf)) {
|
||||
printf("Socket send failed error %d\n", errno);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -158,19 +157,19 @@ int socket_send(char *buf)
|
||||
*/
|
||||
char *socket_receive(void)
|
||||
{
|
||||
static char buf[SS_BUFSIZE];
|
||||
int rlen;
|
||||
static char buf[SS_BUFSIZE];
|
||||
int rlen;
|
||||
|
||||
memset((char *)&buf, 0, SS_BUFSIZE);
|
||||
fromlen = sizeof(from);
|
||||
rlen = recvfrom(sock, buf, SS_BUFSIZE, 0, (struct sockaddr *)&from, &fromlen);
|
||||
if (rlen == -1) {
|
||||
perror("recv");
|
||||
printf("Error reading socket\n");
|
||||
memset((char *)&buf, 0, SS_BUFSIZE);
|
||||
return buf;
|
||||
}
|
||||
return buf;
|
||||
memset((char *)&buf, 0, SS_BUFSIZE);
|
||||
fromlen = sizeof(from);
|
||||
rlen = recvfrom(sock, buf, SS_BUFSIZE, 0, (struct sockaddr *)&from, &fromlen);
|
||||
if (rlen == -1) {
|
||||
perror("recv");
|
||||
printf("Error reading socket\n");
|
||||
memset((char *)&buf, 0, SS_BUFSIZE);
|
||||
return buf;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
@@ -186,28 +185,28 @@ char *socket_receive(void)
|
||||
|
||||
int socket_shutdown(pid_t pid)
|
||||
{
|
||||
static char buf[SS_BUFSIZE];
|
||||
static char buf[SS_BUFSIZE];
|
||||
|
||||
if (sock == -1)
|
||||
return 0;
|
||||
|
||||
sprintf(buf, "ACLO:1,%d;", pid);
|
||||
if (socket_send(buf) == 0) {
|
||||
strcpy(buf, socket_receive());
|
||||
if (strncmp(buf, "107:0;", 6) != 0) {
|
||||
printf("Shutdown not acknowledged by the server\n");
|
||||
printf("Got \"%s\"\n", buf);
|
||||
}
|
||||
}
|
||||
|
||||
if (shutdown(sock, 1) == -1) {
|
||||
perror(myname);
|
||||
printf("Cannot shutdown socket\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sock = -1;
|
||||
if (sock == -1)
|
||||
return 0;
|
||||
|
||||
sprintf(buf, "ACLO:1,%d;", pid);
|
||||
if (socket_send(buf) == 0) {
|
||||
strcpy(buf, socket_receive());
|
||||
if (strncmp(buf, "107:0;", 6) != 0) {
|
||||
printf("Shutdown not acknowledged by the server\n");
|
||||
printf("Got \"%s\"\n", buf);
|
||||
}
|
||||
}
|
||||
|
||||
if (shutdown(sock, 1) == -1) {
|
||||
perror(myname);
|
||||
printf("Cannot shutdown socket\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sock = -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -303,7 +303,6 @@ int noderecord(faddr *);
|
||||
/*
|
||||
* From pktname.c
|
||||
*/
|
||||
char *prepbuf(faddr *);
|
||||
char *pktname(faddr *, char);
|
||||
char *reqname(faddr *);
|
||||
char *floname(faddr *, char);
|
||||
|
@@ -10,7 +10,7 @@
|
||||
* MBSE BBS and utilities.
|
||||
*
|
||||
*****************************************************************************
|
||||
* Copyright (C) 1997-2002
|
||||
* Copyright (C) 1997-2003
|
||||
*
|
||||
* Michiel Broek FIDO: 2:280/2802
|
||||
* Beekmansbos 10
|
||||
@@ -566,7 +566,7 @@ int JAM_Open(char *Msgbase)
|
||||
fdJlr = open(File, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
|
||||
RetVal = TRUE;
|
||||
|
||||
strcpy(BaseName, Msgbase);
|
||||
memmove(BaseName, Msgbase, strlen(Msgbase));
|
||||
} else {
|
||||
close(fdHdr);
|
||||
fdHdr = -1;
|
||||
|
239
lib/pktname.c
239
lib/pktname.c
@@ -4,7 +4,7 @@
|
||||
* Purpose ...............: BinkleyTerm outbound naming
|
||||
*
|
||||
*****************************************************************************
|
||||
* Copyright (C) 1997-2002
|
||||
* Copyright (C) 1997-2003
|
||||
*
|
||||
* Michiel Broek FIDO: 2:280/2802
|
||||
* Beekmansbos 10
|
||||
@@ -51,172 +51,175 @@
|
||||
#define ltyp "pol"
|
||||
|
||||
|
||||
static char buf[PATH_MAX];
|
||||
|
||||
|
||||
char *prepbuf(faddr *);
|
||||
char *prepbuf(faddr *addr)
|
||||
{
|
||||
char *p, *domain=NULL;
|
||||
char zpref[8];
|
||||
int i;
|
||||
static char buf[PATH_MAX];
|
||||
char *p, *domain=NULL, zpref[8];
|
||||
int i;
|
||||
|
||||
sprintf(buf, "%s", CFG.outbound);
|
||||
sprintf(buf, "%s", CFG.outbound);
|
||||
|
||||
if (CFG.addr4d) {
|
||||
Syslog('o', "Use 4d addressing, zone is %d", addr->zone);
|
||||
if (CFG.addr4d) {
|
||||
Syslog('o', "Use 4d addressing, zone is %d", addr->zone);
|
||||
|
||||
if ((addr->zone == 0) || (addr->zone == CFG.aka[0].zone))
|
||||
zpref[0] = '\0';
|
||||
else
|
||||
sprintf(zpref, ".%03x", addr->zone);
|
||||
} else {
|
||||
/*
|
||||
* If we got a 5d address we use the given domain, if
|
||||
* we got a 4d address, we look for a matching domain name.
|
||||
*/
|
||||
if (addr->domain)
|
||||
domain = xstrcpy(addr->domain);
|
||||
else
|
||||
for (i = 0; i < 40; i++)
|
||||
if (CFG.aka[i].zone == addr->zone) {
|
||||
domain = xstrcpy(CFG.aka[i].domain);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((domain != NULL) && (strlen(CFG.aka[0].domain) != 0) &&
|
||||
(strcasecmp(domain,CFG.aka[0].domain) != 0)) {
|
||||
if ((p = strrchr(buf,'/')))
|
||||
p++;
|
||||
else
|
||||
p = buf;
|
||||
strcpy(p, domain);
|
||||
for (; *p; p++)
|
||||
*p = tolower(*p);
|
||||
for (i = 0; i < 40; i++)
|
||||
if ((strlen(CFG.aka[i].domain)) &&
|
||||
(strcasecmp(CFG.aka[i].domain, domain) == 0))
|
||||
break;
|
||||
|
||||
/*
|
||||
* The default zone must be the first one in the
|
||||
* setup, other zones get the hexadecimal zone
|
||||
* number appended.
|
||||
*/
|
||||
if (CFG.aka[i].zone == addr->zone)
|
||||
zpref[0] = '\0';
|
||||
else
|
||||
sprintf(zpref, ".%03x", addr->zone);
|
||||
} else {
|
||||
/*
|
||||
* this is our primary domain
|
||||
*/
|
||||
if ((addr->zone == 0) || (addr->zone == CFG.aka[0].zone))
|
||||
zpref[0]='\0';
|
||||
else
|
||||
sprintf(zpref,".%03x",addr->zone);
|
||||
}
|
||||
}
|
||||
|
||||
p = buf + strlen(buf);
|
||||
|
||||
if (addr->point)
|
||||
sprintf(p,"%s/%04x%04x.pnt/%08x.", zpref,addr->net,addr->node,addr->point);
|
||||
if ((addr->zone == 0) || (addr->zone == CFG.aka[0].zone))
|
||||
zpref[0] = '\0';
|
||||
else
|
||||
sprintf(p,"%s/%04x%04x.",zpref,addr->net,addr->node);
|
||||
sprintf(zpref, ".%03x", addr->zone);
|
||||
} else {
|
||||
/*
|
||||
* If we got a 5d address we use the given domain, if
|
||||
* we got a 4d address, we look for a matching domain name.
|
||||
*/
|
||||
if (addr && addr->domain && strlen(addr->domain)) {
|
||||
domain = xstrcpy(addr->domain);
|
||||
} else
|
||||
for (i = 0; i < 40; i++)
|
||||
if (CFG.aka[i].zone == addr->zone) {
|
||||
domain = xstrcpy(CFG.aka[i].domain);
|
||||
break;
|
||||
}
|
||||
|
||||
p = buf + strlen(buf);
|
||||
if (domain)
|
||||
free(domain);
|
||||
return p;
|
||||
if ((domain != NULL) && (strlen(CFG.aka[0].domain) != 0) && (strcasecmp(domain,CFG.aka[0].domain) != 0)) {
|
||||
if ((p = strrchr(buf,'/')))
|
||||
p++;
|
||||
else
|
||||
p = buf;
|
||||
strcpy(p, domain);
|
||||
for (; *p; p++)
|
||||
*p = tolower(*p);
|
||||
for (i = 0; i < 40; i++)
|
||||
if ((strlen(CFG.aka[i].domain)) && (strcasecmp(CFG.aka[i].domain, domain) == 0))
|
||||
break;
|
||||
|
||||
/*
|
||||
* The default zone must be the first one in the
|
||||
* setup, other zones get the hexadecimal zone
|
||||
* number appended.
|
||||
*/
|
||||
if (CFG.aka[i].zone == addr->zone)
|
||||
zpref[0] = '\0';
|
||||
else
|
||||
sprintf(zpref, ".%03x", addr->zone);
|
||||
} else {
|
||||
/*
|
||||
* this is our primary domain
|
||||
*/
|
||||
if ((addr->zone == 0) || (addr->zone == CFG.aka[0].zone))
|
||||
zpref[0]='\0';
|
||||
else
|
||||
sprintf(zpref,".%03x",addr->zone);
|
||||
}
|
||||
}
|
||||
|
||||
p = buf + strlen(buf);
|
||||
|
||||
if (addr->point)
|
||||
sprintf(p,"%s/%04x%04x.pnt/%08x.", zpref,addr->net,addr->node,addr->point);
|
||||
else
|
||||
sprintf(p,"%s/%04x%04x.",zpref,addr->net,addr->node);
|
||||
|
||||
if (domain)
|
||||
free(domain);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *pktname(faddr *addr, char flavor)
|
||||
{
|
||||
char *p;
|
||||
static char *p, *q;
|
||||
|
||||
p = prepbuf(addr);
|
||||
if (flavor == 'f')
|
||||
flavor = 'o';
|
||||
p = prepbuf(addr);
|
||||
if (flavor == 'f')
|
||||
flavor = 'o';
|
||||
|
||||
sprintf(p, "%c%s", flavor, ptyp);
|
||||
Syslog('O', "packet name is \"%s\"",buf);
|
||||
return buf;
|
||||
q = p + strlen(p);
|
||||
sprintf(q, "%c%s", flavor, ptyp);
|
||||
Syslog('O', "packet name is \"%s\"", p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *floname(faddr *addr, char flavor)
|
||||
{
|
||||
char *p;
|
||||
static char *p, *q;
|
||||
|
||||
p = prepbuf(addr);
|
||||
if (flavor == 'o')
|
||||
flavor = 'f';
|
||||
sprintf(p, "%c%s", flavor, ftyp);
|
||||
Syslog('O', "flo file name is \"%s\"",buf);
|
||||
return buf;
|
||||
p = prepbuf(addr);
|
||||
if (flavor == 'o')
|
||||
flavor = 'f';
|
||||
q = p + strlen(p);
|
||||
sprintf(q, "%c%s", flavor, ftyp);
|
||||
Syslog('O', "flo file name is \"%s\"", p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *reqname(faddr *addr)
|
||||
{
|
||||
char *p;
|
||||
static char *p, *q;
|
||||
|
||||
p = prepbuf(addr);
|
||||
sprintf(p, "%s", rtyp);
|
||||
Syslog('O', "req file name is \"%s\"",buf);
|
||||
return buf;
|
||||
p = prepbuf(addr);
|
||||
q = p + strlen(p);
|
||||
sprintf(q, "%s", rtyp);
|
||||
Syslog('O', "req file name is \"%s\"", p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *splname(faddr *addr)
|
||||
{
|
||||
char *p;
|
||||
static char *p, *q;
|
||||
|
||||
p = prepbuf(addr);
|
||||
sprintf(p, "%s", styp);
|
||||
Syslog('O', "spl file name is \"%s\"",buf);
|
||||
return buf;
|
||||
p = prepbuf(addr);
|
||||
q = p + strlen(p);
|
||||
sprintf(q, "%s", styp);
|
||||
Syslog('O', "spl file name is \"%s\"", p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *bsyname(faddr *addr)
|
||||
{
|
||||
char *p;
|
||||
static char *p, *q;
|
||||
|
||||
p = prepbuf(addr);
|
||||
sprintf(p, "%s", btyp);
|
||||
Syslog('O', "bsy file name is \"%s\"",buf);
|
||||
return buf;
|
||||
p = prepbuf(addr);
|
||||
q = p + strlen(p);
|
||||
sprintf(q, "%s", btyp);
|
||||
Syslog('O', "bsy file name is \"%s\"", p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *stsname(faddr *addr)
|
||||
{
|
||||
char *p;
|
||||
static char *p, *q;
|
||||
|
||||
p = prepbuf(addr);
|
||||
sprintf(p, "%s", qtyp);
|
||||
Syslog('O', "sts file name is \"%s\"",buf);
|
||||
return buf;
|
||||
p = prepbuf(addr);
|
||||
q = p + strlen(p);
|
||||
sprintf(q, "%s", qtyp);
|
||||
Syslog('O', "sts file name is \"%s\"", p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *polname(faddr *addr)
|
||||
{
|
||||
char *p;
|
||||
static char *p, *q;
|
||||
|
||||
p = prepbuf(addr);
|
||||
sprintf(p, "%s", ltyp);
|
||||
Syslog('O', "pol file name is \"%s\"", buf);
|
||||
return buf;
|
||||
p = prepbuf(addr);
|
||||
q = p + strlen(p);
|
||||
sprintf(q, "%s", ltyp);
|
||||
Syslog('O', "pol file name is \"%s\"", p);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
@@ -226,20 +229,22 @@ static char *dow[] = {(char *)"su", (char *)"mo", (char *)"tu", (char *)"we",
|
||||
|
||||
char *dayname(void)
|
||||
{
|
||||
time_t tt;
|
||||
struct tm *ptm;
|
||||
time_t tt;
|
||||
struct tm *ptm;
|
||||
static char buf[3];
|
||||
|
||||
tt = time(NULL);
|
||||
ptm = localtime(&tt);
|
||||
sprintf(buf, "%s", dow[ptm->tm_wday]);
|
||||
|
||||
tt = time(NULL);
|
||||
ptm = localtime(&tt);
|
||||
sprintf(buf, "%s", dow[ptm->tm_wday]);
|
||||
|
||||
return buf;
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *arcname(faddr *addr, unsigned short Zone, int ARCmailCompat)
|
||||
{
|
||||
static char *buf;
|
||||
char *p;
|
||||
char *ext;
|
||||
time_t tt;
|
||||
@@ -252,7 +257,7 @@ char *arcname(faddr *addr, unsigned short Zone, int ARCmailCompat)
|
||||
|
||||
bestaka = bestaka_s(addr);
|
||||
|
||||
(void)prepbuf(addr);
|
||||
buf = prepbuf(addr);
|
||||
p = strrchr(buf, '/');
|
||||
|
||||
if (!ARCmailCompat && (Zone != addr->zone)) {
|
||||
|
@@ -127,18 +127,14 @@ void ulockprogram(char *progname)
|
||||
free(lockfile);
|
||||
return;
|
||||
}
|
||||
|
||||
if (fscanf(fp, "%u", &oldpid) != 1) {
|
||||
WriteError("$Can't read old pid from \"%s\"", lockfile);
|
||||
fclose(fp);
|
||||
unlink(lockfile);
|
||||
free(lockfile);
|
||||
return;
|
||||
}
|
||||
|
||||
if (oldpid == getpid()) {
|
||||
(void)unlink(lockfile);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
unlink(lockfile);
|
||||
free(lockfile);
|
||||
lockfile = NULL;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user