|
version 1.1.1.3, 2016/11/01 09:56:12
|
version 1.1.1.5, 2021/03/17 00:39:23
|
|
Line 58
|
Line 58
|
| static int ConsoleUserHashEqual(struct ghash *g, const void *item1, |
static int ConsoleUserHashEqual(struct ghash *g, const void *item1, |
| const void *item2); |
const void *item2); |
| static u_int32_t ConsoleUserHash(struct ghash *g, const void *item); |
static u_int32_t ConsoleUserHash(struct ghash *g, const void *item); |
| static int ConsoleSetCommand(Context ctx, int ac, char *av[], void *arg); | static int ConsoleSetCommand(Context ctx, int ac, const char *const av[], const void *arg); |
| |
|
| |
|
| /* |
/* |
|
Line 76
|
Line 76
|
| ConsoleSetCommand, NULL, 0, (void *) SET_ENABLE }, |
ConsoleSetCommand, NULL, 0, (void *) SET_ENABLE }, |
| { "disable [opt ...]", "Disable this console option" , |
{ "disable [opt ...]", "Disable this console option" , |
| ConsoleSetCommand, NULL, 0, (void *) SET_DISABLE }, |
ConsoleSetCommand, NULL, 0, (void *) SET_DISABLE }, |
| { NULL }, | { NULL, NULL, NULL, NULL, 0, NULL }, |
| }; |
}; |
| |
|
| struct ghash *gUsers; /* allowed users */ |
struct ghash *gUsers; /* allowed users */ |
|
Line 96
|
Line 96
|
| { 0, 0, NULL }, |
{ 0, 0, NULL }, |
| }; |
}; |
| |
|
| struct termios gOrigTermiosAttrs; | static struct termios gOrigTermiosAttrs; |
| int gOrigFlags; | static int gOrigFlags; |
| |
|
| /* |
/* |
| * ConsoleInit() |
* ConsoleInit() |
|
Line 175 ConsoleClose(Console c)
|
Line 175 ConsoleClose(Console c)
|
| return 0; |
return 0; |
| } |
} |
| |
|
| |
void |
| |
ConsoleCancelCleanup(void *rwlock) NO_THREAD_SAFETY_ANALYSIS |
| |
{ |
| |
pthread_rwlock_t p = (pthread_rwlock_t)rwlock; |
| |
|
| |
RWLOCK_UNLOCK(p); |
| |
} |
| |
|
| /* |
/* |
| * ConsoleStat() |
* ConsoleStat() |
| */ |
*/ |
| |
|
| int |
int |
| ConsoleStat(Context ctx, int ac, char *av[], void *arg) | ConsoleStat(Context ctx, int ac, const char *const av[], const void *arg) |
| | NO_THREAD_SAFETY_ANALYSIS |
| { |
{ |
| Console c = &gConsole; |
Console c = &gConsole; |
| ConsoleSession s; |
ConsoleSession s; |
| ConsoleSession cs = ctx->cs; |
ConsoleSession cs = ctx->cs; |
| char addrstr[INET6_ADDRSTRLEN]; |
char addrstr[INET6_ADDRSTRLEN]; |
| |
|
| |
(void)ac; |
| |
(void)av; |
| |
(void)arg; |
| |
|
| Printf("Configuration:\r\n"); |
Printf("Configuration:\r\n"); |
| Printf("\tState : %s\r\n", c->fd ? "OPENED" : "CLOSED"); |
Printf("\tState : %s\r\n", c->fd ? "OPENED" : "CLOSED"); |
| Printf("\tIP-Address : %s\r\n", u_addrtoa(&c->addr,addrstr,sizeof(addrstr))); |
Printf("\tIP-Address : %s\r\n", u_addrtoa(&c->addr,addrstr,sizeof(addrstr))); |
| Printf("\tPort : %d\r\n", c->port); |
Printf("\tPort : %d\r\n", c->port); |
| |
|
| |
pthread_cleanup_push(ConsoleCancelCleanup, c->lock); |
| RWLOCK_RDLOCK(c->lock); |
RWLOCK_RDLOCK(c->lock); |
| Printf("Active sessions:\r\n"); |
Printf("Active sessions:\r\n"); |
| SLIST_FOREACH(s, &c->sessions, next) { |
SLIST_FOREACH(s, &c->sessions, next) { |
| Printf("\tUsername: %s\tFrom: %s\r\n", |
Printf("\tUsername: %s\tFrom: %s\r\n", |
| s->user.username, u_addrtoa(&s->peer_addr,addrstr,sizeof(addrstr))); |
s->user.username, u_addrtoa(&s->peer_addr,addrstr,sizeof(addrstr))); |
| } |
} |
| RWLOCK_UNLOCK(c->lock); | pthread_cleanup_pop(1); |
| |
|
| Printf("Global options:\r\n"); |
Printf("Global options:\r\n"); |
| OptStat(ctx, &c->options, gConfList); |
OptStat(ctx, &c->options, gConfList); |
|
Line 225 ConsoleConnect(int type, void *cookie)
|
Line 239 ConsoleConnect(int type, void *cookie)
|
| "\xFF\xFD\x01"; /* DO echo */ |
"\xFF\xFD\x01"; /* DO echo */ |
| char addrstr[INET6_ADDRSTRLEN]; |
char addrstr[INET6_ADDRSTRLEN]; |
| struct sockaddr_storage ss; |
struct sockaddr_storage ss; |
| | |
| | (void)type; |
| Log(LG_CONSOLE, ("CONSOLE: Connect")); |
Log(LG_CONSOLE, ("CONSOLE: Connect")); |
| cs = Malloc(MB_CONS, sizeof(*cs)); |
cs = Malloc(MB_CONS, sizeof(*cs)); |
| if ((cs->fd = TcpAcceptConnection(c->fd, &ss, FALSE)) < 0) |
if ((cs->fd = TcpAcceptConnection(c->fd, &ss, FALSE)) < 0) |
|
Line 383 ConsoleSessionReadEvent(int type, void *cookie)
|
Line 398 ConsoleSessionReadEvent(int type, void *cookie)
|
| char *av_copy[MAX_CONSOLE_ARGS]; |
char *av_copy[MAX_CONSOLE_ARGS]; |
| char addrstr[INET6_ADDRSTRLEN]; |
char addrstr[INET6_ADDRSTRLEN]; |
| |
|
| |
(void)type; |
| while(1) { |
while(1) { |
| if ((n = read(cs->fd, &c, 1)) <= 0) { |
if ((n = read(cs->fd, &c, 1)) <= 0) { |
| if (n < 0) { |
if (n < 0) { |
|
Line 603 success:
|
Line 619 success:
|
| cs->context.lnk ? cs->context.lnk->name : |
cs->context.lnk ? cs->context.lnk->name : |
| (cs->context.bund? cs->context.bund->name : ""), |
(cs->context.bund? cs->context.bund->name : ""), |
| cs->user.username, cs->cmd)); |
cs->user.username, cs->cmd)); |
| DoCommand(&cs->context, ac, av, NULL, 0); | DoCommand(&cs->context, ac, (const char *const *)av, NULL, 0); |
| } else { |
} else { |
| HelpCommand(&cs->context, ac, av, NULL); | HelpCommand(&cs->context, ac, (const char *const *)av, NULL); |
| } |
} |
| FreeArgs(ac, av_copy); |
FreeArgs(ac, av_copy); |
| if (cs->exit) |
if (cs->exit) |
|
Line 710 StdConsoleSessionWrite(ConsoleSession cs, const char *
|
Line 726 StdConsoleSessionWrite(ConsoleSession cs, const char *
|
| static void |
static void |
| StdConsoleSessionWriteV(ConsoleSession cs, const char *fmt, va_list vl) |
StdConsoleSessionWriteV(ConsoleSession cs, const char *fmt, va_list vl) |
| { |
{ |
| |
(void)cs; |
| vprintf(fmt, vl); |
vprintf(fmt, vl); |
| fflush(stdout); |
fflush(stdout); |
| } |
} |
|
Line 756 ConsoleSessionShowPrompt(ConsoleSession cs)
|
Line 773 ConsoleSessionShowPrompt(ConsoleSession cs)
|
| static u_int32_t |
static u_int32_t |
| ConsoleUserHash(struct ghash *g, const void *item) |
ConsoleUserHash(struct ghash *g, const void *item) |
| { |
{ |
| ConsoleUser u = (ConsoleUser) item; | const struct console_user *u = (const struct console_user *) item; |
| u_char *s = (u_char *) u->username; | const u_char *s = (const u_char *) u->username; |
| u_int32_t hash = 0x811c9dc5; |
u_int32_t hash = 0x811c9dc5; |
| |
|
| |
(void)g; |
| while (*s) { |
while (*s) { |
| hash += (hash<<1) + (hash<<4) + (hash<<7) + (hash<<8) + (hash<<24); |
hash += (hash<<1) + (hash<<4) + (hash<<7) + (hash<<8) + (hash<<24); |
| /* xor the bottom with the current octet */ |
/* xor the bottom with the current octet */ |
|
Line 776 ConsoleUserHash(struct ghash *g, const void *item)
|
Line 794 ConsoleUserHash(struct ghash *g, const void *item)
|
| static int |
static int |
| ConsoleUserHashEqual(struct ghash *g, const void *item1, const void *item2) |
ConsoleUserHashEqual(struct ghash *g, const void *item1, const void *item2) |
| { |
{ |
| ConsoleUser u1 = (ConsoleUser) item1; | const struct console_user *u1 = (const struct console_user *) item1; |
| ConsoleUser u2 = (ConsoleUser) item2; | const struct console_user *u2 = (const struct console_user *) item2; |
| |
|
| |
(void)g; |
| if (u1 && u2) |
if (u1 && u2) |
| return (strcmp(u1->username, u2->username) == 0); |
return (strcmp(u1->username, u2->username) == 0); |
| else |
else |
|
Line 790 ConsoleUserHashEqual(struct ghash *g, const void *item
|
Line 809 ConsoleUserHashEqual(struct ghash *g, const void *item
|
| */ |
*/ |
| |
|
| static int |
static int |
| ConsoleSetCommand(Context ctx, int ac, char *av[], void *arg) | ConsoleSetCommand(Context ctx, int ac, const char *const av[], const void *arg) |
| { |
{ |
| Console c = &gConsole; |
Console c = &gConsole; |
| ConsoleSession cs = ctx->cs; |
ConsoleSession cs = ctx->cs; |
|
Line 865 ConsoleShutdown(Console c)
|
Line 884 ConsoleShutdown(Console c)
|
| */ |
*/ |
| |
|
| int |
int |
| UserCommand(Context ctx, int ac, char *av[], void *arg) | UserCommand(Context ctx, int ac, const char *const av[], const void *arg) |
| { |
{ |
| ConsoleUser u; |
ConsoleUser u; |
| |
|
| |
(void)arg; |
| |
(void)ctx; |
| |
|
| if (ac < 2 || ac > 3) |
if (ac < 2 || ac > 3) |
| return(-1); |
return(-1); |
| |
|
|
Line 899 UserCommand(Context ctx, int ac, char *av[], void *arg
|
Line 921 UserCommand(Context ctx, int ac, char *av[], void *arg
|
| */ |
*/ |
| |
|
| int |
int |
| UserStat(Context ctx, int ac, char *av[], void *arg) | UserStat(Context ctx, int ac, const char *const av[], const void *arg) |
| | NO_THREAD_SAFETY_ANALYSIS |
| { |
{ |
| struct ghash_walk walk; |
struct ghash_walk walk; |
| ConsoleUser u; |
ConsoleUser u; |
| |
|
| |
(void)ac; |
| |
(void)av; |
| |
(void)arg; |
| |
|
| Printf("Configured users:\r\n"); |
Printf("Configured users:\r\n"); |
| |
pthread_cleanup_push(ConsoleCancelCleanup, gUsersLock); |
| RWLOCK_RDLOCK(gUsersLock); |
RWLOCK_RDLOCK(gUsersLock); |
| ghash_walk_init(gUsers, &walk); |
ghash_walk_init(gUsers, &walk); |
| while ((u = ghash_walk_next(gUsers, &walk)) != NULL) { |
while ((u = ghash_walk_next(gUsers, &walk)) != NULL) { |
| Printf("\tUsername: %-15s Priv: %s\r\n", u->username, |
Printf("\tUsername: %-15s Priv: %s\r\n", u->username, |
| ((u->priv == 2)?"admin":((u->priv == 1)?"operator":"user"))); |
((u->priv == 2)?"admin":((u->priv == 1)?"operator":"user"))); |
| } |
} |
| RWLOCK_UNLOCK(gUsersLock); | pthread_cleanup_pop(1); |
| |
|
| return 0; |
return 0; |
| } |
} |