~ubuntu-branches/ubuntu/vivid/curl/vivid

« back to all changes in this revision

Viewing changes to packages/OS400/os400sys.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Vogt
  • Date: 2008-06-18 15:21:57 UTC
  • mto: (3.1.1 lenny) (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 28.
  • Revision ID: james.westby@ubuntu.com-20080618152157-j8b12047aqcl6kii
Tags: upstream-7.18.2
ImportĀ upstreamĀ versionĀ 7.18.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
19
 * KIND, either express or implied.
20
20
 *
21
 
 * $Id: os400sys.c,v 1.3 2008-01-16 16:04:47 patrickm Exp $
 
21
 * $Id: os400sys.c,v 1.4 2008-05-20 10:21:50 patrickm Exp $
22
22
 *
23
23
 ***************************************************************************/
24
24
 
25
25
/* OS/400 additional support. */
26
26
 
27
 
#include "config-os400.h"       /* Not setup.h: we only need some defines. */
 
27
#include "config-os400.h"       /* Not setup.h: we only need some defines. */
28
28
 
29
29
#include <sys/types.h>
30
30
#include <sys/socket.h>
 
31
#include <sys/un.h>
31
32
 
32
33
#include <stdlib.h>
 
34
#include <stddef.h>
33
35
#include <string.h>
34
36
#include <pthread.h>
35
37
#include <netdb.h>
965
967
}
966
968
 
967
969
#endif /* CURL_DISABLE_LDAP */
 
970
 
 
971
 
 
972
static int
 
973
convert_sockaddr(struct sockaddr_storage * dstaddr,
 
974
                                const struct sockaddr * srcaddr, int srclen)
 
975
 
 
976
{
 
977
  const struct sockaddr_un * srcu;
 
978
  struct sockaddr_un * dstu;
 
979
  unsigned int i;
 
980
  unsigned int dstsize;
 
981
 
 
982
  /* Convert a socket address into job CCSID, if needed. */
 
983
 
 
984
  if (!srcaddr || srclen < offsetof(struct sockaddr, sa_family) +
 
985
      sizeof srcaddr->sa_family || srclen > sizeof *dstaddr) {
 
986
    errno = EINVAL;
 
987
    return -1;
 
988
    }
 
989
 
 
990
  memcpy((char *) dstaddr, (char *) srcaddr, srclen);
 
991
 
 
992
  switch (srcaddr->sa_family) {
 
993
 
 
994
  case AF_UNIX:
 
995
    srcu = (const struct sockaddr_un *) srcaddr;
 
996
    dstu = (struct sockaddr_un *) dstaddr;
 
997
    dstsize = sizeof *dstaddr - offsetof(struct sockaddr_un, sun_path);
 
998
    srclen -= offsetof(struct sockaddr_un, sun_path);
 
999
    i = QadrtConvertA2E(dstu->sun_path, srcu->sun_path, dstsize - 1, srclen);
 
1000
    dstu->sun_path[i] = '\0';
 
1001
    i += offsetof(struct sockaddr_un, sun_path);
 
1002
    srclen = i;
 
1003
    }
 
1004
 
 
1005
  return srclen;
 
1006
}
 
1007
 
 
1008
 
 
1009
int
 
1010
Curl_os400_connect(int sd, struct sockaddr * destaddr, int addrlen)
 
1011
 
 
1012
{
 
1013
  int i;
 
1014
  struct sockaddr_storage laddr;
 
1015
 
 
1016
  i = convert_sockaddr(&laddr, destaddr, addrlen);
 
1017
 
 
1018
  if (i < 0)
 
1019
    return -1;
 
1020
 
 
1021
  return connect(sd, (struct sockaddr *) &laddr, i);
 
1022
}
 
1023
 
 
1024
 
 
1025
int
 
1026
Curl_os400_bind(int sd, struct sockaddr * localaddr, int addrlen)
 
1027
 
 
1028
{
 
1029
  int i;
 
1030
  struct sockaddr_storage laddr;
 
1031
 
 
1032
  i = convert_sockaddr(&laddr, localaddr, addrlen);
 
1033
 
 
1034
  if (i < 0)
 
1035
    return -1;
 
1036
 
 
1037
  return bind(sd, (struct sockaddr *) &laddr, i);
 
1038
}
 
1039
 
 
1040
 
 
1041
int
 
1042
Curl_os400_sendto(int sd, char * buffer, int buflen, int flags,
 
1043
                                struct sockaddr * dstaddr, int addrlen)
 
1044
 
 
1045
{
 
1046
  int i;
 
1047
  struct sockaddr_storage laddr;
 
1048
 
 
1049
  i = convert_sockaddr(&laddr, dstaddr, addrlen);
 
1050
 
 
1051
  if (i < 0)
 
1052
    return -1;
 
1053
 
 
1054
  return sendto(sd, buffer, buflen, flags, (struct sockaddr *) &laddr, i);
 
1055
}
 
1056
 
 
1057
 
 
1058
int
 
1059
Curl_os400_recvfrom(int sd, char * buffer, int buflen, int flags,
 
1060
                                struct sockaddr * fromaddr, int * addrlen)
 
1061
 
 
1062
{
 
1063
  int i;
 
1064
  int rcvlen;
 
1065
  int laddrlen;
 
1066
  const struct sockaddr_un * srcu;
 
1067
  struct sockaddr_un * dstu;
 
1068
  struct sockaddr_storage laddr;
 
1069
 
 
1070
  if (!fromaddr || !addrlen || *addrlen <= 0)
 
1071
    return recvfrom(sd, buffer, buflen, flags, fromaddr, addrlen);
 
1072
 
 
1073
  laddrlen = sizeof laddr;
 
1074
  laddr.ss_family = AF_UNSPEC;          /* To detect if unused. */
 
1075
  rcvlen = recvfrom(sd, buffer, buflen, flags,
 
1076
                    (struct sockaddr *) &laddr, &laddrlen);
 
1077
 
 
1078
  if (rcvlen < 0)
 
1079
    return rcvlen;
 
1080
 
 
1081
  switch (laddr.ss_family) {
 
1082
 
 
1083
  case AF_UNIX:
 
1084
    srcu = (const struct sockaddr_un *) &laddr;
 
1085
    dstu = (struct sockaddr_un *) fromaddr;
 
1086
    i = *addrlen - offsetof(struct sockaddr_un, sun_path);
 
1087
    laddrlen -= offsetof(struct sockaddr_un, sun_path);
 
1088
    i = QadrtConvertE2A(dstu->sun_path, srcu->sun_path, i, laddrlen);
 
1089
    laddrlen = i + offsetof(struct sockaddr_un, sun_path);
 
1090
 
 
1091
    if (laddrlen < *addrlen)
 
1092
      dstu->sun_path[i] = '\0';
 
1093
 
 
1094
    break;
 
1095
 
 
1096
  case AF_UNSPEC:
 
1097
    break;
 
1098
 
 
1099
  default:
 
1100
    if (laddrlen > *addrlen)
 
1101
      laddrlen = *addrlen;
 
1102
 
 
1103
    if (laddrlen)
 
1104
      memcpy((char *) fromaddr, (char *) &laddr, laddrlen);
 
1105
 
 
1106
    break;
 
1107
    }
 
1108
 
 
1109
  *addrlen = laddrlen;
 
1110
  return rcvlen;
 
1111
}