#include <X11/Xauth.h>
#include <stdlib.h>
static int
read_short (unsigned short *shortp, FILE *file)
{
unsigned char file_short[2];
if (fread ((char *) file_short, (int) sizeof (file_short), 1, file) != 1)
return 0;
*shortp = file_short[0] * 256 + file_short[1];
return 1;
}
static int
read_counted_string (unsigned short *countp, char **stringp, FILE *file)
{
unsigned short len;
char *data;
if (read_short (&len, file) == 0)
return 0;
if (len == 0) {
data = 0;
} else {
data = malloc ((unsigned) len);
if (!data)
return 0;
if (fread (data, (int) sizeof (char), (int) len, file) != len) {
bzero (data, len);
free (data);
return 0;
}
}
*stringp = data;
*countp = len;
return 1;
}
Xauth *
XauReadAuth (auth_file)
FILE *auth_file;
{
Xauth local;
Xauth *ret;
if (read_short (&local.family, auth_file) == 0)
return 0;
if (read_counted_string (&local.address_length, &local.address, auth_file) == 0)
return 0;
if (read_counted_string (&local.number_length, &local.number, auth_file) == 0) {
if (local.address) free (local.address);
return 0;
}
if (read_counted_string (&local.name_length, &local.name, auth_file) == 0) {
if (local.address) free (local.address);
if (local.number) free (local.number);
return 0;
}
if (read_counted_string (&local.data_length, &local.data, auth_file) == 0) {
if (local.address) free (local.address);
if (local.number) free (local.number);
if (local.name) free (local.name);
return 0;
}
ret = (Xauth *) malloc (sizeof (Xauth));
if (!ret) {
if (local.address) free (local.address);
if (local.number) free (local.number);
if (local.name) free (local.name);
if (local.data) {
bzero (local.data, local.data_length);
free (local.data);
}
return 0;
}
*ret = local;
return ret;
}