Example #1
0
void UpdateJobKeyValue(int rank, char *key, char *value)
{
    SOCKET sock;
    char pszRank[20];
    char pszStr[MAX_CMD_LENGTH+1];
    char pszResult[MAX_CMD_LENGTH+1];
    int error;

    if (!g_bUseJobHost)
        return;

    if ((key == NULL) || (value == NULL) || (rank < 0))
        return;

    sprintf(pszRank, s_pszRankFormat, rank);

    if ((error = ConnectToMPD(s_pszRootHost, s_nPort, s_pszPassPhrase, &sock)) == 0)
    {
        // put the key/value string
        sprintf(pszStr, "dbput name=%s key=%s%s value=%s", s_pszJobId, pszRank, key, value);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the put operation: '%s', error %d\n", pszStr, WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // close the session with the mpd
        if (WriteString(sock, "done") == SOCKET_ERROR)
        {
            printf("Error: Unable to write 'done' to socket[%d]\n", sock);
            easy_closesocket(sock);
            return;
        }

        easy_closesocket(sock);
    }
    else
    {
        printf("UpdateJobKeyValue(%s:%s): Connect to %s failed, error %d\n", key, value, s_pszRootHost, error);
        fflush(stdout);
    }
}
Example #2
0
void UpdateJobState(char *state)
{
    SOCKET sock;
    char pszStr[MAX_CMD_LENGTH+1];
    char pszResult[MAX_CMD_LENGTH+1];
    int error;

    if (!g_bUseJobHost)
        return;

    if ((error = ConnectToMPD(s_pszRootHost, s_nPort, s_pszPassPhrase, &sock)) == 0)
    {
        // put the state string
        sprintf(pszStr, "dbput %s:state:%s", s_pszJobId, state);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the put operation: '%s', error %d\n", pszStr, WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // close the session with the mpd
        if (WriteString(sock, "done") == SOCKET_ERROR)
        {
            printf("Error: Unable to write 'done' to socket[%d]\n", sock);
            easy_closesocket(sock);
            return;
        }

        easy_closesocket(sock);
    }
    else
    {
        printf("UpdateJobState(%s): Connect to %s failed, error %d\n", state, s_pszRootHost, error);
        fflush(stdout);
    }
}
Example #3
0
void ParseArgv(int argc, char **argv)
{
	bool quit = 0;
	std::string now_playing_format = "{{(%l) }{{%a - }%t}}|{%f}}";
	
	for (int i = 1; i < argc; ++i)
	{
		if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--host"))
		{
			if (++i >= argc)
				exit(0);
			Mpd.SetHostname(argv[i]);
			continue;
		}
		if (!strcmp(argv[i], "-p") || !strcmp(argv[i], "--port"))
		{
			if (++i >= argc)
				exit(0);
			Mpd.SetPort(atoi(argv[i]));
			continue;
		}
		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version"))
		{
			std::cout << "ncmpcpp version: " << VERSION << "\n\n"
			<< "optional screens compiled-in:\n"
#			ifdef HAVE_TAGLIB_H
			<< " - tag editor\n"
			<< " - tiny tag editor\n"
#			endif
#			ifdef HAVE_CURL_CURL_H
			<< " - artist info\n"
#			endif
#			ifdef ENABLE_OUTPUTS
			<< " - outputs\n"
#			endif
#			ifdef ENABLE_VISUALIZER
			<< " - visualizer\n"
#			endif
#			ifdef ENABLE_CLOCK
			<< " - clock\n"
#			endif
			<< "\nencoding detection: "
#			ifdef HAVE_LANGINFO_H
			<< "enabled"
#			else
			<< "disabled"
#			endif // HAVE_LANGINFO_H
			<< "\nbuilt with support for:"
#			ifdef HAVE_CURL_CURL_H
			<< " curl"
#			endif
#			ifdef HAVE_ICONV_H
			<< " iconv"
#			endif
#			ifdef HAVE_FFTW3_H
			<< " fftw"
#			endif
#			ifdef USE_PDCURSES
			<< " pdcurses"
#			else
			<< " ncurses"
#			endif
#			ifdef HAVE_TAGLIB_H
			<< " taglib"
#			endif
#			ifdef HAVE_PTHREAD_H
			<< " threads"
#			endif
#			ifdef _UTF8
			<< " unicode"
#			endif
			<< std::endl;
			exit(0);
		}
		else if (!strcmp(argv[i], "-?") || !strcmp(argv[i], "--help"))
		{
			std::cout
			<< "Usage: ncmpcpp [OPTION]...\n"
			<< "  -h, --host                connect to server at host [localhost]\n"
			<< "  -p, --port                connect to server at port [6600]\n"
			<< "  -?, --help                show this help message\n"
			<< "  -v, --version             display version information\n"
			<< "  --now-playing             display now playing song [" << now_playing_format << "]\n"
			<< "\n"
			<< "  play                      start playing\n"
			<< "  pause                     pause the currently playing song\n"
			<< "  toggle                    toggle play/pause mode\n"
			<< "  stop                      stop playing\n"
			<< "  next                      play the next song\n"
			<< "  prev                      play the previous song\n"
			<< "  volume [+-]<num>          adjusts volume by [+-]<num>\n"
			;
			exit(0);
		}
		
		if (!ConnectToMPD())
			exit(0);
		
		if (!strcmp(argv[i], "--now-playing"))
		{
			Mpd.UpdateStatus();
			if (!Mpd.GetErrorMessage().empty())
			{
				std::cout << "Error: " << Mpd.GetErrorMessage() << std::endl;
				exit(1);
			}
			if (Mpd.isPlaying())
			{
				if (argc > ++i)
				{
					// apply additional pair of braces
					now_playing_format = "{";
					now_playing_format += argv[i];
					now_playing_format += "}";
					Replace(now_playing_format, "\\n", "\n");
					Replace(now_playing_format, "\\t", "\t");
					MPD::Song::ValidateFormat("now-playing format", now_playing_format);
				}
				std::cout << utf_to_locale_cpy(Mpd.GetCurrentSong().toString(now_playing_format)) << "\n";
			}
			exit(0);
		}
		else if (!strcmp(argv[i], "play"))
		{
			Mpd.Play();
			quit = 1;
		}
		else if (!strcmp(argv[i], "pause"))
		{
			Mpd.Pause(1);
			quit = 1;
		}
		else if (!strcmp(argv[i], "toggle"))
		{
			Mpd.UpdateStatus();
			if (!Mpd.GetErrorMessage().empty())
			{
				std::cout << "Error: " << Mpd.GetErrorMessage() << std::endl;
				exit(1);
			}
			Mpd.Toggle();
			quit = 1;
		}
		else if (!strcmp(argv[i], "stop"))
		{
			Mpd.Stop();
			quit = 1;
		}
		else if (!strcmp(argv[i], "next"))
		{
			Mpd.Next();
			quit = 1;
		}
		else if (!strcmp(argv[i], "prev"))
		{
			Mpd.Prev();
			quit = 1;
		}
		else if (!strcmp(argv[i], "volume"))
		{
			i++;
			Mpd.UpdateStatus();
			if (!Mpd.GetErrorMessage().empty())
			{
				std::cout << "Error: " << Mpd.GetErrorMessage() << std::endl;
				exit(1);
			}
			if (i != argc)
				Mpd.SetVolume(Mpd.GetVolume()+atoi(argv[i]));
			quit = 1;
		}
		else
		{
			std::cout << "ncmpcpp: invalid option: " << argv[i] << std::endl;
			exit(0);
		}
		if (!Mpd.GetErrorMessage().empty())
		{
			std::cout << "Error: " << Mpd.GetErrorMessage() << std::endl;
			exit(0);
		}
	}
	if (quit)
		exit(0);
}
Example #4
0
void CFindHostsDlg::OnVerify() 
{
    char host[100];
    SOCKET sock;
    int index;
    char str[100];
    HCURSOR hOldCursor;
    POSITION pos;
    
    UpdateData();
    
    m_nofm = "";
    UpdateData(FALSE);

    m_num_threads = m_list.GetSelectedCount();
    if (m_num_threads == 0)
	return;

    pos = m_list.GetFirstSelectedItemPosition();
    if (pos == NULL)
    {
	return;
    }

    hOldCursor = SetCursor( LoadCursor(NULL, IDC_WAIT) );

    m_ok_btn.EnableWindow(FALSE);
    m_cancel_btn.EnableWindow(FALSE);

    m_num_items = m_list.GetSelectedCount();
    m_progress.SetRange(0, m_num_items);
    m_progress.SetPos(0);
    m_progress.SetStep(1);
    m_nofm.Format("0 of %d", m_num_items);
    UpdateData(FALSE);


    if (m_bNeedPassword)
    {
	CPwdDialog dlg;
	dlg.DoModal();
	if (dlg.m_bUseDefault)
	    strcpy(m_pszPhrase, MPD_DEFAULT_PASSPHRASE);
	else
	    strcpy(m_pszPhrase, dlg.m_password);
    }
    while (pos)
    {
	index = m_list.GetNextSelectedItem(pos);
	if (m_list.GetItemText(index, 0, host, 100) == 0)
	{
	    SetCursor(hOldCursor);
	    MessageBox("GetItemText failed", "Error", MB_OK);
	    return;
	}

	if (ConnectToMPD(host, m_nPort, m_pszPhrase, &sock) != 0)
	{
	    easy_closesocket(sock);
	    ::PostMessage(m_hWnd, WM_USER+1, index, FALSE);
	    continue;
	}
	
	if (WriteString(sock, "version") == SOCKET_ERROR)
	{
	    easy_closesocket(sock);
	    ::PostMessage(m_hWnd, WM_USER+1, index, FALSE);
	    continue;
	}
	if (!ReadString(sock, str))
	{
	    easy_closesocket(sock);
	    ::PostMessage(m_hWnd, WM_USER+1, index, FALSE);
	    continue;
	}
	WriteString(sock, "done");
	easy_closesocket(sock);
	
	::PostMessage(m_hWnd, WM_USER+2, index, FALSE);
    }
    SetCursor(hOldCursor);
}
Example #5
0
void FindThreadSingle(FindThreadSingleArg *arg)
{
    TCHAR host[100];
    char str[100];
    SOCKET sock;
    
    if (arg->list->GetItemText(arg->i, 0, host, 100) == 0)
    {
	::PostMessage(arg->hWnd, WM_USER+1, arg->i, FALSE);
	delete arg;
	return;
    }
    
    if (arg->wildcard && (!wildcmp(arg->wildstr, host)))
    {
	::PostMessage(arg->hWnd, WM_USER+1, arg->i, FALSE);
	delete arg;
	return;
    }
    
    ::PostMessage(arg->hWnd, WM_USER+1, arg->i, TRUE);

    if (arg->fast)
    {
	if (ConnectToMPDquick(host, arg->port, arg->phrase, &sock) != 0)
	{
	    ::PostMessage(arg->hWnd, WM_USER+1, arg->i, FALSE);
	    delete arg;
	    return;
	}
    }
    else
    {
	if (ConnectToMPD(host, arg->port, arg->phrase, &sock) != 0)
	{
	    ::PostMessage(arg->hWnd, WM_USER+1, arg->i, FALSE);
	    delete arg;
	    return;
	}
    }
    
    if (WriteString(sock, "version") == SOCKET_ERROR)
    {
	printf("WriteString failed after attempting passphrase authentication: %d\n", WSAGetLastError());fflush(stdout);
	easy_closesocket(sock);
	::PostMessage(arg->hWnd, WM_USER+1, arg->i, FALSE);
	delete arg;
	return;
    }
    if (!ReadString(sock, str))
    {
	::PostMessage(arg->hWnd, WM_USER+1, arg->i, FALSE);
	delete arg;
	return;
    }
    WriteString(sock, "done");
    easy_closesocket(sock);
    
    if (mpd_version_string_to_int(str) == 0)
	::PostMessage(arg->hWnd, WM_USER+1, arg->i, FALSE);
    else
	::PostMessage(arg->hWnd, WM_USER+2, arg->i, TRUE);
    delete arg;
}
Example #6
0
void ListJobs(char *host, int port, char *altphrase)
{
    SOCKET sock;
    char str[CONSOLE_STR_LENGTH+1];
    int error;
    char key[100];
    char value[CONSOLE_STR_LENGTH];
    char localhost[100];

    if (host == NULL)
    {
	gethostname(localhost, 100);
	host = localhost;
    }

    if (ConnectToMPD(host, port, (altphrase == NULL) ? MPD_DEFAULT_PASSPHRASE : altphrase, &sock) != 0)
    {
	printf("Unable to connect to the mpd on %s\n", host);
	fflush(stdout);
	return;
    }

    printf("Jobs on %s:\n", host);
    //printf("start time : user@jobid\n");
    printf("yyyy.mm.dd<hh .mm .ss > : user@jobid : state\n");
    printf("--------------------------------------------\n");
    fflush(stdout);
    strcpy(str, "dbfirst jobs");
    if (WriteString(sock, str) == SOCKET_ERROR)
    {
	error = WSAGetLastError();
	printf("writing '%s' failed, %d\n", str, error);
	Translate_Error(error, str);
	printf("%s\n", str);
	fflush(stdout);
	easy_closesocket(sock);
	return;
    }
    if (ReadStringTimeout(sock, str, MPD_DEFAULT_TIMEOUT))
    {
	if (strcmp(str, "DBS_FAIL") == 0)
	{
	    printf("no jobs on %s\n", host);
	    fflush(stdout);
	    WriteString(sock, "done");
	    easy_closesocket(sock);
	    return;
	}
	if (strcmp(str, "DBS_END") == 0)
	{
	    printf("no jobs on %s\n", host);
	    fflush(stdout);
	    WriteString(sock, "done");
	    easy_closesocket(sock);
	    return;
	}
	GetKeyAndValue(str, key, value);
	printf("%s : %s : ", key, value);
	fflush(stdout);
	GetAndPrintState(sock, strstr(value, "@")+1);
    }
    else
    {
	printf("Unable to read the jobs on %s.\n", host);
	fflush(stdout);
	WriteString(sock, "done");
	easy_closesocket(sock);
	return;
    }

    while (true)
    {
	strcpy(str, "dbnext jobs");
	if (WriteString(sock, str) == SOCKET_ERROR)
	{
	    error = WSAGetLastError();
	    printf("writing '%s' failed, %d\n", str, error);
	    Translate_Error(error, str);
	    printf("%s\n", str);
	    fflush(stdout);
	    easy_closesocket(sock);
	    return;
	}
	if (ReadStringTimeout(sock, str, MPD_DEFAULT_TIMEOUT))
	{
	    if (strcmp(str, "DBS_FAIL") == 0)
	    {
		printf("unexpected error reading the next job\n");
		fflush(stdout);
		WriteString(sock, "done");
		easy_closesocket(sock);
		return;
	    }
	    if (strcmp(str, "DBS_END") == 0)
	    {
		break;
	    }
	    GetKeyAndValue(str, key, value);
	    printf("%s : %s : ", key, value);
	    GetAndPrintState(sock, strstr(value, "@")+1);
	}
	else
	{
	    printf("Unable to read the jobs on %s.\n", host);
	    fflush(stdout);
	    WriteString(sock, "done");
	    easy_closesocket(sock);
	    return;
	}
    }

    if (WriteString(sock, "done") == SOCKET_ERROR)
    {
	error = WSAGetLastError();
	Translate_Error(error, str);
	printf("WriteString failed: %d\n%s\n", error, str);
	fflush(stdout);
    }
    easy_closesocket(sock);
}
Example #7
0
void PutJobProcessInDatabase(MPIRunLaunchProcessArg *arg, int pid)
{
    SOCKET sock;
    char pszStr[MAX_CMD_LENGTH+1];
    char pszResult[MAX_CMD_LENGTH+1];
    int error;
    char pszRank[100];
    int extent;

    if (!g_bUseJobHost)
        return;

    if (arg->n < 10)
        extent = 1;
    else if (arg->n < 100)
        extent = 2;
    else if (arg->n < 1000)
        extent = 3;
    else extent = 4;

    sprintf(s_pszRankFormat, "%%0%dd", extent);
    sprintf(pszRank, s_pszRankFormat, arg->i);

    if ((error = ConnectToMPD(s_pszRootHost, s_nPort, s_pszPassPhrase, &sock)) == 0)
    {
        // put host
        sprintf(pszStr, "dbput %s:%shost:%s", arg->pszJobID, pszRank, arg->pszHost);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the put operation: '%s', error %d\n", pszStr, WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // put command line
        sprintf(pszStr, "dbput name=%s key=%scmd value=%s", arg->pszJobID, pszRank, arg->pszCmdLine);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the put operation: '%s', error %d\n", pszStr, WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // put working directory
        sprintf(pszStr, "dbput name=%s key=%sdir value=%s", arg->pszJobID, pszRank, arg->pszDir);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the put operation: '%s', error %d\n", pszStr, WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // put environment variables
        sprintf(pszStr, "dbput %s:%senv:%s", arg->pszJobID, pszRank, arg->pszEnv);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the put operation: '%s', error %d\n", pszStr, WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // put process id
        sprintf(pszStr, "dbput %s:%spid:%d", arg->pszJobID, pszRank, pid);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the put operation: '%s', error %d\n", pszStr, WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // close the session with the mpd
        if (WriteString(sock, "done") == SOCKET_ERROR)
        {
            printf("Error: Unable to write 'done' to socket[%d]\n", sock);
            easy_closesocket(sock);
            return;
        }

        easy_closesocket(sock);
    }
    else
    {
        printf("PutJobProcessInRootMPD: Connect to %s failed, error %d\n", s_pszRootHost, error);
        fflush(stdout);
    }
}
Example #8
0
void PutJobInDatabase(MPIRunLaunchProcessArg *arg)
{
    int error;
    SOCKET sock;
    SYSTEMTIME stime;
    char pszStr[MAX_CMD_LENGTH+1];
    char pszResult[MAX_CMD_LENGTH+1];

    if (!g_bUseJobHost)
        return;

    // save the host
    strcpy(s_pszRootHost, g_pszJobHost);
    // save the passphrase
    if (g_bUseJobMPDPwd)
        strcpy(s_pszPassPhrase, g_pszJobHostMPDPwd);
    else
        strcpy(s_pszPassPhrase, MPD_DEFAULT_PASSPHRASE);
    // save the jobid
    strcpy(s_pszJobId, arg->pszJobID);

    if ((error = ConnectToMPD(s_pszRootHost, s_nPort, s_pszPassPhrase, &sock)) == 0)
    {
        // open the jobs database
        sprintf(pszStr, "dbcreate jobs");
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the jobs database query: error %d\n", WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("Unable to open the jobs database on '%s'\n%s", s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // create a database for this job with the jobid as its name
        sprintf(pszStr, "dbcreate %s", arg->pszJobID);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the job database creation request: error %d\n", WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("Unable to create the job database(%s) on '%s'\n%s", arg->pszJobID, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // get the current time and put it in the jobs database with this jobid
        GetLocalTime(&stime);
        sprintf(pszStr, "dbput jobs:%d.%02d.%02d<%02dh.%02dm.%02ds>:%s@%s", stime.wYear, stime.wMonth, stime.wDay, stime.wHour, stime.wMinute, stime.wSecond, arg->pszAccount, arg->pszJobID);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the jobs timestamp put operation: error %d\n", WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("Unable to put the job timestamp in the jobs database on '%s'\n%s", s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // put the user name in the job database
        sprintf(pszStr, "dbput %s:user:%s", arg->pszJobID, (arg->pszAccount[0] == '\0') ? "<single user mode>" : arg->pszAccount);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the job timestamp put operation: error %d\n", WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // put the size of the parallel process in the job database
        sprintf(pszStr, "dbput %s:nproc:%d", arg->pszJobID, arg->n);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the job nproc put operation: error %d\n", WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // put the state of the job database
        sprintf(pszStr, "dbput %s:state:LAUNCHING", arg->pszJobID, (arg->pszAccount[0] == '\0') ? "<single user mode>" : arg->pszAccount);
        if (WriteString(sock, pszStr) == SOCKET_ERROR)
        {
            printf("ERROR: Unable to write '%s' to socket[%d]\n", pszStr, sock);
            easy_closesocket(sock);
            return;
        }
        if (!ReadString(sock, pszResult))
        {
            printf("ERROR: ReadString failed to read the result of the job state put operation: error %d\n", WSAGetLastError());
            easy_closesocket(sock);
            return;
        }
        if (strnicmp(pszResult, "DBS_SUCCESS", 11) != 0)
        {
            printf("ERROR: put operation('%s') failed on '%s'\n%s", pszStr, s_pszRootHost, pszResult);
            fflush(stdout);
            easy_closesocket(sock);
            return;
        }

        // close the session with the mpd
        if (WriteString(sock, "done") == SOCKET_ERROR)
        {
            printf("Error: Unable to write 'done' to socket[%d]\n", sock);
            easy_closesocket(sock);
            return;
        }

        easy_closesocket(sock);
    }
    else
    {
        printf("PutJobInDatabase: Connect to %s failed, error %d\n", s_pszRootHost, error);
        fflush(stdout);
    }
}