Reformatting the serv.c file. - acarsdec - an ACARS decoder
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 1248597a6b7689167d766aa71e298a7c5c7aa70e
 (DIR) parent 62f33d87852de094a7ddc6da2656f80be6a87143
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Sat, 27 Oct 2012 07:09:35 +0200
       
       Reformatting the serv.c file.
       
       Diffstat:
         serv.c                              |     471 ++++++++++++++++---------------
       
       1 file changed, 239 insertions(+), 232 deletions(-)
       ---
 (DIR) diff --git a/serv.c b/serv.c
       @@ -1,8 +1,8 @@
        /*
         *  Copyright (c) 2007 by Thierry Leconte (F4DWV)
       - *            (c) 2010 by Christoph Lohmann <20h@r-36.net>
       + *                        (c) 2010 by Christoph Lohmann <20h@r-36.net>
         *
       - *      $Id: serv.c,v 1.2 2007/04/22 16:14:41 f4dwv Exp $
       + *          $Id: serv.c,v 1.2 2007/04/22 16:14:41 f4dwv Exp $
         *
         *   This code is free software; you can redistribute it and/or modify
         *   it under the terms of the GNU Library General Public License version 2
       @@ -34,278 +34,285 @@ static int sa, sc;
        
        int init_serv(short port)
        {
       -    struct sockaddr_in locaddr, remaddr;
       -    socklen_t len;
       -    char c;
       -    int res;
       -
       -    sa = socket(PF_INET, SOCK_STREAM, 0);
       -    if (sa < 0) {
       -        fprintf(stderr, "socket : %s\n", strerror(errno));
       -        return -1;
       -    }
       -
       -    res = 1;
       -    res = setsockopt(sa, SOL_SOCKET, SO_REUSEADDR, &res, sizeof(res));
       -    if (res) {
       -            fprintf(stderr, "reuseaddr : %s\n", strerror(errno));
       -            return -1;
       -    }
       -
       -    memset(&locaddr, 0, sizeof(locaddr));
       -    locaddr.sin_family = AF_INET;
       -    locaddr.sin_port = htons(port);
       -    locaddr.sin_addr.s_addr = htonl(INADDR_ANY);
       -
       -    len = sizeof(locaddr);
       -    res = bind(sa, (struct sockaddr *) &locaddr, len);
       -    if (res) {
       -        fprintf(stderr, "bind : %s\n", strerror(errno));
       -        return -1;
       -    }
       -
       -    res = listen(sa, 1);
       -    if (res) {
       -        fprintf(stderr, "listen : %s\n", strerror(errno));
       -        return -1;
       -    }
       -
       -    memset(&remaddr, 0, sizeof(remaddr));
       -    len = sizeof(remaddr);
       -    sc = accept(sa, (struct sockaddr *) &remaddr, &len);
       -    if (sc < 0) {
       -        fprintf(stderr, "accept : %s\n", strerror(errno));
       -        return -1;
       -    }
       -
       -    do {
       -        res = read(sc, &c, 1);
       -    } while (res == 1 && c != '\n');
       -
       -
       -    return 0;
       +        struct sockaddr_in locaddr, remaddr;
       +        socklen_t len;
       +        char c;
       +        int res;
       +
       +        sa = socket(PF_INET, SOCK_STREAM, 0);
       +        if (sa < 0) {
       +                fprintf(stderr, "socket : %s\n", strerror(errno));
       +                return -1;
       +        }
       +
       +        res = 1;
       +        res = setsockopt(sa, SOL_SOCKET, SO_REUSEADDR, &res, sizeof(res));
       +        if (res) {
       +                fprintf(stderr, "reuseaddr : %s\n", strerror(errno));
       +                return -1;
       +        }
       +
       +        memset(&locaddr, 0, sizeof(locaddr));
       +        locaddr.sin_family = AF_INET;
       +        locaddr.sin_port = htons(port);
       +        locaddr.sin_addr.s_addr = htonl(INADDR_ANY);
       +
       +        len = sizeof(locaddr);
       +        res = bind(sa, (struct sockaddr *) &locaddr, len);
       +        if (res) {
       +                fprintf(stderr, "bind : %s\n", strerror(errno));
       +                return -1;
       +        }
       +
       +        res = listen(sa, 1);
       +        if (res) {
       +                fprintf(stderr, "listen : %s\n", strerror(errno));
       +                return -1;
       +        }
       +
       +        memset(&remaddr, 0, sizeof(remaddr));
       +        len = sizeof(remaddr);
       +        sc = accept(sa, (struct sockaddr *) &remaddr, &len);
       +        if (sc < 0) {
       +                fprintf(stderr, "accept : %s\n", strerror(errno));
       +                return -1;
       +        }
       +
       +        do {
       +                res = read(sc, &c, 1);
       +        } while (res == 1 && c != '\n');
       +
       +
       +        return 0;
        }
        
        
        /* convert ACARS position reports to APRS position */
        static void toaprs(int la, char lac, int ln, char lnc, int prec, char *out)
        {
       -    int lad, lnd;
       -    float lam, lnm;
       +        int lad, lnd;
       +        float lam, lnm;
        
       -    lad = la / 10000;
       -    lnd = ln / 10000;
       -    lam = (float) (la - (lad * 10000)) * 60.0 / 10000.0;
       -    lnm = (float) (ln - (lnd * 10000)) * 60.0 / 10000.0;
       +        lad = la / 10000;
       +        lnd = ln / 10000;
       +        lam = (float) (la - (lad * 10000)) * 60.0 / 10000.0;
       +        lnm = (float) (ln - (lnd * 10000)) * 60.0 / 10000.0;
        
       -    switch (prec) {
       +        switch (prec) {
                case 0:
       -                    sprintf(out, "%02d%02.0f.  %c/%03d%02.0f.  %c^", lad, lam, lac, lnd, lnm, lnc);
       +                sprintf(out, "%02d%02.0f.  %c/%03d%02.0f.  %c^",
       +                                lad, lam, lac, lnd, lnm, lnc);
                        break;
                case 1:
       -                    sprintf(out, "%02d%04.1f %c/%03d%04.1f %c^", lad, lam, lac, lnd, lnm, lnc);
       +                sprintf(out, "%02d%04.1f %c/%03d%04.1f %c^",
       +                                lad, lam, lac, lnd, lnm, lnc);
                        break;
                case 2:
                default:
       -                    sprintf(out, "%02d%05.2f%c/%03d%05.2f%c^", lad, lam, lac, lnd, lnm, lnc);
       +                sprintf(out, "%02d%05.2f%c/%03d%05.2f%c^",
       +                                lad, lam, lac, lnd, lnm, lnc);
                        break;
       -    }
       +        }
        }
        
        int posconv(char *txt, unsigned char *label, char *pos)
        {
       -    char lac, lnc;
       -    int la, ln;
       -    char las[7], lns[7];
       -    int n;
       -    char *p;
       -
       -/*try different heuristics */
       -
       -    n = sscanf(txt, "#M1BPOS%c%05d%c%063d,", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 10;
       -        ln *= 10;
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -    n = sscanf(txt, "#M1AAEP%c%06d%c%07d", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        toaprs(la, lac, ln, lnc, 2, pos);
       -        return 0;;
       -    }
       -
       -    if (strncmp(txt, "#M1B", 4) == 0) {
       -        if ((p = strstr(txt, "/FPO")) != NULL) {
       -            n = sscanf(p, "/FPO%c%05d%c%06d", &lac, &la, &lnc, &ln);
       -            if (n == 4 && (lac == 'N' || lac == 'S')
       -                && (lnc == 'E' || lnc == 'W')) {
       +        char lac, lnc;
       +        int la, ln;
       +        char las[7], lns[7];
       +        int n;
       +        char *p;
       +
       +        /*try different heuristics */
       +
       +        n = sscanf(txt, "#M1BPOS%c%05d%c%063d,", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
                        la *= 10;
                        ln *= 10;
                        toaprs(la, lac, ln, lnc, 1, pos);
                        return 0;;
       -            }
                }
       -        if ((p = strstr(txt, "/PS")) != NULL) {
       -            n = sscanf(p, "/PS%c%05d%c%06d", &lac, &la, &lnc, &ln);
       -            if (n == 4 && (lac == 'N' || lac == 'S')
       -                && (lnc == 'E' || lnc == 'W')) {
       +        n = sscanf(txt, "#M1AAEP%c%06d%c%07d", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                toaprs(la, lac, ln, lnc, 2, pos);
       +                return 0;;
       +        }
       +
       +        if (strncmp(txt, "#M1B", 4) == 0) {
       +                if ((p = strstr(txt, "/FPO")) != NULL) {
       +                        n = sscanf(p, "/FPO%c%05d%c%06d", &lac, &la, &lnc, &ln);
       +                        if (n == 4 && (lac == 'N' || lac == 'S')
       +                        && (lnc == 'E' || lnc == 'W')) {
       +                                la *= 10;
       +                                ln *= 10;
       +                                toaprs(la, lac, ln, lnc, 1, pos);
       +                                return 0;;
       +                        }
       +                }
       +                if ((p = strstr(txt, "/PS")) != NULL) {
       +                        n = sscanf(p, "/PS%c%05d%c%06d", &lac, &la, &lnc, &ln);
       +                        if (n == 4 && (lac == 'N' || lac == 'S')
       +                        && (lnc == 'E' || lnc == 'W')) {
       +                        la *= 10;
       +                        ln *= 10;
       +                        toaprs(la, lac, ln, lnc, 1, pos);
       +                        return 0;;
       +                        }
       +                }
       +        }
       +
       +        n = sscanf(txt, "FST01%*8s%c%06d%c%07d", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                toaprs(la, lac, ln, lnc, 2, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "(2%c%5c%c%6c", &lac, las, &lnc, lns);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                las[5] = 0;
       +                lns[6] = 0;
       +                la = 10 * atoi(las);
       +                ln = 10 * atoi(lns);
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "(:2%c%5c%c%6c", &lac, las, &lnc, lns);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                las[5] = 0;
       +                lns[6] = 0;
       +                la = 10 * atoi(las);
       +                ln = 10 * atoi(lns);
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +
       +        n = sscanf(txt, "(2%*4s%c%5c%c%6c", &lac, las, &lnc, lns);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                las[5] = 0;
       +                lns[6] = 0;
       +                la = 10 * atoi(las);
       +                ln = 10 * atoi(lns);
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "LAT %c%3c.%3c/LON %c%3c.%3c", &lac, las, &(las[3]),
       +                   &lnc, lns, &(lns[3]));
       +        if (n == 6 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                las[6] = 0;
       +                lns[6] = 0;
       +                la = 10 * atoi(las);
       +                ln = 10 * atoi(lns);
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +
       +        n = sscanf(txt, "#DFB(POS-%*6s-%04d%c%05d%c/", &la, &lac, &ln, &lnc);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                la *= 100;
       +                ln *= 100;
       +                toaprs(la, lac, ln, lnc, 0, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "#DFB*POS\a%*8s%c%04d%c%05d/", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                la *= 100;
       +                ln *= 100;
       +                toaprs(la, lac, ln, lnc, 0, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "POS%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                la *= 10;
       +                ln *= 10;
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "POS%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                la *= 10;
       +                ln *= 10;
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "RCL%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                la *= 10;
       +                ln *= 10;
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "TWX%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
                        la *= 10;
                        ln *= 10;
                        toaprs(la, lac, ln, lnc, 1, pos);
                        return 0;;
       -            }
                }
       -    }
       -
       -    n = sscanf(txt, "FST01%*8s%c%06d%c%07d", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        toaprs(la, lac, ln, lnc, 2, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "(2%c%5c%c%6c", &lac, las, &lnc, lns);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        las[5] = 0;
       -        lns[6] = 0;
       -        la = 10 * atoi(las);
       -        ln = 10 * atoi(lns);
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "(:2%c%5c%c%6c", &lac, las, &lnc, lns);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        las[5] = 0;
       -        lns[6] = 0;
       -        la = 10 * atoi(las);
       -        ln = 10 * atoi(lns);
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -
       -    n = sscanf(txt, "(2%*4s%c%5c%c%6c", &lac, las, &lnc, lns);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        las[5] = 0;
       -        lns[6] = 0;
       -        la = 10 * atoi(las);
       -        ln = 10 * atoi(lns);
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "LAT %c%3c.%3c/LON %c%3c.%3c", &lac, las, &(las[3]),
       -               &lnc, lns, &(lns[3]));
       -    if (n == 6 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        las[6] = 0;
       -        lns[6] = 0;
       -        la = 10 * atoi(las);
       -        ln = 10 * atoi(lns);
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -
       -    n = sscanf(txt, "#DFB(POS-%*6s-%04d%c%05d%c/", &la, &lac, &ln, &lnc);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 100;
       -        ln *= 100;
       -        toaprs(la, lac, ln, lnc, 0, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "#DFB*POS\a%*8s%c%04d%c%05d/", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 100;
       -        ln *= 100;
       -        toaprs(la, lac, ln, lnc, 0, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "POS%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 10;
       -        ln *= 10;
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "POS%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 10;
       -        ln *= 10;
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "RCL%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 10;
       -        ln *= 10;
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "TWX%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 10;
       -        ln *= 10;
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "CLA%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 10;
       -        ln *= 10;
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    n = sscanf(txt, "%c%05d/%c%06d,", &lac, &la, &lnc, &ln);
       -    if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       -        la *= 10;
       -        ln *= 10;
       -        toaprs(la, lac, ln, lnc, 1, pos);
       -        return 0;;
       -    }
       -
       -    return 1;
       +
       +        n = sscanf(txt, "CLA%*2s,%c%05d%c%06d,", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                la *= 10;
       +                ln *= 10;
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +        n = sscanf(txt, "%c%05d/%c%06d,", &lac, &la, &lnc, &ln);
       +        if (n == 4 && (lac == 'N' || lac == 'S') && (lnc == 'E' || lnc == 'W')) {
       +                la *= 10;
       +                ln *= 10;
       +                toaprs(la, lac, ln, lnc, 1, pos);
       +                return 0;;
       +        }
       +
       +        return 1;
        }
        
        int send_mesg(msg_t * msg)
        {
       -    char apstr[512];
       -    char txt[512];
       -    char pos[64];
       -    unsigned char *ind;
       +        char apstr[512];
       +        char txt[512];
       +        char pos[64];
       +        unsigned char *ind;
        
       -   if(msg->label[0]=='_' && msg->label[1]==0x7f)
       -        return 0;
       +        if(msg->label[0]=='_' && msg->label[1]==0x7f)
       +                return 0;
        
       -    strcpy(txt,msg->txt);
       -    for(ind = (unsigned char *)&txt; *ind != 0 ;ind++) {
       -        if(*ind==0x0a || *ind == 0x0d) *ind=' ';
       -     }
       +        strcpy(txt,msg->txt);
       +        for(ind = (unsigned char *)&txt; *ind != 0 ;ind++) {
       +                if(*ind==0x0a || *ind == 0x0d) *ind=' ';
       +        }
        
       -    ind = msg->addr;
       -    while (*ind == '.' && *ind != 0)
       -        ind++;
       +        ind = msg->addr;
       +        while (*ind == '.' && *ind != 0)
       +                ind++;
        
       -    if (posconv(msg->txt, msg->label, pos))
       -        sprintf(apstr, "%s>ACARS:>Fid:%s Lbl:%s %s\n", ind, msg->fid,msg->label,txt);
       -    else
       -        sprintf(apstr, "%s>ACARS:!%sFid:%s Lbl:%s %s\n", ind, pos,msg->fid,msg->label,txt);
       +        if (posconv(msg->txt, msg->label, pos)) {
       +                sprintf(apstr, "%s>ACARS:>Fid:%s Lbl:%s %s\n",
       +                                ind, msg->fid,msg->label,txt);
       +        } else {
       +                sprintf(apstr, "%s>ACARS:!%sFid:%s Lbl:%s %s\n",
       +                                ind, pos,msg->fid,msg->label,txt);
       +        }
        
       -    write(sc, apstr, strlen(apstr));
       +        write(sc, apstr, strlen(apstr));
        
       -    return 0;
       +        return 0;
        }
        
        
        void end_serv(void)
        {
       -    close(sc);
       -    close(sa);
       +        close(sc);
       +        close(sa);
        }
       +