static int tcpsock_connect(struct socket *s, struct sockaddr *name, int namelen) { int rc; struct sockaddr_in *sin; struct sockreq req; if (!name) return -EFAULT; if (namelen < sizeof(struct sockaddr_in)) return -EFAULT; sin = (struct sockaddr_in *) name; if (sin->sin_family != AF_INET && sin->sin_family != AF_UNSPEC) return -EAFNOSUPPORT; if (s->state == SOCKSTATE_CONNECTED) return -EISCONN; if (s->state == SOCKSTATE_CONNECTING) return -EALREADY; if (s->state != SOCKSTATE_BOUND && s->state != SOCKSTATE_UNBOUND) return -EINVAL; if (!s->tcp.pcb) { rc = alloc_pcb(s); if (rc < 0) return rc; } s->state = SOCKSTATE_CONNECTING; rc = tcp_connect(s->tcp.pcb, (struct ip_addr *) &sin->sin_addr, ntohs(sin->sin_port), connected_tcp); if (rc < 0) return rc; if (s->state != SOCKSTATE_CONNECTED) { if (s->flags & SOCK_NBIO) return -EAGAIN; rc = submit_socket_request(s, &req, SOCKREQ_CONNECT, NULL, INFINITE); if (rc < 0) return rc; } return 0; }
static int tcpsock_bind(struct socket *s, struct sockaddr *name, int namelen) { int rc; struct sockaddr_in *sin; if (!name) return -EFAULT; if (namelen < sizeof(struct sockaddr_in)) return -EFAULT; sin = (struct sockaddr_in *) name; if (sin->sin_family != AF_INET && sin->sin_family != AF_UNSPEC) return -EAFNOSUPPORT; if (s->state != SOCKSTATE_UNBOUND) return -EINVAL; if (!s->tcp.pcb) { rc = alloc_pcb(s); if (rc < 0) return rc; } rc = tcp_bind(s->tcp.pcb, (struct ip_addr *) &sin->sin_addr, ntohs(sin->sin_port)); if (rc < 0) return rc; s->state = SOCKSTATE_BOUND; return 0; }
/** * \private * create a pcb with all the needed value at the specified location */ uint32_t create_proc(char *name, uint32_t prio, uint32_t argc, char **params) { uint32_t *i, j; int32_t pid; pcb *p; prgm *prg; //kdebug_println("Create process in"); if (name == NULL) return NULLPTR; if (prio > MAX_PRI || prio < MIN_PRI) return INVARG; if (pcb_counter <= MAXPCB) { /* * Allocate a pcb */ p = alloc_pcb(); if (p == NULL) return OUTOMEM; /* * Reset the pcb */ pcb_reset(p); /* * Check that the program exist */ prg = search_prgm(name); if (prg == NULL) return INVARG; /* * Set the name */ pcb_set_name(p, name); /* * init the program counter */ pcb_set_epc(p, (uint32_t) prg->address); /* * get a pid */ pid = get_next_pid(); if (pid < 0) return pid; /* contain an error code */ pcb_set_pid(p, pid); /* set the pid */ pcb_set_pri(p, prio); /* set the priority */ /* * Set the supervisor of the process, which is the one we ask for the creation * or -1 if the system ask. * This value is in the global variable current_pcb */ if (current_pcb != NULL) { pcb_set_supervisor(p, pcb_get_pid(current_pcb)); pcb_set_supervised(current_pcb, pid); } else pcb_set_supervisor(p, -1); /* <<<<<<< HEAD:src/kernel/kprocess.c <<<<<<< HEAD:src/kernel/kprocess.c * Set the parameters of the function */ //p->registers.a_reg[0] = (params == NULL) ? 0 : stoi(get_arg(params, 0)) + 1; //p->registers.a_reg[1] = (uint32_t) params; /* the adresse of the first arg */ if (params != NULL) { p->registers.a_reg[0] = argc + 1; p->registers.a_reg[1] = (uint32_t) params; } else { p->registers.a_reg[0] = 0; p->registers.a_reg[1] = 0; } /* ======= >>>>>>> 3e4887fd7d8130975ae6c220ed2077f5f2538be9:src/kernel/kprocess.c * Set the stack pointer ======= * Set the stack pointer >>>>>>> ef0b08729fd10e82db039bea92d2ce232b3a027b:src/kernel/kprocess.c */ i = allocate_stack(pcb_get_pid(p)); if (i == NULL) return OUTOMEM; /* * We add the arg on the stack */ //kprint("sp set\n"); if (params != NULL) { //kprint((char *) params); //kprint("params not null\n"); //kprint(itos((uint32_t) i, c)); //kprint("\n"); i = (uint32_t *) ((uint32_t) i - (ARG_SIZE * (argc + 1) * sizeof(char))); /* set the sp after the arg */ //kprint(itos((uint32_t) i, c)); //kprint("\n"); pcb_set_sp(p, (uint32_t) i); /* set the stack pointer */ for (j = 0; j < (argc + 1) * (ARG_SIZE * sizeof(char) / sizeof(uint32_t)); j++) { //kprint("Copy params\n"); *i = (uint32_t) * params; //kprint("Param copied\n"); //i += ARG_SIZE * sizeof(char); i++; (uint32_t *) params++; } //kprint((char *) pcb_get_sp(p)); } else pcb_set_sp(p, (uint32_t) i); //kprint("copy arg done\n"); /* * Set the parameters of the function * The begin of the parameters are pointed by the stack pointer */ if (params != NULL) { p->registers.a_reg[0] = argc + 1; p->registers.a_reg[1] = (uint32_t) pcb_get_sp(p); } else { p->registers.a_reg[0] = 0; p->registers.a_reg[1] = 0; } /* * Set the state */ pcb_set_state(p, READY); /* * Set the last error */ pcb_set_error(p, OMGROXX); /* * The pcb is no more empty */ pcb_set_empty(p, FALSE); /* * Now we can add the pcb to the ready list */ if (pls_add(&plsready, p) == OUTOMEM) { /* * Adding fail, don't forget to dealloc every allocated stuff */ deallocate_stack(pcb_get_pid(p)); pcb_reset(p); return OUTOMEM; } /* * Everything goes well, we add one to the pcb_counter */ pcb_counter++; } else return OUTOMEM; //kdebug_println("Create process out"); return pid; }