forked from mirrors/tftp-hpa-google
		
	Apply some code cleanups that apparently fix Solaris 7 gcc problems.
This commit is contained in:
		
							parent
							
								
									8796832723
								
							
						
					
					
						commit
						571deaa36b
					
				
					 3 changed files with 93 additions and 79 deletions
				
			
		
							
								
								
									
										5
									
								
								CHANGES
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								CHANGES
									
										
									
									
									
								
							|  | @ -1,5 +1,10 @@ | ||||||
| $Id$ | $Id$ | ||||||
| 
 | 
 | ||||||
|  | Changes in 0.34: | ||||||
|  | 	Additional Solaris gcc compiler bug workarounds; these | ||||||
|  | 	actually make the code somewhat cleaner. | ||||||
|  | 	 | ||||||
|  | 
 | ||||||
| Changes in 0.33: | Changes in 0.33: | ||||||
| 	Even better error messages. | 	Even better error messages. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										81
									
								
								tftp/tftp.c
									
										
									
									
									
								
							
							
						
						
									
										81
									
								
								tftp/tftp.c
									
										
									
									
									
								
							|  | @ -89,6 +89,7 @@ tftp_sendfile(int fd, const char *name, const char *mode) | ||||||
| 	struct sockaddr_in from; | 	struct sockaddr_in from; | ||||||
| 	int fromlen; | 	int fromlen; | ||||||
| 	FILE *file; | 	FILE *file; | ||||||
|  | 	u_short ap_opcode, ap_block; | ||||||
| 
 | 
 | ||||||
