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:
Love Hörnquist Åstrand
2006-07-02 22:36:37 +00:00
parent 40256ad394
commit fffc248c1f

View File

@@ -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);