int main(int argc, char **argv) { int i; int n; int ch; char *s; int wp, rp, ep = 0; char wmbuf[256], rmbuf[256]; FILE *pid_file; int sock = -1; int done_fwds = 0; int runasdaemon = 0; int sawargstop = 0; #if defined(__CYGWIN__) int sawoptionn = 0; #endif #ifndef HAVE___PROGNAME __progname = "autossh"; #endif /* * set up options from environment */ get_env_args(); /* * We accept all ssh args, and quietly pass them on * to ssh when we call it. */ while ((ch = getopt(argc, argv, OPTION_STRING)) != -1) { switch(ch) { case 'M': if (!env_port) writep = optarg; break; case 'V': fprintf(stdout, "%s %s\n", __progname, VER); exit(0); break; case 'f': runasdaemon = 1; break; #if defined(__CYGWIN__) case 'N': sawoptionn = 1; break; #endif case '?': usage(1); break; default: /* other options get passed to ssh */ break; } } /* if we got it from the environment */ if (env_port) writep = env_port; /* * We must at least have a monitor port and a remote host. */ if (env_port) { if (argc < 2) usage(1); } else if (!writep || argc < 4) usage(1); if (logtype & L_SYSLOG) openlog(__progname, LOG_PID|syslog_perror, LOG_USER); /* * Check for echo port */ if ((s = strchr(writep, ':')) != NULL) { *s = '\0'; echop = s + 1; ep = strtoul(echop, &s, 0); if (*echop == '\0' || *s != '\0' || ep == 0) xerrlog(LOG_ERR, "invalid echo port \"%s\"", echop); } /* * Check, and get the read port (write port + 1); * then construct port-forwarding arguments for ssh. */ wp = strtoul(writep, &s, 0); if (*writep == '\0' || *s != '\0') xerrlog(LOG_ERR, "invalid port \"%s\"", writep); if (wp == 0) { errlog(LOG_INFO, "port set to 0, monitoring disabled"); writep = NULL; } else if (wp > 65534 || wp < 0) xerrlog(LOG_ERR, "monitor port (%d) out of range", wp); else { rp = wp+1; /* all this for solaris; we could use asprintf() */ (void)snprintf(readp, sizeof(readp), "%d", rp); /* port-forward arg strings */ n = snprintf(wmbuf, sizeof(wmbuf), "%d:%s:%d", wp, mhost, echop ? ep : wp); if (n > sizeof(wmbuf)) xerrlog(LOG_ERR, "overflow building forwarding string"); if (!echop) { n = snprintf(rmbuf, sizeof(rmbuf), "%d:%s:%d", wp, mhost, rp); if (n > sizeof(rmbuf)) xerrlog(LOG_ERR, "overflow building forwarding string"); } } /* * Adjust timeouts if necessary: net_timeout is first * the timeout for accept and then for io, so if the * poll_time is set less than 2 timeouts, the timeouts need * to be adjusted to be at least 1/2. Perhaps there should be * be some padding here as well.... */ if ((poll_time * 1000) / 2 < net_timeout) { net_timeout = (poll_time * 1000) / 2; errlog(LOG_INFO, "short poll time: adjusting net timeouts to %d", net_timeout); } /* * Build a new arg list, skipping -f, -M and inserting * port forwards. */ add_arg(ssh_path); #if defined(__CYGWIN__) if (ntservice && !sawoptionn) add_arg("-N"); #endif for (i = 1; i < argc; i++) { /* * We step past the first '--', taking it as ours * (autossh's). Any further ones we pass to ssh. */ if (argv[i][0] == '-' && argv[i][1] == '-') { if (!sawargstop) { sawargstop = 1; continue; } } if (wp && env_port && !done_fwds) { add_arg("-L"); add_arg(wmbuf); if (!echop) { add_arg("-R"); add_arg(rmbuf); } done_fwds = 1; } else if (!sawargstop && argv[i][0] == '-' && argv[i][1] == 'M') { if (argv[i][2] == '\0') i++; if (wp && !done_fwds) { add_arg("-L"); add_arg(wmbuf); if (!echop) { add_arg("-R"); add_arg(rmbuf); } done_fwds = 1; } continue; } /* look for -f in option args and strip out */ strip_arg(argv[i], 'f', OPTION_STRING); add_arg(argv[i]); } if (runasdaemon) { if (daemon(0, 0) == -1) { xerrlog(LOG_ERR, "run as daemon failed: %s", strerror(errno)); } /* * If running as daemon, the user likely wants it * to just run and not fail early (perhaps machines * are coming up, etc.) */ gate_time = 0; } /* * Only if we're doing the network monitor thing. * Socket once opened stays open for listening for * the duration of the program. */ if (writep) { if (!echop) { sock = conn_listen(mhost, readp); /* set close-on-exec */ (void)fcntl(sock, F_SETFD, FD_CLOEXEC); } else sock = NO_RD_SOCK; } if (pid_file_name) { pid_file = fopen(pid_file_name, "w"); if (!pid_file) { xerrlog(LOG_ERR, "cannot open pid file \"%s\": %s", pid_file_name, strerror(errno)); } pid_file_created = 1; atexit(unlink_pid_file); if (fprintf(pid_file, "%d\n", (int)getpid()) == 0) xerrlog(LOG_ERR, "write failed to pid file \"%s\": %s", pid_file_name, strerror(errno)); fflush(pid_file); fclose(pid_file); } ssh_run(sock, newav); if (sock >= 0) { shutdown(sock, SHUT_RDWR); close(sock); } if (logtype & L_SYSLOG) closelog(); exit(0); }
int sh2iasm(char *str, char *err_msg) // Function to do all the work { char name[30]; char arg1[30]; char arg2[30]; char *p; int loop; int oplen,arg1len,arg2len; sh_operand_info arg1info,arg2info,disp; sh_opcode_info opcode; arg1info.type = 0; arg1info.reg = 0; arg2info.type = 0; arg2info.reg = 0; //gets(str); p = str; while(*p == ' ') p++; if((oplen = strip_opname(p,name)) == 0) { asm_bad("No opcode", err_msg); return 0; } p += oplen; while(*p == ' ') p++; arg1len = strip_arg(p,arg1); p += arg1len; while(*p == ' ') p++; if(*p == ',') p++; while(*p == ' ') p++; arg2len = strip_arg(p,arg2); for(loop = 0;name[loop] != 0;loop++) { name[loop] = tolower(name[loop]); } for(loop = 0;arg1[loop] != 0;loop++) arg1[loop] = tolower(arg1[loop]); for(loop = 0;arg2[loop] != 0;loop++) arg2[loop] = tolower(arg2[loop]); if(!parse_arg(arg1,&arg1info,err_msg)) { if(arg1[0] != 0) asm_bad("Arg 1", err_msg); return 0; } if(!parse_arg(arg2,&arg2info,err_msg)) { if(arg2[0] != 0) asm_bad("Arg 2", err_msg); return 0; } if(!search_op(name,&arg1info,&arg2info,&opcode)) { asm_bad("Invalid opcode. Likely doesn't exist or format is wrong\n", err_msg); return 0; } loop = 0; rebuild_args(arg1,arg2,&arg1info,&arg2info,&disp); return build_bytes(opcode,arg1info,arg2info,disp); }