|
Lines 106-113
Link Here
|
| 106 |
const char *original_command = NULL; |
106 |
const char *original_command = NULL; |
| 107 |
|
107 |
|
| 108 |
/* data */ |
108 |
/* data */ |
| 109 |
#define MAX_SESSIONS 10 |
109 |
static Session *sessions; |
| 110 |
Session sessions[MAX_SESSIONS]; |
110 |
static int num_sessions; |
| 111 |
|
111 |
|
| 112 |
#ifdef HAVE_LOGIN_CAP |
112 |
#ifdef HAVE_LOGIN_CAP |
| 113 |
login_cap_t *lc; |
113 |
login_cap_t *lc; |
|
Lines 1627-1654
Link Here
|
| 1627 |
session_new(void) |
1627 |
session_new(void) |
| 1628 |
{ |
1628 |
{ |
| 1629 |
int i; |
1629 |
int i; |
| 1630 |
static int did_init = 0; |
1630 |
Session *s; |
| 1631 |
if (!did_init) { |
1631 |
if (!num_sessions) { |
| 1632 |
debug("session_new: init"); |
1632 |
debug("session_new: init"); |
| 1633 |
for (i = 0; i < MAX_SESSIONS; i++) { |
1633 |
num_sessions=1; |
|
|
1634 |
sessions=calloc(num_sessions,sizeof(sessions[0])); |
| 1635 |
for (i = 0; i < num_sessions; i++) { |
| 1634 |
sessions[i].used = 0; |
1636 |
sessions[i].used = 0; |
| 1635 |
} |
1637 |
} |
| 1636 |
did_init = 1; |
|
|
| 1637 |
} |
1638 |
} |
| 1638 |
for (i = 0; i < MAX_SESSIONS; i++) { |
1639 |
for (i = 0; i < num_sessions; i++) { |
| 1639 |
Session *s = &sessions[i]; |
1640 |
s = &sessions[i]; |
| 1640 |
if (! s->used) { |
1641 |
if (! s->used) |
| 1641 |
memset(s, 0, sizeof(*s)); |
1642 |
break; |
| 1642 |
s->chanid = -1; |
1643 |
} |
| 1643 |
s->ptyfd = -1; |
1644 |
if (s->used && \ |
| 1644 |
s->ttyfd = -1; |
1645 |
(!options.max_sessions || num_sessions < options.max_sessions)) { |
| 1645 |
s->used = 1; |
1646 |
/* only grow it one entry, to honor MaxSessions. */ |
| 1646 |
s->self = i; |
1647 |
debug("session_new: realloc"); |
| 1647 |
s->x11_chanids = NULL; |
1648 |
Session *n=realloc(sessions,++num_sessions*sizeof(Session)); |
| 1648 |
debug("session_new: session %d", i); |
1649 |
if (!n) |
| 1649 |
return s; |
1650 |
return NULL; |
| 1650 |
} |
1651 |
sessions=n; |
|
|
1652 |
s=sessions+num_sessions-1; |
| 1653 |
s->used=0; |
| 1654 |
} |
| 1655 |
if (!s->used) { |
| 1656 |
memset(s, 0, sizeof(*s)); |
| 1657 |
s->chanid = -1; |
| 1658 |
s->ptyfd = -1; |
| 1659 |
s->ttyfd = -1; |
| 1660 |
s->used = 1; |
| 1661 |
s->self = i; |
| 1662 |
s->x11_chanids = NULL; |
| 1663 |
debug("session_new: session %d", i); |
| 1664 |
return s; |
| 1651 |
} |
1665 |
} |
|
|
1666 |
debug("session_new: no room"); |
| 1652 |
return NULL; |
1667 |
return NULL; |
| 1653 |
} |
1668 |
} |
| 1654 |
|
1669 |
|
|
Lines 1656-1662
Link Here
|
| 1656 |
session_dump(void) |
1671 |
session_dump(void) |
| 1657 |
{ |
1672 |
{ |
| 1658 |
int i; |
1673 |
int i; |
| 1659 |
for (i = 0; i < MAX_SESSIONS; i++) { |
1674 |
for (i = 0; i < num_sessions; i++) { |
| 1660 |
Session *s = &sessions[i]; |
1675 |
Session *s = &sessions[i]; |
| 1661 |
debug("dump: used %d session %d %p channel %d pid %ld", |
1676 |
debug("dump: used %d session %d %p channel %d pid %ld", |
| 1662 |
s->used, |
1677 |
s->used, |
|
Lines 1689-1695
Link Here
|
| 1689 |
session_by_tty(char *tty) |
1704 |
session_by_tty(char *tty) |
| 1690 |
{ |
1705 |
{ |
| 1691 |
int i; |
1706 |
int i; |
| 1692 |
for (i = 0; i < MAX_SESSIONS; i++) { |
1707 |
for (i = 0; i < num_sessions; i++) { |
| 1693 |
Session *s = &sessions[i]; |
1708 |
Session *s = &sessions[i]; |
| 1694 |
if (s->used && s->ttyfd != -1 && strcmp(s->tty, tty) == 0) { |
1709 |
if (s->used && s->ttyfd != -1 && strcmp(s->tty, tty) == 0) { |
| 1695 |
debug("session_by_tty: session %d tty %s", i, tty); |
1710 |
debug("session_by_tty: session %d tty %s", i, tty); |
|
Lines 1705-1711
Link Here
|
| 1705 |
session_by_channel(int id) |
1720 |
session_by_channel(int id) |
| 1706 |
{ |
1721 |
{ |
| 1707 |
int i; |
1722 |
int i; |
| 1708 |
for (i = 0; i < MAX_SESSIONS; i++) { |
1723 |
for (i = 0; i < num_sessions; i++) { |
| 1709 |
Session *s = &sessions[i]; |
1724 |
Session *s = &sessions[i]; |
| 1710 |
if (s->used && s->chanid == id) { |
1725 |
if (s->used && s->chanid == id) { |
| 1711 |
debug("session_by_channel: session %d channel %d", i, id); |
1726 |
debug("session_by_channel: session %d channel %d", i, id); |
|
Lines 1722-1728
Link Here
|
| 1722 |
{ |
1737 |
{ |
| 1723 |
int i, j; |
1738 |
int i, j; |
| 1724 |
|
1739 |
|
| 1725 |
for (i = 0; i < MAX_SESSIONS; i++) { |
1740 |
for (i = 0; i < num_sessions; i++) { |
| 1726 |
Session *s = &sessions[i]; |
1741 |
Session *s = &sessions[i]; |
| 1727 |
|
1742 |
|
| 1728 |
if (s->x11_chanids == NULL || !s->used) |
1743 |
if (s->x11_chanids == NULL || !s->used) |
|
Lines 1745-1751
Link Here
|
| 1745 |
{ |
1760 |
{ |
| 1746 |
int i; |
1761 |
int i; |
| 1747 |
debug("session_by_pid: pid %ld", (long)pid); |
1762 |
debug("session_by_pid: pid %ld", (long)pid); |
| 1748 |
for (i = 0; i < MAX_SESSIONS; i++) { |
1763 |
for (i = 0; i < num_sessions; i++) { |
| 1749 |
Session *s = &sessions[i]; |
1764 |
Session *s = &sessions[i]; |
| 1750 |
if (s->used && s->pid == pid) |
1765 |
if (s->used && s->pid == pid) |
| 1751 |
return s; |
1766 |
return s; |
|
Lines 2287-2293
Link Here
|
| 2287 |
session_destroy_all(void (*closefunc)(Session *)) |
2302 |
session_destroy_all(void (*closefunc)(Session *)) |
| 2288 |
{ |
2303 |
{ |
| 2289 |
int i; |
2304 |
int i; |
| 2290 |
for (i = 0; i < MAX_SESSIONS; i++) { |
2305 |
for (i = 0; i < num_sessions; i++) { |
| 2291 |
Session *s = &sessions[i]; |
2306 |
Session *s = &sessions[i]; |
| 2292 |
if (s->used) { |
2307 |
if (s->used) { |
| 2293 |
if (closefunc != NULL) |
2308 |
if (closefunc != NULL) |
|
Lines 2306-2312
Link Here
|
| 2306 |
char *cp; |
2321 |
char *cp; |
| 2307 |
|
2322 |
|
| 2308 |
buf[0] = '\0'; |
2323 |
buf[0] = '\0'; |
| 2309 |
for (i = 0; i < MAX_SESSIONS; i++) { |
2324 |
for (i = 0; i < num_sessions; i++) { |
| 2310 |
Session *s = &sessions[i]; |
2325 |
Session *s = &sessions[i]; |
| 2311 |
if (s->used && s->ttyfd != -1) { |
2326 |
if (s->used && s->ttyfd != -1) { |
| 2312 |
|
2327 |
|