23
Mon, Dec
3 New Articles

The CL Corner: Learn More About C Run-Time APIs

APIs
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

Now let's use the ctime API.

 

Similar to how we enhanced the original Send Update program, SNDUPD, and the Check Last Send program, CHKLSTSND, to incorporate a level of operational friendliness to the job at hand with SNDUPD2 and CHKLSTSND2, today we'll make comparable changes to the SNDUPD3 and CHKLSTSND3 programs. As a reminder, the task we are working on is to send an alert from one program (CHKLSTSNDx) when another program (SNDUPDx) has not successfully run in over six hours.

 

The change we will make is to store a human-readable form of the date and time the Send Update program last successfully run. We will create a new data area, QGPL/LSTSNDTIM4, with the following command:

 

CRTDTAARA DTAARA(QGPL/LSTSNDTIM4) TYPE(*CHAR) LEN(30)

 

The data area is created with a size of 30 bytes to accommodate a formatted local timestamp value such as Tue May 13 13:38:22 2008 plus an integer value of the current UTC time. We will format this local timestamp value using the Convert Time to Character String (ctime) API. The API documentation can be found in the C/C++ Language Run-Time manual, and the parameter list/prototype is repeated below.

 

char *ctime(const time_t *time);

 

The ctime API accepts one parameter, time, which is a pointer to data of type time_t. The "const" indicates that the API does not modify the value of this parameter. The ctime API also returns a pointer to a char(acter) string. This character string is formatted in the manner shown previously (Tue May 13 13:38:22 2008) with the time values converted to the local time. Other APIs exist if we wanted to format the string using UTC-based time values. The character string is documented as always being 26 bytes in length with the last two bytes representing a new-line character and a null byte.

 

Below is an updated Send Update program, SNDUPD4, which writes the formatted timestamp and UTC value to the data area LSTSNDTIM4.

 

Pgm                                                       

Dcl        Var(&Snd_Int)     Type(*Int)                    

Dcl        Var(&Snd_Char)    Type(*Char) Stg(*Defined) +  

             Len(4) DefVar(&Snd_Int)                      

                                                          

Dcl        Var(&DtaAraVal)   Type(*Char) Len(30)          

  Dcl        Var(&TimeStamp) Type(*Char) Stg(*Defined) +  

               Len(26) DefVar(&DtaAraVal)                 

  Dcl        Var(&Snd_Time)  Type(*Char) Stg(*Defined) +  

               Len(4) DefVar(&DtaAraVal 27)               

                                                           

Dcl        Var(&FmtTim_Ptr)  Type(*Ptr)                   

Dcl        Var(&FmtTim)      Type(*Char) Stg(*Based) +    

             Len(26) BasPtr(&FmtTim_Ptr)                  

                                                           

/* Send the updates and then:                         */  

                                                       

CallPrc    Prc('time')  Parm(&Snd_Int)                 

CallPrc    Prc('ctime') Parm(&Snd_Int) +                

             RtnVal(&FmtTim_Ptr)                       

ChgVar     Var(&TimeStamp) Value(&FmtTim)              

ChgVar     Var(&Snd_Time) Value(&Snd_Char)             

ChgDtaAra  DtaAra(QGPL/LSTSNDTIM4) Value(&DtaAraVal)   

EndPgm                                                  

 

As with the earlier SNDUPD3 program, SNDUPD4 first calls the time API to obtain the current UTC time. The addition from SNDUPD3 is that the ctime API is then called, passing the current UTC time value from the time API as a parameter. The ctime API returns a pointer (&FmtTim_Ptr) to a 26-byte character string representing the formatted local time equivalent of the UTC time. In the case of SNDUPD3, this character string is represented by the &FmtTim variable, which is *BASED on the returned &FmtTim_Ptr pointer variable. SNDUPD3 modifies the variable &DtaAraVal (Data Area Value) by updating the *DEFINED subfields &TimeStamp and &Snd_Time. These subfields represent the formatted local time and UTC time_t value, respectively. The data area LSTSNDTIM4 is then updated using the &DtaAraVal variable.

 

