Page History

Turn Off History

See also:

First milestone

It had been since few months so it may not appropriate to call it as first mile stone. I would say it is first milestone for working code of Condor.

Well, I must admit that it is too painful to convert everything at once. Try to devise some strategy that can split works and test-cases. Which modules are necessary and which are not for the first milestone?

Features

Will not be implemented

Test required

Don't forget below lists.

currently working on

Note for constants

Don't forget constants that should be adjusted!

MAXMACHNAME : seen in file_transfer_db.c, stores the result of sin_to_hostname.

Converting utility functions

is_ipaddr

int is_ipaddr(const char *inbuf, struct in_addr *sin_addr)

is_ipaddr() does convert string representation of IP address into numerical representation(in_addr). And, it returns FALSE if it fails.

Original implementation was just re-invention of inet_ntop()/inet_ntoa(). So, I replaced to new implementation that calls inet_ntop() twice. (with AF_INET and AF_INET6)

struct hostent

I Initially only looked at struct sockaddr_in. I wrote class ipaddr for replacement. However, it is only half of the world. I should devise IPv6 compliant structure for struct hostent and make it obsolete. I think it would make more sense if we have class ipaddr and class MyString instead of sockaddr* and char*. Write here some design possibilities!

// from MSDN
typedef struct hostent {
  char FAR      *h_name;
  char FAR  FAR **h_aliases;
  short         h_addrtype;
  short         h_length;
  char FAR  FAR **h_addr_list;
}

typedef struct addrinfo {
  int             ai_flags;
  int             ai_family;
  int             ai_socktype;
  int             ai_protocol;
  size_t          ai_addrlen;
  char            *ai_canonname;
  struct sockaddr *ai_addr;
  struct addrinfo *ai_next;
}

get_full_hostname

my_ip_addr, my_hostname, my_full_hostname() and get_full_hostname() are now obsolete. Now, implementing ipv6_hostname.{h/cpp}.

It uses gethostbyname() which has been obsoleted. It should call getaddrinfo() instead. The function has about 150-200 lines of code. At the end of function, it tail-calls get_full_hostname_from_hostent(). struct hostent is also deprecated structure.

It requires overhaul from interface to implementation.

Importance: ?

IpVerify

[zach] implemented by mostly Todd, and little bit by Zach and Dan.

IpVerify verifies the remote process's ip from the configuration file. There are many lines that are referring to DCpermission. I am bit confused here. I do not understand what 'DCpermission' made for.

It requires overhaul from interface to implementation.

Importance: ?

Ulrich Mystery

Ulrich's Userlevel IPv6 Programming Introductionn - http://people.redhat.com/drepper/userapi-ipv6.html

He denotes gethostbyaddr() as an obsolete. However, gethostbyaddr() accepts a socket type as a parameter. (AF_INET, AF_INET6) That means it should work well with IPv6. Why it is obsolete??

I decided to use continually gethostbyaddr(). Remvoing gethostbyaddr() requires a lot of modification on existing code.

Converting Sock

Sock is not only used by TCP/UDP connection but also used by Unix domain socket (AF_UNIX). Basically, Sock can only create TCP or UDP socket internally but SharedEndPoint and SharedPortClient creates Unix domain socket and calls Sock::assign() to pass the descriptor.

I guess this is broken abstraction since Sock has IP related functions such as peer_addr() or peer_port() which are not available to Unix domain socket.

It seems assign() is only used by these Shared* thing. So maybe we could end up with refactoring it.

List of Condor IP addr functions

// from condor_c++_util/get_full_hostname.cpp

extern char* get_full_hostname( const char*,
                                struct in_addr *sin_addrp = NULL );

extern char* get_full_hostname_from_hostent( struct hostent* host_ptr,
                                             const char* host );

// from condor_util_lib/condor_netdb.c

struct hostent *
condor_gethostbyname(const char *name);

struct hostent *
condor_gethostbyaddr(const char *addr, SOCKET_LENGTH_TYPE len, int type);

int
condor_gethostname(char *name, size_t namelen);

// from condor_util_lib/internet.c
// internet.c is a total failure...... tons of old-style codings

int is_ipaddr(const char *inbuf, struct in_addr *sin_addr);

int is_ipaddr_no_wildcard(const char *inbuf, struct in_addr *sin_addr);

int is_ipaddr_wildcard(const char *inbuf, struct in_addr *sin_addr, struct in_addr *mask_addr);

int is_valid_network( const char *network, struct in_addr *ip, struct in_addr *mask);

int is_valid_sinful( const char *sinful );

// there are many more from internet.c. omitted at this time.

Condor NetDB

Condor defines its own netdb-related functions (proxy functions) for its own DNS system called NO_DNS.

What is it?

TCP_FORWARDING_HOST ?

solved

KeyCache

KeyCache, uses sockaddr_in for storing ip addr. before modify, be sure to look at the overall picture. only used in condor_secman and daemon core.

KeyCacheEntry stores sockaddr_in. KeyCache converts sockaddr_in into sinful string and use the string as a key.

Sock::my_addr() can fail?

One of asymmetry in Sock class is that peer_addr() does not fail and always return a value but my_addr() can fail. ( peer_addr tells you the address of peer, my_addr() tells you the address of local socket)

The possible case for a failure of my_addr() is that when Sock class did not assign a socket descriptor.

In this case, peer_addr() can also fail.

Returning a pointer of a static buffer inside a function

It is quite common practice in Condor source code that returning a pointer of a static buffer in a function. It was perfectly fine in a world that pthread is rare and multi-core is unknown. It is obviously non-re-entrant and non-thread-safe. Well, I could do as it was. But, I am slightly uncomfortable of writing such a function. So, I decided to use MyString instead of returning a pointer of a static buffer.

changes

should i change?

Sock::get_port() -> Sock::my_addr().get_port() *for consistency does it really necessary to a table of local ip addr?