+
+myoob()
+{
+ char *cp;
+
+ /* only process if transfer occurring */
+ if (!transflag) {
+ return;
+ }
+ cp = tmpline;
+ if (getline(cp, 7, stdin) == NULL) {
+ reply(221, "You could at least say goodby.");
+ dologout(0);
+ }
+ upper(cp);
+ if (strcmp(cp, "ABOR\r\n"))
+ return;
+ tmpline[0] = '\0';
+ reply(426,"Transfer aborted. Data connection closed.");
+ reply(226,"Abort successful");
+ longjmp(urgcatch, 1);
+}
+
+/*
+ * Note: The 530 reply codes could be 4xx codes, except nothing is
+ * given in the state tables except 421 which implies an exit. (RFC959)
+ */
+passive()
+{
+ int len;
+ struct sockaddr_in tmp;
+ register char *p, *a;
+
+ pdata = socket(AF_INET, SOCK_STREAM, 0);
+ if (pdata < 0) {
+ reply(530, "Can't open passive connection");
+ return;
+ }
+ tmp = ctrl_addr;
+ tmp.sin_port = 0;
+ seteuid(0);
+ if (bind(pdata, (struct sockaddr *) &tmp, sizeof(tmp)) < 0) {
+ seteuid(pw->pw_uid);
+ (void) close(pdata);
+ pdata = -1;
+ reply(530, "Can't open passive connection");
+ return;
+ }
+ seteuid(pw->pw_uid);
+ len = sizeof(tmp);
+ if (getsockname(pdata, (char *) &tmp, &len) < 0) {
+ (void) close(pdata);
+ pdata = -1;
+ reply(530, "Can't open passive connection");
+ return;
+ }
+ if (listen(pdata, 1) < 0) {
+ (void) close(pdata);
+ pdata = -1;
+ reply(530, "Can't open passive connection");
+ return;
+ }
+ a = (char *) &tmp.sin_addr;
+ p = (char *) &tmp.sin_port;
+
+#define UC(b) (((int) b) & 0xff)
+
+ reply(227, "Entering Passive Mode (%d,%d,%d,%d,%d,%d)", UC(a[0]),
+ UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1]));
+}
+
+char *
+gunique(local)
+ char *local;
+{
+ static char new[MAXPATHLEN];
+ char *cp = rindex(local, '/');
+ int d, count=0;
+ char ext = '1';
+
+ if (cp) {
+ *cp = '\0';
+ }
+ d = access(cp ? local : ".", 2);
+ if (cp) {
+ *cp = '/';
+ }
+ if (d < 0) {
+ syslog(LOG_ERR, "%s: %m", local);
+ return((char *) 0);
+ }
+ (void) strcpy(new, local);
+ cp = new + strlen(new);
+ *cp++ = '.';
+ while (!d) {
+ if (++count == 100) {
+ reply(452, "Unique file name not cannot be created.");
+ return((char *) 0);
+ }
+ *cp++ = ext;
+ *cp = '\0';
+ if (ext == '9') {
+ ext = '0';
+ }
+ else {
+ ext++;
+ }
+ if ((d = access(new, 0)) < 0) {
+ break;
+ }
+ if (ext != '0') {
+ cp--;
+ }
+ else if (*(cp - 2) == '.') {
+ *(cp - 1) = '1';
+ }
+ else {
+ *(cp - 2) = *(cp - 2) + 1;
+ cp--;
+ }
+ }
+ return(new);
+}