After running SNDUPD4, DSPDTAARA DTAARA(QGPL/LSTSNDTIM4) should now show text similar to Tue May 13 13:38:22 2008 followed by six trailing characters that may appear to be garbled. These last six characters represent the new-line character and null byte that the ctime API appended to the formatted timestamp plus the 4 bytes for the UTC time value in an integer format.

 

Below is the new Check Last Send program, CHKLSTSND4. This program is essentially unchanged from the earlier CHKLSTSND3 version other than having to ignore the formatted timestamp value that now precedes the UTC time value.

 

            Pgm                                                     

            Dcl        Var(&Snd_Int)   Type(*Int)                   

            Dcl        Var(&Snd_Char)  Type(*Char) Stg(*Defined) +  

                         Len(4) DefVar(&Snd_Int)                    

            Dcl        Var(&Cur_Int)    Type(*Int)                  

            Dcl        Var(&Alert_Time) Type(*Int)  Value(21600)    

            Dcl        Var(&Delay_Time) Type(*Dec)                  

            Dcl        Var(&Status)     Type(*Char) Len(1)          

                                                                     

            Dcl        Var(&DtaAraVal)   Type(*Char) Len(30)        

              Dcl        Var(&Snd_Time)  Type(*Char) Stg(*Defined) +

                           Len(4) DefVar(&DtaAraVal 27)             

                                                                     

Loop:       RtvDtaAra  DtaAra(QGPL/LSTSNDTIM4) RtnVar(&DtaAraVal)   

            ChgVar     Var(&Snd_Char) Value(&Snd_Time)                

            CallPrc    Prc('time') Parm(&Cur_Int)                     

                                                                       

            If         Cond((&Cur_Int - &Snd_Int) > &Alert_Time) +    

                         Then(Do)                                     

                            SndPgmMsg Msg('Time to send alert') +     

                               ToPgmQ(*Ext)                           

                            ChgVar Var(&Delay_Time) Value(300)        

                            EndDo                                     

            Else       Cmd(ChgVar Var(&Delay_Time) +                  

                         Value(&Alert_Time - (&Cur_Int - &Snd_Int) +  

                         + 1))                                        

                                                                       

            RtvJobA    EndSts(&Status)                                

            If         Cond(&Status *NE '1') Then(Do)                 

                       DlyJob Dly(&Delay_Time)                        

                       GoTo CmdLbl(Loop)                              

                       EndDo          

                                      

            EndPgm            

 

The CHKLSTSND4 program could actually be shortened by directly defining &Snd_Int over the &DtaAraVal variable and eliminating the need for the variables &Snd_Char and &Snd_Time, but I left these variables in so that the flow of the program might appear more obvious.

 

As with the CEE date and time APIs, there are many C run-time date- and time-related APIs beyond just the time and ctime APIs we have looked at. I encourage you to review these additional APIs so that you can be better aware of what tools are available to you when working with time on the system. As you can see, these APIs can greatly simplify your development efforts when you want to manipulate various time values.      

More CL Questions?             

