/** * reiser4_attach_fsdata - try to attach fsdata * @file: * @inode: * * Finds or creates cursor for readdir-over-nfs. */ int reiser4_attach_fsdata(struct file *file, struct inode *inode) { loff_t pos; int result; dir_cursor *cursor; /* * we are serialized by inode->i_mutex */ if (!file_is_stateless(file)) return 0; pos = file->f_pos; result = 0; if (pos == 0) { /* * first call to readdir (or rewind to the beginning of * directory) */ cursor = kmem_cache_alloc(d_cursor_cache, reiser4_ctx_gfp_mask_get()); if (cursor != NULL) result = insert_cursor(cursor, file, inode); else result = RETERR(-ENOMEM); } else { /* try to find existing cursor */ struct d_cursor_key key; key.cid = pos >> CID_SHIFT; key.oid = get_inode_oid(inode); spin_lock(&d_lock); cursor = d_cursor_hash_find(&d_info(inode)->table, &key); if (cursor != NULL) { /* cursor was found */ if (cursor->ref == 0) { /* move it from unused list */ list_del_init(&cursor->alist); --d_cursor_unused; } ++cursor->ref; } spin_unlock(&d_lock); if (cursor != NULL) { spin_lock_inode(inode); assert("nikita-3556", cursor->fsdata->back == NULL); clean_fsdata(file); free_file_fsdata_nolock(file); file->private_data = cursor->fsdata; spin_unlock_inode(inode); } } return result; }
/** * insert_cursor - allocate file_fsdata, insert cursor to tree and hash table * @cursor: * @file: * @inode: * * Allocates reiser4_file_fsdata, attaches it to @cursor, inserts cursor to * reiser4 super block's hash table and radix tree. add detachable readdir * state to the @f */ static int insert_cursor(dir_cursor *cursor, struct file *file, struct inode *inode) { int result; reiser4_file_fsdata *fsdata; memset(cursor, 0, sizeof *cursor); /* this is either first call to readdir, or rewind. Anyway, create new * cursor. */ fsdata = create_fsdata(NULL); if (fsdata != NULL) { result = radix_tree_preload(reiser4_ctx_gfp_mask_get()); if (result == 0) { struct d_cursor_info *info; oid_t oid; info = d_info(inode); oid = get_inode_oid(inode); /* cid occupies higher 12 bits of f->f_pos. Don't * allow it to become negative: this confuses * nfsd_readdir() */ cursor->key.cid = (++cid_counter) & 0x7ff; cursor->key.oid = oid; cursor->fsdata = fsdata; cursor->info = info; cursor->ref = 1; spin_lock_inode(inode); /* install cursor as @f's private_data, discarding old * one if necessary */ #if REISER4_DEBUG if (file->private_data) warning("", "file has fsdata already"); #endif clean_fsdata(file); free_file_fsdata_nolock(file); file->private_data = fsdata; fsdata->cursor = cursor; spin_unlock_inode(inode); spin_lock(&d_lock); /* insert cursor into hash table */ d_cursor_hash_insert(&info->table, cursor); /* and chain it into radix-tree */ bind_cursor(cursor, (unsigned long)oid); spin_unlock(&d_lock); radix_tree_preload_end(); file->f_pos = ((__u64) cursor->key.cid) << CID_SHIFT; } } else result = RETERR(-ENOMEM); return result; }
static void check_ip_settings(struct modemdata *data, const char *key, GVariant *value) { g_print("IPv4: %s, value type: %s\n", key, g_variant_get_type_string(value)); if (g_strcmp0(key, "Interface") == 0) { const char *iface; g_variant_get(value, "s", &iface); strncpy(ipv4.interface, iface, sizeof(ipv4.interface)); } else if (g_strcmp0(key, "Address") == 0) { const char *addr; g_variant_get(value, "s", &addr); strncpy(ipv4.address, addr, sizeof(ipv4.address)); } else if (g_strcmp0(key, "Netmask") == 0) { const char *addr; g_variant_get(value, "s", &addr); strncpy(ipv4.netmask, addr, sizeof(ipv4.netmask)); } else if (g_strcmp0(key, "Gateway") == 0) { const char *addr; g_variant_get(value, "s", &addr); strncpy(ipv4.gateway, addr, sizeof(ipv4.gateway)); } else if (g_strcmp0(key, "DomainNameServers") == 0) { GVariantIter *iter; const char *v; int i; g_variant_get(value, "as", &iter); i = 0; while (g_variant_iter_loop (iter, "s", &v)) { d_info("DNS: %s\n", v); memset(ipv4.resolvers[i], 0, sizeof(ipv4.resolvers[i])); strncpy(ipv4.resolvers[i], v, sizeof(ipv4.resolvers[i])); i++; if (i >= sizeof(ipv4.resolvers) / sizeof(ipv4.resolvers[0])) break; } ipv4.nresolvers = i; } }
void execute_ip_script(char *iface, char *ip_addr, char *netmask, char *gateway) { char *outp, *errp; char *route_argv[] = { ROUTE, "add", "default", NULL, NULL, NULL, }; char *ifconfig_argv[] = { IFCONFIG, iface, ip_addr, "netmask", netmask, NULL, }; char *script_argv[] = { PATH_TO_SCRIPT, iface, ip_addr, netmask, gateway, NULL, }; gboolean r; GError *err; int status; err = NULL; r = g_spawn_sync(NULL, script_argv, NULL, 0, /* flags*/ NULL, NULL, &outp, &errp, &status, &err); d_info("ip config script exec: %s (%s) status = %d\n", outp, errp, status); if (!r) { if (err) d_info("ip config error %s\n", err->message); } else goto out; /* Do traditional ifconfig/route setup */ r = g_spawn_sync(NULL, ifconfig_argv, NULL, 0, /* flags*/ NULL, NULL, &outp, &errp, &status, &err); d_info("ifconfig exec: %s (%s) status = %d\n", outp, errp, status); if (!r) { if (err) d_info("ifconfig error %s\n", err->message); } if (!gateway) { route_argv[3] = "dev"; route_argv[4] = iface; } else { route_argv[3] = "gw"; route_argv[4] = gateway; } r = g_spawn_sync(NULL, route_argv, NULL, 0, /* flags*/ NULL, NULL, &outp, &errp, &status, &err); d_info("route exec: %s (%s) status = %d\n", outp, errp, status); if (!r) { if (err) d_info("route error %s\n", err->message); } out: g_free(outp); g_free(errp); }
/** * process_cursors - do action on each cursor attached to inode * @inode: * @act: action to do * * Finds all cursors of @inode in reiser4's super block radix tree of cursors * and performs action specified by @act on each of cursors. */ static void process_cursors(struct inode *inode, enum cursor_action act) { oid_t oid; dir_cursor *start; struct list_head *head; reiser4_context *ctx; struct d_cursor_info *info; /* this can be called by * * kswapd->...->prune_icache->..reiser4_destroy_inode * * without reiser4_context */ ctx = reiser4_init_context(inode->i_sb); if (IS_ERR(ctx)) { warning("vs-23", "failed to init context"); return; } assert("nikita-3558", inode != NULL); info = d_info(inode); oid = get_inode_oid(inode); spin_lock_inode(inode); head = get_readdir_list(inode); spin_lock(&d_lock); /* find any cursor for this oid: reference to it is hanging of radix * tree */ start = lookup(info, (unsigned long)oid); if (start != NULL) { dir_cursor *scan; reiser4_file_fsdata *fsdata; /* process circular list of cursors for this oid */ scan = start; do { dir_cursor *next; next = list_entry(scan->list.next, dir_cursor, list); fsdata = scan->fsdata; assert("nikita-3557", fsdata != NULL); if (scan->key.oid == oid) { switch (act) { case CURSOR_DISPOSE: list_del_init(&fsdata->dir.linkage); break; case CURSOR_LOAD: list_add(&fsdata->dir.linkage, head); break; case CURSOR_KILL: kill_cursor(scan); break; } } if (scan == next) /* last cursor was just killed */ break; scan = next; } while (scan != start); } spin_unlock(&d_lock); /* check that we killed 'em all */ assert("nikita-3568", ergo(act == CURSOR_KILL, list_empty_careful(get_readdir_list(inode)))); assert("nikita-3569", ergo(act == CURSOR_KILL, lookup(info, oid) == NULL)); spin_unlock_inode(inode); reiser4_exit_context(ctx); }
static void waitForPADS(PPPoEConnection * conn, int timeout) { fd_set readable; int r; struct timeval tv; PPPoEPacket packet; int len; d_dbg("[%d]: waitForPADS: >>> \n", getpid()); do { tv.tv_sec = timeout; tv.tv_usec = 0; FD_ZERO(&readable); FD_SET(conn->discoverySocket, &readable); while (1) { r = select(conn->discoverySocket + 1, &readable, NULL, NULL, &tv); if (r >= 0 || errno != EINTR) break; } if (r < 0) { d_error("[%d]: select (waitForPADS)\n", getpid()); return; } if (r == 0) return; /* Get the packet */ receivePacket(conn->discoverySocket, &packet, &len); if (packet.code == CODE_PADS) d_dbg("[%d]: GOT a PADS!\n", getpid()); /* Check length */ if (ntohs(packet.length) + HDR_SIZE > len) { d_error("[%d]: Bogus PPPoE length field (%u)\n", getpid(), (unsigned int)ntohs(packet.length)); continue; } /* If it's not from the AC, it's not for me */ if (memcmp(packet.ethHdr.h_source, conn->peerEth, ETH_ALEN)) continue; /* If it's not for us, loop again */ if (!packetIsForMe(conn, &packet)) continue; /* Is it PADS ? */ if (packet.code == CODE_PADS) { /* Parse for goodies */ kpppoe_parsePacket(&packet, parsePADSTags, conn); conn->discoveryState = STATE_SESSION; break; } } while (conn->discoveryState != STATE_SESSION); /* Don't bother with ntohs; we'll just end up converting it back... */ conn->session = packet.session; d_info("[%d]: PPP session is %d\n", getpid(), (int)ntohs(conn->session)); #ifndef LOGNUM #ifdef ELBOX_PROGS_GPL_SYSLOGD_AP syslog(ALOG_NOTICE|LOG_NOTICE,"[Notice]PPPoE: Received PADS for %s. (Session ID: %x)", linkname, (int)ntohs(conn->session)); #else syslog(ALOG_NOTICE|LOG_NOTICE,"PPPoE: Received PADS for %s. (Session ID: %x)", linkname, (int)ntohs(conn->session)); #endif #else syslog(ALOG_NOTICE|LOG_NOTICE,"NTC:028[%s][%x]", linkname, (int)ntohs(conn->session)); #endif sts_session_id = conn->session; /* RFC 2516 says session id MUST NOT be zero of 0xffff */ if (ntohs(conn->session) == 0 || ntohs(conn->session) == 0xffff) d_info("[%d]: Access concentrator used a session value of %x -- the AC is violating RFC 2516\n", getpid(), (unsigned int) ntohs(conn->session)); d_dbg("[%d]: waitForPADS: <<< \n", getpid()); }
static void waitForPADO(PPPoEConnection * conn, int timeout) { fd_set readable; int r = -1; struct timeval tv; PPPoEPacket packet; int len; struct PacketCriteria pc; pc.conn = conn; pc.acNameOK = (conn->acName) ? 0 : 1; pc.serviceNameOK = (conn->serviceName) ? 0 : 1; pc.seenACName = 0; pc.seenServiceName = 0; do { tv.tv_sec = timeout; tv.tv_usec = 0; FD_ZERO(&readable); FD_SET(conn->discoverySocket, &readable); while (!got_sigterm) /* Modified by Kwest Wan 20080919 to terminate pppd immediately if PPPoE server don't reponse */ { d_dbg("[%d]: waitPADO select >>>>\n", getpid()); r = select(conn->discoverySocket+1, &readable, NULL, NULL, &tv); d_dbg("[%d]: waitPADO select (%d) <<<<\n", getpid(), r); if (r >= 0 || errno != EINTR) break; } if (r < 0) { d_error("[%d]: select (waitForPADS)\n", getpid()); return; } if (r == 0) return; /* Get the packet */ d_dbg("[%d]: receivePacket >>>\n", getpid()); receivePacket(conn->discoverySocket, &packet, &len); d_dbg("[%d]: receivePacket <<<\n", getpid()); /* Check length */ if (ntohs(packet.length) + HDR_SIZE > len) { d_error("[%d]: Bogus PPPoE length field (%u)\n", getpid(), (unsigned int)ntohs(packet.length)); continue; } /* If it's not for us, loop again */ if (!packetIsForMe(conn, &packet)) { d_dbg("[%d]: packet is not for me!\n", getpid()); continue; } /* Is it PADS ? */ if (packet.code == CODE_PADO) { if (NOT_UNICAST(packet.ethHdr.h_source)) { d_info("[%d]: Ignoring PADO packet from non-unicast MAC address\n", getpid()); #ifndef LOGNUM #ifdef ELBOX_PROGS_GPL_SYSLOGD_AP syslog(ALOG_NOTICE|LOG_NOTICE, "[Notice]PPPoE: Ignore PADO packet from non-unicast MAC address. (%s)", linkname); #else syslog(ALOG_NOTICE|LOG_NOTICE, "PPPoE: Ignore PADO packet from non-unicast MAC address. (%s)", linkname); #endif #else syslog(ALOG_NOTICE|LOG_NOTICE, "NTC:029[%s]", linkname); #endif continue; } kpppoe_parsePacket(&packet, parsePADOTags, &pc); if (!pc.seenACName) { d_info("[%d]: Ignoring PADO packet with no AC-Name tag\n", getpid()); #ifndef LOGNUM #ifdef ELBOX_PROGS_GPL_SYSLOGD_AP syslog(ALOG_NOTICE|LOG_NOTICE, "[Notice]PPPoE: Ignore PADO packet with no AC-Name tag. (%s)", linkname); #else syslog(ALOG_NOTICE|LOG_NOTICE, "PPPoE: Ignore PADO packet with no AC-Name tag. (%s)", linkname); #endif #else syslog(ALOG_NOTICE|LOG_NOTICE, "NTC:030[%s]", linkname); #endif continue; } if (!pc.seenServiceName) { d_info("[%d]: Ignoring PADO packet with no Service-Name tag\n", getpid()); #ifndef LOGNUM #ifdef ELBOX_PROGS_GPL_SYSLOGD_AP syslog(ALOG_NOTICE|LOG_NOTICE, "[Notice]PPPoE: Ignore PADO packet with no Service-Name tag. (%s)", linkname); #else syslog(ALOG_NOTICE|LOG_NOTICE, "PPPoE: Ignore PADO packet with no Service-Name tag. (%s)", linkname); #endif #else syslog(ALOG_NOTICE|LOG_NOTICE, "NTC:031[%s]", linkname); #endif continue; } conn->numPADOs++; if (conn->printACNames) printf("------------------------------------------------------\n"); update_statusfile("PPPoE:PADO"); d_dbg("[%d]: acNameOK:%d, serviceNameOK:%d\n", getpid(), pc.acNameOK, pc.serviceNameOK); if (pc.acNameOK && pc.serviceNameOK) { memcpy(conn->peerEth, packet.ethHdr.h_source, ETH_ALEN); if (conn->printACNames) { printf("AC-Ethernet-Address: %02x:%02x:%02x:%02x:%02x:%02x\n", (unsigned)conn->peerEth[0], (unsigned)conn->peerEth[1], (unsigned)conn->peerEth[2], (unsigned)conn->peerEth[3], (unsigned)conn->peerEth[4], (unsigned)conn->peerEth[5]); continue; } conn->discoveryState = STATE_RECEIVED_PADO; #ifndef LOGNUM #ifdef ELBOX_PROGS_GPL_SYSLOGD_AP syslog(ALOG_NOTICE|LOG_NOTICE, "[Notice]PPPoE: Received PADO for %s, from: %02x:%02x:%02x:%02x:%02x:%02x", linkname, (unsigned)conn->peerEth[0], (unsigned)conn->peerEth[1], (unsigned)conn->peerEth[2], (unsigned)conn->peerEth[3], (unsigned)conn->peerEth[4], (unsigned)conn->peerEth[5]); #else syslog(ALOG_NOTICE|LOG_NOTICE, "PPPoE: Received PADO for %s, from: %02x:%02x:%02x:%02x:%02x:%02x", linkname, (unsigned)conn->peerEth[0], (unsigned)conn->peerEth[1], (unsigned)conn->peerEth[2], (unsigned)conn->peerEth[3], (unsigned)conn->peerEth[4], (unsigned)conn->peerEth[5]); #endif #else syslog(ALOG_NOTICE|LOG_NOTICE, "NTC:026[%s][%02x:%02x:%02x:%02x:%02x:%02x]", linkname, (unsigned)conn->peerEth[0], (unsigned)conn->peerEth[1], (unsigned)conn->peerEth[2], (unsigned)conn->peerEth[3], (unsigned)conn->peerEth[4], (unsigned)conn->peerEth[5]); #endif break; } } else { d_dbg("[%d]: this is not PADO!\n", getpid()); } } while (conn->discoveryState != STATE_RECEIVED_PADO); }