2.1 --- a/program.c Sat Nov 02 01:24:34 2019 +0100
2.2 +++ b/program.c Sat Nov 02 16:57:28 2019 +0100
2.3 @@ -200,7 +200,7 @@
2.4 void write_files(struct interface *iface)
2.5 {
2.6 FILE *client_fp = NULL, *client_header_fp = NULL,
2.7 - *server_fp = NULL, *server_header_fp = NULL,
2.8 + *server_fp = NULL, *server_header_fp = NULL, *server_interface_fp = NULL,
2.9 *common_fp = NULL;
2.10
2.11 /* NOTE: Should exit with an error. */
2.12 @@ -228,6 +228,10 @@
2.13 server_header_fp = get_output_file(server_header_filename, output_dirname, output_basename);
2.14 if (server_header_fp == NULL)
2.15 goto finalisation;
2.16 +
2.17 + server_interface_fp = get_output_file(server_interface_filename, output_dirname, output_basename);
2.18 + if (server_interface_fp == NULL)
2.19 + goto finalisation;
2.20 }
2.21
2.22 common_fp = get_output_file(common_filename, output_dirname, output_basename);
2.23 @@ -261,10 +265,13 @@
2.24 fputs(header_prologue, client_header_fp);
2.25
2.26 if (server_fp != NULL)
2.27 - fprintf(server_fp, server_prologue, output_basename, output_basename);
2.28 + fprintf(server_fp, server_prologue, output_basename, output_basename, output_basename);
2.29
2.30 if (server_header_fp != NULL)
2.31 - fputs(header_prologue, server_header_fp);
2.32 + fputs(server_header_prologue, server_header_fp);
2.33 +
2.34 + if (server_interface_fp != NULL)
2.35 + fputs(header_prologue, server_interface_fp);
2.36
2.37 if (common_fp != NULL)
2.38 fputs(common_prologue, common_fp);
2.39 @@ -272,7 +279,8 @@
2.40 /* Write the interface details. */
2.41
2.42 write_interfaces(iface, client_fp, client_header_fp,
2.43 - server_fp, server_header_fp, common_fp);
2.44 + server_fp, server_header_fp, server_interface_fp,
2.45 + common_fp);
2.46
2.47 finalisation:
2.48
2.49 @@ -290,6 +298,9 @@
2.50 if (server_header_fp != NULL)
2.51 fclose(server_header_fp);
2.52
2.53 + if (server_interface_fp != NULL)
2.54 + fclose(server_interface_fp);
2.55 +
2.56 if (common_fp != NULL)
2.57 fclose(common_fp);
2.58
2.59 @@ -304,7 +315,8 @@
2.60 /* Generate the source file corresponding to the interface. */
2.61
2.62 void write_interfaces(struct interface *iface, FILE *client_fp, FILE *client_header_fp,
2.63 - FILE *server_fp, FILE *server_header_fp, FILE *common_fp)
2.64 + FILE *server_fp, FILE *server_header_fp, FILE *server_interface_fp,
2.65 + FILE *common_fp)
2.66 {
2.67 if (iface == NULL)
2.68 return;
2.69 @@ -312,7 +324,7 @@
2.70 /* The list is reversed. */
2.71
2.72 write_interfaces(iface->tail, client_fp, client_header_fp,
2.73 - server_fp, server_header_fp, common_fp);
2.74 + server_fp, server_header_fp, server_interface_fp, common_fp);
2.75
2.76 /* Write this particular interface after all referenced ones. */
2.77
2.78 @@ -353,10 +365,6 @@
2.79
2.80 if (server_header_fp != NULL)
2.81 {
2.82 - /* Emit include statements. */
2.83 -
2.84 - write_includes(iface->includes, server_header_fp);
2.85 -
2.86 /* Emit signatures. */
2.87
2.88 write_signatures(iface->signatures, server_header_fp, iface->name,
2.89 @@ -365,6 +373,18 @@
2.90 write_dispatcher_signature(server_header_fp, iface->name);
2.91 }
2.92
2.93 + if (server_interface_fp != NULL)
2.94 + {
2.95 + /* Emit include statements. */
2.96 +
2.97 + write_includes(iface->includes, server_interface_fp);
2.98 +
2.99 + /* Emit signatures. */
2.100 +
2.101 + write_signatures(iface->signatures, server_interface_fp, iface->name,
2.102 + write_server_interface_signature);
2.103 + }
2.104 +
2.105 /* Emit common structures. */
2.106
2.107 if (common_fp != NULL)
2.108 @@ -445,9 +465,21 @@
2.109 fputs(");\n", fp);
2.110 }
2.111
2.112 +/* Generate each signature for a wrapper function used by the server. */
2.113 +
2.114 +void write_server_signature(struct signature *sig, FILE *fp, const char *name)
2.115 +{
2.116 + /* NOTE: Qualifier discarded for now. */
2.117 +
2.118 + /* To unpack and repack messages, another function is employed. */
2.119 +
2.120 + fprintf(fp, "\nlong wrap_%s_%s(ipc_message_t *msg, void *_self);\n",
2.121 + name, sig->operation);
2.122 +}
2.123 +
2.124 /* Generate each operation signature or "function prototype" for server use. */
2.125
2.126 -void write_server_signature(struct signature *sig, FILE *fp, const char *name)
2.127 +void write_server_interface_signature(struct signature *sig, FILE *fp, const char *name)
2.128 {
2.129 /* NOTE: Qualifier discarded for now. */
2.130
2.131 @@ -456,11 +488,6 @@
2.132 fprintf(fp, "\nlong %s_%s(void *_self", name, sig->operation);
2.133 write_parameters(sig->parameters, fp, SIGNATURE_ROLE);
2.134 fputs(");\n", fp);
2.135 -
2.136 - /* To unpack and repack messages, another function is employed. */
2.137 -
2.138 - fprintf(fp, "\nlong wrap_%s_%s(ipc_message_t *msg, void *_self);\n",
2.139 - name, sig->operation);
2.140 }
2.141
2.142 /* Generate a dispatch function signature for the interface. */
3.1 --- a/program.h Sat Nov 02 01:24:34 2019 +0100
3.2 +++ b/program.h Sat Nov 02 16:57:28 2019 +0100
3.3 @@ -47,7 +47,8 @@
3.4 void write_files(struct interface *iface);
3.5
3.6 void write_interfaces(struct interface *iface, FILE *client_fp, FILE *client_header_fp,
3.7 - FILE *server_fp, FILE *server_header_fp, FILE *common_fp);
3.8 + FILE *server_fp, FILE *server_header_fp, FILE *server_interface_fp,
3.9 + FILE *common_fp);
3.10
3.11 /* Include statements. */
3.12
3.13 @@ -60,6 +61,7 @@
3.14
3.15 void write_client_signature(struct signature *sig, FILE *fp, const char *name);
3.16 void write_server_signature(struct signature *sig, FILE *fp, const char *name);
3.17 +void write_server_interface_signature(struct signature *sig, FILE *fp, const char *name);
3.18
3.19 /* Function details. */
3.20