Wondering how to accomplish a function in CL? Send your CL-related questions to me at This email address is being protected from spambots. You need JavaScript enabled to view it.. I'll see what I can do about answering your burning questions in future columns.

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  • SB Profound WC 5536 Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application. You can find Part 1 here. In Part 2 of our free Node.js Webinar Series, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Brian will briefly discuss the different tools available, and demonstrate his preferred setup for Node development on IBM i or any platform. Attend this webinar to learn:

  • SB Profound WP 5539More than ever, there is a demand for IT to deliver innovation. Your IBM i has been an essential part of your business operations for years. However, your organization may struggle to maintain the current system and implement new projects. The thousands of customers we've worked with and surveyed state that expectations regarding the digital footprint and vision of the company are not aligned with the current IT environment.

  • SB HelpSystems ROBOT Generic IBM announced the E1080 servers using the latest Power10 processor in September 2021. The most powerful processor from IBM to date, Power10 is designed to handle the demands of doing business in today’s high-tech atmosphere, including running cloud applications, supporting big data, and managing AI workloads. But what does Power10 mean for your data center? In this recorded webinar, IBMers Dan Sundt and Dylan Boday join IBM Power Champion Tom Huntington for a discussion on why Power10 technology is the right strategic investment if you run IBM i, AIX, or Linux. In this action-packed hour, Tom will share trends from the IBM i and AIX user communities while Dan and Dylan dive into the tech specs for key hardware, including:

  • Magic MarkTRY the one package that solves all your document design and printing challenges on all your platforms. Produce bar code labels, electronic forms, ad hoc reports, and RFID tags – without programming! MarkMagic is the only document design and print solution that combines report writing, WYSIWYG label and forms design, and conditional printing in one integrated product. Make sure your data survives when catastrophe hits. Request your trial now!  Request Now.

  • SB HelpSystems ROBOT GenericForms of ransomware has been around for over 30 years, and with more and more organizations suffering attacks each year, it continues to endure. What has made ransomware such a durable threat and what is the best way to combat it? In order to prevent ransomware, organizations must first understand how it works.

  • SB HelpSystems ROBOT GenericIT security is a top priority for businesses around the world, but most IBM i pros don’t know where to begin—and most cybersecurity experts don’t know IBM i. In this session, Robin Tatam explores the business impact of lax IBM i security, the top vulnerabilities putting IBM i at risk, and the steps you can take to protect your organization. If you’re looking to avoid unexpected downtime or corrupted data, you don’t want to miss this session.

  • SB HelpSystems ROBOT GenericCan you trust all of your users all of the time? A typical end user receives 16 malicious emails each month, but only 17 percent of these phishing campaigns are reported to IT. Once an attack is underway, most organizations won’t discover the breach until six months later. A staggering amount of damage can occur in that time. Despite these risks, 93 percent of organizations are leaving their IBM i systems vulnerable to cybercrime. In this on-demand webinar, IBM i security experts Robin Tatam and Sandi Moore will reveal:

  • FORTRA Disaster protection is vital to every business. Yet, it often consists of patched together procedures that are prone to error. From automatic backups to data encryption to media management, Robot automates the routine (yet often complex) tasks of iSeries backup and recovery, saving you time and money and making the process safer and more reliable. Automate your backups with the Robot Backup and Recovery Solution. Key features include:

  • FORTRAManaging messages on your IBM i can be more than a full-time job if you have to do it manually. Messages need a response and resources must be monitored—often over multiple systems and across platforms. How can you be sure you won’t miss important system events? Automate your message center with the Robot Message Management Solution. Key features include:

  • FORTRAThe thought of printing, distributing, and storing iSeries reports manually may reduce you to tears. Paper and labor costs associated with report generation can spiral out of control. Mountains of paper threaten to swamp your files. Robot automates report bursting, distribution, bundling, and archiving, and offers secure, selective online report viewing. Manage your reports with the Robot Report Management Solution. Key features include:

  • FORTRAFor over 30 years, Robot has been a leader in systems management for IBM i. With batch job creation and scheduling at its core, the Robot Job Scheduling Solution reduces the opportunity for human error and helps you maintain service levels, automating even the biggest, most complex runbooks. Manage your job schedule with the Robot Job Scheduling Solution. Key features include:

  • LANSA Business users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.

  • LANSAWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed. Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

  • LANSASupply Chain is becoming increasingly complex and unpredictable. From raw materials for manufacturing to food supply chains, the journey from source to production to delivery to consumers is marred with inefficiencies, manual processes, shortages, recalls, counterfeits, and scandals. In this webinar, we discuss how:

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • Profound Logic Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application.

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn: