void fetion_login(PurpleAccount * account) { PurpleConnection *gc; struct fetion_account_data *sip; gchar **userserver; gint ret; const char *username = purple_account_get_username(account); gc = purple_account_get_connection(account); gc->proto_data = sip = g_new0(struct fetion_account_data, 1); sip->gc = gc; sip->tg = 0; //temp group chat id sip->cseq = 0; sip->account = account; sip->registerexpire = 400; sip->reregister = time(NULL) + 100; sip->txbuf = purple_circ_buffer_new(0); sip->impresa = NULL; sip->icon_buf = purple_circ_buffer_new(0); sip->GetContactFlag = 0; purple_debug_info("Fetion:", "shit\n"); userserver = g_strsplit(username, "@", 2); purple_connection_set_display_name(gc, userserver[0]); if (IsCMccNo(userserver[0])) { sip->username = NULL; sip->mobileno = g_strdup(userserver[0]); } else { sip->mobileno = NULL; sip->username = g_strdup(userserver[0]); } // sip->servername = g_strdup(userserver[1]); sip->SysCfgServer = g_strdup("nav.fetion.com.cn"); sip->password = g_strdup(purple_connection_get_password(gc)); g_strfreev(userserver); sip->buddies = g_hash_table_new((GHashFunc) fetion_ht_hash_nick, (GEqualFunc) fetion_ht_equals_nick); sip->tempgroup = g_hash_table_new((GHashFunc) fetion_ht_hash_nick, (GEqualFunc) fetion_ht_equals_nick); sip->group = g_hash_table_new((GHashFunc) fetion_ht_hash_nick, (GEqualFunc) fetion_ht_equals_nick); sip->group2id = g_hash_table_new((GHashFunc) fetion_ht_hash_nick, (GEqualFunc) fetion_ht_equals_nick); purple_connection_update_progress(gc, _("Connecting"), 1, 2); /* TODO: Set the status correctly. */ sip->status = g_strdup("available"); sip->registertimeout = purple_timeout_add(60000, (GSourceFunc) LoginToSsiPortal, sip); //Try to get systemconfig sip->ServerVersion = NULL; sip->ServiceNoVersion = NULL; sip->ParaVersion = NULL; sip->HttpAppVersion = NULL; sip->ClientCfgVersion = NULL; sip->HintsVersion = NULL; ret = ParseCfg(sip); //if(ret!=0) sip->SysCfg.conn = purple_proxy_connect(NULL, sip->account, sip->SysCfgServer, 80, (PurpleProxyConnectFunction) RetriveSysCfg, sip); }
int main(int argc, char **argv) { int c, once, nagios, nagiosexit; double temperature, mintemp, maxtemp; char *myname, *bmyname, *temp; pid_t mypid, sid; time_t now; struct stat fileStat; FILE *pidfile; char buf[BUFSIZE], theprobe[BUFSIZE]; foreground = verbose = numprobes = dolog = dorrd = once = nagios = nagiosexit = 0; mintemp = maxtemp = 0.0; interval = 300; // Default interval is 300 seconds (5 minutes) memset(theprobe, 0, sizeof(theprobe)); ParseCfg(CFGFILE); // Parse CFG now, allowing cmdline to override while ((c = getopt (argc, argv, "fvlroi:p:m:M:")) != -1) { switch (c) { case 'f': foreground = 1; break; case 'v': verbose = 1; break; case 'l': dolog = 1; break; case 'r': dorrd = 1; break; case 'o': once = 1; break; case 'p': strncpy (theprobe, optarg, BUFSIZE-1); once = nagios = 1; break; case 'm': mintemp = atof(optarg); break; case 'M': maxtemp = atof(optarg); break; case 'i': interval = atoi(optarg); if (interval == 0) { // atoi is crap. Need to make sure interval is real fprintf(stderr, "Interval can not be zero\n"); exit(EXIT_FAILURE); } break; default: printf("usage: %s [ -v ] [ -f ] [ -o ] [ -i interval ] [ -l | -r ]\n", argv[0]); exit(EXIT_FAILURE); } } if ((!dolog && !dorrd) && !once) { fprintf(stderr, "Please use either logging (-l) or rrd (-r) output\n"); exit(EXIT_FAILURE); } if (once) foreground = 1; if ((mintemp || maxtemp) && !nagios) { fprintf(stderr, "Warning: Minimum and Maximum temperature switches are ignored without -p\n"); } // Locate the probes. numprobes = findprobes(); if (numprobes == 0) { fprintf(stderr, "Error: No DS18B20 compatible probes located.\n"); fprintf(stderr, "Please make sure the w1-gpio and w1-therm drivers.\n"); fprintf(stderr, "are loaded into the kernel.\n"); exit(EXIT_FAILURE); } if (verbose) fprintf(stderr, "Probe on commandline is '%s'\n", theprobe); // Lets see if our logdir exists and is a directory if (!foreground) { if (stat(LOGROOT, &fileStat) < 0) { fprintf(stderr, "Error: %s does not exist.\n", LOGROOT); exit(EXIT_FAILURE); } if (!S_ISDIR(fileStat.st_mode)) { fprintf(stderr, "Error: %s is not a directory.\n", LOGROOT); exit(EXIT_FAILURE); } if (verbose) fprintf(stderr, "Log folder '%s' is OK.\n", LOGROOT); // Now to open all the logfiles if ((openlogs()) != numprobes) { fprintf(stderr, "Something went wrong opening files.\n"); exit(EXIT_FAILURE); } } // All looks good. Time to prep the main loop. if (foreground) { if (!nagios) fprintf(stderr, "Running in the foreground, not daemonizing.\n"); } else { mypid = fork(); if (mypid < 0) exit(EXIT_FAILURE); // Could not fork. if (mypid > 0) exit(EXIT_SUCCESS); // Parent can exit here // New child process from here. sid = setsid(); if (sid < 0) exit(EXIT_FAILURE); if ((chdir(LOGROOT)) < 0) exit(EXIT_FAILURE); // Close the standard file descriptors close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); } if (!foreground) { mypid = getpid(); // Get my pid myname = strdup(argv[0]); bmyname = basename(myname); snprintf(buf, sizeof(buf)-1, "/var/run/%s.pid", bmyname); if ((pidfile = fopen(buf, "w")) == NULL) { fprintf(stderr, "Unable to open pidfile '%s'. '%s'\n", buf, strerror(errno)); exit(EXIT_FAILURE); } fprintf(pidfile, "%d\n", mypid); fflush(pidfile); fclose(pidfile); openlog(bmyname, LOG_PID|LOG_CONS, LOG_USER); } // SIGHUP makes us close and reopen logs. This is probably a FIXME as signal() is really // not portable at all and can even behave differently on some Linux systems. signal(SIGHUP, handle_sighup); // Main loop while(1) { // rewind the logs and read them for (c = 0; c < numprobes; c++) { probefd[c] = fopen(probepath[c], "r"); if (probefd[c] == NULL) { if (foreground) { fprintf(stderr, "Error: Unable to open '%s': %s\n", probepath[c], strerror(errno)); } else { syslog(LOG_ERR, "Error: Unable to open '%s': %s\n", probepath[c], strerror(errno)); } exit(EXIT_FAILURE); } // First lets see if we are looking for a single probe only if (nagios) { if (strncasecmp(probename[c], theprobe, PROBENAMELEN-1)) continue; } /* * Example output from a probe. It's two lines and we want the t= part: * 5c 01 4b 46 7f ff 04 10 a1 : crc=a1 YES * 5c 01 4b 46 7f ff 04 10 a1 t=21750 */ fgets(buf, sizeof(buf)-1, probefd[c]); // we always want line 2 memset(buf, 0, sizeof(buf)); // so we ignore the first read fgets(buf, sizeof(buf)-1, probefd[c]); temp = strtok(buf, "t="); // C stringparsing rules! :) temp = strtok(NULL, "t="); // See? Easy as pie. temperature = atof(temp)/1000; // change "21750" into "21.750" if (dolog && !once) { now = time(NULL); fprintf(logfd[c], "%u %2.3f\n", (unsigned int) now, temperature); fflush(logfd[c]); // Probably unnecessary to flush. } if (once) { if (nagios) { if (mintemp && temperature < mintemp) { fprintf(stdout, "CRITICAL: Temperature of probe '%s' is %2.3f which is below %2.3f | 'temperature'=%2.3f\n", probename[c], temperature, mintemp, temperature); nagiosexit = 2; } else if (maxtemp && temperature > maxtemp) { fprintf(stdout, "CRITICAL: Temperature of probe '%s' is %2.3f which is over %2.3f | 'temperature'=%2.3f\n", probename[c], temperature, maxtemp, temperature); nagiosexit = 2; } else { fprintf(stdout, "OK: Temperature of probe '%s' is %2.3f | 'temperature'=%2.3f\n", probename[c], temperature, temperature); nagiosexit = 0; } } else { fprintf(stdout, "%s:\t%2.3f\n", probename[c], temperature); } } fclose(probefd[c]); } if (nagios) exit(nagiosexit); if (once) exit(EXIT_SUCCESS); sleep(interval); } exit(EXIT_SUCCESS); // Never reached. Makes gcc -Wall shut up. }