static void netlink_notification (NMNetlinkMonitor *monitor, struct nl_msg *msg, gpointer user_data) { NMIP6Manager *manager = (NMIP6Manager *) user_data; NMIP6Device *device; struct nlmsghdr *hdr; gboolean config_changed = FALSE; hdr = nlmsg_hdr (msg); nm_log_dbg (LOGD_HW, "netlink notificate type %d", hdr->nlmsg_type); switch (hdr->nlmsg_type) { case RTM_NEWADDR: case RTM_DELADDR: device = process_addr (manager, msg); config_changed = TRUE; break; case RTM_NEWROUTE: case RTM_DELROUTE: device = process_route (manager, msg); config_changed = TRUE; break; case RTM_NEWPREFIX: device = process_prefix (manager, msg); break; case RTM_NEWNDUSEROPT: device = process_nduseropt (manager, msg); config_changed = TRUE; break; case RTM_NEWLINK: device = process_newlink (manager, msg); config_changed = TRUE; break; default: return; } if (device) { nm_log_dbg (LOGD_IP6, "(%s): syncing device with netlink changes", device->iface); nm_ip6_device_sync_from_netlink (device, config_changed); } }
void handle(int sockfd, struct sockaddr_in * cli_addr) { char buffer[BUFFER_SIZE]; char addr[MAX_URI_LEN]; char first_line[BUFFER_SIZE]; struct Message m,res; int i,entlen; char cgi_env[BUFFER_SIZE]; time_t now_time; FILE* fp; bzero(buffer, sizeof(buffer)); read(sockfd, buffer, sizeof(buffer)-1); if(global_option.l == 1) { /*copy first line of the request*/ for(i=0; buffer[i]!='\r' && buffer[i]!='\n' && i<BUFFER_SIZE-1; i++) first_line[i] = buffer[i]; first_line[i]=0; } #ifdef DEBUG printf("Full Message:\n%s\n\n", buffer); #endif m = read_req_msg(buffer); #ifdef DEBUG printf("Method: %d\n", m.req.method); printf("URI: %s\n", m.req.URI); printf("Version: %d.%d\n\n", m.req.version.major, m.req.version.minor); #endif /*Prepare response*/ /*Always use HTTP/1.0*/ res.type = RESPONSE; res.res.version.major = 1; res.res.version.minor = 0; now_time = time(NULL); strcpy(res.res.now_time, asctime(gmtime(&now_time))); strcpy(res.res.server, SERVER); if(m.type == UNKNOWN) { /* 400 Bad Request*/ res.res.scode = 400; default_rp(&res); set_file(&res, "400.html" , 1, NULL); } else { res.res.isCGI = process_addr(addr, m.req.URI); if(res.res.isCGI==1) { bzero(cgi_env, sizeof(cgi_env)); if(m.req.method == GET) { for(i=0;addr[i]!='?' && addr[i]!=0;i++); if(addr[i]=='?') { sprintf(cgi_env,"QUERY_STRING=%s", &(addr[i+1])); addr[i]=0; } #ifdef DEBUG printf("ENV = %s\n", cgi_env); #endif } else if(m.req.method == POST) { if(m.req.entity != NULL) { entlen = strlen(m.req.entity); } sprintf(cgi_env,"CONTENT_LENGTH=%d", entlen); } } if(m.req.method == GET || m.req.method == HEAD || m.req.method == POST) { /* Test Existence */ if(access(addr, R_OK) != 0) { /* Not Exists*/ /* Or permission denied*/ res.res.isCGI = 0; res.res.scode = 404; default_rp(&res); if(m.req.method == HEAD) set_file(&res, "404.html" , 0, NULL); else set_file(&res, "404.html" , 1, NULL); } else if(res.res.isCGI == 1 && access(addr, X_OK)!=0) { /* Not Executable*/ res.res.isCGI = 0; res.res.scode = 403; default_rp(&res); if(m.req.method == HEAD) set_file(&res, "403.html" , 0, NULL); else set_file(&res, "403.html" , 1, NULL); } else { res.res.scode = 200; default_rp(&res); if(res.res.isCGI==1) putenv(cgi_env); if(m.req.method == HEAD) set_file(&res, addr , 0, NULL); else if(m.req.method == GET) set_file(&res, addr , 1, NULL); else { /*POST*/ set_file(&res, addr , 1, m.req.entity); } } } } if(global_option.l == 1) { if(global_option.d == 1) { fp = (FILE*) stdout; } else { /*logging*/ fp = fopen(global_option.lfile, "a"); } fprintf(fp, "%s ", inet_ntoa(cli_addr->sin_addr)); } else { fp = NULL; } send_msg(sockfd, res, fp, first_line); if(global_option.l == 1 && global_option.d == 0) { fclose(fp); } close(sockfd); }