AuRead.c revision 27702724
127702724Smrg/* $Xorg: AuRead.c,v 1.4 2001/02/09 02:03:42 xorgcvs Exp $ */
227702724Smrg
327702724Smrg/*
427702724Smrg
527702724SmrgCopyright 1988, 1998  The Open Group
627702724Smrg
727702724SmrgPermission to use, copy, modify, distribute, and sell this software and its
827702724Smrgdocumentation for any purpose is hereby granted without fee, provided that
927702724Smrgthe above copyright notice appear in all copies and that both that
1027702724Smrgcopyright notice and this permission notice appear in supporting
1127702724Smrgdocumentation.
1227702724Smrg
1327702724SmrgThe above copyright notice and this permission notice shall be included in
1427702724Smrgall copies or substantial portions of the Software.
1527702724Smrg
1627702724SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1727702724SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1827702724SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
1927702724SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2027702724SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2127702724SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2227702724Smrg
2327702724SmrgExcept as contained in this notice, the name of The Open Group shall not be
2427702724Smrgused in advertising or otherwise to promote the sale, use or other dealings
2527702724Smrgin this Software without prior written authorization from The Open Group.
2627702724Smrg
2727702724Smrg*/
2827702724Smrg/* $XFree86: xc/lib/Xau/AuRead.c,v 1.5 2001/07/25 15:04:48 dawes Exp $ */
2927702724Smrg
3027702724Smrg#ifdef HAVE_CONFIG_H
3127702724Smrg#include <config.h>
3227702724Smrg#endif
3327702724Smrg#include <X11/Xauth.h>
3427702724Smrg#include <stdlib.h>
3527702724Smrg
3627702724Smrgstatic int
3727702724Smrgread_short (unsigned short *shortp, FILE *file)
3827702724Smrg{
3927702724Smrg    unsigned char   file_short[2];
4027702724Smrg
4127702724Smrg    if (fread ((char *) file_short, (int) sizeof (file_short), 1, file) != 1)
4227702724Smrg	return 0;
4327702724Smrg    *shortp = file_short[0] * 256 + file_short[1];
4427702724Smrg    return 1;
4527702724Smrg}
4627702724Smrg
4727702724Smrgstatic int
4827702724Smrgread_counted_string (unsigned short *countp, char **stringp, FILE *file)
4927702724Smrg{
5027702724Smrg    unsigned short  len;
5127702724Smrg    char	    *data;
5227702724Smrg
5327702724Smrg    if (read_short (&len, file) == 0)
5427702724Smrg	return 0;
5527702724Smrg    if (len == 0) {
5627702724Smrg	data = NULL;
5727702724Smrg    } else {
5827702724Smrg    	data = malloc ((unsigned) len);
5927702724Smrg    	if (!data)
6027702724Smrg	    return 0;
6127702724Smrg    	if (fread (data, (int) sizeof (char), (int) len, file) != len) {
6227702724Smrg	    bzero (data, len);
6327702724Smrg	    free (data);
6427702724Smrg	    return 0;
6527702724Smrg    	}
6627702724Smrg    }
6727702724Smrg    *stringp = data;
6827702724Smrg    *countp = len;
6927702724Smrg    return 1;
7027702724Smrg}
7127702724Smrg
7227702724SmrgXauth *
7327702724SmrgXauReadAuth (FILE *auth_file)
7427702724Smrg{
7527702724Smrg    Xauth   local;
7627702724Smrg    Xauth   *ret;
7727702724Smrg
7827702724Smrg    if (read_short (&local.family, auth_file) == 0)
7927702724Smrg	return NULL;
8027702724Smrg    if (read_counted_string (&local.address_length, &local.address, auth_file) == 0)
8127702724Smrg	return NULL;
8227702724Smrg    if (read_counted_string (&local.number_length, &local.number, auth_file) == 0) {
8327702724Smrg	if (local.address) free (local.address);
8427702724Smrg	return NULL;
8527702724Smrg    }
8627702724Smrg    if (read_counted_string (&local.name_length, &local.name, auth_file) == 0) {
8727702724Smrg	if (local.address) free (local.address);
8827702724Smrg	if (local.number) free (local.number);
8927702724Smrg	return NULL;
9027702724Smrg    }
9127702724Smrg    if (read_counted_string (&local.data_length, &local.data, auth_file) == 0) {
9227702724Smrg	if (local.address) free (local.address);
9327702724Smrg	if (local.number) free (local.number);
9427702724Smrg	if (local.name) free (local.name);
9527702724Smrg	return NULL;
9627702724Smrg    }
9727702724Smrg    ret = (Xauth *) malloc (sizeof (Xauth));
9827702724Smrg    if (!ret) {
9927702724Smrg	if (local.address) free (local.address);
10027702724Smrg	if (local.number) free (local.number);
10127702724Smrg	if (local.name) free (local.name);
10227702724Smrg	if (local.data) {
10327702724Smrg	    bzero (local.data, local.data_length);
10427702724Smrg	    free (local.data);
10527702724Smrg	}
10627702724Smrg	return NULL;
10727702724Smrg    }
10827702724Smrg    *ret = local;
10927702724Smrg    return ret;
11027702724Smrg}
111