+
+/*
+ * heuristic to detect if need to reshuffle CTL_RESPONSE structure
+ */
+
+#define swapshort(a) (((a << 8) | ((unsigned short) a >> 8)) & 0xffff)
+#define swaplong(a) ((swapshort(a) << 16) | (swapshort(((unsigned)a >> 16))))
+
+#ifdef sun
+struct ctl_response_vax {
+ char type;
+ char answer;
+ short junk;
+ int id_num;
+ struct sockaddr_in addr;
+};
+
+swapresponse(rsp)
+ CTL_RESPONSE *rsp;
+{
+ struct ctl_response_vax swaprsp;
+
+ if (rsp->addr.sin_family != AF_INET) {
+ bcopy(rsp, &swaprsp, sizeof(CTL_RESPONSE));
+ swaprsp.addr.sin_family = swapshort(swaprsp.addr.sin_family);
+ if (swaprsp.addr.sin_family == AF_INET) {
+ rsp->addr = swaprsp.addr;
+ rsp->type = swaprsp.type;
+ rsp->answer = swaprsp.answer;
+ rsp->id_num = swaplong(swaprsp.id_num);
+ }
+ }
+}
+#endif
+
+#ifdef vax
+struct ctl_response_sun {
+ char type;
+ char answer;
+ unsigned short id_num2;
+ unsigned short id_num1;
+ short sin_family;
+ short sin_port;
+ short sin_addr2;
+ short sin_addr1;
+};
+
+swapresponse(rsp)
+ CTL_RESPONSE *rsp;
+{
+ struct ctl_response_sun swaprsp;
+
+ if (rsp->addr.sin_family != AF_INET) {
+ bcopy(rsp, &swaprsp, sizeof(struct ctl_response_sun));
+ if (swaprsp.sin_family == swapshort(AF_INET)) {
+ rsp->type = swaprsp.type;
+ rsp->answer = swaprsp.answer;
+ rsp->id_num = swapshort(swaprsp.id_num1)
+ | (swapshort(swaprsp.id_num2) << 16);
+ rsp->addr.sin_family = swapshort(swaprsp.sin_family);
+ rsp->addr.sin_port = swaprsp.sin_port;
+ rsp->addr.sin_addr.s_addr =
+ swaprsp.sin_addr2 | (swaprsp.sin_addr1 << 16);
+ }
+ }
+}
+#endif