static int eventfd_open(struct file_desc *d) { struct eventfd_file_info *info; int tmp; info = container_of(d, struct eventfd_file_info, d); tmp = eventfd(info->efe->counter, 0); if (tmp < 0) { pr_perror("Can't create eventfd %#08x", info->efe->id); return -1; } if (rst_file_params(tmp, info->efe->fown, info->efe->flags)) { pr_perror("Can't restore params on eventfd %#08x", info->efe->id); goto err_close; } return tmp; err_close: close(tmp); return -1; }
static int signalfd_open(struct file_desc *d, int *new_fd) { struct signalfd_info *info; int tmp; sigset_t mask; info = container_of(d, struct signalfd_info, d); pr_info("Restoring signalfd %#x\n", info->sfe->id); sigset_fill(&mask, info->sfe->sigmask); tmp = signalfd(-1, &mask, 0); if (tmp < 0) { pr_perror("Can't create signalfd %#08x", info->sfe->id); return -1; } if (rst_file_params(tmp, info->sfe->fown, info->sfe->flags)) { pr_perror("Can't restore params on signalfd %#08x", info->sfe->id); goto err_close; } *new_fd = tmp; return 0; err_close: close(tmp); return -1; }
static int open_packet_sk_spkt(PacketSockEntry *pse, int *new_fd) { struct sockaddr addr_spkt; int sk; sk = socket(PF_PACKET, pse->type, pse->protocol); if (sk < 0) { pr_perror("Can't create packet socket"); return -1; } memset(&addr_spkt, 0, sizeof(addr_spkt)); addr_spkt.sa_family = AF_PACKET; // if the socket was bound to any device if (pse->ifindex > 0) { const size_t sa_data_size = sizeof(addr_spkt.sa_data); struct ifreq req; memset(&req, 0, sizeof(req)); req.ifr_ifindex = pse->ifindex; if (ioctl(sk, SIOCGIFNAME, &req) < 0) { pr_perror("Can't get interface name (ifindex %d)", pse->ifindex); goto err; } strncpy(addr_spkt.sa_data, req.ifr_name, sa_data_size); addr_spkt.sa_data[sa_data_size - 1] = 0; if (bind(sk, &addr_spkt, sizeof(addr_spkt)) < 0) { pr_perror("Can't bind packet socket to %s", req.ifr_name); goto err; } } if (rst_file_params(sk, pse->fown, pse->flags)) goto err; if (restore_socket_opts(sk, pse->opts)) goto err; *new_fd = sk; return 0; err: close(sk); return -1; }
static int open_packet_sk(struct file_desc *d) { struct packet_sock_info *psi; PacketSockEntry *pse; struct sockaddr_ll addr; int sk, yes; psi = container_of(d, struct packet_sock_info, d); pse = psi->pse; pr_info("Opening packet socket id %#x\n", pse->id); sk = socket(PF_PACKET, pse->type, pse->protocol); if (sk < 0) { pr_perror("Can't create packet sock"); goto err; } memset(&addr, 0, sizeof(addr)); addr.sll_family = AF_PACKET; addr.sll_ifindex = pse->ifindex; if (bind(sk, (struct sockaddr *)&addr, sizeof(addr)) < 0) { pr_perror("Can't bind packet socket"); goto err_cl; } if (restore_opt(sk, SOL_PACKET, PACKET_VERSION, &pse->version)) goto err_cl; if (restore_opt(sk, SOL_PACKET, PACKET_RESERVE, &pse->reserve)) goto err_cl; if (restore_opt(sk, SOL_PACKET, PACKET_TIMESTAMP, &pse->timestamp)) goto err_cl; if (restore_opt(sk, SOL_PACKET, PACKET_COPY_THRESH, &pse->copy_thresh)) goto err_cl; if (pse->aux_data) { yes = 1; if (restore_opt(sk, SOL_PACKET, PACKET_AUXDATA, &yes)) goto err_cl; } if (pse->orig_dev) { yes = 1; if (restore_opt(sk, SOL_PACKET, PACKET_ORIGDEV, &yes)) goto err_cl; } if (pse->vnet_hdr) { yes = 1; if (restore_opt(sk, SOL_PACKET, PACKET_VNET_HDR, &yes)) goto err_cl; } if (pse->loss) { yes = 1; if (restore_opt(sk, SOL_PACKET, PACKET_LOSS, &yes)) goto err_cl; } if (restore_mreqs(sk, pse)) goto err_cl; if (restore_rings(sk, pse)) goto err_cl; if (pse->has_fanout) { pr_info("Restoring fanout %x\n", pse->fanout); if (restore_opt(sk, SOL_PACKET, PACKET_FANOUT, &pse->fanout)) goto err_cl; } if (rst_file_params(sk, pse->fown, pse->flags)) goto err_cl; if (restore_socket_opts(sk, pse->opts)) goto err_cl; return sk; err_cl: close(sk); err: return -1; }