| 	startclock();		/* start stat's clock */ | 	startclock();		/* start stat's clock */ | ||||||
| 	dp = r_init();		/* reset fillbuf/read-ahead code */ | 	dp = r_init();		/* reset fillbuf/read-ahead code */ | ||||||
|  | @ -141,17 +142,17 @@ tftp_sendfile(int fd, const char *name, const char *mode) | ||||||
| 			if (trace) | 			if (trace) | ||||||
| 				tpacket("received", ap, n); | 				tpacket("received", ap, n); | ||||||
| 			/* should verify packet came from server */ | 			/* should verify packet came from server */ | ||||||
| 			ap->th_opcode = ntohs(ap->th_opcode); | 			ap_opcode = ntohs((u_short)ap->th_opcode); | ||||||
| 			ap->th_block = ntohs(ap->th_block); | 			ap_block = ntohs((u_short)ap->th_block); | ||||||
| 			if (ap->th_opcode == ERROR) { | 			if (ap_opcode == ERROR) { | ||||||
| 				printf("Error code %d: %s\n", ap->th_code, | 				printf("Error code %d: %s\n", ap_block, | ||||||
| 					ap->th_msg); | 					ap->th_msg); | ||||||
| 				goto abort; | 				goto abort; | ||||||
| 			} | 			} | ||||||
| 			if (ap->th_opcode == ACK) { | 			if (ap_opcode == ACK) { | ||||||
| 				int j; | 				int j; | ||||||
| 
 | 
 | ||||||
| 				if (ap->th_block == block) { | 				if (ap_block == block) { | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| 				/* On an error, try to synchronize
 | 				/* On an error, try to synchronize
 | ||||||
|  | @ -197,6 +198,7 @@ tftp_recvfile(int fd, const char *name, const char *mode) | ||||||
| 	int fromlen; | 	int fromlen; | ||||||
| 	FILE *file; | 	FILE *file; | ||||||
| 	volatile int convert;		/* true if converting crlf -> lf */ | 	volatile int convert;		/* true if converting crlf -> lf */ | ||||||
|  | 	u_short dp_opcode, dp_block; | ||||||
| 
 | 
 | ||||||
| 	startclock(); | 	startclock(); | ||||||
| 	dp = w_init(); | 	dp = w_init(); | ||||||
|  | @ -214,7 +216,7 @@ tftp_recvfile(int fd, const char *name, const char *mode) | ||||||
| 			firsttrip = 0; | 			firsttrip = 0; | ||||||
| 		} else { | 		} else { | ||||||
| 			ap->th_opcode = htons((u_short)ACK); | 			ap->th_opcode = htons((u_short)ACK); | ||||||
| 			ap->th_block = htons((u_short)(block)); | 			ap->th_block = htons((u_short)block); | ||||||
| 			size = 4; | 			size = 4; | ||||||
| 			block++; | 			block++; | ||||||
| 		} | 		} | ||||||
|  | @ -246,17 +248,16 @@ send_ack: | ||||||
| 			if (trace) | 			if (trace) | ||||||
| 				tpacket("received", dp, n); | 				tpacket("received", dp, n); | ||||||
| 			/* should verify client address */ | 			/* should verify client address */ | ||||||
| 			dp->th_opcode = ntohs(dp->th_opcode); | 			dp_opcode = ntohs((u_short)dp->th_opcode); | ||||||
| 			dp->th_block = ntohs(dp->th_block); | 			dp_block = ntohs((u_short)dp->th_block); | ||||||
| 			if (dp->th_opcode == ERROR) { | 			if (dp_opcode == ERROR) { | ||||||
| 				printf("Error code %d: %s\n", dp->th_code, | 			  printf("Error code %d: %s\n", dp_block, dp->th_msg); | ||||||
| 					dp->th_msg); |  | ||||||
| 			  goto abort; | 			  goto abort; | ||||||
| 			} | 			} | ||||||
| 			if (dp->th_opcode == DATA) { | 			if (dp_opcode == DATA) { | ||||||
| 				int j; | 				int j; | ||||||
| 
 | 
 | ||||||
| 				if (dp->th_block == block) { | 				if (dp_block == block) { | ||||||
| 					break;		/* have next packet */ | 					break;		/* have next packet */ | ||||||
| 				} | 				} | ||||||
| 				/* On an error, try to synchronize
 | 				/* On an error, try to synchronize
 | ||||||
|  | @ -266,7 +267,7 @@ send_ack: | ||||||
| 				if (j && trace) { | 				if (j && trace) { | ||||||
| 					printf("discarded %d packets\n", j); | 					printf("discarded %d packets\n", j); | ||||||
| 				} | 				} | ||||||
| 				if (dp->th_block == (block-1)) { | 				if (dp_block == (block-1)) { | ||||||
| 					goto send_ack;	/* resend ack */ | 					goto send_ack;	/* resend ack */ | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | @ -308,21 +309,19 @@ makerequest(int request, const char *name, | ||||||
| 	return (cp - (char *)tp); | 	return (cp - (char *)tp); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct errmsg { | static const char * const errmsgs[] = | ||||||
| 	int	e_code; | { | ||||||
| 	const char *e_msg; |   "Undefined error code", 			/* 0 - EUNDEF */ | ||||||
| } errmsgs[] = { |   "File not found",				/* 1 - ENOTFOUND */ | ||||||
| 	{ EUNDEF,	"Undefined error code" }, |   "Access denied",				/* 2 - EACCESS */ | ||||||
| 	{ ENOTFOUND,	"File not found" }, |   "Disk full or allocation exceeded", 		/* 3 - ENOSPACE */ | ||||||
| 	{ EACCESS,	"Access violation" }, |   "Illegal TFTP operation",			/* 4 - EBADOP */ | ||||||
| 	{ ENOSPACE,	"Disk full or allocation exceeded" }, |   "Unknown transfer ID",			/* 5 - EBADID */ | ||||||
| 	{ EBADOP,	"Illegal TFTP operation" }, |   "File already exists",			/* 6 - EEXISTS */ | ||||||
| 	{ EBADID,	"Unknown transfer ID" }, |   "No such user",				/* 7 - ENOUSER */ | ||||||
| 	{ EEXISTS,	"File already exists" }, |   "Failure to negotiate RFC2347 options" 	/* 8 - EOPTNEG */ | ||||||
| 	{ ENOUSER,	"No such user" }, |  | ||||||
|         { EOPTNEG,      "Failure to negotiate RFC2347 options" }, |  | ||||||
| 	{ -1,		0 } |  | ||||||
| }; | }; | ||||||
|  | #define ERR_CNT (sizeof(errmsgs)/sizeof(const char *)) | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Send a nak packet (error message). |  * Send a nak packet (error message). | ||||||
|  | @ -333,26 +332,28 @@ struct errmsg { | ||||||
| static void | static void | ||||||
| nak(int error, const char *msg) | nak(int error, const char *msg) | ||||||
| { | { | ||||||
|   struct errmsg *pe; |  | ||||||
|   struct tftphdr *tp; |   struct tftphdr *tp; | ||||||
|   int length; |   int length; | ||||||
|    |    | ||||||
|   tp = (struct tftphdr *)ackbuf; |   tp = (struct tftphdr *)ackbuf; | ||||||
|   tp->th_opcode = htons((u_short)ERROR); |   tp->th_opcode = htons((u_short)ERROR); | ||||||
|   tp->th_code = htons((u_short)error); |   tp->th_code = htons((u_short)error); | ||||||
|   if ( !msg ) { | 
 | ||||||
|   if ( error >= 100 ) { |   if ( error >= 100 ) { | ||||||
|  |     /* This is a Unix errno+100 */ | ||||||
|  |     if ( !msg ) | ||||||
|       msg = strerror(error - 100); |       msg = strerror(error - 100); | ||||||
|       tp->th_code = EUNDEF; |     error = EUNDEF; | ||||||
|   } else { |   } else { | ||||||
|       for (pe = errmsgs; pe->e_code >= 0; pe++) { |     if ( (unsigned)error >= ERR_CNT ) | ||||||
| 	if (pe->e_code == error) { |       error = EUNDEF; | ||||||
| 	  msg = pe->e_msg; |      | ||||||
| 	  break; |     if ( !msg ) | ||||||
| 	} |       msg = errmsgs[error]; | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   tp->th_code = htons((u_short)error); | ||||||
|  | 
 | ||||||
|   length = strlen(msg)+1; |   length = strlen(msg)+1; | ||||||
|   memcpy(tp->th_msg, msg, length); |   memcpy(tp->th_msg, msg, length); | ||||||
|   length += 4;			/* Add space for header */ |   length += 4;			/* Add space for header */ | ||||||
|  | @ -370,7 +371,7 @@ tpacket(const char *s, struct tftphdr *tp, int n) | ||||||
| 	static const char *opcodes[] = | 	static const char *opcodes[] = | ||||||
| 	   { "#0", "RRQ", "WRQ", "DATA", "ACK", "ERROR", "OACK" }; | 	   { "#0", "RRQ", "WRQ", "DATA", "ACK", "ERROR", "OACK" }; | ||||||
| 	char *cp, *file; | 	char *cp, *file; | ||||||
| 	u_short op = ntohs(tp->th_opcode); | 	u_short op = ntohs((u_short)tp->th_opcode); | ||||||
| 
 | 
 | ||||||
| 	if (op < RRQ || op > ERROR) | 	if (op < RRQ || op > ERROR) | ||||||
| 		printf("%s opcode=%x ", s, op); | 		printf("%s opcode=%x ", s, op); | ||||||
|  |  | ||||||
|  | @ -270,6 +270,7 @@ main(int argc, char **argv) | ||||||
| #ifdef WITH_REGEX | #ifdef WITH_REGEX | ||||||
|   char *rewrite_file = NULL; |   char *rewrite_file = NULL; | ||||||
| #endif | #endif | ||||||
|  |   u_short tp_opcode; | ||||||
| 
 | 
 | ||||||
|   /* basename() is way too much of a pain from a portability standpoint */ |   /* basename() is way too much of a pain from a portability standpoint */ | ||||||
| 
 | 
 | ||||||
|  | @ -677,8 +678,8 @@ main(int argc, char **argv) | ||||||
|     exit(EX_IOERR); |     exit(EX_IOERR); | ||||||
|   } |   } | ||||||
|   tp = (struct tftphdr *)buf; |   tp = (struct tftphdr *)buf; | ||||||
|   tp->th_opcode = ntohs(tp->th_opcode); |   tp_opcode = ntohs(tp->th_opcode); | ||||||
|   if (tp->th_opcode == RRQ || tp->th_opcode == WRQ) |   if (tp_opcode == RRQ || tp_opcode == WRQ) | ||||||
|     tftp(tp, n); |     tftp(tp, n); | ||||||
|   exit(0); |   exit(0); | ||||||
| } | } | ||||||
|  | @ -713,11 +714,12 @@ tftp(struct tftphdr *tp, int size) | ||||||
|   char *origfilename; |   char *origfilename; | ||||||
|   char *filename, *mode = NULL; |   char *filename, *mode = NULL; | ||||||
|   const char *errmsgptr; |   const char *errmsgptr; | ||||||
|  |   u_short tp_opcode = ntohs(tp->th_opcode); | ||||||
|    |    | ||||||
|   char *val = NULL, *opt = NULL; |   char *val = NULL, *opt = NULL; | ||||||
|   char *ap = ackbuf + 2; |   char *ap = ackbuf + 2; | ||||||
| 
 | 
 | ||||||
|   ((struct tftphdr *)ackbuf)->th_opcode = ntohs(OACK); |   ((struct tftphdr *)ackbuf)->th_opcode = htons(OACK); | ||||||
|    |    | ||||||
|   origfilename = cp = (char *) &(tp->th_stuff); |   origfilename = cp = (char *) &(tp->th_stuff); | ||||||
|   argn = 0; |   argn = 0; | ||||||
|  | @ -749,21 +751,21 @@ tftp(struct tftphdr *tp, int size) | ||||||
| 	exit(0); | 	exit(0); | ||||||
|       } |       } | ||||||
|       if ( !(filename = |       if ( !(filename = | ||||||
| 	     (*pf->f_rewrite)(origfilename, tp->th_opcode, &errmsgptr)) ) { | 	     (*pf->f_rewrite)(origfilename, tp_opcode, &errmsgptr)) ) { | ||||||
| 	nak(EACCESS, errmsgptr); /* File denied by mapping rule */ | 	nak(EACCESS, errmsgptr); /* File denied by mapping rule */ | ||||||
| 	exit(0); | 	exit(0); | ||||||
|       } |       } | ||||||
|       if ( verbosity >= 1 ) { |       if ( verbosity >= 1 ) { | ||||||
| 	if ( filename == origfilename || !strcmp(filename, origfilename) ) | 	if ( filename == origfilename || !strcmp(filename, origfilename) ) | ||||||
| 	  syslog(LOG_NOTICE, "%s from %s filename %s\n", | 	  syslog(LOG_NOTICE, "%s from %s filename %s\n", | ||||||
| 		 tp->th_opcode == WRQ ? "WRQ" : "RRQ", | 		 tp_opcode == WRQ ? "WRQ" : "RRQ", | ||||||
| 		 inet_ntoa(from.sin_addr), filename); | 		 inet_ntoa(from.sin_addr), filename); | ||||||
| 	else | 	else | ||||||
| 	  syslog(LOG_NOTICE, "%s from %s filename %s remapped to %s\n", | 	  syslog(LOG_NOTICE, "%s from %s filename %s remapped to %s\n", | ||||||
| 		 tp->th_opcode == WRQ ? "WRQ" : "RRQ", | 		 tp_opcode == WRQ ? "WRQ" : "RRQ", | ||||||
| 		 inet_ntoa(from.sin_addr), origfilename, filename); | 		 inet_ntoa(from.sin_addr), origfilename, filename); | ||||||
|       }		    |       }		    | ||||||
|       ecode = (*pf->f_validate)(filename, tp->th_opcode, pf, &errmsgptr); |       ecode = (*pf->f_validate)(filename, tp_opcode, pf, &errmsgptr); | ||||||
|       if (ecode) { |       if (ecode) { | ||||||
| 	nak(ecode, errmsgptr); | 	nak(ecode, errmsgptr); | ||||||
| 	exit(0); | 	exit(0); | ||||||
|  | @ -783,12 +785,12 @@ tftp(struct tftphdr *tp, int size) | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   if ( ap != (ackbuf+2) ) { |   if ( ap != (ackbuf+2) ) { | ||||||
|     if ( tp->th_opcode == WRQ ) |     if ( tp_opcode == WRQ ) | ||||||
|       (*pf->f_recv)(pf, (struct tftphdr *)ackbuf, ap-ackbuf); |       (*pf->f_recv)(pf, (struct tftphdr *)ackbuf, ap-ackbuf); | ||||||
|     else |     else | ||||||
|       (*pf->f_send)(pf, (struct tftphdr *)ackbuf, ap-ackbuf); |       (*pf->f_send)(pf, (struct tftphdr *)ackbuf, ap-ackbuf); | ||||||
|   } else { |   } else { | ||||||
|     if (tp->th_opcode == WRQ) |     if (tp_opcode == WRQ) | ||||||
|       (*pf->f_recv)(pf, NULL, 0); |       (*pf->f_recv)(pf, NULL, 0); | ||||||
|     else |     else | ||||||
|       (*pf->f_send)(pf, NULL, 0); |       (*pf->f_send)(pf, NULL, 0); | ||||||
|  | @ -1153,6 +1155,7 @@ tftp_sendfile(struct formats *pf, struct tftphdr *oap, int oacklen) | ||||||
|   struct tftphdr *dp; |   struct tftphdr *dp; | ||||||
|   struct tftphdr *ap;		/* ack packet */ |   struct tftphdr *ap;		/* ack packet */ | ||||||
|   static u_short block = 1;	/* Static to avoid longjmp funnies */ |   static u_short block = 1;	/* Static to avoid longjmp funnies */ | ||||||
|  |   u_short ap_opcode, ap_block; | ||||||
|   int size, n; |   int size, n; | ||||||
|    |    | ||||||
|   if (oap) { |   if (oap) { | ||||||
|  | @ -1170,15 +1173,15 @@ tftp_sendfile(struct formats *pf, struct tftphdr *oap, int oacklen) | ||||||
| 	goto abort; | 	goto abort; | ||||||
|       } |       } | ||||||
|       ap = (struct tftphdr *)ackbuf; |       ap = (struct tftphdr *)ackbuf; | ||||||
|       ap->th_opcode = ntohs((u_short)ap->th_opcode); |       ap_opcode = ntohs((u_short)ap->th_opcode); | ||||||
|       ap->th_block = ntohs((u_short)ap->th_block); |       ap_block = ntohs((u_short)ap->th_block); | ||||||
|        |        | ||||||
|       if (ap->th_opcode == ERROR) { |       if (ap_opcode == ERROR) { | ||||||
| 	syslog(LOG_WARNING, "tftp: client does not accept options\n"); | 	syslog(LOG_WARNING, "tftp: client does not accept options\n"); | ||||||
| 	goto abort; | 	goto abort; | ||||||
|       } |       } | ||||||
|       if (ap->th_opcode == ACK) { |       if (ap_opcode == ACK) { | ||||||
| 	if (ap->th_block == 0) | 	if (ap_block == 0) | ||||||
| 	  break; | 	  break; | ||||||
| 	/* Resynchronize with the other side */ | 	/* Resynchronize with the other side */ | ||||||
| 	(void)synchnet(peer); | 	(void)synchnet(peer); | ||||||
|  | @ -1211,14 +1214,14 @@ tftp_sendfile(struct formats *pf, struct tftphdr *oap, int oacklen) | ||||||
| 	goto abort; | 	goto abort; | ||||||
|       } |       } | ||||||
|       ap = (struct tftphdr *)ackbuf; |       ap = (struct tftphdr *)ackbuf; | ||||||
|       ap->th_opcode = ntohs((u_short)ap->th_opcode); |       ap_opcode = ntohs((u_short)ap->th_opcode); | ||||||
|       ap->th_block = ntohs((u_short)ap->th_block); |       ap_block = ntohs((u_short)ap->th_block); | ||||||
|        |        | ||||||
|       if (ap->th_opcode == ERROR) |       if (ap_opcode == ERROR) | ||||||
| 	goto abort; | 	goto abort; | ||||||
|        |        | ||||||
|       if (ap->th_opcode == ACK) { |       if (ap_opcode == ACK) { | ||||||
| 	if (ap->th_block == block) { | 	if (ap_block == block) { | ||||||
| 	  break; | 	  break; | ||||||
| 	} | 	} | ||||||
| 				/* Re-synchronize with the other side */ | 				/* Re-synchronize with the other side */ | ||||||
|  | @ -1258,6 +1261,7 @@ tftp_recvfile(struct formats *pf, struct tftphdr *oap, int oacklen) | ||||||
|   static struct tftphdr *ap;    /* ack buffer */ |   static struct tftphdr *ap;    /* ack buffer */ | ||||||
|   static u_short block = 0; |   static u_short block = 0; | ||||||
|   static int acksize; |   static int acksize; | ||||||
|  |   u_short dp_opcode, dp_block; | ||||||
| 
 | 
 | ||||||
|   dp = w_init(); |   dp = w_init(); | ||||||
|   do { |   do { | ||||||
|  | @ -1286,17 +1290,17 @@ tftp_recvfile(struct formats *pf, struct tftphdr *oap, int oacklen) | ||||||
| 	syslog(LOG_WARNING, "tftpd: read: %m"); | 	syslog(LOG_WARNING, "tftpd: read: %m"); | ||||||
| 	goto abort; | 	goto abort; | ||||||
|       } |       } | ||||||
|       dp->th_opcode = ntohs((u_short)dp->th_opcode); |       dp_opcode = ntohs((u_short)dp->th_opcode); | ||||||
|       dp->th_block = ntohs((u_short)dp->th_block); |       dp_block = ntohs((u_short)dp->th_block); | ||||||
|       if (dp->th_opcode == ERROR) |       if (dp_opcode == ERROR) | ||||||
| 	goto abort; | 	goto abort; | ||||||
|       if (dp->th_opcode == DATA) { |       if (dp_opcode == DATA) { | ||||||
| 	if (dp->th_block == block) { | 	if (dp_block == block) { | ||||||
| 	  break;   /* normal */ | 	  break;   /* normal */ | ||||||
| 	} | 	} | ||||||
| 				/* Re-synchronize with the other side */ | 				/* Re-synchronize with the other side */ | ||||||
| 	(void) synchnet(peer); | 	(void) synchnet(peer); | ||||||
| 	if (dp->th_block == (block-1)) | 	if (dp_block == (block-1)) | ||||||
| 	  goto send_ack;		/* rexmit */ | 	  goto send_ack;		/* rexmit */ | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  | @ -1320,8 +1324,8 @@ tftp_recvfile(struct formats *pf, struct tftphdr *oap, int oacklen) | ||||||
|   timeout_quit = 0; |   timeout_quit = 0; | ||||||
| 
 | 
 | ||||||
|   if (n >= 4 &&			/* if read some data */ |   if (n >= 4 &&			/* if read some data */ | ||||||
|       dp->th_opcode == DATA &&    /* and got a data block */ |       dp_opcode == DATA &&	/* and got a data block */ | ||||||
|       block == dp->th_block) {	/* then my last ack was lost */ |       block == dp_block) {	/* then my last ack was lost */ | ||||||
|     (void) send(peer, ackbuf, 4, 0);     /* resend final ack */ |     (void) send(peer, ackbuf, 4, 0);     /* resend final ack */ | ||||||
|   } |   } | ||||||
|  abort: |  abort: | ||||||
|  | @ -1356,18 +1360,22 @@ nak(int error, const char *msg) | ||||||
|    |    | ||||||
|   tp = (struct tftphdr *)buf; |   tp = (struct tftphdr *)buf; | ||||||
|   tp->th_opcode = htons((u_short)ERROR); |   tp->th_opcode = htons((u_short)ERROR); | ||||||
|   tp->th_code = htons((u_short)error); | 
 | ||||||
|   if ( !msg ) { |  | ||||||
|   if ( error >= 100 ) { |   if ( error >= 100 ) { | ||||||
|     /* This is a Unix errno+100 */ |     /* This is a Unix errno+100 */ | ||||||
|  |     if ( !msg ) | ||||||
|       msg = strerror(error - 100); |       msg = strerror(error - 100); | ||||||
|       tp->th_code = EUNDEF; |     error = EUNDEF; | ||||||
|   } else { |   } else { | ||||||
|     if ( (unsigned)error >= ERR_CNT ) |     if ( (unsigned)error >= ERR_CNT ) | ||||||
| 	tp->th_code = error = EUNDEF; |       error = EUNDEF; | ||||||
|  | 
 | ||||||
|  |     if ( !msg ) | ||||||
|       msg = errmsgs[error]; |       msg = errmsgs[error]; | ||||||
|   } |   } | ||||||
|   } | 
 | ||||||
|  |   tp->th_code = htons((u_short)error); | ||||||
|  | 
 | ||||||
|   length = strlen(msg)+1; |   length = strlen(msg)+1; | ||||||
|   memcpy(tp->th_msg, msg, length); |   memcpy(tp->th_msg, msg, length); | ||||||
|   length += 4;			/* Add space for header */ |   length += 4;			/* Add space for header */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 hpa
						hpa