Diff for /embedaddon/mpd/src/util.c between versions 1.1.1.3 and 1.1.1.4.2.1

version 1.1.1.3, 2016/11/01 09:56:12 version 1.1.1.4.2.1, 2023/09/27 11:08:01
Line 15 Line 15
 #include <libutil.h>  #include <libutil.h>
 #include <netdb.h>  #include <netdb.h>
 #include <tcpd.h>  #include <tcpd.h>
#include <sys/wait.h>#include <sys/limits.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
   #include <sys/wait.h>
 #include <net/route.h>  #include <net/route.h>
 #include <netinet/if_ether.h>  #include <netinet/if_ether.h>
 #include <net/ethernet.h>  #include <net/ethernet.h>
Line 80  static const u_int16_t Crc16Table[256] = { Line 82  static const u_int16_t Crc16Table[256] = {
  */   */
   
   static void           Escape(char *line);    static void           Escape(char *line);
  static char           *ReadLine(FILE *fp, int *lineNum, char *result, int resultsize);  static char           *ReadLine(FILE *fp, int *lineNum, char *result, size_t resultsize);
   
   static char           HexVal(char c);    static char           HexVal(char c);
   
   static void           IndexConfFile(FILE *fp, struct configfile **cf);    static void           IndexConfFile(FILE *fp, struct configfile **cf);
       
  struct configfiles    *ConfigFilesIndex=NULL;  static struct configfiles     *ConfigFilesIndex=NULL;
   
 #undef isspace  #undef isspace
 #define isspace(c) (((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\r')?1:0)  #define isspace(c) (((c)==' '||(c)=='\t'||(c)=='\n'||(c)=='\r')?1:0)
Line 118  int Line 120  int
 ExecCmd(int log, const char *label, const char *fmt, ...)  ExecCmd(int log, const char *label, const char *fmt, ...)
 {  {
   int           rtn;    int           rtn;
  char          cmd[BIG_LINE_SIZE];  char          cmd[LINE_MAX];
  char          cmdn[BIG_LINE_SIZE];  char          cmdn[LINE_MAX];
   va_list       ap;    va_list       ap;
   
   va_start(ap, fmt);    va_start(ap, fmt);
Line 153  int Line 155  int
 ExecCmdNosh(int log, const char *label, const char *fmt, ...)  ExecCmdNosh(int log, const char *label, const char *fmt, ...)
 {  {
     int         rtn;      int         rtn;
    char        cmd[BIG_LINE_SIZE];    char        cmd[LINE_MAX];
     char        *cmdp = &(cmd[0]);      char        *cmdp = &(cmd[0]);
     char        *argv[256];      char        *argv[256];
     char        **arg;      char        **arg;
Line 378  Escape(char *line) Line 380  Escape(char *line)
   
 int  int
 ReadFile(const char *filename, const char *target,  ReadFile(const char *filename, const char *target,
        int (*func)(Context ctx, int ac, char *av[], const char *file, int line), Context ctx)        int (*func)(Context ctx, int ac, const char *const av[], const char *file, int line), Context ctx)
 {  {
   FILE  *fp;    FILE  *fp;
   int   ac;    int   ac;
Line 409  ReadFile(const char *filename, const char *target, Line 411  ReadFile(const char *filename, const char *target,
       break;        break;
     }      }
     ac = ParseLine(line, av, sizeof(av) / sizeof(*av), 0);      ac = ParseLine(line, av, sizeof(av) / sizeof(*av), 0);
    (*func)(ctx, ac, av, filename, lineNum);    (*func)(ctx, ac, (const char *const *)av, filename, lineNum);
   }    }
   
 /* Done */  /* Done */
Line 558  OpenConfFile(const char *name, struct configfile **cf) Line 560  OpenConfFile(const char *name, struct configfile **cf)
 char *  char *
 ReadFullLine(FILE *fp, int *lineNum, char *result, int resultsize)  ReadFullLine(FILE *fp, int *lineNum, char *result, int resultsize)
 {  {
  int           len, linelen, resultlinesize, continuation;  int           len, resultlinesize, continuation;
   unsigned        linelen;
   char          line[BIG_LINE_SIZE];    char          line[BIG_LINE_SIZE];
   char          real_line[BIG_LINE_SIZE];    char          real_line[BIG_LINE_SIZE];
   char          *resultline;    char          *resultline;
Line 626  ReadFullLine(FILE *fp, int *lineNum, char *result, int Line 629  ReadFullLine(FILE *fp, int *lineNum, char *result, int
  */   */
   
 static char *  static char *
ReadLine(FILE *fp, int *lineNum, char *result, int resultsize)ReadLine(FILE *fp, int *lineNum, char *result, size_t resultsize)
 {  {
   int           empty;    int           empty;
   char          *s;    char          *s;
Line 919  GetInetSocket(int type, struct u_addr *addr, in_port_t Line 922  GetInetSocket(int type, struct u_addr *addr, in_port_t
   
 /* Get and bind non-blocking socket */  /* Get and bind non-blocking socket */
   
  if ((sock = socket(sa.ss_family, type, type == SOCK_STREAM ? IPPROTO_TCP : 0)) < 0)  if ((sock = socket(sa.ss_family, socktype(type), type == SOCK_STREAM ? IPPROTO_TCP : 0)) < 0)
   {    {
     snprintf(ebuf, len, "socket: %s", strerror(errno));      snprintf(ebuf, len, "socket: %s", strerror(errno));
     return(-1);      return(-1);
Line 977  TcpGetListenPort(struct u_addr *addr, in_port_t port,  Line 980  TcpGetListenPort(struct u_addr *addr, in_port_t port, 
   
 /* Make socket available for connections  */  /* Make socket available for connections  */
   
  if (listen(sock, -1) < 0)  if (listen(sock, INT_MAX) < 0)
   {    {
     Perror("%s: listen", __FUNCTION__);      Perror("%s: listen", __FUNCTION__);
     (void) close(sock);      (void) close(sock);
Line 1050  ShowMesg(int log, const char *pref, const char *buf, i Line 1053  ShowMesg(int log, const char *pref, const char *buf, i
   
   if (len > 0)    if (len > 0)
   {    {
    if (len > sizeof(mesg) - 1)    if (len > (int)(sizeof(mesg) - 1))
       len = sizeof(mesg) - 1;        len = sizeof(mesg) - 1;
     memcpy(mesg, buf, len);      memcpy(mesg, buf, len);
     mesg[len] = 0;      mesg[len] = 0;
Line 1093  Bin2Hex(const unsigned char *bin, size_t len) Line 1096  Bin2Hex(const unsigned char *bin, size_t len)
 u_char *  u_char *
 Hex2Bin(char *hexstr)  Hex2Bin(char *hexstr)
 {  {
  int           i;  unsigned      i;
   u_char        *binval;    u_char        *binval;
   
   binval = Malloc(MB_UTIL, strlen(hexstr) / 2);    binval = Malloc(MB_UTIL, strlen(hexstr) / 2);
Line 1176  GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn Line 1179  GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn
             close(s);              close(s);
             return(-1);              return(-1);
         }          }
        ipa = ((struct sockaddr_in *)&ifreq.ifr_ifru.ifru_addr)->sin_addr;        ipa = ((struct sockaddr_in *)(void *)&ifreq.ifr_ifru.ifru_addr)->sin_addr;
         if ((ntohl(ipa.s_addr)>>24) == 127)          if ((ntohl(ipa.s_addr)>>24) == 127)
             ipa.s_addr = 0;     /* We don't like 127.0.0.1 */              ipa.s_addr = 0;     /* We don't like 127.0.0.1 */
     }      }
Line 1196  GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn Line 1199  GetAnyIpAddress(struct u_addr *ipaddr, const char *ifn
         }          }
                   
         /* if used size is too close to allocated size retry with a larger buffer */          /* if used size is too close to allocated size retry with a larger buffer */
        if (ifc.ifc_len + 128 < buffsize)        if ((unsigned)ifc.ifc_len + 128 < buffsize)
           break;            break;
                   
          Freee(ifs);           Freee(ifs);
Line 1296  GetEther(struct u_addr *addr, struct sockaddr_dl *hwad Line 1299  GetEther(struct u_addr *addr, struct sockaddr_dl *hwad
         }          }
                     
         /* if used size is too close to allocated size retry with a larger buffer */          /* if used size is too close to allocated size retry with a larger buffer */
        if (ifc.ifc_len + 128 < buffsize)        if ((unsigned)ifc.ifc_len + 128 < buffsize)
             break;              break;
                     
         Freee(ifs);          Freee(ifs);
Line 1431  GetPeerEther(struct u_addr *addr, struct sockaddr_dl * Line 1434  GetPeerEther(struct u_addr *addr, struct sockaddr_dl *
         }          }
         lim = buf + needed;          lim = buf + needed;
         for (next = buf; next < lim; next += rtm->rtm_msglen) {          for (next = buf; next < lim; next += rtm->rtm_msglen) {
                rtm = (struct rt_msghdr *)next;                rtm = (struct rt_msghdr *)(void *)next;
                 sin2 = (struct sockaddr_inarp *)(rtm + 1);                  sin2 = (struct sockaddr_inarp *)(rtm + 1);
                 if (addr->u.ip4.s_addr == sin2->sin_addr.s_addr) {                  if (addr->u.ip4.s_addr == sin2->sin_addr.s_addr) {
                        sdl = (struct sockaddr_dl *)((char *)sin2 + SA_SIZE(sin2));                        sdl = (struct sockaddr_dl *)(void *)((char *)sin2 + SA_SIZE(sin2));
                         memcpy(hwaddr, sdl, sdl->sdl_len);                          memcpy(hwaddr, sdl, sdl->sdl_len);
                         found_entry = 1;                          found_entry = 1;
                         break;                          break;
Line 1451  void Line 1454  void
 ppp_util_ascify(char *buf, size_t bsiz, const char *data, size_t len)  ppp_util_ascify(char *buf, size_t bsiz, const char *data, size_t len)
 {  {
         char *bp;          char *bp;
        int i;        unsigned i;
   
         for (bp = buf, i = 0; i < len; i++) {          for (bp = buf, i = 0; i < len; i++) {
                 const char ch = (char)data[i];                  const char ch = (char)data[i];
Line 1505  ether_ntoa_r(const struct ether_addr *n, char *a) Line 1508  ether_ntoa_r(const struct ether_addr *n, char *a)
         return (a);          return (a);
 }  }
 #endif  #endif
   
   int
   IfaceSetFlag(const char *ifname, int value)
   {
           struct ifreq            my_ifr;
           int s;
           int flags;
   
           /* Get socket */
           if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) {
               Perror("Can't get socket to set flags");
               return(-1);
           }
   
           memset(&my_ifr, 0, sizeof(my_ifr));
           (void) strlcpy(my_ifr.ifr_name, ifname, sizeof(my_ifr.ifr_name));
   
           if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0) {
                   Perror("ioctl (SIOCGIFFLAGS)");
                   close(s);
                   return (-1);
           }
           flags = (my_ifr.ifr_flags & 0xffff) | (my_ifr.ifr_flagshigh << 16);
   
           if (value < 0) {
                   value = -value;
                   flags &= ~value;
           } else
                   flags |= value;
           my_ifr.ifr_flags = flags & 0xffff;
           my_ifr.ifr_flagshigh = flags >> 16;
           if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&my_ifr) < 0) {
                   Perror("ioctl (SIOCSIFFLAGS)");
                   close(s);
                   return (-1);
           }
           close(s);
           return (0);
   }
   
   /*
    * Obtain some data, peer (source) and destination addresses of SOCK_DGRAM IPv4 UDP request.
    */
   ssize_t GetDataAddrs(int sock, void *dbuf, size_t dbufsize,
                             struct sockaddr_storage *peer, socklen_t peer_len,
                             struct u_addr *addr)
   {
           struct {
                   struct  msghdr msg;
                   struct  iovec iov;
           } b;
           union { /* ensure correct alignment for space */
                   struct cmsghdr cm;
                   char space[CMSG_SPACE(sizeof(struct in_addr))];
           } buf;
   
           struct  cmsghdr *p;
           ssize_t size;
   
           /* Sanity check */
           if (addr->family != AF_INET) {
                   errno = EAFNOSUPPORT;
                   return (-1);
           }
   
           b.msg.msg_name = peer;
           b.msg.msg_namelen = peer_len;
           b.msg.msg_iov = &b.iov;
           b.msg.msg_iovlen = 1;
           b.msg.msg_control = &buf;
           b.msg.msg_controllen = sizeof(buf);
           b.msg.msg_flags = 0;
   
           b.iov.iov_base = dbuf;
           b.iov.iov_len = dbufsize;
   
           if ((size = recvmsg(sock, &b.msg, 0)) < 0) {
                   Perror("%s: recvmsg: %s", __FUNCTION__, strerror(errno));
                   return (size);
           }
   
           p = CMSG_FIRSTHDR(&b.msg);
           if (p && p->cmsg_level == IPPROTO_IP && p->cmsg_type == IP_RECVDSTADDR)
                   memcpy(&addr->u.ip4, CMSG_DATA(p), sizeof(addr->u.ip4));
   
           return (size);
   }
   
   uint16_t GetSystemIfaceMTU(const char *ifname)
   {
           struct ifreq ifr;
           static int sock = -1;
   
           if (sock == -1 &&
               (sock = socket(PF_INET, socktype(SOCK_DGRAM), 0)) == -1) {
                   Perror("[%s] %s: Socket creation error", ifname, __FUNCTION__);
                   return (0);
           }
   
           memset(&ifr, 0, sizeof(ifr));
           strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
   
           if (ioctl(sock, SIOCGIFMTU, (caddr_t)&ifr) == -1) {
                   Perror("[%s] %s: SIOCGIFMTU failed", ifname, __FUNCTION__);
                   return (0);
           }
           /* Let _exit() close sock */
           return (ifr.ifr_mtu);
   }

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4.2.1


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>