Changeset 3a0a4d8 in mainline for uspace/app


Ignore:
Timestamp:
2013-09-12T07:54:05Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
95027b5
Parents:
47f5a77 (diff), 64f3d3b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge mainline changes

Location:
uspace/app
Files:
14 added
20 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/bdsh/cmds/modules/cat/cat.c

    r47f5a77 r3a0a4d8  
    6363static bool should_quit = false;
    6464static bool dash_represents_stdin = false;
     65static unsigned int lineno = 0;
     66static bool number = false;
     67static bool last_char_was_newline = false;
    6568
    6669static console_ctrl_t *console = NULL;
     
    7578        { "hex", no_argument, 0, 'x' },
    7679        { "stdin", no_argument, 0, 's' },
     80        { "number", no_argument, 0, 'n' },
    7781        { 0, 0, 0, 0 }
    7882};
     
    9599                "  -m, --more       Pause after each screen full\n"
    96100                "  -x, --hex        Print bytes as hex values\n"
    97                 "  -s  --stdin      Treat `-' in file list as standard input\n"
     101                "  -s, --stdin      Treat `-' in file list as standard input\n"
     102                "  -n, --number     Number all output lines\n"
    98103                "Currently, %s is under development, some options don't work.\n",
    99104                cmdname, cmdname);
     
    153158static void paged_char(wchar_t c)
    154159{
     160        if (last_char_was_newline && number) {
     161                lineno++;
     162                printf("%6u  ", lineno);
     163        }
    155164        putchar(c);
     165        last_char_was_newline = c == '\n';
    156166        if (paging_enabled) {
    157167                chars_remaining--;
     
    306316        should_quit = false;
    307317        console = console_init(stdin, stdout);
     318        number = false;
     319        lineno = 0;
     320        /* This enables printing of the first number. */
     321        last_char_was_newline = true;
     322
    308323
    309324        argc = cli_count_args(argv);
    310325
    311326        for (c = 0, optind = 0, opt_ind = 0; c != -1;) {
    312                 c = getopt_long(argc, argv, "xhvmH:t:b:s", long_options, &opt_ind);
     327                c = getopt_long(argc, argv, "xhvmH:t:b:s:n", long_options, &opt_ind);
    313328                switch (c) {
    314329                case 'h':
     
    347362                        dash_represents_stdin = true;
    348363                        break;
     364                case 'n':
     365                        number = true;
     366                        break;
    349367                }
    350368        }
  • uspace/app/bdsh/cmds/modules/mount/mount.c

    r47f5a77 r3a0a4d8  
    7474        get_mtab_list(&mtab_list);
    7575
    76         list_foreach(mtab_list, cur) {
    77                 mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,
    78                     link);
    79 
     76        list_foreach(mtab_list, link, mtab_ent_t, mtab_ent) {
    8077                if (old_ent)
    8178                        free(old_ent);
  • uspace/app/devctl/devctl.c

    r47f5a77 r3a0a4d8  
    3535#include <devman.h>
    3636#include <errno.h>
     37#include <stdbool.h>
    3738#include <stdio.h>
    3839#include <stdlib.h>
     
    4445#define MAX_NAME_LENGTH 1024
    4546
    46 char name[MAX_NAME_LENGTH];
    47 char drv_name[MAX_NAME_LENGTH];
     47static char name[MAX_NAME_LENGTH];
     48static char drv_name[MAX_NAME_LENGTH];
     49static bool verbose = false;
     50
     51static const char *drv_state_str(driver_state_t state)
     52{
     53        const char *sstate;
     54
     55        switch (state) {
     56        case DRIVER_NOT_STARTED:
     57                sstate = "not started";
     58                break;
     59        case DRIVER_STARTING:
     60                sstate = "starting";
     61                break;
     62        case DRIVER_RUNNING:
     63                sstate = "running";
     64                break;
     65        default:
     66                sstate = "unknown";
     67        }
     68
     69        return sstate;
     70}
    4871
    4972static int fun_subtree_print(devman_handle_t funh, int lvl)
     
    5275        devman_handle_t *cfuns;
    5376        size_t count, i;
     77        unsigned int score;
    5478        int rc;
    5579        int j;
     
    7498                printf("%s : %s\n", name, drv_name);
    7599
     100        if (verbose) {
     101                for (i = 0; true; i++) {
     102                        rc = devman_fun_get_match_id(funh, i, name, MAX_NAME_LENGTH,
     103                            &score);
     104                        if (rc != EOK)
     105                                break;
     106
     107                        for (j = 0; j < lvl; j++)
     108                                printf("    ");
     109
     110                        printf("    %u %s\n", score, name);
     111                }
     112        }
     113
    76114        rc = devman_fun_get_child(funh, &devh);
    77115        if (rc == ENOENT)
     
    159197}
    160198
     199static int drv_list(void)
     200{
     201        devman_handle_t *devs;
     202        devman_handle_t *drvs;
     203        driver_state_t state;
     204        const char *sstate;
     205        size_t ndrvs;
     206        size_t ndevs;
     207        size_t i;
     208        int rc;
     209
     210        rc = devman_get_drivers(&drvs, &ndrvs);
     211        if (rc != EOK)
     212                return rc;
     213
     214        for (i = 0; i < ndrvs; i++) {
     215                devs = NULL;
     216
     217                rc = devman_driver_get_name(drvs[i], drv_name, MAX_NAME_LENGTH);
     218                if (rc != EOK)
     219                        goto skip;
     220                rc = devman_driver_get_state(drvs[i], &state);
     221                if (rc != EOK)
     222                        goto skip;
     223                rc = devman_driver_get_devices(drvs[i], &devs, &ndevs);
     224                if (rc != EOK)
     225                        goto skip;
     226
     227                sstate = drv_state_str(state);
     228
     229                printf("%-11s %3zu %s\n", sstate, ndevs, drv_name);
     230skip:
     231                free(devs);
     232        }
     233        free(drvs);
     234
     235        return EOK;
     236}
     237
     238static int drv_show(char *drvname)
     239{
     240        devman_handle_t *devs;
     241        devman_handle_t drvh;
     242        devman_handle_t funh;
     243        driver_state_t state;
     244        const char *sstate;
     245        unsigned int score;
     246        size_t ndevs;
     247        size_t i;
     248        int rc;
     249
     250        rc = devman_driver_get_handle(drvname, &drvh);
     251        if (rc != EOK)
     252                return rc;
     253
     254        devs = NULL;
     255
     256        rc = devman_driver_get_name(drvh, drv_name, MAX_NAME_LENGTH);
     257        if (rc != EOK)
     258                return rc;
     259
     260        rc = devman_driver_get_state(drvh, &state);
     261        if (rc != EOK)
     262                return rc;
     263
     264        rc = devman_driver_get_devices(drvh, &devs, &ndevs);
     265        if (rc != EOK)
     266                return rc;
     267
     268        sstate = drv_state_str(state);
     269
     270        printf("Driver: %s\n", drv_name);
     271        printf("State: %s\n", sstate);
     272
     273        printf("Attached devices:\n");
     274
     275        for (i = 0; i < ndevs; i++) {
     276                rc = devman_dev_get_parent(devs[i], &funh);
     277                if (rc != EOK)
     278                        goto error;
     279
     280                rc = devman_fun_get_path(funh, name, MAX_NAME_LENGTH);
     281                if (rc != EOK)
     282                        goto error;
     283                printf("\t%s\n", name);
     284        }
     285
     286        printf("Match IDs:\n");
     287
     288        for (i = 0; true; i++) {
     289                rc = devman_driver_get_match_id(drvh, i, name, MAX_NAME_LENGTH,
     290                    &score);
     291                if (rc != EOK)
     292                        break;
     293
     294                printf("\t%u %s\n", score, name);
     295        }
     296
     297error:
     298        free(devs);
     299
     300        return EOK;
     301}
     302
     303static int drv_load(const char *drvname)
     304{
     305        int rc;
     306        devman_handle_t drvh;
     307
     308        rc = devman_driver_get_handle(drvname, &drvh);
     309        if (rc != EOK) {
     310                printf("Failed resolving driver '%s' (%d).\n", drvname, rc);
     311                return rc;
     312        }
     313
     314        rc = devman_driver_load(drvh);
     315        if (rc != EOK) {
     316                printf("Failed loading driver '%s' (%d).\n", drvname, rc);
     317                return rc;
     318        }
     319
     320        return EOK;
     321}
     322
    161323static void print_syntax(void)
    162324{
    163         printf("syntax: devctl [(online|offline) <function>]\n");
     325        printf("syntax:\n");
     326        printf("\tdevctl\n");
     327        printf("\tdevctl online <function>]\n");
     328        printf("\tdevctl offline <function>]\n");
     329        printf("\tdevctl list-drv\n");
     330        printf("\tdevctl show-drv <driver-name>\n");
     331        printf("\tdevctl load-drv <driver-name>\n");
    164332}
    165333
     
    168336        int rc;
    169337
    170         if (argc == 1) {
     338        if (argc == 1 || argv[1][0] == '-') {
     339                if (argc > 1) {
     340                        if (str_cmp(argv[1], "-v") == 0) {
     341                                verbose = true;
     342                        } else {
     343                                printf(NAME ": Invalid argument '%s'\n", argv[1]);
     344                                print_syntax();
     345                                return 1;
     346                        }
     347                }
    171348                rc = fun_tree_print();
    172349                if (rc != EOK)
     
    194371                        return 2;
    195372                }
     373        } else if (str_cmp(argv[1], "list-drv") == 0) {
     374                rc = drv_list();
     375                if (rc != EOK)
     376                        return 2;
     377        } else if (str_cmp(argv[1], "show-drv") == 0) {
     378                if (argc < 3) {
     379                        printf(NAME ": Argument missing.\n");
     380                        print_syntax();
     381                        return 1;
     382                }
     383
     384                rc = drv_show(argv[2]);
     385                if (rc != EOK) {
     386                        return 2;
     387                }
     388        } else if (str_cmp(argv[1], "load-drv") == 0) {
     389                if (argc < 3) {
     390                        printf(NAME ": Argument missing.\n");
     391                        print_syntax();
     392                        return 1;
     393                }
     394
     395                rc = drv_load(argv[2]);
     396                if (rc != EOK)
     397                        return 2;
    196398        } else {
    197399                printf(NAME ": Invalid argument '%s'.\n", argv[1]);
  • uspace/app/dnsres/dnsres.c

    r47f5a77 r3a0a4d8  
    3636#include <inet/addr.h>
    3737#include <inet/dnsr.h>
     38#include <net/socket_codes.h>
    3839#include <stdio.h>
    3940#include <stdlib.h>
    4041
    41 #define NAME "dnsres"
     42#define NAME  "dnsres"
    4243
    4344static void print_syntax(void)
    4445{
    45         printf("syntax: " NAME " <host-name>\n");
     46        printf("Syntax: %s [-4|-6] <host-name>\n", NAME);
    4647}
    4748
    4849int main(int argc, char *argv[])
    4950{
    50         int rc;
    51         dnsr_hostinfo_t *hinfo;
    52         char *hname;
    53         char *saddr;
    54 
    55         if (argc != 2) {
     51        if ((argc < 2) || (argc > 3)) {
    5652                print_syntax();
    5753                return 1;
    5854        }
    59 
    60         hname = argv[1];
    61 
    62         rc = dnsr_name2host(hname, &hinfo);
     55       
     56        uint16_t af;
     57        char *hname;
     58       
     59        if (str_cmp(argv[1], "-4") == 0) {
     60                if (argc < 3) {
     61                        print_syntax();
     62                        return 1;
     63                }
     64               
     65                af = AF_INET;
     66                hname = argv[2];
     67        } else if (str_cmp(argv[1], "-6") == 0) {
     68                if (argc < 3) {
     69                        print_syntax();
     70                        return 1;
     71                }
     72               
     73                af = AF_INET6;
     74                hname = argv[2];
     75        } else {
     76                af = 0;
     77                hname = argv[1];
     78        }
     79       
     80        dnsr_hostinfo_t *hinfo;
     81        int rc = dnsr_name2host(hname, &hinfo, af);
    6382        if (rc != EOK) {
    64                 printf(NAME ": Error resolving '%s'.\n", argv[1]);
    65                 return 1;
     83                printf("%s: Error resolving '%s'.\n", NAME, hname);
     84                return rc;
    6685        }
    67 
     86       
     87        char *saddr;
    6888        rc = inet_addr_format(&hinfo->addr, &saddr);
    6989        if (rc != EOK) {
    7090                dnsr_hostinfo_destroy(hinfo);
    71                 printf(NAME ": Out of memory.\n");
    72                 return 1;
     91                printf("%s: Error formatting address.\n", NAME);
     92                return rc;
    7393        }
    74 
     94       
    7595        printf("Host name: %s\n", hname);
     96       
    7697        if (str_cmp(hname, hinfo->cname) != 0)
    7798                printf("Canonical name: %s\n", hinfo->cname);
     99       
    78100        printf("Address: %s\n", saddr);
    79 
     101       
    80102        dnsr_hostinfo_destroy(hinfo);
    81103        free(saddr);
    82 
     104       
    83105        return 0;
    84106}
  • uspace/app/edit/sheet.c

    r47f5a77 r3a0a4d8  
    105105        char *ipp;
    106106        size_t sz;
    107         tag_t *tag;
    108107        char *newp;
    109108
     
    128127        /* Adjust tags. */
    129128
    130         list_foreach(sh->tags, link) {
    131                 tag = list_get_instance(link, tag_t, link);
    132 
     129        list_foreach(sh->tags, link, tag_t, tag) {
    133130                if (tag->b_off > pos->b_off)
    134131                        tag->b_off += sz;
     
    154151        char *spp;
    155152        size_t sz;
    156         tag_t *tag;
    157153        char *newp;
    158154        size_t shrink_size;
     
    165161
    166162        /* Adjust tags. */
    167         list_foreach(sh->tags, link) {
    168                 tag = list_get_instance(link, tag_t, link);
    169 
     163        list_foreach(sh->tags, link, tag_t, tag) {
    170164                if (tag->b_off >= epos->b_off)
    171165                        tag->b_off -= sz;
  • uspace/app/init/init.c

    r47f5a77 r3a0a4d8  
    384384        srv_start("/srv/input", HID_INPUT);
    385385        srv_start("/srv/output", HID_OUTPUT);
     386        srv_start("/srv/hound");
    386387       
    387388        int rc = compositor(HID_INPUT, HID_COMPOSITOR_SERVER);
  • uspace/app/klog/klog.c

    r47f5a77 r3a0a4d8  
    206206        klog_length = size / sizeof(wchar_t);
    207207       
    208         rc = physmem_map((void *) faddr, pages,
    209             AS_AREA_READ | AS_AREA_CACHEABLE, (void *) &klog);
     208        rc = physmem_map(faddr, pages, AS_AREA_READ | AS_AREA_CACHEABLE,
     209            (void *) &klog);
    210210        if (rc != EOK) {
    211211                fprintf(stderr, "%s: Unable to map klog\n", NAME);
  • uspace/app/netecho/netecho.c

    r47f5a77 r3a0a4d8  
    225225        uint8_t address_buf[sizeof(struct sockaddr_in6)];
    226226
    227         socklen_t addrlen;
     227        socklen_t addrlen = sizeof(struct sockaddr_in6);
    228228        int socket_id;
    229229        ssize_t rcv_size;
     
    240240        if (type == SOCK_STREAM) {
    241241                /* Accept a socket if a stream socket is used */
    242                 addrlen = sizeof(address_buf);
    243242                if (verbose)
    244243                        printf("accept()\n");
     
    280279                                case AF_INET6:
    281280                                        port = ntohs(address_in6->sin6_port);
    282                                         address_start = (uint8_t *) &address_in6->sin6_addr.s6_addr;
     281                                        address_start = (uint8_t *) address_in6->sin6_addr.s6_addr;
    283282                                        break;
    284283                                default:
  • uspace/app/nettest1/nettest.c

    r47f5a77 r3a0a4d8  
    4141#include "print_error.h"
    4242
    43 
    4443/** Creates new sockets.
    4544 *
     
    5251 * @return Other error codes as defined for the socket() function.
    5352 */
    54 int sockets_create(int verbose, int *socket_ids, int sockets, int family, sock_type_t type)
    55 {
    56         int index;
    57 
     53int sockets_create(int verbose, int *socket_ids, unsigned int sockets,
     54    uint16_t family, sock_type_t type)
     55{
    5856        if (verbose)
    5957                printf("Create\t");
    60                
    61         fflush(stdout);
    62        
    63         for (index = 0; index < sockets; index++) {
     58       
     59        fflush(stdout);
     60       
     61        for (unsigned int index = 0; index < sockets; index++) {
    6462                socket_ids[index] = socket(family, type, 0);
    6563                if (socket_ids[index] < 0) {
    66                         printf("Socket %d (%d) error:\n", index, socket_ids[index]);
     64                        printf("Socket %u (%d) error:\n", index, socket_ids[index]);
    6765                        socket_print_error(stderr, socket_ids[index], "Socket create: ", "\n");
    6866                        return socket_ids[index];
    6967                }
     68               
    7069                if (verbose)
    7170                        print_mark(index);
     
    8382 * @return Other error codes as defined for the closesocket() function.
    8483 */
    85 int sockets_close(int verbose, int *socket_ids, int sockets)
    86 {
    87         int index;
    88         int rc;
    89 
     84int sockets_close(int verbose, int *socket_ids, unsigned int sockets)
     85{
    9086        if (verbose)
    9187                printf("\tClose\t");
    92 
    93         fflush(stdout);
    94        
    95         for (index = 0; index < sockets; index++) {
    96                 rc = closesocket(socket_ids[index]);
     88       
     89        fflush(stdout);
     90       
     91        for (unsigned int index = 0; index < sockets; index++) {
     92                int rc = closesocket(socket_ids[index]);
    9793                if (rc != EOK) {
    98                         printf("Socket %d (%d) error:\n", index, socket_ids[index]);
     94                        printf("Socket %u (%d) error:\n", index, socket_ids[index]);
    9995                        socket_print_error(stderr, rc, "Socket close: ", "\n");
    10096                        return rc;
    10197                }
     98               
    10299                if (verbose)
    103100                        print_mark(index);
     
    117114 * @return Other error codes as defined for the connect() function.
    118115 */
    119 int sockets_connect(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t addrlen)
    120 {
    121         int index;
    122         int rc;
    123 
     116int sockets_connect(int verbose, int *socket_ids, unsigned int sockets,
     117    struct sockaddr *address, socklen_t addrlen)
     118{
    124119        if (verbose)
    125120                printf("\tConnect\t");
     
    127122        fflush(stdout);
    128123       
    129         for (index = 0; index < sockets; index++) {
    130                 rc = connect(socket_ids[index], address, addrlen);
     124        for (unsigned int index = 0; index < sockets; index++) {
     125                int rc = connect(socket_ids[index], address, addrlen);
    131126                if (rc != EOK) {
    132127                        socket_print_error(stderr, rc, "Socket connect: ", "\n");
    133128                        return rc;
    134129                }
    135                 if (verbose)
    136                         print_mark(index);
    137         }
    138        
    139         return EOK;
    140 }
    141 
    142 /** Sends data via sockets.
    143  *
    144  * @param[in] verbose A value indicating whether to print out verbose information.
    145  * @param[in] socket_ids A field of stored socket identifiers.
    146  * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
    147  * @param[in] address The destination host address to send data to.
    148  * @param[in] addrlen The length of the destination address in bytes.
    149  * @param[in] data The data to be sent.
    150  * @param[in] size The data size in bytes.
    151  * @param[in] messages The number of datagrams per socket to be sent.
     130               
     131                if (verbose)
     132                        print_mark(index);
     133        }
     134       
     135        return EOK;
     136}
     137
     138/** Send data via sockets.
     139 *
     140 * @param[in] verbose    Print out verbose information.
     141 * @param[in] socket_ids Stored socket identifiers.
     142 * @param[in] sockets    Number of sockets.
     143 * @param[in] address    Destination host address to send data to.
     144 * @param[in] addrlen    Length of the destination address in bytes.
     145 * @param[in] data       Data to be sent.
     146 * @param[in] size       Size of the data in bytes.
     147 * @param[in] messages   Number of datagrams per socket to be sent.
     148 * @param[in] type       Socket type.
     149 *
    152150 * @return EOK on success.
    153151 * @return Other error codes as defined for the sendto() function.
    154  */
    155 int sockets_sendto(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t addrlen, char *data, int size, int messages)
    156 {
    157         int index;
    158         int message;
    159         int rc;
    160 
     152 *
     153 */
     154int sockets_sendto(int verbose, int *socket_ids, unsigned int sockets,
     155    struct sockaddr *address, socklen_t addrlen, char *data, size_t size,
     156    unsigned int messages, sock_type_t type)
     157{
    161158        if (verbose)
    162159                printf("\tSendto\t");
    163 
    164         fflush(stdout);
    165        
    166         for (index = 0; index < sockets; index++) {
    167                 for (message = 0; message < messages; message++) {
    168                         rc = sendto(socket_ids[index], data, size, 0, address, addrlen);
     160       
     161        fflush(stdout);
     162       
     163        for (unsigned int index = 0; index < sockets; index++) {
     164                for (unsigned int message = 0; message < messages; message++) {
     165                        int rc;
     166                       
     167                        switch (type) {
     168                        case SOCK_STREAM:
     169                                rc = send(socket_ids[index], data, size, 0);
     170                                break;
     171                        case SOCK_DGRAM:
     172                                rc = sendto(socket_ids[index], data, size, 0, address, addrlen);
     173                                break;
     174                        default:
     175                                rc = EINVAL;
     176                        }
     177                       
    169178                        if (rc != EOK) {
    170                                 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
     179                                printf("Socket %u (%d), message %u error:\n",
     180                                    index, socket_ids[index], message);
    171181                                socket_print_error(stderr, rc, "Socket send: ", "\n");
    172182                                return rc;
    173183                        }
    174184                }
    175                 if (verbose)
    176                         print_mark(index);
    177         }
    178        
    179         return EOK;
    180 }
    181 
    182 /** Receives data via sockets.
    183  *
    184  * @param[in] verbose A value indicating whether to print out verbose information.
    185  * @param[in] socket_ids A field of stored socket identifiers.
    186  * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
    187  * @param[in] address The source host address of received datagrams.
    188  * @param[in,out] addrlen The maximum length of the source address in bytes. The actual size of the source address is set instead.
    189  * @param[out] data The received data.
    190  * @param[in] size The maximum data size in bytes.
    191  * @param[in] messages The number of datagrams per socket to be received.
     185               
     186                if (verbose)
     187                        print_mark(index);
     188        }
     189       
     190        return EOK;
     191}
     192
     193/** Receive data via sockets.
     194 *
     195 * @param[in]     verbose    Print out verbose information.
     196 * @param[in]     socket_ids Stored socket identifiers.
     197 * @param[in]     sockets    Number of sockets.
     198 * @param[in]     address    Source host address of received datagrams.
     199 * @param[in,out] addrlen    Maximum length of the source address in bytes.
     200 *                           The actual size of the source address is set.
     201 * @param[out]    data       Received data.
     202 * @param[in]     size       Maximum data size in bytes.
     203 * @param[in]     messages   Number of datagrams per socket to be received.
     204 *
    192205 * @return EOK on success.
    193206 * @return Other error codes as defined for the recvfrom() function.
    194  */
    195 int sockets_recvfrom(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t *addrlen, char *data, int size, int messages)
    196 {
    197         int value;
    198         int index;
    199         int message;
    200 
     207 *
     208 */
     209int sockets_recvfrom(int verbose, int *socket_ids, unsigned int sockets,
     210    struct sockaddr *address, socklen_t *addrlen, char *data, size_t size,
     211    unsigned int messages)
     212{
    201213        if (verbose)
    202214                printf("\tRecvfrom\t");
     
    204216        fflush(stdout);
    205217       
    206         for (index = 0; index < sockets; index++) {
    207                 for (message = 0; message < messages; message++) {
    208                         value = recvfrom(socket_ids[index], data, size, 0, address, addrlen);
    209                         if (value < 0) {
    210                                 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
    211                                 socket_print_error(stderr, value, "Socket receive: ", "\n");
    212                                 return value;
    213                         }
    214                 }
    215                 if (verbose)
    216                         print_mark(index);
    217         }
    218         return EOK;
    219 }
    220 
    221 /** Sends and receives data via sockets.
     218        for (unsigned int index = 0; index < sockets; index++) {
     219                for (unsigned int message = 0; message < messages; message++) {
     220                        int rc = recvfrom(socket_ids[index], data, size, 0, address, addrlen);
     221                        if (rc < 0) {
     222                                printf("Socket %u (%d), message %u error:\n",
     223                                    index, socket_ids[index], message);
     224                                socket_print_error(stderr, rc, "Socket receive: ", "\n");
     225                                return rc;
     226                        }
     227                }
     228               
     229                if (verbose)
     230                        print_mark(index);
     231        }
     232       
     233        return EOK;
     234}
     235
     236/** Send and receive data via sockets.
    222237 *
    223238 * Each datagram is sent and a reply read consequently.
    224239 * The next datagram is sent after the reply is received.
    225240 *
    226  * @param[in] verbose A value indicating whether to print out verbose information.
    227  * @param[in] socket_ids A field of stored socket identifiers.
    228  * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
    229  * @param[in,out] address The destination host address to send data to. The source host address of received datagrams is set instead.
    230  * @param[in] addrlen The length of the destination address in bytes.
    231  * @param[in,out] data The data to be sent. The received data are set instead.
    232  * @param[in] size The data size in bytes.
    233  * @param[in] messages The number of datagrams per socket to be received.
     241 * @param[in]     verbose    Print out verbose information.
     242 * @param[in]     socket_ids Stored socket identifiers.
     243 * @param[in]     sockets    Number of sockets.
     244 * @param[in,out] address    Destination host address to send data to.
     245 *                           The source host address of received datagrams is set.
     246 * @param[in]     addrlen    Length of the destination address in bytes.
     247 * @param[in,out] data       Data to be sent. The received data are set.
     248 * @param[in]     size       Size of the data in bytes.
     249 * @param[in]     messages   Number of datagrams per socket to be received.
     250 * @param[in]     type       Socket type.
     251 *
    234252 * @return EOK on success.
    235253 * @return Other error codes as defined for the recvfrom() function.
    236  */
    237 int sockets_sendto_recvfrom(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t *addrlen, char *data, int size, int messages)
    238 {
    239         int value;
    240         int index;
    241         int message;
    242         int rc;
    243 
     254 *
     255 */
     256int sockets_sendto_recvfrom(int verbose, int *socket_ids, unsigned int sockets,
     257    struct sockaddr *address, socklen_t *addrlen, char *data,
     258    size_t size, unsigned int messages, sock_type_t type)
     259{
    244260        if (verbose)
    245261                printf("\tSendto and recvfrom\t");
    246 
    247         fflush(stdout);
    248        
    249         for (index = 0; index < sockets; index++) {
    250                 for (message = 0; message < messages; message++) {
    251                         rc = sendto(socket_ids[index], data, size, 0, address, *addrlen);
     262       
     263        fflush(stdout);
     264       
     265        for (unsigned int index = 0; index < sockets; index++) {
     266                for (unsigned int message = 0; message < messages; message++) {
     267                        int rc;
     268                       
     269                        switch (type) {
     270                        case SOCK_STREAM:
     271                                rc = send(socket_ids[index], data, size, 0);
     272                                break;
     273                        case SOCK_DGRAM:
     274                                rc = sendto(socket_ids[index], data, size, 0, address, *addrlen);
     275                                break;
     276                        default:
     277                                rc = EINVAL;
     278                        }
     279                       
    252280                        if (rc != EOK) {
    253                                 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
     281                                printf("Socket %u (%d), message %u error:\n",
     282                                    index, socket_ids[index], message);
    254283                                socket_print_error(stderr, rc, "Socket send: ", "\n");
    255284                                return rc;
    256285                        }
    257                         value = recvfrom(socket_ids[index], data, size, 0, address, addrlen);
    258                         if (value < 0) {
    259                                 printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
    260                                 socket_print_error(stderr, value, "Socket receive: ", "\n");
    261                                 return value;
    262                         }
    263                 }
     286                       
     287                        rc = recvfrom(socket_ids[index], data, size, 0, address, addrlen);
     288                        if (rc < 0) {
     289                                printf("Socket %u (%d), message %u error:\n",
     290                                    index, socket_ids[index], message);
     291                                socket_print_error(stderr, rc, "Socket receive: ", "\n");
     292                                return rc;
     293                        }
     294                }
     295               
    264296                if (verbose)
    265297                        print_mark(index);
     
    274306 *
    275307 * @param[in] index The index of the mark to be printed.
    276  */
    277 void print_mark(int index)
     308 *
     309 */
     310void print_mark(unsigned int index)
    278311{
    279312        if ((index + 1) % 10)
     
    281314        else
    282315                printf("|");
     316       
    283317        fflush(stdout);
    284318}
  • uspace/app/nettest1/nettest.h

    r47f5a77 r3a0a4d8  
    4040#include <net/socket.h>
    4141
    42 extern void print_mark(int);
    43 extern int sockets_create(int, int *, int, int, sock_type_t);
    44 extern int sockets_close(int, int *, int);
    45 extern int sockets_connect(int, int *, int, struct sockaddr *, socklen_t);
    46 extern int sockets_sendto(int, int *, int, struct sockaddr *, socklen_t, char *, int, int);
    47 extern int sockets_recvfrom(int, int *, int, struct sockaddr *, socklen_t *, char *, int, int);
    48 extern int sockets_sendto_recvfrom(int, int *, int, struct sockaddr *, socklen_t *, char *, int, int);
     42extern void print_mark(unsigned int);
     43extern int sockets_create(int, int *, unsigned int, uint16_t, sock_type_t);
     44extern int sockets_close(int, int *, unsigned int);
     45extern int sockets_connect(int, int *, unsigned int, struct sockaddr *,
     46    socklen_t);
     47extern int sockets_sendto(int, int *, unsigned int, struct sockaddr *,
     48    socklen_t, char *, size_t, unsigned int, sock_type_t);
     49extern int sockets_recvfrom(int, int *, unsigned int, struct sockaddr *,
     50    socklen_t *, char *, size_t, unsigned int);
     51extern int sockets_sendto_recvfrom(int, int *, unsigned int, struct sockaddr *,
     52    socklen_t *, char *, size_t, unsigned int, sock_type_t);
    4953
    5054#endif
  • uspace/app/nettest1/nettest1.c

    r47f5a77 r3a0a4d8  
    253253       
    254254        rc = sockets_sendto_recvfrom(verbose, socket_ids, nsockets, address,
    255             &addrlen, data, size, nmessages);
     255            &addrlen, data, size, nmessages, type);
    256256        if (rc != EOK)
    257257                return rc;
     
    278278       
    279279        rc = sockets_sendto(verbose, socket_ids, nsockets, address, addrlen,
    280             data, size, nmessages);
     280            data, size, nmessages, type);
    281281        if (rc != EOK)
    282282                return rc;
     
    335335                /* Interpret as a host name */
    336336                dnsr_hostinfo_t *hinfo = NULL;
    337                 rc = dnsr_name2host(addr_s, &hinfo);
     337                rc = dnsr_name2host(addr_s, &hinfo, family);
    338338               
    339339                if (rc != EOK) {
  • uspace/app/nettest2/nettest2.c

    r47f5a77 r3a0a4d8  
    271271                /* Interpret as a host name */
    272272                dnsr_hostinfo_t *hinfo = NULL;
    273                 rc = dnsr_name2host(addr_s, &hinfo);
     273                rc = dnsr_name2host(addr_s, &hinfo, family);
    274274               
    275275                if (rc != EOK) {
     
    375375       
    376376        rc = sockets_sendto_recvfrom(verbose, socket_ids, sockets, address,
    377             &addrlen, data, size, messages);
     377            &addrlen, data, size, messages, type);
    378378        if (rc != EOK)
    379379                return rc;
     
    399399       
    400400        rc = sockets_sendto(verbose, socket_ids, sockets, address, addrlen,
    401             data, size, messages);
     401            data, size, messages, type);
    402402        if (rc != EOK)
    403403                return rc;
  • uspace/app/nettest3/nettest3.c

    r47f5a77 r3a0a4d8  
    7878                if (rc != EOK) {
    7979                        /* Try interpreting as a host name */
    80                         rc = dnsr_name2host(argv[1], &hinfo);
     80                        rc = dnsr_name2host(argv[1], &hinfo, AF_INET);
    8181                        if (rc != EOK) {
    8282                                printf("Error resolving host '%s'.\n", argv[1]);
  • uspace/app/nterm/conn.c

    r47f5a77 r3a0a4d8  
    8484                /* Interpret as a host name */
    8585                dnsr_hostinfo_t *hinfo = NULL;
    86                 rc = dnsr_name2host(addr_s, &hinfo);
     86                rc = dnsr_name2host(addr_s, &hinfo, 0);
    8787               
    8888                if (rc != EOK) {
  • uspace/app/ping/ping.c

    r47f5a77 r3a0a4d8  
    4242#include <inet/inetping.h>
    4343#include <io/console.h>
     44#include <getopt.h>
    4445#include <stdio.h>
    4546#include <stdlib.h>
     47#include <str.h>
     48#include <str_error.h>
    4649#include <sys/types.h>
    4750
     
    5457#define PING_TIMEOUT (1000 * 1000)
    5558
     59typedef enum {
     60        RECEIVED_NONE,
     61        RECEIVED_SUCCESS,
     62        RECEIVED_INTERRUPT
     63} received_t;
     64
     65static received_t received;
     66static FIBRIL_CONDVAR_INITIALIZE(received_cv);
     67static FIBRIL_MUTEX_INITIALIZE(received_lock);
     68
     69static bool quit = false;
     70static FIBRIL_CONDVAR_INITIALIZE(quit_cv);
     71static FIBRIL_MUTEX_INITIALIZE(quit_lock);
     72
    5673static int ping_ev_recv(inetping_sdu_t *);
    57 
    58 static bool done = false;
    59 static FIBRIL_CONDVAR_INITIALIZE(done_cv);
    60 static FIBRIL_MUTEX_INITIALIZE(done_lock);
    6174
    6275static inetping_ev_ops_t ev_ops = {
     
    6780static addr32_t dest;
    6881
    69 static bool ping_repeat = false;
     82static bool repeat_forever = false;
     83static size_t repeat_count = 1;
     84
     85static const char *short_options = "rn:";
    7086
    7187static void print_syntax(void)
    7288{
    73         printf("syntax: " NAME " [-r] <host>\n");
    74 }
    75 
    76 static void ping_signal_done(void)
    77 {
    78         fibril_mutex_lock(&done_lock);
    79         done = true;
    80         fibril_mutex_unlock(&done_lock);
    81         fibril_condvar_broadcast(&done_cv);
     89        printf("Syntax: %s [-n <count>|-r] <host>\n", NAME);
     90}
     91
     92static void ping_signal_received(received_t value)
     93{
     94        fibril_mutex_lock(&received_lock);
     95        received = value;
     96        fibril_mutex_unlock(&received_lock);
     97        fibril_condvar_broadcast(&received_cv);
     98}
     99
     100static void ping_signal_quit(void)
     101{
     102        fibril_mutex_lock(&quit_lock);
     103        quit = true;
     104        fibril_mutex_unlock(&quit_lock);
     105        fibril_condvar_broadcast(&quit_cv);
    82106}
    83107
     
    105129            "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size);
    106130       
    107         if (!ping_repeat)
    108                 ping_signal_done();
     131        ping_signal_received(RECEIVED_SUCCESS);
    109132       
    110133        free(asrc);
     
    116139{
    117140        inetping_sdu_t sdu;
    118         int rc;
    119 
     141       
    120142        sdu.src = src;
    121143        sdu.dest = dest;
     
    123145        sdu.data = (void *) "foo";
    124146        sdu.size = 3;
    125 
    126         rc = inetping_send(&sdu);
    127         if (rc != EOK) {
    128                 printf(NAME ": Failed sending echo request (%d).\n", rc);
    129                 return rc;
    130         }
    131 
    132         return EOK;
     147       
     148        int rc = inetping_send(&sdu);
     149        if (rc != EOK)
     150                printf("Failed sending echo request: %s (%d).\n",
     151                    str_error(rc), rc);
     152       
     153        return rc;
    133154}
    134155
     
    136157{
    137158        uint16_t seq_no = 0;
    138 
     159       
     160        while ((repeat_count--) || (repeat_forever)) {
     161                fibril_mutex_lock(&received_lock);
     162                received = RECEIVED_NONE;
     163                fibril_mutex_unlock(&received_lock);
     164               
     165                (void) ping_send(++seq_no);
     166               
     167                fibril_mutex_lock(&received_lock);
     168                int rc = fibril_condvar_wait_timeout(&received_cv, &received_lock,
     169                    PING_TIMEOUT);
     170                received_t recv = received;
     171                fibril_mutex_unlock(&received_lock);
     172               
     173                if ((rc == ETIMEOUT) || (recv == RECEIVED_NONE))
     174                        printf("Echo request timed out (seq. no %u)\n", seq_no);
     175               
     176                if (recv == RECEIVED_INTERRUPT)
     177                        break;
     178               
     179                if ((repeat_count > 0) || (repeat_forever)) {
     180                        fibril_mutex_lock(&received_lock);
     181                        rc = fibril_condvar_wait_timeout(&received_cv, &received_lock,
     182                            PING_DELAY);
     183                        recv = received;
     184                        fibril_mutex_unlock(&received_lock);
     185                       
     186                        if (recv == RECEIVED_INTERRUPT)
     187                                break;
     188                }
     189        }
     190       
     191        ping_signal_quit();
     192        return 0;
     193}
     194
     195static int input_fibril(void *arg)
     196{
     197        console_ctrl_t *con = console_init(stdin, stdout);
     198       
    139199        while (true) {
    140                 fibril_mutex_lock(&done_lock);
    141                 if (done) {
    142                         fibril_mutex_unlock(&done_lock);
    143                         return 0;
    144                 }
    145                 fibril_mutex_unlock(&done_lock);
    146 
    147                 (void) ping_send(++seq_no);
    148                 async_usleep(PING_DELAY);
    149         }
    150 
    151         return 0;
    152 }
    153 
    154 static int input_fibril(void *arg)
    155 {
    156         console_ctrl_t *con;
    157         cons_event_t ev;
    158 
    159         con = console_init(stdin, stdout);
    160         printf("[Press Ctrl-Q to quit]\n");
    161 
    162         while (true) {
     200                cons_event_t ev;
    163201                if (!console_get_event(con, &ev))
    164202                        break;
    165 
    166                 if (ev.type == CEV_KEY && ev.ev.key.type == KEY_PRESS &&
    167                     (ev.ev.key.mods & (KM_ALT | KM_SHIFT)) ==
    168                     0 && (ev.ev.key.mods & KM_CTRL) != 0) {
     203               
     204                if ((ev.type == CEV_KEY) && (ev.ev.key.type == KEY_PRESS) &&
     205                    ((ev.ev.key.mods & (KM_ALT | KM_SHIFT)) == 0) &&
     206                    ((ev.ev.key.mods & KM_CTRL) != 0)) {
    169207                        /* Ctrl+key */
    170208                        if (ev.ev.key.key == KC_Q) {
    171                                 ping_signal_done();
    172                                 return 0;
     209                                ping_signal_received(RECEIVED_INTERRUPT);
     210                                break;
    173211                        }
    174212                }
    175213        }
    176 
     214       
    177215        return 0;
    178216}
     
    184222        char *adest = NULL;
    185223        char *sdest = NULL;
    186         int rc;
    187         int argi;
    188 
    189         rc = inetping_init(&ev_ops);
    190         if (rc != EOK) {
    191                 printf(NAME ": Failed connecting to internet ping service "
    192                     "(%d).\n", rc);
    193                 goto error;
    194         }
    195 
    196         argi = 1;
    197         if (argi < argc && str_cmp(argv[argi], "-r") == 0) {
    198                 ping_repeat = true;
    199                 ++argi;
    200         } else {
    201                 ping_repeat = false;
    202         }
    203 
    204         if (argc - argi != 1) {
     224       
     225        int rc = inetping_init(&ev_ops);
     226        if (rc != EOK) {
     227                printf("Failed connecting to internet ping service: "
     228                    "%s (%d).\n", str_error(rc), rc);
     229                goto error;
     230        }
     231       
     232        int c;
     233        while ((c = getopt(argc, argv, short_options)) != -1) {
     234                switch (c) {
     235                case 'r':
     236                        repeat_forever = true;
     237                        break;
     238                case 'n':
     239                        rc = str_size_t(optarg, NULL, 10, true, &repeat_count);
     240                        if (rc != EOK) {
     241                                printf("Invalid repeat count.\n");
     242                                print_syntax();
     243                                goto error;
     244                        }
     245                        break;
     246                default:
     247                        printf("Unknown option passed.\n");
     248                        print_syntax();
     249                        goto error;
     250                }
     251        }
     252       
     253        if (optind >= argc) {
     254                printf("IP address or host name not supplied.\n");
    205255                print_syntax();
    206256                goto error;
    207257        }
    208 
     258       
    209259        /* Parse destination address */
    210260        inet_addr_t dest_addr;
    211         rc = inet_addr_parse(argv[argi], &dest_addr);
     261        rc = inet_addr_parse(argv[optind], &dest_addr);
    212262        if (rc != EOK) {
    213263                /* Try interpreting as a host name */
    214                 rc = dnsr_name2host(argv[argi], &hinfo);
     264                rc = dnsr_name2host(argv[optind], &hinfo, AF_INET);
    215265                if (rc != EOK) {
    216                         printf(NAME ": Error resolving host '%s'.\n", argv[argi]);
     266                        printf("Error resolving host '%s'.\n", argv[optind]);
    217267                        goto error;
    218268                }
     
    223273        uint16_t af = inet_addr_get(&dest_addr, &dest, NULL);
    224274        if (af != AF_INET) {
    225                 printf(NAME ": Destination '%s' is not an IPv4 address.\n",
    226                     argv[argi]);
     275                printf("Destination '%s' is not an IPv4 address.\n",
     276                    argv[optind]);
    227277                goto error;
    228278        }
     
    231281        rc = inetping_get_srcaddr(dest, &src);
    232282        if (rc != EOK) {
    233                 printf(NAME ": Failed determining source address.\n");
     283                printf("Failed determining source address.\n");
    234284                goto error;
    235285        }
     
    240290        rc = inet_addr_format(&src_addr, &asrc);
    241291        if (rc != EOK) {
    242                 printf(NAME ": Out of memory.\n");
     292                printf("Out of memory.\n");
    243293                goto error;
    244294        }
     
    246296        rc = inet_addr_format(&dest_addr, &adest);
    247297        if (rc != EOK) {
    248                 printf(NAME ": Out of memory.\n");
     298                printf("Out of memory.\n");
    249299                goto error;
    250300        }
     
    253303                rc = asprintf(&sdest, "%s (%s)", hinfo->cname, adest);
    254304                if (rc < 0) {
    255                         printf(NAME ": Out of memory.\n");
     305                        printf("Out of memory.\n");
    256306                        goto error;
    257307                }
     
    260310                adest = NULL;
    261311        }
    262 
    263         printf("Sending ICMP echo request from %s to %s.\n",
     312       
     313        printf("Sending ICMP echo request from %s to %s (Ctrl+Q to quit)\n",
    264314            asrc, sdest);
    265 
    266         fid_t fid;
    267 
    268         if (ping_repeat) {
    269                 fid = fibril_create(transmit_fibril, NULL);
    270                 if (fid == 0) {
    271                         printf(NAME ": Failed creating transmit fibril.\n");
    272                         goto error;
    273                 }
    274 
    275                 fibril_add_ready(fid);
    276 
    277                 fid = fibril_create(input_fibril, NULL);
    278                 if (fid == 0) {
    279                         printf(NAME ": Failed creating input fibril.\n");
    280                         goto error;
    281                 }
    282 
    283                 fibril_add_ready(fid);
    284         } else {
    285                 ping_send(1);
    286         }
    287 
    288         fibril_mutex_lock(&done_lock);
    289         rc = EOK;
    290         while (!done && rc != ETIMEOUT) {
    291                 rc = fibril_condvar_wait_timeout(&done_cv, &done_lock,
    292                         ping_repeat ? 0 : PING_TIMEOUT);
    293         }
    294         fibril_mutex_unlock(&done_lock);
    295 
    296         if (rc == ETIMEOUT) {
    297                 printf(NAME ": Echo request timed out.\n");
    298                 goto error;
    299         }
    300 
     315       
     316        fid_t fid = fibril_create(transmit_fibril, NULL);
     317        if (fid == 0) {
     318                printf("Failed creating transmit fibril.\n");
     319                goto error;
     320        }
     321       
     322        fibril_add_ready(fid);
     323       
     324        fid = fibril_create(input_fibril, NULL);
     325        if (fid == 0) {
     326                printf("Failed creating input fibril.\n");
     327                goto error;
     328        }
     329       
     330        fibril_add_ready(fid);
     331       
     332        fibril_mutex_lock(&quit_lock);
     333        while (!quit)
     334                fibril_condvar_wait(&quit_cv, &quit_lock);
     335        fibril_mutex_unlock(&quit_lock);
     336       
    301337        free(asrc);
    302338        free(adest);
  • uspace/app/ping6/ping6.c

    r47f5a77 r3a0a4d8  
    4242#include <inet/inetping6.h>
    4343#include <io/console.h>
     44#include <getopt.h>
    4445#include <stdio.h>
    4546#include <stdlib.h>
     47#include <str.h>
     48#include <str_error.h>
    4649#include <sys/types.h>
    4750
     
    5457#define PING_TIMEOUT (1000 * 1000)
    5558
     59typedef enum {
     60        RECEIVED_NONE,
     61        RECEIVED_SUCCESS,
     62        RECEIVED_INTERRUPT
     63} received_t;
     64
     65static received_t received;
     66static FIBRIL_CONDVAR_INITIALIZE(received_cv);
     67static FIBRIL_MUTEX_INITIALIZE(received_lock);
     68
     69static bool quit = false;
     70static FIBRIL_CONDVAR_INITIALIZE(quit_cv);
     71static FIBRIL_MUTEX_INITIALIZE(quit_lock);
     72
    5673static int ping_ev_recv(inetping6_sdu_t *);
    57 
    58 static bool done = false;
    59 static FIBRIL_CONDVAR_INITIALIZE(done_cv);
    60 static FIBRIL_MUTEX_INITIALIZE(done_lock);
    6174
    6275static inetping6_ev_ops_t ev_ops = {
     
    6780static addr128_t dest;
    6881
    69 static bool ping_repeat = false;
     82static bool repeat_forever = false;
     83static size_t repeat_count = 1;
     84
     85static const char *short_options = "rn:";
    7086
    7187static void print_syntax(void)
    7288{
    73         printf("syntax: " NAME " [-r] <host>\n");
    74 }
    75 
    76 static void ping_signal_done(void)
    77 {
    78         fibril_mutex_lock(&done_lock);
    79         done = true;
    80         fibril_mutex_unlock(&done_lock);
    81         fibril_condvar_broadcast(&done_cv);
     89        printf("Syntax: %s [-n <count>|-r] <host>\n", NAME);
     90}
     91
     92static void ping_signal_received(received_t value)
     93{
     94        fibril_mutex_lock(&received_lock);
     95        received = value;
     96        fibril_mutex_unlock(&received_lock);
     97        fibril_condvar_broadcast(&received_cv);
     98}
     99
     100static void ping_signal_quit(void)
     101{
     102        fibril_mutex_lock(&quit_lock);
     103        quit = true;
     104        fibril_mutex_unlock(&quit_lock);
     105        fibril_condvar_broadcast(&quit_cv);
    82106}
    83107
     
    105129            "payload size %zu\n", asrc, adest, sdu->seq_no, sdu->size);
    106130       
    107         if (!ping_repeat)
    108                 ping_signal_done();
     131        ping_signal_received(RECEIVED_SUCCESS);
    109132       
    110133        free(asrc);
     
    116139{
    117140        inetping6_sdu_t sdu;
    118         int rc;
    119 
     141       
    120142        addr128(src, sdu.src);
    121143        addr128(dest, sdu.dest);
     
    123145        sdu.data = (void *) "foo";
    124146        sdu.size = 3;
    125 
    126         rc = inetping6_send(&sdu);
    127         if (rc != EOK) {
    128                 printf(NAME ": Failed sending echo request (%d).\n", rc);
    129                 return rc;
    130         }
    131 
    132         return EOK;
     147       
     148        int rc = inetping6_send(&sdu);
     149        if (rc != EOK)
     150                printf("Failed sending echo request: %s (%d).\n",
     151                    str_error(rc), rc);
     152       
     153        return rc;
    133154}
    134155
     
    136157{
    137158        uint16_t seq_no = 0;
    138 
     159       
     160        while ((repeat_count--) || (repeat_forever)) {
     161                fibril_mutex_lock(&received_lock);
     162                received = RECEIVED_NONE;
     163                fibril_mutex_unlock(&received_lock);
     164               
     165                (void) ping_send(++seq_no);
     166               
     167                fibril_mutex_lock(&received_lock);
     168                int rc = fibril_condvar_wait_timeout(&received_cv, &received_lock,
     169                    PING_TIMEOUT);
     170                received_t recv = received;
     171                fibril_mutex_unlock(&received_lock);
     172               
     173                if ((rc == ETIMEOUT) || (recv == RECEIVED_NONE))
     174                        printf("Echo request timed out (seq. no %u)\n", seq_no);
     175               
     176                if (recv == RECEIVED_INTERRUPT)
     177                        break;
     178               
     179                if ((repeat_count > 0) || (repeat_forever)) {
     180                        fibril_mutex_lock(&received_lock);
     181                        rc = fibril_condvar_wait_timeout(&received_cv, &received_lock,
     182                            PING_DELAY);
     183                        recv = received;
     184                        fibril_mutex_unlock(&received_lock);
     185                       
     186                        if (recv == RECEIVED_INTERRUPT)
     187                                break;
     188                }
     189        }
     190       
     191        ping_signal_quit();
     192        return 0;
     193}
     194
     195static int input_fibril(void *arg)
     196{
     197        console_ctrl_t *con = console_init(stdin, stdout);
     198       
    139199        while (true) {
    140                 fibril_mutex_lock(&done_lock);
    141                 if (done) {
    142                         fibril_mutex_unlock(&done_lock);
    143                         return 0;
    144                 }
    145                 fibril_mutex_unlock(&done_lock);
    146 
    147                 (void) ping_send(++seq_no);
    148                 async_usleep(PING_DELAY);
    149         }
    150 
    151         return 0;
    152 }
    153 
    154 static int input_fibril(void *arg)
    155 {
    156         console_ctrl_t *con;
    157         cons_event_t ev;
    158 
    159         con = console_init(stdin, stdout);
    160         printf("[Press Ctrl-Q to quit]\n");
    161 
    162         while (true) {
     200                cons_event_t ev;
    163201                if (!console_get_event(con, &ev))
    164202                        break;
    165 
    166                 if (ev.type == CEV_KEY && ev.ev.key.type == KEY_PRESS &&
    167                     (ev.ev.key.mods & (KM_ALT | KM_SHIFT)) ==
    168                     0 && (ev.ev.key.mods & KM_CTRL) != 0) {
     203               
     204                if ((ev.type == CEV_KEY) && (ev.ev.key.type == KEY_PRESS) &&
     205                    ((ev.ev.key.mods & (KM_ALT | KM_SHIFT)) == 0) &&
     206                    ((ev.ev.key.mods & KM_CTRL) != 0)) {
    169207                        /* Ctrl+key */
    170208                        if (ev.ev.key.key == KC_Q) {
    171                                 ping_signal_done();
    172                                 return 0;
     209                                ping_signal_received(RECEIVED_INTERRUPT);
     210                                break;
    173211                        }
    174212                }
    175213        }
    176 
     214       
    177215        return 0;
    178216}
     
    184222        char *adest = NULL;
    185223        char *sdest = NULL;
    186         int rc;
    187         int argi;
    188 
    189         rc = inetping6_init(&ev_ops);
    190         if (rc != EOK) {
    191                 printf(NAME ": Failed connecting to internet ping service "
    192                     "(%d).\n", rc);
    193                 goto error;
    194         }
    195 
    196         argi = 1;
    197         if (argi < argc && str_cmp(argv[argi], "-r") == 0) {
    198                 ping_repeat = true;
    199                 ++argi;
    200         } else {
    201                 ping_repeat = false;
    202         }
    203 
    204         if (argc - argi != 1) {
     224       
     225        int rc = inetping6_init(&ev_ops);
     226        if (rc != EOK) {
     227                printf("Failed connecting to internet ping service: "
     228                    "%s (%d).\n", str_error(rc), rc);
     229                goto error;
     230        }
     231       
     232        int c;
     233        while ((c = getopt(argc, argv, short_options)) != -1) {
     234                switch (c) {
     235                case 'r':
     236                        repeat_forever = true;
     237                        break;
     238                case 'n':
     239                        rc = str_size_t(optarg, NULL, 10, true, &repeat_count);
     240                        if (rc != EOK) {
     241                                printf("Invalid repeat count.\n");
     242                                print_syntax();
     243                                goto error;
     244                        }
     245                        break;
     246                default:
     247                        printf("Unknown option passed.\n");
     248                        print_syntax();
     249                        goto error;
     250                }
     251        }
     252       
     253        if (optind >= argc) {
     254                printf("IP address or host name not supplied.\n");
    205255                print_syntax();
    206256                goto error;
    207257        }
    208 
     258       
    209259        /* Parse destination address */
    210260        inet_addr_t dest_addr;
    211         rc = inet_addr_parse(argv[argi], &dest_addr);
     261        rc = inet_addr_parse(argv[optind], &dest_addr);
    212262        if (rc != EOK) {
    213263                /* Try interpreting as a host name */
    214                 rc = dnsr_name2host(argv[argi], &hinfo);
     264                rc = dnsr_name2host(argv[optind], &hinfo, AF_INET);
    215265                if (rc != EOK) {
    216                         printf(NAME ": Error resolving host '%s'.\n", argv[argi]);
     266                        printf("Error resolving host '%s'.\n", argv[optind]);
    217267                        goto error;
    218268                }
     
    223273        uint16_t af = inet_addr_get(&dest_addr, NULL, &dest);
    224274        if (af != AF_INET6) {
    225                 printf(NAME ": Destination '%s' is not an IPv6 address.\n",
    226                     argv[argi]);
     275                printf("Destination '%s' is not an IPv6 address.\n",
     276                    argv[optind]);
    227277                goto error;
    228278        }
     
    231281        rc = inetping6_get_srcaddr(dest, src);
    232282        if (rc != EOK) {
    233                 printf(NAME ": Failed determining source address.\n");
     283                printf("Failed determining source address.\n");
    234284                goto error;
    235285        }
     
    240290        rc = inet_addr_format(&src_addr, &asrc);
    241291        if (rc != EOK) {
    242                 printf(NAME ": Out of memory.\n");
     292                printf("Out of memory.\n");
    243293                goto error;
    244294        }
     
    246296        rc = inet_addr_format(&dest_addr, &adest);
    247297        if (rc != EOK) {
    248                 printf(NAME ": Out of memory.\n");
     298                printf("Out of memory.\n");
    249299                goto error;
    250300        }
     
    253303                rc = asprintf(&sdest, "%s (%s)", hinfo->cname, adest);
    254304                if (rc < 0) {
    255                         printf(NAME ": Out of memory.\n");
     305                        printf("Out of memory.\n");
    256306                        goto error;
    257307                }
     
    260310                adest = NULL;
    261311        }
    262 
    263         printf("Sending ICMP echo request from %s to %s.\n",
     312       
     313        printf("Sending ICMP echo request from %s to %s (Ctrl+Q to quit)\n",
    264314            asrc, sdest);
    265 
    266         fid_t fid;
    267 
    268         if (ping_repeat) {
    269                 fid = fibril_create(transmit_fibril, NULL);
    270                 if (fid == 0) {
    271                         printf(NAME ": Failed creating transmit fibril.\n");
    272                         goto error;
    273                 }
    274 
    275                 fibril_add_ready(fid);
    276 
    277                 fid = fibril_create(input_fibril, NULL);
    278                 if (fid == 0) {
    279                         printf(NAME ": Failed creating input fibril.\n");
    280                         goto error;
    281                 }
    282 
    283                 fibril_add_ready(fid);
    284         } else {
    285                 ping_send(1);
    286         }
    287 
    288         fibril_mutex_lock(&done_lock);
    289         rc = EOK;
    290         while (!done && rc != ETIMEOUT) {
    291                 rc = fibril_condvar_wait_timeout(&done_cv, &done_lock,
    292                         ping_repeat ? 0 : PING_TIMEOUT);
    293         }
    294         fibril_mutex_unlock(&done_lock);
    295 
    296         if (rc == ETIMEOUT) {
    297                 printf(NAME ": Echo request timed out.\n");
    298                 goto error;
    299         }
    300 
     315       
     316        fid_t fid = fibril_create(transmit_fibril, NULL);
     317        if (fid == 0) {
     318                printf("Failed creating transmit fibril.\n");
     319                goto error;
     320        }
     321       
     322        fibril_add_ready(fid);
     323       
     324        fid = fibril_create(input_fibril, NULL);
     325        if (fid == 0) {
     326                printf("Failed creating input fibril.\n");
     327                goto error;
     328        }
     329       
     330        fibril_add_ready(fid);
     331       
     332        fibril_mutex_lock(&quit_lock);
     333        while (!quit)
     334                fibril_condvar_wait(&quit_cv, &quit_lock);
     335        fibril_mutex_unlock(&quit_lock);
     336       
    301337        free(asrc);
    302338        free(adest);
  • uspace/app/tester/mm/common.c

    r47f5a77 r3a0a4d8  
    8484}
    8585
    86 static bool overlap_match(link_t *link, void *addr, size_t size)
    87 {
    88         mem_block_t *block = list_get_instance(link, mem_block_t, link);
    89        
     86static bool overlap_match(mem_block_t *block, void *addr, size_t size)
     87{
    9088        /* Entry block control structure <mbeg, mend) */
    9189        uint8_t *mbeg = (uint8_t *) block;
     
    125123        bool fnd = false;
    126124       
    127         list_foreach(mem_blocks, link) {
    128                 if (overlap_match(link, addr, size)) {
     125        list_foreach(mem_blocks, link, mem_block_t, block) {
     126                if (overlap_match(block, addr, size)) {
    129127                        fnd = true;
    130128                        break;
  • uspace/app/trace/trace.c

    r47f5a77 r3a0a4d8  
    724724        o = oper_new("stat", 0, arg_def, V_ERRNO, 0, resp_def);
    725725        proto_add_oper(p, VFS_IN_STAT, o);
     726        o = oper_new("statfs", 0, arg_def, V_ERRNO, 0, resp_def);
     727        proto_add_oper(p, VFS_IN_STATFS, o);
    726728
    727729        proto_register(SERVICE_VFS, p);
  • uspace/app/usbinfo/dump.c

    r47f5a77 r3a0a4d8  
    103103void dump_match_ids(match_id_list_t *matches, const char *line_prefix)
    104104{
    105         list_foreach(matches->ids, link) {
    106                 match_id_t *match = list_get_instance(link, match_id_t, link);
    107 
     105        list_foreach(matches->ids, link, match_id_t, match) {
    108106                printf("%s%3d %s\n", line_prefix, match->score, match->id);
    109107        }
  • uspace/app/usbinfo/hid.c

    r47f5a77 r3a0a4d8  
    100100        printf("%sParsed HID report descriptor for interface %d\n",
    101101            get_indent(0), iface_no);
    102         list_foreach(report->reports, report_it) {
    103                 usb_hid_report_description_t *description = list_get_instance(
    104                     report_it, usb_hid_report_description_t, reports_link);
     102        list_foreach(report->reports, reports_link,
     103            usb_hid_report_description_t, description) {
    105104                printf("%sReport %d (type %d)\n", get_indent(1),
    106105                    (int) description->report_id,
    107106                    (int) description->type);
    108                 list_foreach(description->report_items, item_it) {
    109                         usb_hid_report_field_t *field = list_get_instance(
    110                             item_it, usb_hid_report_field_t, ritems_link);
     107                list_foreach(description->report_items, ritems_link,
     108                    usb_hid_report_field_t, field) {
    111109                        printf("%sUsage page = 0x%04x    Usage = 0x%04x\n",
    112110                            get_indent(2),
Note: See TracChangeset for help on using the changeset viewer.