2 #include <sys/socket.h>
4 #include <netinet/in.h>
14 #include "codemuxlib.h"
16 /*-----------------------------------------------------------------*/
18 GetNextLineBack(FILE *file, int lower, int stripComments)
20 /* reads the next non-blank line of the file. strips off any leading
21 space, any comments, and any trailing space. returns a lowercase
22 version of the line that has been malloc'd */
25 while (fgets(line, sizeof(line), file) != NULL) {
29 /* strip off any comments, leading and trailing whitespace */
31 if ((temp = strchr(line, '#')) != NULL)
35 while (len > 0 && isspace((int) line[len-1])) {
40 while (isspace((int) *temp))
43 continue; /* blank line, move on */
46 return(StrdupLower(temp));
47 return(xstrdup(temp));
52 /*-----------------------------------------------------------------*/
54 GetLowerNextLine(FILE *file)
56 return(GetNextLineBack(file, TRUE, TRUE));
58 /*-----------------------------------------------------------------*/
60 GetNextLine(FILE *file)
62 return(GetNextLineBack(file, FALSE, TRUE));
64 /*-----------------------------------------------------------------*/
66 GetNextLineNoCommStrip(FILE *file)
68 return(GetNextLineBack(file, FALSE, FALSE));
70 /*-----------------------------------------------------------------*/
72 DoesSuffixMatch(char *start, int len, char *suffix)
74 int sufLen = strlen(suffix);
80 if (strncasecmp(start+len-sufLen, suffix, sufLen))
84 /*-----------------------------------------------------------------*/
86 DoesDotlessSuffixMatch(char *start, int len, char *suffix)
88 /* ignores any dots on end of start, suffix */
89 int sufLen = strlen(suffix);
94 while (len > 1 && start[len-1] == '.')
96 while (sufLen > 1 && suffix[sufLen-1] == '.')
101 if (strncasecmp(start+len-sufLen, suffix, sufLen))
105 /*-----------------------------------------------------------------*/
112 while (*buf != '\0') {
113 int isSpace = isspace(*buf);
114 if (wasSpace && (!isSpace))
121 /*-----------------------------------------------------------------*/
123 GetField(const char *start, int whichField)
127 /* move to first non-blank char */
128 while (isspace(*start))
134 for (currField = 0; currField < whichField; currField++) {
135 /* move over this field */
136 while (*start != '\0' && (!isspace(*start)))
138 /* move over blanks before next field */
139 while (isspace(*start))
144 return((char *) start);
146 /* ---------------------------------------------------------------- */
148 GetWord(const char *start, int whichWord)
150 /* returns a newly allocated string containing the desired word,
151 or NULL if there was a problem */
156 temp = (unsigned char *) GetField(start, whichWord);
159 while (!(temp[len] == '\0' || isspace(temp[len])))
162 NiceExit(-1, "internal error");
163 res = (char *)xcalloc(1, len+1);
165 NiceExit(-1, "out of memory");
166 memcpy(res, temp, len);
169 /*-----------------------------------------------------------------*/
171 CreatePrivateAcceptSocketEx(int portNum, int nonBlocking, int loopbackOnly)
174 struct linger doLinger;
176 struct sockaddr_in sa;
179 if ((sock = socket(PF_INET, SOCK_STREAM, 0)) == -1)
182 /* don't linger on close */
183 doLinger.l_onoff = doLinger.l_linger = 0;
184 if (setsockopt(sock, SOL_SOCKET, SO_LINGER,
185 &doLinger, sizeof(doLinger)) == -1) {
190 /* reuse addresses */
191 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
192 &doReuse, sizeof(doReuse)) == -1) {
198 /* make listen socket nonblocking */
199 if (fcntl(sock, F_SETFL, O_NDELAY) == -1) {
205 /* set up info for binding listen */
206 memset(&sa, 0, sizeof(sa));
207 sa.sin_family = AF_INET;
208 sa.sin_addr.s_addr = (loopbackOnly) ? htonl(INADDR_LOOPBACK)
210 sa.sin_port = htons(portNum);
213 if (bind(sock, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
218 /* start listening */
219 if (listen(sock, 32) == -1) {
226 /*-----------------------------------------------------------------*/
228 CreatePrivateAcceptSocket(int portNum, int nonBlocking)
230 return CreatePrivateAcceptSocketEx(portNum, nonBlocking, FALSE);
232 /*-----------------------------------------------------------------*/
234 StrdupLower(const char *orig)
239 if ((temp = xstrdup(orig)) == NULL)
240 NiceExit(-1, "no memory in strduplower");
241 for (i = 0; temp[i]; i++) {
242 if (isupper((int) temp[i]))
243 temp[i] = tolower(temp[i]);
248 /*-----------------------------------------------------------------*/
250 StrcpyLower(char *dest, const char *src)
252 /* copy 'src' to 'dest' in lower cases.
253 'dest' should have enough free space to hold src */
256 for (i = 0; src[i]; i++) {
257 dest[i] = (isupper((int) src[i])) ? tolower(src[i]) : src[i];
260 /* mark it as NULL */
263 /*-----------------------------------------------------------------*/
265 NiceExitBack(int val, char *reason, char *file, int line)
268 time_t currT = time(NULL);
270 sprintf(buf, "[%s, %d] %.24s %s\n", file, line, ctime(&currT), reason);
271 fprintf(stderr, "%s", buf);