]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - errsock.c
Add a Socket implementation which just holds an error message.
[PuTTY.git] / errsock.c
1 /*
2  * A dummy Socket implementation which just holds an error message.
3  */
4
5 #include <stdio.h>
6 #include <assert.h>
7
8 #define DEFINE_PLUG_METHOD_MACROS
9 #include "tree234.h"
10 #include "putty.h"
11 #include "network.h"
12
13 typedef struct Socket_error_tag *Error_Socket;
14
15 struct Socket_error_tag {
16     const struct socket_function_table *fn;
17     /* the above variable absolutely *must* be the first in this structure */
18
19     char *error;
20     Plug plug;
21     void *privptr;
22 };
23
24 static Plug sk_error_plug(Socket s, Plug p)
25 {
26     Error_Socket ps = (Error_Socket) s;
27     Plug ret = ps->plug;
28     if (p)
29         ps->plug = p;
30     return ret;
31 }
32
33 static void sk_error_close(Socket s)
34 {
35     Error_Socket ps = (Error_Socket) s;
36
37     sfree(ps->error);
38     sfree(ps);
39 }
40
41 static void sk_error_set_private_ptr(Socket s, void *ptr)
42 {
43     Error_Socket ps = (Error_Socket) s;
44     ps->privptr = ptr;
45 }
46
47 static void *sk_error_get_private_ptr(Socket s)
48 {
49     Error_Socket ps = (Error_Socket) s;
50     return ps->privptr;
51 }
52
53 static const char *sk_error_socket_error(Socket s)
54 {
55     Error_Socket ps = (Error_Socket) s;
56     return ps->error;
57 }
58
59 Socket new_error_socket(const char *errmsg, Plug plug)
60 {
61     static const struct socket_function_table socket_fn_table = {
62         sk_error_plug,
63         sk_error_close,
64         NULL /* write */,
65         NULL /* write_oob */,
66         NULL /* write_eof */,
67         NULL /* flush */,
68         sk_error_set_private_ptr,
69         sk_error_get_private_ptr,
70         NULL /* set_frozen */,
71         sk_error_socket_error
72     };
73
74     Error_Socket ret;
75
76     ret = snew(struct Socket_error_tag);
77     ret->fn = &socket_fn_table;
78     ret->plug = plug;
79     ret->error = dupstr(errmsg);
80
81     return (Socket) ret;
82 }