security-class-object-leak-20040301
[openafs.git] / src / WINNT / afsd / afsmsg95.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* This file contains functions used by the Windows 95 (DJGPP) AFS client
11    to communicate with the startup executable. */
12
13 #include <stdio.h>
14 #include <sys/types.h>
15 #include <sys/socket.h>
16 #include <netinet/in.h>
17
18 #include "afs/afsmsg95.h"
19
20 int sock;
21 struct sockaddr_in addr;
22 extern int errno;
23
24 int afsMsg_Init()
25 {
26   int rc;
27   struct sockaddr_in myaddr;
28   
29   sock = socket(AF_INET, SOCK_DGRAM, 0);
30   if (sock < 0)
31     return -1;
32
33   addr.sin_addr.s_addr = htonl(0x7f000001);  /* 127.0.0.1 */
34   addr.sin_family = AF_INET;
35   addr.sin_port = htons(AFS_MSG_PORT);
36
37   myaddr.sin_addr.s_addr = INADDR_ANY;
38   myaddr.sin_family = AF_INET;
39   myaddr.sin_port = 0;
40
41   rc = bind(sock, (struct sockaddr *) &myaddr, sizeof(myaddr));
42 #ifdef DEBUG
43   fprintf(stderr, "afsMsg_Init: bind sock %d rc=%d\n", sock, rc);
44 #endif
45   
46   return 0;
47 }
48
49 int afsMsg_StatusChange(int status, int exitCode, char *string)
50 {
51   afsMsg_statChange_t *msgP;
52   int rc;
53   int slen = 0;
54   char msgBuf[AFS_MAX_MSG_LEN];
55   int now;
56
57   msgP = (afsMsg_statChange_t *) msgBuf;
58   
59   msgP->hdr.msgtype = AFS_MSG_STATUS_CHANGE;
60   
61   msgP->newStatus = status;
62   msgP->exitCode = exitCode;
63
64   if (string)
65   {
66     slen = strlen(string);  /* one extra for NULL */
67     if (slen > AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t))
68       slen = AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t);
69     strncpy(&msgP->message, string, slen);
70   }
71
72   msgP->hdr.length = sizeof(afsMsg_statChange_t) + slen;
73
74   rc = sendto(sock, msgP, msgP->hdr.length, 0, (struct sockaddr *) &addr,
75               sizeof(addr));
76   /*rc = send(sock, &msg, msg.hdr.length, 0);*/
77   time(&now);
78 #ifdef DEBUG
79   fprintf(stderr, "%s: sent status change %d to sock %d length %d size=%d errno=%d\n",
80          asctime(localtime(&now)), status,
81          sock, msgP->hdr.length, rc, (rc < 0 ? errno:0));
82 #endif
83   fflush(stdout);
84
85   return rc;
86 }
87
88 int afsMsg_Print(char *str, int level)
89 {
90   afsMsg_print_t *msgP;
91   int rc;
92   char msgBuf[AFS_MAX_MSG_LEN];
93   int slen;
94
95   slen = strlen(str);  /* one extra for NULL */
96   if (slen > AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t))
97     slen = AFS_MAX_MSG_LEN - sizeof(afsMsg_statChange_t);
98   strncpy(&msgP->message, str, slen);
99
100   msgP->hdr.msgtype = AFS_MSG_PRINT;
101   msgP->hdr.length = sizeof(afsMsg_hdr_t) + slen;
102   msgP->debugLevel = level;
103   strcpy(&msgP->message, str);
104   
105   rc = sendto(sock, msgP, msgP->hdr.length, 0, (struct sockaddr *) &addr,
106               sizeof(addr));
107   return rc;
108 }
109
110 int afsMsg_Shutdown()
111 {
112   int rc;
113   rc = close(sock);
114   if (rc < 0) fprintf(stderr, "error closing socket, rc=%d\n", rc);
115 #ifdef DEBUG
116   else fprintf(stderr, "socket closed\n");
117 #endif
118   fflush(stderr);
119 }