Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/loader/main.c

    rb4cbef1 r622cdbe  
    125125static void ldr_set_cwd(ipc_callid_t rid, ipc_call_t *request)
    126126{
    127         char *buf;
    128         int rc = async_string_receive(&buf, 0, NULL);
    129        
    130         if (rc == EOK) {
    131                 if (cwd != NULL)
    132                         free(cwd);
    133                
    134                 cwd = buf;
    135         }
    136        
    137         ipc_answer_0(rid, rc);
     127        ipc_callid_t callid;
     128        size_t len;
     129       
     130        if (!async_data_write_receive(&callid, &len)) {
     131                ipc_answer_0(callid, EINVAL);
     132                ipc_answer_0(rid, EINVAL);
     133                return;
     134        }
     135       
     136        cwd = malloc(len + 1);
     137        if (!cwd) {
     138                ipc_answer_0(callid, ENOMEM);
     139                ipc_answer_0(rid, ENOMEM);
     140                return;
     141        }
     142       
     143        async_data_write_finalize(callid, cwd, len);
     144        cwd[len] = '\0';
     145       
     146        ipc_answer_0(rid, EOK);
    138147}
    139148
     
    145154static void ldr_set_pathname(ipc_callid_t rid, ipc_call_t *request)
    146155{
    147         char *buf;
    148         int rc = async_string_receive(&buf, 0, NULL);
    149        
    150         if (rc == EOK) {
    151                 if (pathname != NULL)
    152                         free(pathname);
    153                
    154                 pathname = buf;
    155         }
    156        
    157         ipc_answer_0(rid, rc);
     156        ipc_callid_t callid;
     157        size_t len;
     158        char *name_buf;
     159       
     160        if (!async_data_write_receive(&callid, &len)) {
     161                ipc_answer_0(callid, EINVAL);
     162                ipc_answer_0(rid, EINVAL);
     163                return;
     164        }
     165       
     166        name_buf = malloc(len + 1);
     167        if (!name_buf) {
     168                ipc_answer_0(callid, ENOMEM);
     169                ipc_answer_0(rid, ENOMEM);
     170                return;
     171        }
     172       
     173        async_data_write_finalize(callid, name_buf, len);
     174        ipc_answer_0(rid, EOK);
     175       
     176        if (pathname != NULL) {
     177                free(pathname);
     178                pathname = NULL;
     179        }
     180       
     181        name_buf[len] = '\0';
     182        pathname = name_buf;
    158183}
    159184
     
    165190static void ldr_set_args(ipc_callid_t rid, ipc_call_t *request)
    166191{
    167         char *buf;
    168         size_t buf_size;
    169         int rc = async_string_receive(&buf, 0, &buf_size);
    170        
    171         if (rc == EOK) {
    172                 /*
    173                  * Count number of arguments
    174                  */
    175                 char *cur = buf;
    176                 int count = 0;
     192        ipc_callid_t callid;
     193        size_t buf_size, arg_size;
     194        char *p;
     195        int n;
     196       
     197        if (!async_data_write_receive(&callid, &buf_size)) {
     198                ipc_answer_0(callid, EINVAL);
     199                ipc_answer_0(rid, EINVAL);
     200                return;
     201        }
     202       
     203        if (arg_buf != NULL) {
     204                free(arg_buf);
     205                arg_buf = NULL;
     206        }
     207       
     208        if (argv != NULL) {
     209                free(argv);
     210                argv = NULL;
     211        }
     212       
     213        arg_buf = malloc(buf_size + 1);
     214        if (!arg_buf) {
     215                ipc_answer_0(callid, ENOMEM);
     216                ipc_answer_0(rid, ENOMEM);
     217                return;
     218        }
     219       
     220        async_data_write_finalize(callid, arg_buf, buf_size);
     221       
     222        arg_buf[buf_size] = '\0';
     223       
     224        /*
     225         * Count number of arguments
     226         */
     227        p = arg_buf;
     228        n = 0;
     229        while (p < arg_buf + buf_size) {
     230                arg_size = str_size(p);
     231                p = p + arg_size + 1;
     232                ++n;
     233        }
     234       
     235        /* Allocate argv */
     236        argv = malloc((n + 1) * sizeof(char *));
     237       
     238        if (argv == NULL) {
     239                free(arg_buf);
     240                ipc_answer_0(rid, ENOMEM);
     241                return;
     242        }
     243
     244        /*
     245         * Fill argv with argument pointers
     246         */
     247        p = arg_buf;
     248        n = 0;
     249        while (p < arg_buf + buf_size) {
     250                argv[n] = p;
    177251               
    178                 while (cur < buf + buf_size) {
    179                         size_t arg_size = str_size(cur);
    180                         cur += arg_size + 1;
    181                         count++;
    182                 }
    183                
    184                 /*
    185                  * Allocate new argv
    186                  */
    187                 char **_argv = (char **) malloc((count + 1) * sizeof(char *));
    188                 if (_argv == NULL) {
    189                         free(buf);
    190                         ipc_answer_0(rid, ENOMEM);
    191                         return;
    192                 }
    193                
    194                 /*
    195                  * Fill the new argv with argument pointers
    196                  */
    197                 cur = buf;
    198                 count = 0;
    199                 while (cur < buf + buf_size) {
    200                         _argv[count] = cur;
    201                        
    202                         size_t arg_size = str_size(cur);
    203                         cur += arg_size + 1;
    204                         count++;
    205                 }
    206                 _argv[count] = NULL;
    207                
    208                 /*
    209                  * Copy temporary data to global variables
    210                  */
    211                 if (arg_buf != NULL)
    212                         free(arg_buf);
    213                
    214                 if (argv != NULL)
    215                         free(argv);
    216                
    217                 argc = count;
    218                 arg_buf = buf;
    219                 argv = _argv;
    220         }
    221        
    222         ipc_answer_0(rid, rc);
     252                arg_size = str_size(p);
     253                p = p + arg_size + 1;
     254                ++n;
     255        }
     256       
     257        argc = n;
     258        argv[n] = NULL;
     259
     260        ipc_answer_0(rid, EOK);
    223261}
    224262
     
    230268static void ldr_set_files(ipc_callid_t rid, ipc_call_t *request)
    231269{
    232         fdi_node_t *buf;
     270        ipc_callid_t callid;
    233271        size_t buf_size;
    234         int rc = async_data_receive(&buf, 0, 0, sizeof(fdi_node_t), &buf_size);
    235        
    236         if (rc == EOK) {
    237                 int count = buf_size / sizeof(fdi_node_t);
    238                
    239                 /*
    240                  * Allocate new filv
    241                  */
    242                 fdi_node_t **_filv = (fdi_node_t *) malloc((count + 1) * sizeof(fdi_node_t *));
    243                 if (_filv == NULL) {
    244                         free(buf);
    245                         ipc_answer_0(rid, ENOMEM);
    246                         return;
    247                 }
    248                
    249                 /*
    250                  * Fill the new filv with argument pointers
    251                  */
    252                 int i;
    253                 for (i = 0; i < count; i++)
    254                         _filv[i] = &buf[i];
    255                
    256                 _filv[count] = NULL;
    257                
    258                 /*
    259                  * Copy temporary data to global variables
    260                  */
    261                 if (fil_buf != NULL)
    262                         free(fil_buf);
    263                
    264                 if (filv != NULL)
    265                         free(filv);
    266                
    267                 filc = count;
    268                 fil_buf = buf;
    269                 filv = _filv;
    270         }
     272        if (!async_data_write_receive(&callid, &buf_size)) {
     273                ipc_answer_0(callid, EINVAL);
     274                ipc_answer_0(rid, EINVAL);
     275                return;
     276        }
     277       
     278        if ((buf_size % sizeof(fdi_node_t)) != 0) {
     279                ipc_answer_0(callid, EINVAL);
     280                ipc_answer_0(rid, EINVAL);
     281                return;
     282        }
     283       
     284        if (fil_buf != NULL) {
     285                free(fil_buf);
     286                fil_buf = NULL;
     287        }
     288       
     289        if (filv != NULL) {
     290                free(filv);
     291                filv = NULL;
     292        }
     293       
     294        fil_buf = malloc(buf_size);
     295        if (!fil_buf) {
     296                ipc_answer_0(callid, ENOMEM);
     297                ipc_answer_0(rid, ENOMEM);
     298                return;
     299        }
     300       
     301        async_data_write_finalize(callid, fil_buf, buf_size);
     302       
     303        int count = buf_size / sizeof(fdi_node_t);
     304       
     305        /* Allocate filvv */
     306        filv = malloc((count + 1) * sizeof(fdi_node_t *));
     307       
     308        if (filv == NULL) {
     309                free(fil_buf);
     310                ipc_answer_0(rid, ENOMEM);
     311                return;
     312        }
     313       
     314        /*
     315         * Fill filv with argument pointers
     316         */
     317        int i;
     318        for (i = 0; i < count; i++)
     319                filv[i] = &fil_buf[i];
     320       
     321        filc = count;
     322        filv[count] = NULL;
    271323       
    272324        ipc_answer_0(rid, EOK);
     
    340392                /* Dynamically linked program */
    341393                DPRINTF("Run ELF interpreter.\n");
    342                 DPRINTF("Entry point: %p\n", interp_info.entry);
     394                DPRINTF("Entry point: 0x%lx\n", interp_info.entry);
    343395               
    344396                ipc_answer_0(rid, EOK);
Note: See TracChangeset for help on using the changeset viewer.