AuRead.c 4.06 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

/*

Copyright 1988, 1998  The Open Group

Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation.

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.

*/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
31
#include <nx-X11/Xauth.h>
32
#include <stdlib.h>
Ulrich Sibiller's avatar
Ulrich Sibiller committed
33
#ifdef NX_TRANS_SOCKET
34
#include <errno.h>
Ulrich Sibiller's avatar
Ulrich Sibiller committed
35
#endif
36 37 38 39 40 41

static int
read_short (unsigned short *shortp, FILE *file)
{
    unsigned char   file_short[2];

Ulrich Sibiller's avatar
Ulrich Sibiller committed
42
#ifdef NX_TRANS_SOCKET
43 44 45 46 47 48
    /*
     * Added a check on EINTR to prevent the fread() call to be
     * interrupted by any signal not blocked by OsBlockSignals().
     */

    for (;;) {
49
        if (fread ((char *) file_short, sizeof (file_short), 1, file) != 1) {
50 51 52 53 54 55 56 57 58
            if (errno == EINTR && ferror (file)) {
                perror ("Reading from auth file");
                clearerr (file);
                continue;
            }
            return 0;
        }
        break;
    }
Ulrich Sibiller's avatar
Ulrich Sibiller committed
59
#else
60
    if (fread ((char *) file_short, sizeof (file_short), 1, file) != 1)
Ulrich Sibiller's avatar
Ulrich Sibiller committed
61 62
       return 0;
#endif
63 64 65 66 67 68 69 70
    *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;
71
    char            *data;
72 73

    if (read_short (&len, file) == 0)
74
        return 0;
75
    if (len == 0) {
76
        data = NULL;
77
    } else {
78 79 80
        data = malloc ((unsigned) len);
        if (!data)
            return 0;
Ulrich Sibiller's avatar
Ulrich Sibiller committed
81
#ifdef NX_TRANS_SOCKET
82 83
        for (;;)
        {
84
            if (fread (data, sizeof (char), len, file) != len)
85 86 87 88 89 90 91
            {
                if (errno == EINTR && ferror (file))
                {
                    perror ("Reading from auth file");
                    clearerr (file);
                    continue;
                }
92 93 94 95
                bzero (data, len);
                free (data);
                return 0;
            }
96 97
            break;
        }
Ulrich Sibiller's avatar
Ulrich Sibiller committed
98
#else
99
        if (fread (data, sizeof (char), len, file) != len) {
Ulrich Sibiller's avatar
Ulrich Sibiller committed
100 101 102 103 104
            bzero (data, len);
            free (data);
            return 0;
        }
#endif
105 106 107 108 109 110 111
    }
    *stringp = data;
    *countp = len;
    return 1;
}

Xauth *
112
XauReadAuth (FILE *auth_file)
113 114 115 116 117
{
    Xauth   local;
    Xauth   *ret;

    if (read_short (&local.family, auth_file) == 0)
118
        return NULL;
119
    if (read_counted_string (&local.address_length, &local.address, auth_file) == 0)
120
        return NULL;
121
    if (read_counted_string (&local.number_length, &local.number, auth_file) == 0) {
122
        free (local.address);
123
        return NULL;
124 125
    }
    if (read_counted_string (&local.name_length, &local.name, auth_file) == 0) {
126 127
        free (local.address);
        free (local.number);
128
        return NULL;
129 130
    }
    if (read_counted_string (&local.data_length, &local.data, auth_file) == 0) {
131 132 133
        free (local.address);
        free (local.number);
        free (local.name);
134
        return NULL;
135 136 137
    }
    ret = (Xauth *) malloc (sizeof (Xauth));
    if (!ret) {
138 139 140
        free (local.address);
        free (local.number);
        free (local.name);
141 142 143 144
        if (local.data) {
            bzero (local.data, local.data_length);
            free (local.data);
        }
145
        return NULL;
146 147 148 149
    }
    *ret = local;
    return ret;
}