On 04/23/2012 09:12 PM, Timothy Pearson wrote:
The part I don't get is that this worked at all in KDE 3.5.10. Specifically this portion of the code:
else { struct servent *pse; if( (pse = getservbyname("ssh", "tcp") ) == NULL ) mPort = 22; else mPort = ntohs(pse->s_port); }
looks like it should be completely removed! This duplicates the default port logic in ssh (bad), and also overrides any ports set via the ssh option file (even worse).
I'd try removing that section of code to see if it resolves the problem.
Tim
I think you are correct. I didn't know what the hell it did, so I wrote a code snippet to look at it and the pse structure created. What I don't get is how the heck this would ever get the correct port since you are never providing getservbyname with any remote host information. I run this and I get port numbers -- but 1+1!=2 yet...:
#include <limits.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <string.h>
#include <netdb.h> #include <arpa/inet.h>
int getval (char *str, int base);
int main(int argc, char *argv[]) { int mPort; long port;
if (argc < 2) { fprintf(stderr, "Usage: %s port_str [base]\n", argv[0]); exit(EXIT_FAILURE); }
port = getval(argv[1], (argc > 2) ? atoi(argv[2]) : 10);
printf("port: %d\n", port);
struct servent *pse; pse = getservbyname("ssh", "tcp");
if( port > 0 ) mPort = port; else { if( (pse) == NULL ) mPort = 22; else mPort = ntohs(pse->s_port); }
printf("mPort: %d\n", mPort); printf("(servant *pse)\n\ pse->s_name: %s\n\ pse->s_aliases: %s\n\ pse->s_port %d\n\ pse->s_proto %s\n", pse->s_name, pse->s_aliases, pse->s_port, pse->s_proto);
printf ("The host byte order -> Network byte order: %d\n\n", ntohs(pse->s_port));
return 0; }
int getval (char *str, int base) {
char *endptr; long val;
errno = 0; /* To distinguish success/failure after call */ val = strtol(str, &endptr, base);
/* Check for various possible errors */
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) { perror("strtol"); return(EXIT_FAILURE); }
if (endptr == str) { fprintf(stderr, "No digits were found\n"); return(EXIT_FAILURE); }
/* If we got here, strtol() successfully parsed a number */
printf("strtol() returned %ld\n", val);
if (*endptr != '\0') /* Not necessarily an error... */ printf("Further characters after number: %s\n", endptr);
return (val); }