break out creation of a client and make handleServer pthread_create compatible
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@17793 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -55,6 +55,7 @@ struct client {
|
|||||||
struct handle *handle;
|
struct handle *handle;
|
||||||
struct sockaddr_storage sa;
|
struct sockaddr_storage sa;
|
||||||
socklen_t salen;
|
socklen_t salen;
|
||||||
|
char servername[MAXHOSTNAMELEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
FILE *logfile;
|
FILE *logfile;
|
||||||
@@ -735,54 +736,68 @@ find_op(int32_t op)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static struct client *
|
||||||
handleServer(int fd)
|
create_client(int fd)
|
||||||
{
|
{
|
||||||
struct handler *handler;
|
struct client *c;
|
||||||
struct client c;
|
|
||||||
int32_t op;
|
|
||||||
char servername[MAXHOSTNAMELEN];
|
|
||||||
char hostname[MAXHOSTNAMELEN];
|
char hostname[MAXHOSTNAMELEN];
|
||||||
|
|
||||||
memset(&c, 0, sizeof(c));
|
c = ecalloc(1, sizeof(*c));
|
||||||
|
|
||||||
gethostname(hostname, sizeof(hostname));
|
gethostname(hostname, sizeof(hostname));
|
||||||
asprintf(&c.moniker, "gssmask: %s", hostname);
|
asprintf(&c->moniker, "gssmask: %s", hostname);
|
||||||
|
|
||||||
{
|
{
|
||||||
c.salen = sizeof(c.sa);
|
c->salen = sizeof(c->sa);
|
||||||
getpeername(fd, (struct sockaddr *)&c.sa, &c.salen);
|
getpeername(fd, (struct sockaddr *)&c->sa, &c->salen);
|
||||||
|
|
||||||
getnameinfo((struct sockaddr *)&c.sa, c.salen,
|
getnameinfo((struct sockaddr *)&c->sa, c->salen,
|
||||||
servername, sizeof(servername), NULL, 0, NI_NUMERICHOST);
|
c->servername, sizeof(c->servername),
|
||||||
|
NULL, 0, NI_NUMERICHOST);
|
||||||
}
|
}
|
||||||
|
|
||||||
c.sock = krb5_storage_from_fd(fd);
|
c->sock = krb5_storage_from_fd(fd);
|
||||||
if (c.sock == NULL)
|
if (c->sock == NULL)
|
||||||
errx(1, "krb5_storage_from_fd");
|
errx(1, "krb5_storage_from_fd");
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
handleServer(void *ptr)
|
||||||
|
{
|
||||||
|
struct handler *handler;
|
||||||
|
struct client *c;
|
||||||
|
int32_t op;
|
||||||
|
|
||||||
|
c = (struct client *)ptr;
|
||||||
|
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
ret32(&c, op);
|
ret32(c, op);
|
||||||
|
|
||||||
handler = find_op(op);
|
handler = find_op(op);
|
||||||
if (handler == NULL) {
|
if (handler == NULL) {
|
||||||
logmessage(&c, __FILE__, __LINE__, 0,
|
logmessage(c, __FILE__, __LINE__, 0,
|
||||||
"op %d not supported", (int)op);
|
"op %d not supported", (int)op);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
logmessage(&c, __FILE__, __LINE__, 0,
|
logmessage(c, __FILE__, __LINE__, 0,
|
||||||
"---> Got op %s from server %s",
|
"---> Got op %s from server %s",
|
||||||
handler->name, servername);
|
handler->name, c->servername);
|
||||||
|
|
||||||
if ((handler->func)(handler->op, &c))
|
if ((handler->func)(handler->op, c))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
krb5_storage_free(c.sock);
|
krb5_storage_free(c->sock);
|
||||||
if (c.logging)
|
if (c->logging)
|
||||||
krb5_storage_free(c.logging);
|
krb5_storage_free(c->logging);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -851,7 +866,14 @@ main(int argc, char **argv)
|
|||||||
mini_inetd(port);
|
mini_inetd(port);
|
||||||
fprintf(logfile, "connected\n");
|
fprintf(logfile, "connected\n");
|
||||||
|
|
||||||
handleServer(0);
|
{
|
||||||
|
struct client *c;
|
||||||
|
|
||||||
|
c = create_client(0);
|
||||||
|
/* close(0); */
|
||||||
|
|
||||||
|
handleServer(c);
|
||||||
|
}
|
||||||
|
|
||||||
krb5_free_context(context);
|
krb5_free_context(context);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user